|
Компания Microsoft благодарит Вас за покупку операционнй системы Microsoft ScanDisk.
|
Я хотел бы менять цвет компонентов 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;
|
|