Ich bin nicht sicher ob jetzt ein Teil meiner Anforderung verloren gegangen ist.
So wie TBase die Basisklasse für meine kommenden Objekte ist, sollte TBaseObjectList die Basisklasse für meine kommenden Listen sein
Eine der kommenden Klasse incl. Liste könnte dann so aussehen
Delphi-Quellcode:
// ***************************************************************************************************************************************
// Als Beispiel eine auf ein eigenes Property abgespeckte Klasse
TNamen = class(TBase)
private
FNamen: String;
procedure SetNamen(const Value: String);
public
property Namen: String read FNamen write SetNamen;
constructor Create;
destructor Destroy; override;
end;
// ***************************************************************************************************************************************
// Und die zu diesem Beispiel passen ObjectList
TNamenList<T: TNamen> = class(TBaseObjectList);
var
lNamenList: TNamenList;
Wenn ich es so definiere
TNamenList<T: TNamen> = class(TBaseObjectList)
sagt Delphi bei Zugriff auf
lNamenList[3].Namen
dass er Namen nicht kennt
Wenn ich es so definiere
TNamenList = TBaseObjectList<TNamen>;
sagt Delphi bei Zugriff auf
lNamen := lNamenList[3];
dass TNamen und TBase incompatibel sind.
Wenn ich per Typecast
lNamen := TNamen(lNamenList[3]);
auf die Liste zugreife funktioniert die Änderung von lNamen.Namen und die Liste wird korrekt auf Changed gesetzt. Eigentlich wollte ich aber ohne TypeCast auskommen, zumal es viele Zugriffe gibt die direkt auf
lNamenList[3].Namen
zugreifen. Und beim Beenden des Programms kommt weiterhin der EAccessViolation.
Das hier verstehe ich nicht ganz
Delphi-Quellcode:
TBaseObjectList = class(TObjectList<TBase>)
private
...
end;
TBaseObjectList<T: TBase> = class(TBaseObjectList);
Soll es wirklich zwei mal TBaseObjectList heißen?
Ich habe mal mein Testcode angehängt. Hängt vielleicht nur noch an einer Kleinigkeit