procedureTForm3.Button3Click(Sender: TObject);
VarControl : Integer;
begin
ForControl := 0 ToControlCount-1 Do
IfControls[Control] IsTDBEdit Then
WithTDBEdit(Controls[Control]) Do
IfDataSource.DataSet.FieldByName(DataField).Required ThenColor := clRed;
end;
{ Данный метод будет работать только в случае, если БД-компонент обладает тремя полями: DataSource, типа TDataSource, DataField, типа String, и Color, типа TColor (это не должно быть проблемой). Также вам необходимо включить TypInfo в список используемых модулей }
procedureTForm3.Button4Click(Sender: TObject);
Var
Control : Integer;
DataSource : TDataSource;
DataField : String;
FunctionGetDataSource(Instance: TComponent) : Boolean;
VarPropInfo: PPropInfo;
Begin
Result := False;
PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, 'DataSource');
If(PropInfo <> Nil) And(PropInfo^.PropType^.Kind = tkClass) Then Begin
DataSource := TDataSource(TypInfo.GetOrdProp(Instance, PropInfo));
Result := DataSource <> Nil;
End;
End;
FunctionGetDataField(Instance: TComponent) : Boolean;
VarPropInfo : PPropInfo;
Begin
Result := False;
PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, 'DataField');
If(PropInfo <> Nil) And(PropInfo^.PropType^.Kind = tkString) Then Begin
DataField := TypInfo.GetStrProp(Instance, PropInfo);
Result := True;
End;
End;
ProcedureSetColor(Instance: TComponent; Color: TColor);
VarPropInfo : PPropInfo;
Begin
PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, 'Color');
If(PropInfo <> Nil) And(PropInfo^.PropType^.Kind = tkInteger) ThenTypInfo.SetOrdProp (Instance, PropInfo, Ord(Color));
End;
begin
ForControl := 0 ToControlCount-1 Do
IfGetDataSource(Controls[Control]) AndGetDataField(Controls[Control]) And
(DataSource.DataSet <> Nil) And
DataSource.DataSet.FieldByName(DataField).Required Then
SetColor(Controls[Control], clRed);
end;
– Robert Wittig
Insert/Override с помощью DBEdit
Сама Windows не позволяет это сделать, но я нашел как это обойти с помощью одной хитрости, и, похоже, это классно работает (надеюсь вы получите даже больше, чем вы хотите :).
Сначала я добавляю к моей форме свойство (и соответствующие переменные и процедуры), наподобие этому:
private
FinsertMode: boolean;
procedureSetInsertMode(value: boolean);
public
propertyinsertMode: boolean readFinsertMode writeSetInsertMode;
В обработчике создания события формы я инициализирую его:
procedureTForm1.FormCreate(Sender: TObject);
begin
{инициализация}
insertMode := True;
end;
Также для этого свойства я создаю процедуру SetInsertMode, которая с помощью TPanel с именем Panel1 извещает пользователя о текущем режиме работы:
procedureTForm1.SetInsertMode(value: boolean);
begin
FinsertMode := value;
ifFinsertMode thenPanel1.Caption := 'ВСТАВКА'
elsePanel1.Caption := 'ПЕРЕЗАПИСЬ';
end;
Затем я добавляю три обработчика событий (OnKeyDown, OnKeyPress, OnEnter) для каждого моего DBEdit (можно при наличии нескольких компонентов создать один общий обработчик для всех):
procedureTForm1.DBEditKeyDown(Sender: TObject; varKey: Word; Shift: TShiftState);
begin
if(Key = VK_INSERT) theninsertMode := notinsertMode;
end;
procedureTForm1.DBEditKeyPress(Sender: TObject; varKey: Char);
begin
if( notinsertMode) and(Sender isTDBEdit) then(Sender asTDBEdit).SelLength := 1
else(Sender asTDBEdit).SelLength := 0;
end;
procedureTForm1.DBEditEnter(Sender: TObject);
begin
insertMode := True;
end;
Банзай! Похоже это работает, хотя я и не имел достаточного времени протестировать это. Естественно, вы можете изменить это по просьбе вашего заказчика (например, я всегда сбрасывал режим во вставку при перемещении к другому компоненту DBEedit). Все вышесказанное должно также работать без проблем и с компонентами Edit.
– Denis Sarrazin
Пробую так:
myDbEdit.Text := '';
или адрес TField, если вы хотите так:
TableNameMyField.Value := '';
Читать дальше