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/)
-   -   Auflisten von Sub-Eigenschaften einer Komponente (https://www.delphipraxis.net/193705-auflisten-von-sub-eigenschaften-einer-komponente.html)

josef-b 31. Aug 2017 06:24

Auflisten von Sub-Eigenschaften einer Komponente
 
Ich möchte mir wegen Mapping von Eigenschaften die Eigenschaften
einer Komponente anzeigen lassen.

Dazu habe ich diesen Codeschnipsel gefunden, der auch funktioniert.

Allederdings werden da nur die Haupt-Eigenschaften aufgelistet. Ich möchte
nun aber von einer bestimmten Eigenschaft, die Unter-Eigenschaften
auflisten lassen, die in einer Klasse deklariert sind.



Delphi-Quellcode:
procedure TF1.ListComponentProperties(Component: TComponent; Strings: TStrings);
var
  Count, Size, I: Integer;
  List: PPropList;
  PropInfo: PPropInfo;
  PropOrEvent, PropValue: string;
begin
  Count := GetPropList(Component.ClassInfo, tkAny, nil);
  Size := Count * SizeOf(Pointer);
  GetMem(List, Size);
  try
    Count := GetPropList(Component.ClassInfo, tkAny, List);
    for I := 0 to Count - 1 do
    begin
      PropInfo := List^[I];
      if PropInfo^.PropType^.Kind in tkMethods then
        PropOrEvent := 'Event'
      else
        PropOrEvent := 'Property';
      PropValue := VarToStr(GetPropValue(Component, PropInfo^.Name));
      Strings.Add(Format('[%s] %s: %s = %s', [PropOrEvent, PropInfo^.Name,
        PropInfo^.PropType^.Name, PropValue]));
    end;
  finally
    FreeMem(List);
  end;
end;

// Example: List all Properties/Events from Button1 in a TListBox

procedure TF1.Button1Click(Sender: TObject);
begin
  ListComponentProperties(Button1, ListBox1.Items);
end;

So habe ich z.B. in einer Komponente eine Klasse deklariert

Delphi-Quellcode:
TMyEigenschaft = Class(TPersistent)
    private
    FEigenschaft1: boolean;
    FEigenschaft2: boolean;
    ....

 published
    property Eigenschaft1: boolean read FEigenschaft1 write FEigenschaft2;
    property Eigenschaft2: boolean read FEigenschaft2 write FEigenschaft2;
    ....
Er zeigt mir dann an: MyEigenschaft TMyEigenschaft aber eben nicht die Untereigenschaften.

Wie kann ich die (zusätzlich) auslesen und auflisten?

himitsu 31. Aug 2017 09:25

AW: Auflisten von Sub-Eigenschaften einer Komponente
 
Zitat:

Delphi-Quellcode:
if PropInfo^.PropType^.Kind in tkMethods then

Ähhhh?


Indem du das Selbe nochmal mit MyEigenschaft machst, was du schon mit der übergeordneten Klasse gemacht hast?

Wenn es ein Property ist und der Value davon ist eine Klasse (Objektzeiger), dann deine Funktion da auch nochmal drüber laufen lassen.

josef-b 31. Aug 2017 10:38

AW: Auflisten von Sub-Eigenschaften einer Komponente
 
Sorry ich kapier das noch nicht richtig.

Die Komponente heisst konkret Elevator15.

Der Befehl heisst dann...

Delphi-Quellcode:

procedure TF1.Button1Click(Sender: TObject);
begin
  ListComponentProperties(Elevator15, ListBox1.Items);
end;
funktioniert auch :

ein Ergebnis ist in der Liste

SPS_Modbus_Adressen: TSPS_Modbus_Adressen - die Klasse mit den Untereigenschaften.

wenn ich jetzt in den Befehl ListComponentProperties eingebe:

Delphi-Quellcode:

procedure TF1.Button1Click(Sender: TObject);
begin
  ListComponentProperties(Elevator15.SPS_Modbus_Adressen), ListBox1.Items);

//oder

  ListComponentProperties(SPS_Modbus_Adressen), ListBox1.Items);

end;

habe die Fehlermeldung: incompatible Typen TComponent und TSPS_Modbus_Adressen

Wie stelle ich das genau an?

TiGü 31. Aug 2017 11:11

AW: Auflisten von Sub-Eigenschaften einer Komponente
 
Delphi-Quellcode:
procedure ListComponentProperties(ATypeInfo: PTypeInfo; Strings: TStrings); overload;
var
  Count, I: Integer;
  List: PPropList;
  PropInfo: PPropInfo;
  PropOrEvent: string;
begin
  List := nil;
  Count := GetPropList(ATypeInfo, List);
  try
    for I := 0 to Count - 1 do
    begin
      PropInfo := List^[I];
      case PropInfo.PropType^.Kind of
        TTypeKind.tkMethod:
          PropOrEvent := 'Event';
        TTypeKind.tkClass:
          begin
            ListComponentProperties(PropInfo.PropType^, Strings)
          end;
      else
        PropOrEvent := 'Property';
      end;
//      PropValue := VarToStr(GetPropValue(Component, PropInfo^.Name)); <--- hier noch Gehirnschmalz reinstecken, da ja die Instanz fehlt

      Strings.Add('- - -' + Format('[%s] %s: %s = %s', [PropOrEvent, PropInfo^.Name, PropInfo^.PropType^.Name, '']));
    end;
  finally
    FreeMem(List);
  end;
end;

procedure ListComponentProperties(Component: TObject; Strings: TStrings); overload;
var
  Count, Size, I: Integer;
  List: PPropList;
  PropInfo: PPropInfo;
  PropOrEvent, PropValue: string;
begin
  List := nil;
  Count := GetPropList(Component, List);
  try
    for I := 0 to Count - 1 do
    begin
      PropInfo := List^[I];
      case PropInfo.PropType^.Kind of
        TTypeKind.tkMethod:
          PropOrEvent := 'Event';
        TTypeKind.tkClass:
          begin
            ListComponentProperties(PropInfo.PropType^, Strings)
          end;
      else
        PropOrEvent := 'Property';
      end;

      PropValue := VarToStr(GetPropValue(Component, PropInfo^.Name));

      Strings.Add(Format('[%s] %s: %s = %s', [PropOrEvent, PropInfo^.Name, PropInfo^.PropType^.Name, PropValue]));
    end;
  finally
    FreeMem(List);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 Uhr.

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