Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Auslesen von Properties mittels RTTI (https://www.delphipraxis.net/71988-auslesen-von-properties-mittels-rtti.html)

StefanG 23. Jun 2006 10:08


Auslesen von Properties mittels RTTI
 
Hallo, ich habe ein Problem mit der RTTI.

Ich habe eine Klasse (in einer Extra Unit), die eine ganze Menge Properties hat (Boolean)
Diese Properties geben an, ob eine Bestimmte Lizenz vorhanden ist oder nicht.

In einer Datenbank gibt es 4 Felder :

Der Name der Lizenz und 3 weitere Felder, die zusammengesetzt den Namen der Property widergeben.
Die Klasse sieht etwa so aus

Delphi-Quellcode:
type
   TLizenzen = class(TObject)
   private
     FM110100      : Boolean;
     FM110120      : Boolean;
     FM110140      : Boolean;
     FM110200      : Boolean;
   public
     constructor Create(Dir: String); overload;
     constructor Create(DS: TDataset); overload;                  
   published
     property M110100      : Boolean    Read FM110100      Write FM110100;
     property M110120      : Boolean    Read FM110120      Write FM110120;
     property M110140      : Boolean    Read FM110140      Write FM110140;
     property M110200      : Boolean    Read FM110200      Write FM110200;
   end;
(unwichtige Sachen jetzt mal weggelassen, es sind in Wirklichkeit auch viel mehr Properties die aber alle gleich aussehen)

Das erste Feld, also der Lizenzname wird in einer Liste angezeigt, woraus man dann verschiedene auswählen kann.
Jetzt will ich überprüfen, ob die Lizenzen vorhanden sind. Dazu baue ich also die anderen 3 Felder zum Lizenznamen zusammen.

Das Problem ist jetzt, dass ich die Property nicht vernünftig abfragen kann.

In der Unit TypInfo gibt es eine Funktion GetOrdProp. Somit sollte ich mit

Delphi-Quellcode:
  ...
  result := GetOrdProp(LizenzObj,'M110100') <> 0;
die Property auslesen können, es kommt aber immer die Meldung "Eigenschaft M110100 existiert nicht.
GetOrdProp(Form1,'visible') z.b. funktioniert aber so.

Beim einlesen habe ich gesehen, dass die Funktion nur Published properties auslesen kann, was sie ja jetzt auch sind,
allerdings gibt auch die Funktion IsPublishedProp(LizenzObj,'M110100') False zurück.

Habe ich irgendwas übersehen oder geht es vielleicht doch ganz anders?

NicoDE 23. Jun 2006 10:14

Re: Auslesen von Properties mittels RTTI
 
Zitat:

Zitat von StefanG
Habe ich irgendwas übersehen oder geht es vielleicht doch ganz anders?

Versuch's mit
Delphi-Quellcode:
{$TYPEINFO ON}
bzw
Delphi-Quellcode:
{$M+}
vor der Definition der Klasse.

StefanG 23. Jun 2006 10:20

Re: Auslesen von Properties mittels RTTI
 
Argh...ich wusste ich hatte es irgendwann schonmal hinbekommen....da hatte ichs auch mit TypeInfo gemacht....thx nico ich werds mal testen

EDIT : Ok so funktionierts jetzt, vielen Dank nochmal

Hawkeye219 23. Jun 2006 10:41

Re: Auslesen von Properties mittels RTTI
 
Hallo,

muß es unbedingt RTTI sein? Vielleicht kann man das Problem auch mit einer Array-Property lösen:

Delphi-Quellcode:
type
   TLizenzen = class (TObject)
   private
     FID : TStringList;
     function GetLizenz (const ID: string): Boolean;
     procedure SetLizenz (const ID: string; Value: Boolean);
   public
     constructor Create;
     destructor Destroy;
       override;
     property Lizenz [const ID: string]: Boolean
       read GetLizenz write SetLizenz; default;
   end;

constructor TLizenzen.Create;
begin
  inherited;
  FID := TStringList.Create;
  FID.Sorted := True;
  FID.Add('M110100');
  FID.Add('M110120');
  FID.Add('M110140');
  FID.Add('M110200');
end;

destructor TLizenzen.Destroy;
begin
  FID.Free;
  inherited;
end;

function TLizenzen.GetLizenz (const ID: string): Boolean;
  var index : Integer;
begin
  index := FID.IndexOf(ID);
  Result := (index >= 0) and Assigned(FID.Objects[index]);
end;

procedure TLizenzen.SetLizenz (const ID: string; Value: Boolean);
  var index : Integer;
begin
  index := FID.IndexOf(ID);
  if (index >= 0) then
    FID.Objects[index] := Pointer(Ord(Value));
end;

procedure TestLIC;
  var LIC : TLizenzen;
      Flag : Boolean;
begin
  LIC := TLizenzen.Create;

  Flag := LIC['Hallo'];

  LIC['M110140'] := True;
  Flag := LIC['M110140'];

  LIC['M110140'] := False;
  Flag := LIC['M110140'];

  LIC.Free;
end;
Gruß Hawkeye

StefanG 23. Jun 2006 10:52

Re: Auslesen von Properties mittels RTTI
 
wäre im Grunde auch eine Möglichkeit gewesen, aber ich darf die Klasse hier leider nicht so umfassend ändern.


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