AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Alle Controls mit FOR-IN durchlaufen?

Ein Thema von Sharky · begonnen am 5. Jun 2005 · letzter Beitrag vom 5. Jun 2005
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#11

Re: Alle Controls mit FOR-IN durchlaufen?

  Alt 5. Jun 2005, 11:07
Hallo marabu,

der Grund ist wahrscheinlich der fehlende Enumerator. sakura hat mal ein gutes Beispiel gepostet, wie man diese Funktionalitaet nachtraeglich noch einbauen kann: zum Beitrag
In Delphi 7 gibt es das for-in-do-Konstrukt leider nicht, also wirst du dort immer noch auf die "alte" Variante mit Laufvariablen zurueckgreifen muessen, ausser du baust dir irgendwie einen Enumerator rein, und machst manuell das, was der Delphi-Compiler fuer dich reinschreibt:
Delphi-Quellcode:
with SomeCollection.GetIEnumerator() do
begin
  while MoveNext() do
  begin
    Current.SomeProperty := SomeValue;
  end;
end;
Am Ende ist es das, was der Compiler aus deiner for-in-do-Schleife macht. Der einzige Unterschied ist hier die Verwendung von GetIEnumerator anstatt GetEnumerator in Delphi 2005. Warum das so ist, weiss ich im Moment auch nicht

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#12

Re: Alle Controls mit FOR-IN durchlaufen?

  Alt 5. Jun 2005, 12:26
Hallo alcaeus,

danke für deinen Hinweis. Habe nochmal etwas genauer in die Online-Hilfe geschaut. Nach meinem jetzigen Kenntnisstand ist da ein Unterschied zwischen methoden-gestützter Iteration und dem Sprachmittel FOR-IN, denn laut OH D2005 ist folgendes möglich:

Delphi-Quellcode:
var
  i: integer;
  ai: array of integer;
begin
  sum := 0;
  for i in ai do
    Inc(sum, i);
end;
Da ist doch bestimmt kein Enumerator im Spiel, oder? Das müsste der Compiler doch einfach so schaffen! Und dass der Compiler Panel1.Controls nicht als ArrayAusdruck akzeptiert, liegt wohl wirklich daran, dass es sich um eine Array Property handelt - worauf mirage228 schon eingangs hinwies. Da der Zugriff über eine Funktion mit dem Parameter index geschieht, kann sich alles und nichts hinter dieser array property verbergen, z.B. auch sowas:

Delphi-Quellcode:
function GetArrayItem(index: integer): integer;
begin
  if index < 2
    then Result := index
    else Result := GetArrayItem(Pred(index)) + index;
end;
Danke an alle die zu meiner Erleuchtung beigetragen haben.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#13

Re: Alle Controls mit FOR-IN durchlaufen?

  Alt 5. Jun 2005, 12:27
Zitat von marabu:
Lasst mich nicht dumm sterben. Ich arbeite noch mit D7. Warum kann das FOR-IN-Konstrukt für Components verwendet werden, aber nicht für Controls? Warum nicht für Arrays? Waldteufel hat mir eben in der Online-Hilfe von D2005 gezeigt, dass FOR-IN mit ArrayExpr, StringExpr, SetExpr und CollectionExpr funktionieren soll. Warum also nicht mit einem Controls-Array? Ist da ein Fehler in der Dokumentation?

marabu
Hi marabu!

TComponent implementiert die Methode "GetEnumerator", welche für das FOR..IN benötigt wird, nur für die Components Eigenschaft (welche im Übrigen kein Array, sondern eine Liste (TList) ist). Die .Controls Eigenschaft kann nicht mit for..in durchlaufen werden, da es sich nicht um ein Array im eigentlichen Sinne handelt, sondern um eine Array-Eigenschaft ("array property"). Mit "normalen" Arrays, sowie auch mit TList selbst, funktioniert FOR..IN wie gewünscht.

mfG
mirage228

Edit: Schon wieder kein roter Kasten
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#14

Re: Alle Controls mit FOR-IN durchlaufen?

  Alt 5. Jun 2005, 12:33
Hallo David,

danke nochmal - ich denke ich habe das jetzt soweit durchdrungen, wie ich es mit D7 durchdringen muss. Vielleicht installiere ich irgendwann auch mal die D2005 PE.

marabu
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#15

Re: Alle Controls mit FOR-IN durchlaufen?

  Alt 5. Jun 2005, 14:14
Irgendwas geht hier nicht mit rechten Dingen zu...

Um "for in" anwenden zu können, brauche ich eine Instanz einer Klasse, die eine funktion GetEnumerator besitzt, welche eine Instanz einer Klasse liefert, die MoveNext, Current und GetCurrent besitzt.
Richtig bisher, oder?

Die Wurzel allen Übels wäre wohl diese Klassen:
Delphi-Quellcode:
type
   TControlEnumerator = class
   protected
      function getOwner: TWinControl;virtual;abstract;
      function getPosition: Integer;virtual;abstract;
      property Owner :TWinControl read getOwner;
      property Position :Integer read getPosition;
   public
      function getCurrent :TControl; virtual;abstract;
      function MoveNext :Boolean; virtual;abstract;
      property Current :TControl read getCurrent;
   end;

   IControlIterator = interface
      function getOwner :TWinControl;
      function GetEnumerator :TControlEnumerator;
      property Owner :TWinControl read getOwner;
   end;

   TControlIterator = class(TInterfacedObject)
   public
      class function GetInstance(aOwner :TWinControl) :IControlIterator;overload;
      class function GetInstance(aOwner :TWinControl;
                               aControlClass :TControlClass) :IControlIterator; overload;
   end;
Der Enum ist abstrakt, da ich in der Unit alle Klassen habe, die nach außen hin benötigt werden.
Deshalb sollte hier IMHO keinerlei Funktionalität reinquetscht werden. (bis auf die Factories...)

Das hier funktioniert sowohl in D7 als auch in D2005:
Delphi-Quellcode:
with TControlIterator.GetInstance(self, TButton).GetEnumerator do
   while MoveNext do
      ListBox1.Items.Add(Current.Name);
Das hier kompiliert zwar in D2005...
Delphi-Quellcode:
for Control in TControlIterator.GetInstance(self, TButton) do
   ListBox1.Items.Add(Control.Name);
...aber er springt zur deklaration von MoveNext in TControlEnumerator und sagt mir "abstract error..."
Haben wir heute den ersten April und ich hab's verpasst?
Wer mal in den angehängten Code schaut dürfte sofort sehen, dass ich eine Instanz des Enums zurückgebe, deren Klasse MoveNext überschreibt...

Ich habe jetzt eine Weile rumgedoktort, aber egal was man versucht: D2005 scheint sich stupide und fix auf die Methoden der Klasse zu stürzen, die GetEnumerator liefert. Ohne auch nur daran zu denken, dass sie überschrieben sein könnten.

Sorry Sharky, ich hab's versucht, aber das ist mir auf Dauer einfach zu doof...
Wie gesagt, ich habe den Code angehängt. Wer was draus machen will: be my guest...
Angehängte Dateien
Dateityp: zip controliterator_757.zip (3,1 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Alle Controls mit FOR-IN durchlaufen?

  Alt 5. Jun 2005, 14:57
Zitat von Robert_G:
... Sorry Sharky, ich hab's versucht, aber das ist mir auf Dauer einfach zu doof...
Dafür braust Du dich jetzt ja nicht zu entschuldigen!

So wie ich es sehe werde ich auf FOR-IN grundsätzlich verzichten.
Wenn ich erst versuchen muss ob es für den gerade notwendigen Zweck einen Enumerator gibt ist das alles nichts anderes als ein weiterer Marketing-Gack
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 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