Hallo Zusammen,
ich habe bis jetzt mit IBObjects gearbeitet. Dessen native Komponenten hatten eine sehr coole
Funktion. Sobald das Dataset den Status geändert hat, wurde die Hintergrundfarbe geändert,
bei Insert=Grün, Edit=Gelb und Delete=Rot. Das vermisse ich sehr z.B.: bei TMSControls.
Deshalb mein Versuch es nachzubauen. Doch das scheint nicht so einfach zu sein.
Die folgende Methode bekommt die Form und das Dataset. Es durchläuft alle Controls des
Forms und such Contols die ein Publisched Property=DataSource haben. Somit sind das schon mal Datensensitive Controls. Wenn das aktuelle Controll auch noch am gleichen Dataset und
nicht Readonly ist, setze ich die Farbe anhand des state vom DataSet. Das funktioniert schon mal. Nun jetzt gibt es unterschiedliche Controls. Ich möchte jetzt nicht jedes Control in der case Typcasten. Am liebste wäre mir, ich hätte ein Set mit allen Controls die ich einfärben möchte.
Ich habe keine Idee wie ich die Typabfrage und den Cast über alle Elemente des Sets hinbekomme. Hat hierfür jemand eine Idee?
Delphi-Quellcode:
if (ctrl is TDBAdvEdit)
then TDBAdvEdit(ctrl).color := clGreen else
if (ctrl is TAdvDBDateTimePicker
then TAdvDBDateTimePicker(ctrl).color := clGreen else ...
Delphi-Quellcode:
procedure ModifyStateColor(ctrl: TWinControl; ds:TDataSet);
procedure ModifyColor(ctrl: TControl);
var
c: TColor;
aDataSource:TDataSource;
begin
if (IsPublishedProp(ctrl, 'DataSource')and
IsPublishedProp(ctrl, 'ReadOnly'))then
begin
aDataSource := TDataSource(GetObjectProp(ctrl, 'DataSource', TDataSource));
if aDataSource=nil then exit;
if ((GetOrdProp(ctrl, 'ReadOnly') = Ord(false))and
(aDataSource.DataSet = ds))then
begin
case aDataSource.DataSet.State of
dsInsert: if (ctrl is TDBAdvEdit)
then TDBAdvEdit(ctrl).color := clGreen;
dsEdit: if (ctrl is TDBAdvEdit)
then TDBAdvEdit(ctrl).color := clYellow;
else if (ctrl is TDBAdvEdit)
then TDBAdvEdit(ctrl).color := clWindow;
end;
end;
end;
end;
var
i: Integer;
begin
for i := 0 to ctrl.controlcount - 1 do
if ctrl.controls[i] is Twincontrol then
begin
ModifyStateColor(TWincontrol(ctrl.controls[i]), ds);
end else
ModifyColor(ctrl.controls[i]);
end;
Gruß Kostas