Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. ;-)

www.delphipraxis.net...mit-templates.html#2

Für diesen Beitrag haben gedankt: Bergmann89
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 04.03.11 07:22 
Nebenbei ist das Schöne, dass du das dann nahtlos mit echten typisierten Listen verwenden kannst später.
ausblenden 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;