Поиск и управление TEdit/TField
Я хотел бы менять цвет компонентов TDBEdit и TEdit, расположенных на форме, на другой, "отчетливый" цвет, в том случае, если с помощью них требуется ввести какие-либо данные.
Как насчет этого? Представляю вашему вниманию два метода. Первый метод задает цвет каждому DBEdit, имеющему требуемое поле. Второй метод (более сложный) задает цвет каждому БД-компоненту, имеющему необходимое поле.
procedure TForm3.Button3Click(Sender: TObject);
Var
Control : Integer;
begin
For Control := 0 To ControlCount-1 Do
If Controls[Control] Is TDBEdit
Then With TDBEdit(Controls[Control]) Do If DataSource.DataSet.FieldByName ( DataField ).Required Then Color := clRed; end; { Данный метод будет работать только в случае, если БД-компонент обладает тремя полями: DataSource, типа TDataSource, DataField, типа String, и Color, типа TColor (это не должно быть проблемой). Также вам необходимо включить TypInfo в список используемых модулей } procedure TForm3.Button4Click(Sender: TObject); Var Control : Integer; DataSource : TDataSource; DataField : String; Function GetDataSource ( Instance : TComponent ) : Boolean; Var PropInfo : 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; Function GetDataField ( Instance : TComponent ) : Boolean; Var PropInfo : 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; Procedure SetColor ( Instance : TComponent; Color : TColor ); Var PropInfo : PPropInfo; Begin PropInfo := TypInfo.GetPropInfo ( Instance.ClassInfo, 'Color' ); If ( PropInfo <> Nil ) And ( PropInfo^.PropType^.Kind = tkInteger ) Then TypInfo.SetOrdProp ( Instance, PropInfo, Ord(Color) ); End; begin For Control := 0 To ControlCount-1 Do If GetDataSource ( Controls[Control] ) And GetDataField ( Controls[Control] ) And ( DataSource.DataSet <> Nil ) And DataSource.DataSet.FieldByName ( DataField ).Required Then SetColor ( Controls[Control], clRed ); end; |
- Robert Wittig [001046]