Hallo Stahli,
zuerst mal Danke für deine Unetrstützung.
Delphi-Quellcode:
TBase = class
private
FNr: Integer;
FParentObject: TBase;
public
function FoundParentClass(aClassName: String): TBase;
function FoundParentItem(aItem: TBase): Boolen;
property Nr: Integer read FNr write FNr;
property ParentObject: TBase read FParentObject write FParentObject;
end;
function TBase.FoundParentItem(aItem: TBase): Boolen;
begin
Result := False;
if Assigned(ParentObject) then
begin
if (ParentObject = aItem) then
Exit(True);
Result := ParentObject.FoundParentItem(aItem);
end;
end;
Ich glaube ich weiß wo mein Denkfehler liegt. Ich hatte bei MessData1 als Parent weiterhin die Liste (FItems) eingetragen. Damit musste ich natürlich wieder durch diese Liste. Sobald ich aber sage MessData1.ParentObject := MessData1List mit MessDataList = TMessDataList =class(TBase) sollte es gehen.
Das ist aber auch nicht mein Vorschlag.
Ich weiß. Ich will nur verstehen und habe auch da mal mit meinem Ansatz weiter getestet.
Kannst Du mal ein
Unit hochladen, in der diese Klassen vollständig enthalten sind?
Es bräuchte ja keine
GUI vorhanden sein - nur eine kompilierbare
Unit. Dann könnte man (ich?) die mal entsprechend umbauen.
Der Code ist in 20 Jahren gewachsen und wir sind aktuell daran, ihn aufzuräumen. Noch aber sind viel zu viele Abhängigkeiten da. Wenn ich nicht weiter komme, versuche ich mal was zu extrahieren.
Ich hatte noch folgenden Ansatz:
Delphi-Quellcode:
TMyObjectList<T> = class(TObjectList<T>)
private
FParentObject: TBase;
public
property ParentObject: Integer read FParentObject write FParentObject;
end;
TBaseList = class(TMyObjectList<TBase>);
// Und die Suche nach einer bestimmten Klasse, z.B. TAnalysis
lObject := ParentObject;
repeat
if lObject is TAnalysis then // gefunden
Result := TAnalysis(lObject)
else if ParentObject is TBase then // Wenn TBase eine Klasse höher
lObject := TBase(lObject).ParentObject
else if ParentObject is TBaseList then // Wenn Liste eine Klasse höhr
lObject := TBaseList(lObject).ParentObject
else
lObject := nil;
until (Result <> nil) or (lObject = nil);
Der code
Delphi-Quellcode:
else if ParentObject is TBaseList then
lObject := TBaseList(lObject).ParentObject
funktioniert aber nicht nicht. Geht das irgendwie?