AGB  ·  Datenschutz  ·  Impressum  







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

RTTI - Properties setzen

Ein Thema von GuenterS · begonnen am 27. Feb 2007 · letzter Beitrag vom 10. Apr 2007
Antwort Antwort
Seite 2 von 2     12   
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.438 Beiträge
 
Delphi 2007 Professional
 
#11

Re: RTTI - Properties setzen

  Alt 10. Apr 2007, 17:12
hmmm, kann mir nicht vorstellen, das es bei services anders sein sollte, da es reine delphi interne sache ist

Von welchem Objekt ist die Klasse abgeleitet?
Eventuell die compilerdirective {$M+} vor der ersten deklaration der klasse geben, damit auch die RTTI von der klasse reincompiliert wird (oder eben von TPersitant ableiten)
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: RTTI - Properties setzen

  Alt 10. Apr 2007, 17:36
Das mit dem Service war mein Fehler, hat damit eigentlich nichts zu tun, tritt genauso in der Applikation auf.

Konnte jetzt aber folgendes Phänomen beobachten.

Ich habe eine Klassenhirarchie die folgendermassen aussieht:
Delphi-Quellcode:
TBaseClass = class of TBasis;

TBasis = class(TObject)

TMitarbeiter = class(TBasis)
published
   property Name: string read FName write FName;
end;

TChef = class(TBasis)
published
   property Titel: string read FTitel write FTitel;
end;
all diese Klassen sind unter der Compilerdirektive {$M+} definiert (im SourceCode natürlich vollständiger).

Jetzt habe ich eine Prozedur in welcher eine Klassenname übergeben wird, aus welcher die entsprechenden Properties ausgelesen werden sollen. Diese schaut (gekürzt) folgendermassen aus:
Delphi-Quellcode:
procedure Synchronize(aClass: TBaseClass);
var
  lBasisClass: TBasis;
  lPropList: TPropList;
  i: integer;
begin
  lBasisClass := aClass.Create;

  GetPropList(lBasisClass.ClassInfo, tkProperties, @lPropList);

  i := 0;
  while ((lPropList[i] <> nil) and (i < high(lPropList))) do
  begin
    //Properties entsprechend setzen
     case PropType(lBasisClass , lPropList[i].Name) of
       tkInteger:
         SetOrdProp(lBasisClass , lPropList[i].Name, lQry.FieldByName(lPropList[i].Name).AsInteger);
       tkFloat:
         SetFloatProp(lBasisClass , lPropList[i].Name, lQry.FieldByName(lPropList[i].Name).AsFloat);
       tkString, tkLString:
         SetStrProp(lBasisClass , lPropList[i].Name, lQry.FieldByName(lPropList[i].Name).AsString);
     end;
     inc(i);
  end;
  lBasisClass.Free;
end;
Wenn ich diese Prozedur mit dem Parameter TMitarbeiter aufruf klappt alles. Beende ich das Programm und rufe die Prozedur mit Paramter TChef auf klappt auch alles. Rufe ich aber zuerst TMitarbeiter und dann TChef auf, ohne dazwischen das Programm zu beenden, findet er die Properties von TMitarbeiter. Dies funktioniert auch andersrum so.

Was könnte ich tun?
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#13

Re: RTTI - Properties setzen

  Alt 10. Apr 2007, 17:53
Mach mal den Konstruktor von TBasis virtuell.
Andernfalls wird bei lBasisClass := aClass.Create nicht der richtige Konstruktor aufgerufen.
Vergleiche das mal mit TComponent.Create. (Ab TComponent ist der Konstruktor virtuell)
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: RTTI - Properties setzen

  Alt 10. Apr 2007, 18:02
Das habe ich gemacht, allerdings ohne einen Erfolg zu erzielen. Die abgeleiteten Klassen haben allerdings keinen eigenen Konstruktor.

[Idee]
Diese Liste was ich da bekomme, ich vermute, dass die einfach nicht geleert wird durch das Holen der neuen Werte? Teste dies eben mal...
[/Idee]
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#15

Re: RTTI - Properties setzen

  Alt 10. Apr 2007, 18:15
Zitat von GuenterS:
das habe ich gemacht, allerdings ohne einen Erfolg zu erzielen.
War aber auch kein Fehler. Jetzt kannst du zunächst mal jeweils einen Konstruktor für TChef und TMitarbeiter schreiben und die Properties dort mal vorbelegen.
Delphi-Quellcode:
constructor TChef.Create; {override}
begin
   inherited;
   Titel := 'Oberboss, Stressmacher';
end;
Dann so weiter debuggen:
Delphi-Quellcode:
procedure Synchronize(aClass: TBaseClass);
var
  lBasisClass: TBasis;
  lPropList: TPropList;
  i: integer;
begin
  lBasisClass := aClass.Create;
  ShowMessage('lBasisClass =Class('+lBasisClass.Classname+')'); // Klassenname anzeigen
Mit der Anzeige von Classname kannst du überprüfen, ob auch das erzeugt Objekt auch wirklich
zu der gewünschten Klasse gehört.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: RTTI - Properties setzen

  Alt 10. Apr 2007, 18:18
der Classname als auch ClassType selber stimmt auch, ganz am anfang der Liste kommen die richtigen Properties, danach die falschen.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#17

Re: RTTI - Properties setzen

  Alt 10. Apr 2007, 18:29
Zitat von GuenterS:
ganz am anfang der Liste kommen die richtigen Properties, danach die falschen.
Ahhhhrrrrrrg!!
GetPropList() liefert die Anzahl der Properties zurück. Deine While-Schleife ist falsch.
Hier ist eine For-Schleife angebracht:
Delphi-Quellcode:
  prop_count := GetPropList(obj.ClassInfo, type_kinds, nil);
....
  for i := 0 to prop_count - 1 do
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: RTTI - Properties setzen

  Alt 10. Apr 2007, 18:33
danke
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 17:25 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