Thema: Delphi RTTI - Properties setzen

Einzelnen Beitrag anzeigen

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