ich habe ein sehr ungewöhnliches Problem:
Einige Klassen, die aufeinander aufgebaut sind:
TBase <- TEditable <- TTriggerBase <- [TTriggerA, TTriggerB]
TTriggerA wird in einem Projekt verwendet und alles läuft gut.
TTriggerB wird in einem anderen Projekt verwendet, da tritt folgendes Verhalten auf:
Der Konstruktor von TTriggerBase füllt die Daten-Member, bei der Rückkehr zum Konstruktor von TriggerB werden diese Inhalte wieder gelöscht.
Zur Lokalisierung des Fehlers habe ich eine statische Variable 'beingCreated: ' angelegt, die eine Referenz auf das konstruierte Objekt trägt.
Steppt man nun durch die Konstruktoren, so fällt auf, dass sich zwar die Werte in self ändern, nicht aber die in 'beingCreated'. Dies gilt aber nur für die Werte in der Ebene TTriggerBase. Die Werte der Vorfahren TBase und TEditable erscheinen über beide Referenzen (s. Bild).
Delphi-Quellcode:
constructor TBase.Create();
begin
inherited Create();
Inc(g_ObjectId);
m_objId := g_ObjectId;
m_Version := 1;
end;
constructor TEditable.Create();
begin
inherited Create();
m_IsModified := false;
end;
constructor TTriggerBase.Create(id: Integer; name: String; wait: single;
bCombineAll: Boolean; fehlerAktion: Integer);
begin
inherited Create();
m_TriggerID := id;
m_Name := name;
m_Timeout := wait;
m_CombineAll := bCombineAll;
m_FehlerAktion := fehlerAktion;
m_Conditions := TObjectList.Create(false);
m_Checks := TObjectList.Create(false);
m_Nachfolger := TObjectList.Create(false);
m_Vorgaenger := nil;
end; // <<=== s. Grafik
constructor TTriggerA.Create(id: Integer; name: String; wait: single;
bCombineAll: Boolean; fehlerAktion: Integer);
begin
inherited Create(id, name, wait, bCombineAll, fehlerAktion);
m_TimeActivated := 0;
m_TimeTriggered := 0;
m_isLogged := false;
end;
var beingCreated: TTriggerB;
constructor TTriggerB.Create(id: Integer; name: String; wait: single;
bCombineAll: Boolean; fehlerAktion: Integer);
begin
beingCreated := self;
inherited Create(id, name, wait, bCombineAll, fehlerAktion);
m_XPosition := 0;
m_TimeTriggered := 0;
m_DeletedObjects := TObjectList.Create(false);
m_AddedObjects := TObjectList.Create(false);
end;
Hat jemand eine Idee, woran das liegen könnte und (vor allem) wie man das Verhalten korrigieren kann?