Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   RTTI Enum von Propertys? (https://www.delphipraxis.net/183514-rtti-enum-von-propertys.html)

Mavarik 16. Jan 2015 10:40

RTTI Enum von Propertys?
 
Hallo Zusammen!

Nochmal zum Thema Rtti.

Gibt es eine Möglichkeit für eine Funktion

Delphi-Quellcode:
function GetAllPropertyNames(C : TClass):TList<String>;
var
   i : integer;
begin
  Result := TList<String>.Create;
  for i:=0 to C.Propertys.count-1 do
    Result.Add(C.Propertys[i].ProperyName);
end;
:stupid:

Grüsse Mavarik

DeddyH 16. Jan 2015 10:45

AW: RTTI Enum von Propertys?
 
Hiermit vielleicht? http://docwiki.embarcadero.com/Libra....GetProperties

[edit] Hihi, Schnapsrunde fällig (2222 Beiträge) :cheers: [/edit]

Mavarik 16. Jan 2015 11:01

AW: RTTI Enum von Propertys?
 
Zitat:

Zitat von DeddyH (Beitrag 1286692)
Hiermit vielleicht? http://docwiki.embarcadero.com/Libra....GetProperties

[edit] Hihi, Schnapsrunde fällig (2222 Beiträge) :cheers: [/edit]

WOW... 2223 Danke... Die Runde geht auf mich..:cheers:

Ups so einfach... GetProperties...

Zitat:

Zitat von docwiki
funktioniert es nur in Typen beschreibenden RTTI-Objekte, die Eigenschaften wie z.B. records, classes und interfaces eigentlich zulassen; für alle anderen Typen gibt diese Methode einfach ein leeres Array zurück

Bedeutet was?

Mavarik

Der schöne Günther 16. Jan 2015 11:17

AW: RTTI Enum von Propertys?
 
Die englische Version ist verständlicher:
Zitat:

Although GetProperties is declared in TRttiType, it only works in RTTI objects describing types that actually allow properties, such as records, classes, and interfaces; for all other types, this method simply returns an empty array.
Soll heißen:
  • Es können eh nur Interfaces, Records und Klassen Properties haben
  • Wenn du einen Typ reinsteckst der sowieso keine Properties haben kann (z.B. einen String) dann bekommst du ein leeres Array zurück

Ich meine, was hätte sonst passieren können. Vielleicht hätte die Methode ja auch eine Exception werfen können wenn man was reinsteckt wo im Vorhinein klar ist dass es keine Properties haben kann.

himitsu 16. Jan 2015 11:25

AW: RTTI Enum von Propertys?
 
Da fühlen sich die armen Class/Record-Helpher aber voll verarscht.


Ich hab vorhin einen Text mit der Nummer 17777 im Programm angelegt und keiner wollte feiern. :cry: (hatte aber auch erst bei 17000 angefangen)

Der schöne Günther 16. Jan 2015 12:13

AW: RTTI Enum von Propertys?
 
Guter Einwand.

Delphi-Quellcode:
program Project16;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.SysUtils, System.Rtti;

type
   TObjectHelper = class helper for TObject
      protected
         function getValue(): Integer;
      public property
         Value: Integer read getValue;
   end;


{ TObjectHelper }

function TObjectHelper.getValue(): Integer;
begin
   Result := 42;
end;

procedure justRttiThings();
var
   context: TRttiContext;
   rttiType: TRttiType;
   properties: TArray<TRttiProperty>;
   propertyIterator: TRttiProperty;
begin
   context := TRttiContext.Create();
   properties := context.GetType( TypeInfo(TObjectHelper)).GetProperties();

   for propertyIterator in properties do
      WriteLn(propertyIterator.Name);
end;

begin
  try
   justRttiThings();
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
ergibt

Code:
Value
RefCount
Welche Magie steckt hier dahinter?

Sir Rufo 16. Jan 2015 12:19

AW: RTTI Enum von Propertys?
 
Wo soll denn da Magie sein? Das ist doch so wie erwartet, oder etwa nicht?

Auf jeden Fall sind alle Informationen vorhanden um das auflösen zu können.

Delphi-Quellcode:
TObjectHelper
ist verbunden mit
Delphi-Quellcode:
TObject
und darum werden alle Eigenschaften von
Delphi-Quellcode:
TObject
und
Delphi-Quellcode:
TObjectHelper
aufgelistet.

Also ich hätte das jetzt auch so erwartet ...

Der schöne Günther 16. Jan 2015 13:11

AW: RTTI Enum von Propertys?
 
  1. Ich bin positiv überrascht dass die vom Helfer eingeführte Property erfasst werden kann
  2. Ich bin erstaunt überrascht wo auf einmal RefCount herkommt. Von TObject schonmal nicht

Sir Rufo 16. Jan 2015 19:51

AW: RTTI Enum von Propertys?
 
Das ist definitiv seltsam und da scheint auch irgendwas nicht zu passen
Delphi-Quellcode:
TObject = class
  public
  ...
{$IFDEF AUTOREFCOUNT}
  protected
{$ENDIF}
    destructor Destroy; virtual;

{$IFDEF CPP_ABI_SUPPORT}
    procedure CPP_ABI_1; virtual;
    procedure CPP_ABI_2; virtual;
    procedure CPP_ABI_3; virtual;
{$ENDIF !CPP_ABI_SUPPORT}

  protected
    function GetDisposed: Boolean; inline;
    procedure CheckDisposed; {$IFNDEF AUTOREFCOUNT} inline; {$ENDIF}

{$IFDEF AUTOREFCOUNT}
  private const
    objDestroyingFlag = Integer($80000000);
    objDisposedFlag = Integer($40000000);
  protected
    [Volatile] FRefCount: Integer;
    class procedure __MarkDestroying(const Obj); static; inline;
    class function __SetDisposed(const Obj): Boolean; static; inline;
  public
    property RefCount: Integer read FRefCount;
{$ENDIF}
    property Disposed: Boolean read GetDisposed;
  end;
Wenn man nur
Delphi-Quellcode:
TObject
abfragt, dann wird keine Eigenschaft gefunden, dabei hätte ich noch
Delphi-Quellcode:
Disposed
erwartet.
Ja und das
Delphi-Quellcode:
RefCount
kommt irgendwie da durch den
Delphi-Quellcode:
helper
rein (und soll angeblich
Delphi-Quellcode:
public
sein).

Stevie 16. Jan 2015 20:26

AW: RTTI Enum von Propertys?
 
Führ doch mal das hier aus, dann siehste, wo das her kommt ;)

Delphi-Quellcode:
rttiType := context.GetType(TypeInfo(TObjectHelper));
while Assigned(rttiType) do
begin
  Writeln(rttiType.ToString);
  rttiType := rttiType.BaseType;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 Uhr.
Seite 1 von 2  1 2      

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