AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Auflisten von Sub-Eigenschaften einer Komponente

Ein Thema von josef-b · begonnen am 31. Aug 2017 · letzter Beitrag vom 31. Aug 2017
Antwort Antwort
josef-b

Registriert seit: 6. Jun 2004
Ort: bei Jena in Thüringen
95 Beiträge
 
Delphi 11 Alexandria
 
#1

Auflisten von Sub-Eigenschaften einer Komponente

  Alt 31. Aug 2017, 07:24
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?

Geändert von josef-b (31. Aug 2017 um 08:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Auflisten von Sub-Eigenschaften einer Komponente

  Alt 31. Aug 2017, 10:25
Zitat:
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.
$2B or not $2B
  Mit Zitat antworten Zitat
josef-b

Registriert seit: 6. Jun 2004
Ort: bei Jena in Thüringen
95 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Auflisten von Sub-Eigenschaften einer Komponente

  Alt 31. Aug 2017, 11:38
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?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Auflisten von Sub-Eigenschaften einer Komponente

  Alt 31. Aug 2017, 12:11
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 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