Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Prüfen ob Komponenteneigenschaft vorhanden (https://www.delphipraxis.net/147348-pruefen-ob-komponenteneigenschaft-vorhanden.html)

RaSoWa1 6. Feb 2010 09:08


Prüfen ob Komponenteneigenschaft vorhanden
 
Hallo,

ich habe mir von TStringGrid eine Komponente abgeleitet, die ich als kleine Datenbank benutze. Zur Datenein/ausgabe habe ich u.a. auch die Möglichkeit vorgesehen Komponenten zu benutzen. Dies realisiere ich mit unten stehenden Code.
Leider werden da nur die im Code aufgeführten Komponeneten angesprochen. Ich suche einen Möglichkeit meine Komponente flexibler zu gestalten.
Ich könnte statt TEdit, TMaskEdit... auch TCustomEdit verwenden. Dies bringt aber nur eine leicht Verbesserung, denn die Verwendung von TCustomRadioGroup statt TRadioGroup funktioniert schon nicht mehr.

Schön wäre es, wenn ich prüfen könnte ob die jeweilige Komponete die Eigenschaft (Text, Caption, Itemindex,...) hat, um dann den Zugriff auszuführen.

Hat jemand eine Idee wie ich dies realisieren kann?
Oder würdet ihr es ganz anders machen?

Code:
Delphi-Quellcode:
function TFilterGrid.CompToCells(Comp: TObject = nil): boolean;
var   c, i,
       j   : integer;
       s   : string;
       ci  : TColInfo;
       ob  : TObject;
begin
  result := False;
  if ChangeMode = False
  then exit;
  for c := 0 to ColCount-1 do begin
    s := Cells[c, Row];
    ci := ColInfo[c];
    if (ci <> nil) and (ci.CompLst <> nil)
    then begin
      for i := 0 to ci.CompLst.Count-1 do begin
        ob := ci.CompLst[i];
        if (ob <> nil) and ((Comp = nil) or (Comp = ob))
        then
          if ob is TEdit
          then s := TEdit(ob).Text
          else
            if ob is TMaskEdit
            then s := TMaskEdit(ob).Text
            else
              if ob is TLabel
              then s := TLabel(ob).Caption
              else
                if ob is TMemo
                then s := ClearEtFromText(TMemo(ob).Text)
                else
                  if ob is TCheckBox
                  then s := ccBoolChar[TCheckbox(ob).Checked]
                  else
                    if ob is TRadioButton
                    then s := ccBoolChar[TRadioButton(ob).Checked]
                    else
                      if ob is TComboBox
                      then s := TComboBox(ob).Text
                      else
                        if ob is TRadioGroup
                        then s := IntToStr(TRadioGroup(ob).ItemIndex)
                        else
                          if ob is TSpinEdit
                          then s := TSpinEdit(ob).Text
                          else
                            if ob is TListBox
                            then
                              with TListBox(ob) do begin
                                if ItemIndex > -1
                                then s := Items[ItemIndex]
                                else s := '';
                                end
                            else
                              if ob is TCheckListBox
                              then
                                with TCheckListBox(ob) do begin
                                  s := '';
                                  for j := 0 to Items.Count-1 do
                                    if Checked[j]
                                    then s := s+Items[j]+cEtRepl;
                                  end
                              else
                                if (ob is TProzContainer) and Assigned(TProzContainer(ob).FuncToCells)
                                then s := TProzContainer(ob).FuncToCells(Cells[c, Row]);
        end;
      end;
    result := result or (Cells[c, Row] <> s);
    Cells[c, Row] := s;
    end;
  if result
  then begin
    if SortEd and (FSortCols <> '')
    then SortiereIndex
    else Change;
    ModiDaten_True;
    end;
end;
Gruß Klaus

himitsu 6. Feb 2010 09:21

Re: Prüfen ob Komponenteneigenschaft vorhanden
 
Sowas geht über die RTTI.

Aber in deinem Fall ist es wohl einfacher, wenn du dich auf die paar Grundtypen festlegst, diese via IS prüfst und verarbeitest.

Andreas L. 6. Feb 2010 09:51

Re: Prüfen ob Komponenteneigenschaft vorhanden
 
Zitat:

Zitat von himitsu
Sowas geht über die RTTI.

Und das geht z. B. so:

Delphi-Quellcode:
var
  ...
  ImgIdx: Integer;
begin
  ...
  ob := ci.CompLst[i];
  if IsPublishedProp(ob, 'ImageIndex') then
    ImgIdx := GetOrdProp(ob, 'ImageIndex');
  ...
end;
Weitere Routinen: Delphi-Referenz durchsuchenGetStrProp, Delphi-Referenz durchsuchenSetStrProp, Delphi-Referenz durchsuchenSetOrdProp

himitsu 6. Feb 2010 09:54

Re: Prüfen ob Komponenteneigenschaft vorhanden
 
Zitat:

Delphi-Quellcode:
if IsPublishedProp(ob, 'ImageIndex') then
  ImgIdx := GetOrdProp(ob, 'ImageIndex');

Man sollte aber besser noch den PropType prüfen, denn sonst passiert was nettes, wenn z.B. eine Komponente daherkommt, welche ihr ImageIndex z.B. als String deklariert hat.

s.h.a.r.k 6. Feb 2010 13:04

Re: Prüfen ob Komponenteneigenschaft vorhanden
 
Nachdem du auch Delphi 2010 kannst du dir mal das Video von Daniel über RTTI in D2010 anschauen: hier, ziemlich weit unten

RaSoWa1 7. Feb 2010 10:53

Re: Prüfen ob Komponenteneigenschaft vorhanden
 
Entschuldigung,
aber ich konnte mich nicht eher melden. Ich muß ab und zu mal Arbeiten, damit ich mir meine Hobby leisten kann.

Ich habe mir das Video zu RTTI soebend angesehen. Ich glaube das ist genau das was ich gesucht habe.
Heute habe ich etwas Zeit und kann mich da mal reinknien.

Danke an Alle für die Tips
und einen schönen Gruß

Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz