Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#1

for..in Schleifen: Wie in Win32 realisiert?

  Alt 26. Sep 2004, 20:04
Wie Danny Thorpe in seinem Blogbeitrag New For Loop Syntax beschreibt, John Kaster im BDNtv: Diamondback sneak peek zeigt und hier ua bereits im Thema for-each Schleife in Delphi diskutiert worden ist, soll Diamondback nun Schleifenkonstrukte der Art
for <variable> in <container expression> do <statement>; in Szenarien wie
Delphi-Quellcode:
type
  TMultiArray = array [0..10, 0..3, 0..9] of Integer;

procedure DemoMulti(const table: TMultiArray);
var
  X: Integer;
begin
  for X in table do
    Writeln(x);
end;
aber auch
Delphi-Quellcode:
procedure DemoTStrings(const AStrings: TStrings);
var
  S: string;
begin
  for S in AStrings do
    Writeln(S);
end;
unterstützen.

Während Danny bei Ordinaltypen und Arrays von speziell vom Compiler verarbeiteten, also CompilerMagic, spricht, schweigt sich John über die Realisierung von Klassen (hier: TStrings), die das neue For-Konstrukt unterstützen sollen, aus. Danny schreibt zwar, dass der Containerausdruck
Zitat von danny:
either implements the IEnumerable interface, or implements a pattern that the compiler recognizes as an enumerator, or is a type that the compiler recognizes as being a container of data items, such as an array
und spricht im letzten Fall offensichtlich von Fällen jener Übersetzungsmagie während der erste dem Ansatz in etwa der in Java-Tiger eingeführten Lösung zu entsprechend scheint- unklar hingegen bleibt mir die Aussage, dass
Zitat von Übersetzung der Aussage von Danny:
eine Klasse implementiert ein Muster, das der Compiler als Enumerator erkennt
Wird hier auf die Meta-Ebene gegangen und die Signatur von Methoden auf die Teilbegriffe "Count", "Item" oder sonstigen für Delphi typischen Bezeichnungen für Problemlösungen dieser Art geprüft? Hätte John in seinem Preview nicht explizit gezeigt, dass die Verarbeitung mit TStrings auch unter Win32 funktioniert und erwähnt, dass die VCL generell angepasst wird, um die neue For-Schleife zu unterstützen, hätte ich mich nicht weiter gewundert, nun jedoch stellt sich für mich folgendes Problem:

Mir ist unklar, wie eine Delphi-Win32-Klasse unter Verwendung der besherigen Referenzzählung ein bestimmtes Interface implementieren sollte und ein Objekt dieser Klasse in der oben beschriebenen Form aufgerufen werden kann, ohne dass ein Verringern des Referenzzählers nach Gebrauch auf null zu dessen Freigabe führt!
Beispiel:
Delphi-Quellcode:
var
  MyStrings: TStrings;
  S: string;
begin
  MyStrings := TStringList.Create;
  try
    //...
    for s in MyStrings do // use IEnumerable -> _AddRef
      Writeln(s);
  finally // leave scope of IEnumerable -> _Release -> .Destroy
    FreeAndNil(MyStrings); // tries to destroy object again!
  end;
Weiß jemand von Euch hierzu etwas genaueres und ist die Schnittstelle von IEnumerable bekannt?

Update: Titel des Themas
gruß, choose
  Mit Zitat antworten Zitat