Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RTTI und EComponentError beim Auslesen der Eigenschaften (https://www.delphipraxis.net/197343-rtti-und-ecomponenterror-beim-auslesen-der-eigenschaften.html)

Whookie 31. Jul 2018 22:53

Delphi-Version: 5

RTTI und EComponentError beim Auslesen der Eigenschaften
 
Ich spiele gerade ein wenig mit dem RTTI und wollte alle Eigenschaften eines TForm ausgeben. Dabei bekomme ich bei der Eigenschaft 'ComObject' einen EComponentError mit der Medung 'TForm1' wurde nicht als COM-Klasse registriert.

Folgenden Code führe ich auf einer MainForm mit einem TMemo aus:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  ctx: TRttiContext;
  lty: TRttiType;
  lprops: TArray<TRttiProperty>;
  lprop: TRttiProperty;
  lval: TValue;
begin
  IntValue := 1234;
  StrValue := 'Hello world';
  //
  ctx := TRttiContext.Create;
  lty := ctx.GetType(ClassType);

  lprops := lty.GetProperties;
  for lprop in lprops do
  begin
    if lprop.IsReadable then
    begin

      lval := lprop.GetValue(Self); // EComponentError bei ComObject
      memo1.lines.Add(format('%s = %s', [lprop.Name, lval.ToString]));
    end
    else
      memo1.lines.Add(format('%s', [lprop.Name]));
  end;
  ctx.Free;
end;
Gibt es eine Möglichkeit den Fehler zu vermeiden, bzw. sollte lval nicht einfach (empty) zurückliefern?

Uwe Raabe 31. Jul 2018 23:33

AW: RTTI und EComponentError beim Auslesen der Eigenschaften
 
Zitat:

Zitat von Whookie (Beitrag 1409272)
Gibt es eine Möglichkeit den Fehler zu vermeiden, bzw. sollte lval nicht einfach (empty) zurückliefern?

Nur, wenn du das Property in Ruhe lässt. Der Getter wirft eine Exception bevor GetValue überhaupt zurückkehrt. Somit kann in lval auch nichts drin stehen.

Whookie 1. Aug 2018 20:49

AW: RTTI und EComponentError beim Auslesen der Eigenschaften
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1409274)
Nur, wenn du das Property in Ruhe lässt. Der Getter wirft eine Exception bevor GetValue überhaupt zurückkehrt. Somit kann in lval auch nichts drin stehen.

Danke, dann bleibt wohl nur ein
Delphi-Quellcode:
try/except
als Lösung übrig.


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