Einzelnen Beitrag anzeigen

Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.060 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Alle DB Controls je nach state einfärben.

  Alt 30. Dez 2012, 00:28
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
  Mit Zitat antworten Zitat