Советы по Delphi


Поиск и управление 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]



Содержание раздела