...Welche Unterschiede ergeben sich, ob ich THardwareList = class(TObjectList<THardwareBase>) oder THardwareList = class(TObjectList<TObject>) definiere?"...
Über die Elemente eine reinen TObjectList kannst du nicht ohne Cast weiter einfach nach innen per ".???" zugreifen.
Trotzdem würd ich als keine Vereinfachung in deinem Kontept die separate Listenklasse sparen und die Liste direkt in THardware aanlegen, also so:
Delphi-Quellcode:
THardware = class
Name : String;
HardwareList : TObjectList<THardwareBase>;
constructor Create;
destructor Destroy; override;
property Count:Integer read GetHardwareListCount;
property Value[idx:Integer]:THardwareBase read GetHardwareListValue; default;
end;
so tiefer Direktzugriff ist nie gut... und hier auch noch logisch falsch weil du kein Element von deiner "Hardwarelist" ausgewält hast!?
statt "Test.Testplan.Hardware.HardwareList[?].GetHardwarePower.Name" besser so allgemeines per Property in Hardware sicher lösen, wo es zur Vorabfrage auch einen Count gibt.
also
"if Test.Testplan.Hardware.HardwareList.Count>0 then Caption:=Test.Testplan.Hardware.HardwareList[0].Name"
oder besser wären CountProperty und ein virtuelles ArrayProperty(als "default") in THardware, so dass dann dies so funktioniert ala "Test.Testplan.Hardware.Count"
"if Test.Testplan.Hardware.Count>0 then Caption:=Test.Testplan.Hardware[0].Name"
Rein logisch sehe ich mit aktuellen Angaben auch noch keinen Grund für Test->Testplan.. ausser es kann/soll mal innerhalb eines Tests mehrere Testpläne geben?
Ich würde aber eher in Richtung Testplan->Tests denken, also das ein Testplan mehrere Tests beinhalten kann, dann würde ähnlich "THardware" TTestplan eine TObjecvtlist<TTest> bekommen und auch wieder eine Count und eine Arrayproperty...
"if (Testplan.Count>0) and (Testplan[0].Hardware.Count>0) then Caption:=Testplan[0].Hardware[0].Name"
...das sähe dann für mich schon viele schöner und praktischer aus und du sparst dir die Assigned-Kette weil es ist immer bis zur Liste alles vorhanden(legt man im "contruktor" an und gibt es im "destruktor" frei), nur ob Elemente in der Liste ist per ".count" zu prüfen wenn direkt auf ein Element zugegriffen werden soll.
...bei Zugriffen auf undefinierte Elemente kannst du so selbst entscheiden kontrolliert eine Exeption zu werfen, oder per eigenem Defaultelement für undefined/outofrange eine gültig Standardrückgabe erzeugen.