Einzelnen Beitrag anzeigen

Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#1

Ergebnis des geerbten Konstruktors verschwindet wieder

  Alt 24. Okt 2013, 09:42
Delphi-Version: 7
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?
Miniaturansicht angehängter Grafiken
unbenannt.png  
  Mit Zitat antworten Zitat