Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Parametisierter Typecast


Bergmann89 - Do 03.03.11 23:35
Titel: Parametisierter Typecast
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.


jaenicke - Do 03.03.11 23:44

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Da mein D7 aber noch keine typisierten Listen kann
Du kannst aber einfach Include-Dateien verwenden. Dann ist das Ergebnis ähnlich. ;-)

http://www.delphipraxis.net/48006-tobjectlist-descendant-mit-templates.html#2


Bergmann89 - 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.


jaenicke - 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. :lol:

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 - Fr 04.03.11 06:41

:shock: 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


jaenicke - 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;