Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zum Indexer - Verständnisprobleme (https://www.delphipraxis.net/124064-frage-zum-indexer-verstaendnisprobleme.html)

tomsson74 13. Nov 2008 22:44


Frage zum Indexer - Verständnisprobleme
 
Frage zum Indexer - Verständnisprobleme

Hallo zusammen

in einer TObjectList speichere ich besitmmte Objekte. Damit ich nicht beim Zugriff auf diese Liste nicht jedes mal ein Typecast machen muss, habe ich die Setter- und Getter-Methode so überlagert, dass sie direkt das richtige Objekt liefert.

Delphi-Quellcode:
   TODBCTableList = class(TObjectList)
   private
     function GetItem(AIndex: Integer): TODBCTable;
     procedure SetItem(AIndex: Integer; AValue: TODBCTable);
   public
     property Items[AIndex : Integer]: TODBCTable read GetItem write SetItem;
   end;

(...)

   function TODBCTableList.GetItem(AIndex: Integer): TODBCTable;
   begin
     Result := TODBCTable(inherited Items[AIndex]);
   end;

   procedure TODBCTableList.SetItem(AIndex: Integer; AValue: TODBCTable);
   begin
     inherited Items[AIndex] := AValue;
   end;
Jetzt kann ich mit einer for schleife auf die Objekte zugreifen (angenommen, meine Klasse hätte die Variablen "Name" und "Bezeichnung"):

Delphi-Quellcode:
Tables := TODBCTableList.Create;

(...) // "Tables" füllen

for I := 0 to Tables.Count - 1 do begin
   Memo1.Lines.Add(Tables.Items[I].Name);
   Memo1.Lines.Add(Tables.Items[I].Bezeichnung);
end;
Und jetzt kommt meine Frage. Eher zufällig bin ich drauf gekommen, dass man statt

Delphi-Quellcode:
Tables.Items[I].Name
auch

Delphi-Quellcode:
TODBCTable(Tables[I]).Name
schreiben kann, also ohne den "Umweg" über "Items" nehmen zu müssen.
Warum geht das ? Das sieht aus wie eine art namenloser Indexer. Ich habe mir die Klasse TObjectList als auch TList (von der TObjectList abgeleitet wurde) angeschaut und natürlich nichts derartiges gefunden.

Aber wenn es schon so funktioniert, kann ich dann dafür auch "meinen" Objekt-Typ als Rückgabewert erzwingen, damit ich auch die gekürzte Schreibweise ohne Typecast nutzen kann ?

Delphi-Quellcode:
Tables[I].Name

Sir Rufo 13. Nov 2008 22:47

Re: Frage zum Indexer - Verständnisprobleme
 
Sollte doch gehen,

schau doch mal deine definition an
Delphi-Quellcode:
property Items[AIndex : Integer]: TODBCTable
cu

Oliver

tomsson74 13. Nov 2008 23:03

Re: Frage zum Indexer - Verständnisprobleme
 
Ja, der Rückgabewert ist ja auch ein TODBCTable-Objekt, wenn ich über "Items" gehe. Aber das ist ja nicht mein Problem.

Die Definition

Delphi-Quellcode:
property Items[AIndex : Integer]: TODBCTable
sagt doch aus, dass ich

Delphi-Quellcode:
TODBCTableList.Items[Index]
schreiben muss, um als Rückgabewert ein TODBCTable-Objekt zu erhalten.

Ich würde aber gerne

Delphi-Quellcode:
TODBCTableList[Index]
schreiben.

Das funkioniert aber nur mit Typecast, also so:

Delphi-Quellcode:
TODBCTable(TODBCTableList[Index])
/Thomas

Andreas L. 13. Nov 2008 23:32

Re: Frage zum Indexer - Verständnisprobleme
 
Zitat:

Ich würde aber gerne

Delphi-Quellcode: markieren
TODBCTableList[Index]


schreiben.
Einfach default der Eigenschaftsdefinition anhängen:

Delphi-Quellcode:
property Items[AIndex : Integer]: TODBCTable read GetItem write SetItem; default;

tomsson74 14. Nov 2008 06:45

Re: Frage zum Indexer - Verständnisprobleme
 
Mensch, da tippe ich soviel Text und die Antwort ist dann ein Einzeiler :D

Danke, so klappt es wunderbar - wieder mal was dazu gelernt.

Damit ist die Frage beantwortet.


/Thomas

Andreas L. 14. Nov 2008 13:18

Re: Frage zum Indexer - Verständnisprobleme
 
Zitat:

Zitat von tomsson74

Danke, so klappt es wunderbar - wieder mal was dazu gelernt.

Gerne :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz