Autor |
Beitrag |
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Do 03.03.11 23:35
Hey,
ich schreib gerade an einer Anwendung, bei der ich viele Instanzen von verschiedenen Objekten in je einer Liste verwalten muss/will. Da mein D7 aber noch keine typisierten Listen kann, und ich nit jedesmal day TObjekt casten will, welches mit die TObjectList zurückgibt, wollte ich mir eigene Klassen schreiben, die von TObjectList abgeleitet sind. Da schreib ich aber auch irgendwie immer das gleiche, nur das ich da nen anderen Typcast drin hab. Also hatte ich folgende Idee:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| function TMyList.Get(Index: Integer): TMyType; var ClassType: TClass; begin ClassType := TMyType; result := (fList[Index] as ClassType); end; |
das funktioniert aber leider nicht. Gibt es eine Möglichkeit, das so ähnlich zu realisieren? Weil dann kann ich eine Klasse für die Liste schreiben, in der alle abgeleiteten Klassen einfach den gespeicherten Typ in einer Variable speichern und der Cast erfolgt dann einfach wieder über die Superklasse.
€: ich glaub ich hab da grad nen Denkfehler drin. ich muss ja bei der Methode trotzdem noch den Typ des Rückgabewertes angeben -.- Warum kann D7 noch keine typisierten Listen
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 03.03.11 23:44
Für diesen Beitrag haben gedankt: Bergmann89
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Fr 04.03.11 00:04
Ah super, das funktioniert. Jetzt hab ich aber alle meine Liste in einer Klasse. Und er meckert rum, wenn ich _TObjectListItem nochmal definieren will (is ja klar). Kann ich das auch noch irgendwie umgehen oder muss ich pro Liste eine eigene Unit anlegen?
€: OK habs alles in Units ausgelagert. Ich hab zwar jetzt ca. 10 Units wo nur sowas drin steht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| unit uglslFunctionList;
interface
uses Classes, uglslObjects, uUtils, Contnrs, uglslFunction;
type TglslObjectListItem = TglslFunction; {$I glslObjectListTemplate.pas} TglslFunctionList = class(TglslObjectlist) end;
implementation
{$I glslObjectListTemplate.pas}
end. |
aber es ist trotzdem wesentlich übersichtlicher und platzsparender als vorher. Nochma Danke
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 04.03.11 06:35
Eigene Units sind am sinnvollsten, ja. Ich selbst habe eine Template-Datei, die mehrere typisierte Listen unterstützt, gebastelt. (Und auch mehr Methoden von TObjectList überschreibt.)
Das geht, indem du ein zusätzliche defines einführst, mit denen du unterscheidest welche Liste gerade eingebunden werden soll. In der Template-Datei sieht es dann aber aus wie Kraut und Rüben.
Beispiel: Delphi-Quelltext 1: 2: 3: 4: 5:
| {$ifdef ObjectList1}TTypedObjectListTemplate1 {$else}{$ifdef ObjectList2}TTypedObjectListTemplate2 {$else}{$ifdef ObjectList3}TTypedObjectListTemplate3 {$else}{$ifdef ObjectList4}TTypedObjectListTemplate4 {$else}TTypedObjectListTemplate{$endif}{$endif}{$endif}{$endif} = class; | Dazu habe ich dann noch solche Sachen gemacht wie Standardroutinen wie Disconnect oder so bei allen aufzurufen, wenn es das gibt. Alles über zusätzliche Defines.
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Fr 04.03.11 06:41
 Okay, da bleib ich lieber bei mehreren Units. Bischen Code kommt ja bei den abgeleiteten Klassen noch dazu, also sieht es nich mehr ganz so leer aus ^^
MfG Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 04.03.11 07:22
Nebenbei ist das Schöne, dass du das dann nahtlos mit echten typisierten Listen verwenden kannst später. Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| {$ifdef DELPHI2009_OR_HIGHER} TMyBeautifulList = TObjectList<TMyBeautifulClass>; {$else} _TObjectListItem = TMyBeautifulClass; {$I templateTListU.pas} TMyBeautifulList = class(_TObjectList) {$endif} private public end; |
|
|
|