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 Properties per Name (String) referenzieren (https://www.delphipraxis.net/28483-properties-per-name-string-referenzieren.html)

Bulvaye 25. Aug 2004 11:35


Properties per Name (String) referenzieren
 
Hallo zusammen,

wie kann ich eine Property über den Property-Namen (als String) referenzieren, um eine Eigenschaft auszulesen bzw. zu setzen?

Beispiel:

Gegeben ist der Objektname "Button1" (also Button1.Name = "Button1") und die Property "Caption". Nun soll es möglich sein, nur mit diesen beiden Strings zum gleichen Ergebnis zu kommen, als schriebe man "Button1.Caption := 'Test'".

Frage ist nun: Wie mache ich das? :?:

Steve 25. Aug 2004 11:40

Re: Properties per Name (String) referenzieren
 
Hi, schau Dir mal Delphi-Referenz durchsuchenFindComponent an :)

Gruß
Stephan

PS: Ich hoffe, ich habe Deine Frage richtig verstanden :stupid:

generic 25. Aug 2004 11:42

Re: Properties per Name (String) referenzieren
 
die componenten kannst du ja über die forms ermitteln.
die properties ist etwas schwieriger.

du musst dann die Laufzeit-Typinformationen auswerten.
vieleicht kannst du mit dem code unten was anfangen.
der bekommt ein geöffnetes dataset und eine objekt übergeben.
dieses wird dann in die db kopiert. wichtig ist das du mit {$M+} kompilierst.

Delphi-Quellcode:
Procedure CopyToDataSet(ds: TDataset; obj: TObject);
var
  Props: PPropList;
  TypeData: PTypeData;
  i: Integer;
begin
  TypeData := GetTypeData(obj.ClassInfo);
  if (TypeData = nil) or (TypeData^.PropCount = 0) then Exit;

  GetMem(Props, TypeData^.PropCount * sizeof(Pointer));
  try
    GetPropInfos(obj.ClassInfo, Props);
    for i := 0 to TypeData^.PropCount-1 do
    begin
      with Props^[i]^ do
      begin
        case PropType^.Kind of
            tkInteger, tkFloat:
                       begin
                         if GetPropValue(obj, Name, true)<0 then
                           ds.FieldByName(Name).Clear
                         else
                           ds.FieldByName(Name).Value:=GetPropValue(obj, Name, true);
                       end;
            tkEnumeration:
                  begin
                    if GetTypeData(PropType^)^.BaseType^ = TypeInfo(Boolean) then
                    begin
                      if Boolean(GetOrdProp(Obj, Props^[i])) then
                        ds.FieldByName(Name).Value:=1
                      else
                        ds.FieldByName(Name).Value:=0;
                    end else
                      raise exception.create('speichern fuer diesen enum nicht implementiert');
                  end;
          else
            ds.FieldByName(Name).Value:=GetPropValue(obj, Name, true);
        end;
      end;
    end;
  finally
    FreeMem(Props);
  end;
end;

Bulvaye 25. Aug 2004 12:56

Re: Properties per Name (String) referenzieren
 
Hmmm..."GetPropInfos" finde ich in meiner Hilfe nicht. In welcher Unit finde ich die Funktion denn? (ich entwickle übrigens mit Delphi 7)

mirage228 25. Aug 2004 12:59

Re: Properties per Name (String) referenzieren
 
Zitat:

Zitat von Bulvaye
Hmmm..."GetPropInfos" finde ich in meiner Hilfe nicht. In welcher Unit finde ich die Funktion denn? (ich entwickle übrigens mit Delphi 7)

Hi,

das sollte die Unit TypInfo sein.

mfG
mirage228

Bulvaye 26. Aug 2004 09:04

Re: Properties per Name (String) referenzieren
 
Vielen Dank für die Hinweise. Tatsächlich ist die ganze Geschichte recht einfach. In der Unit TypInfo gibt es unter anderem zwei Funktionen, die genau das tun, was ich brauche:

Code:
uses TypInfo;

function GetPropValue(Instance: TObject; const PropName: string;
  PreferStrings: Boolean = True): Variant;

procedure SetPropValue(Instance: TObject; const PropName: string;
  const Value: Variant);
GetPropValue liest eine Property aus und SetPropValue setzt eine Property auf einen bestimmten Wert, z.B.:

SetPropValue(Button1, "Caption", "Suchen");

Per Funktion GetPropInfos() kann man auch alle Properties eines TObjects in eine Liste auslesen und durchlaufen.

Grüße
Bulvaye

Chewie 26. Aug 2004 10:28

Re: Properties per Name (String) referenzieren
 
Wichtig zu beachten ist nur, dass das ganze nur bei Properties funktioniert, die als published deklariert sind!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 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