Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Interface Listen (https://www.delphipraxis.net/155057-interface-listen.html)

kaju74 6. Okt 2010 15:43

Delphi-Version: 2010

Interface Listen
 
Hallo.

Ich versuche gerade ein internen Firmen-Tool (D7) zu modernisieren, dass automatisch eine Persistenzschicht aus
Objekt-Listen anhand einer Konfigurationsdatei erzeugt. Dazu wurde - klassisch - auf TCollection und
TCollectionItem zurückgegriffen, um Objektlisten abzubilden. Beispiel:

Delphi-Quellcode:
TItem = class(TCollectionItem)
  <Deklaration der Eigenschaften & Methoden>
end;

TItems = class(TCollection)
  <Implemntierung der Add/Delete/... Methoden>
end;
Nun möchte ich u.a. die neuen Sprachfeatures von D2010 nutzen und bei dieser Gelegenheit auf Interfaces setzen:

Delphi-Quellcode:
IItem = interface(...)
bzw.

Delphi-Quellcode:
IItems = interface(...)
D.h: Über eine Instanz von IItems möchte ich auf die einzelen Item-Elemente via "for each" zugreifen. Soweit ich
das verstanden habe, muss ich dazu spezielle Enumeratable-Klassen in der Implementierung benutzen (GetNext, Move...).

Irgendwie finde ich aber keine passenden Beispiele, die das mal ganz einfach veranschaulichen, was ich da wie und
wo überschreiben bzw. von welchen Interfaces und Klassen ich da ableiten muss.

Kann mir da einer auf die Sprünge helfen?

Vielen lieben Dank,
Marc

rollstuhlfahrer 6. Okt 2010 16:12

AW: Interface Listen
 
Interfaces in Delphi sind keine aktiven Komponenten. Soll heißen: Ein Objekt kann genauso ohne ein dazugehöriges Interface funktionieren. Das Interface gibt nur an, welche Funktionen (Methoden/Prozeduren/Funktionen) ein Objekt haben muss. So kannst du verschiedenste Objektklassen an eine bestimmte Funktion übergeben. Es müssen lediglich die im Interface genannten Funktionen vorhanden sein.

Wenn du jetzt alle Objekte durchgehen willst, empfiehlt sich eine TObjectList, in die du alle Objekte reinschreibst.

Bernhard

kaju74 6. Okt 2010 16:27

AW: Interface Listen
 
Hi..

Ja, aber Interfaces...

a) ...dienen u.a. der Beschreibung der (implementierten) Methoden
b) ...werden beim Verlassen des Scopes (je nach Deklaration) automatisch freigegeben

Daher sollten es schon Interfaces sein. Die Frage ist nur, von welchen Interfaces mal
ableitet um eine Enumeration durch die neuen Sprachfeatures zu erhalten.

Gruß,
Marc

rollstuhlfahrer 6. Okt 2010 17:01

AW: Interface Listen
 
gibt es denn keine TInterfaceList??

Bernhard

kaju74 7. Okt 2010 11:10

AW: Interface Listen
 
Hallo.

Das schon, aber dessen Verwendung verstehe ich nicht, da ich ja irgendwelche Methoden überschreiben muss, um via "for each" darauf zugreifen zu können. Wie ich das verstehe, muss ich irgendwelche Enumerator-Ableitungen machen, die dann pro Typ das entsprechende Interface entsprechend Typecastet...hmmm...naja, ich probier's dann mal irgendwie hinzukriegen....thx.

Gruß,
Marc

mjustin 7. Okt 2010 11:23

AW: Interface Listen
 
Zitat:

Zitat von kaju74 (Beitrag 1054272)
Hallo.

Das schon, aber dessen Verwendung verstehe ich nicht, da ich ja irgendwelche Methoden überschreiben muss, um via "for each" darauf zugreifen zu können. Wie ich das verstehe, muss ich irgendwelche Enumerator-Ableitungen machen, die dann pro Typ das entsprechende Interface entsprechend Typecastet...hmmm...naja, ich probier's dann mal irgendwie hinzukriegen....thx.

Gruß,
Marc

Mit Generics ginge es theoretisch (Code kompiliert in Delphi 2009, aber ungetestet!):

Delphi-Quellcode:
program Project14;

{$APPTYPE CONSOLE}

uses
  Generics.Collections;

type
  MyInterface = interface
  procedure SayHello;
  end;

  InterfaceList = TList<MyInterface>;
var
  IL: InterfaceList;
  I: MyInterface;

begin
  IL := InterfaceList.Create;

  for I in IL do
  begin
    I.SayHello;
  end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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