Autor Beitrag
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mi 11.08.04 08:37 
Hallo!

Ich habe gerade auf der Borland Website gelesen das mit der neuen Version des Compilers eine Neuerung bei den Schleifen ansteht: for-loop- oder auch for-each-Schleifen.

Die Neuerung klingt ganze Interessant. Vor allem solche Konstrukte wie
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  TRole = (worker, manager, executioner, CEO);
  TJobRoles = set of TRole;

procedure Demo3(const JobRoles: TJobRoles);
var
  R: TRole;
begin
  for R in JobRoles do
    // use R here;
end;

finde ich sehr praktisch.

Gruß
Tino
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 11.08.04 11:28 
Was isn´n los?

Delphi-Groups
DP 1, DP 2

Wahnsinn.
Und was meldet BILD stattdessen: "Waldi Hartmann gefeuert". Wie langweilig. :mrgreen:
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 11.08.04 20:48 
Wozu braucht mabn die??? In PHP mag die zwar ihre Berechtigung haben, aber mit ner For lässt sich das gleiche erreichen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TRole = (worker, manager, executioner, CEO);

procedure Demo3(const JobRoles: TJobRoles);
var
  R: TRole;
begin
  for R := Low(R) to High(R) do
    // use R here;
end;


Bei Arrays genauso... Gut, For R in TJobRoles ist ne Code-Ersparnis, aber so sieht man wenigstens, was er macht.

P.S.: Auf die Art kann man sogar angeben von wo bis wo er durchlaufen soll:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TRole = (worker, manager, executioner, CEO);

procedure Demo4(const JobRoles: TJobRoles);
var
  R: TRole;
begin
  for R := manager to executioner do
    // use R here;
end;

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 11.08.04 21:45 
BenBE hat folgendes geschrieben:
..., aber mit ner For lässt sich das gleiche erreichen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TRole = (worker, manager, executioner, CEO);

procedure Demo3(const JobRoles: TJobRoles);
var
  R: TRole;
begin
  for R := Low(R) to High(R) do
    // use R here;
end;


Nicht ganz. Hier geht er von worker bis CEO. Bei

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure Demo3(const JobRoles: TJobRoles);
var
  R: TRole;
begin
  for R in JobRoles do
    // use R here;
end;


macht er vielmehr das:

ausblenden Delphi-Quelltext
1:
2:
3:
 for R := Low(R) to High(R) do
  if R in JobRoles then
   // use R here;

Außerdem lässt sich das ganze ja auch bspw. auf TList anwenden:

ausblenden Delphi-Quelltext
1:
2:
for pointer in List.Items do
 ...


Besonders interessant wäre es natürlich wenn man auch gleich noch auf TXYZ casten könnte (kann man das?)
Tino Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 12.08.04 07:29 
obbschtkkuche hat folgendes geschrieben:
Besonders interessant wäre es natürlich wenn man auch gleich noch auf TXYZ casten könnte (kann man das?)

Was man mit de Pointer innerhalb der Schleife anstellt (casten) dürfter dieser wohl egal sein. Ich gehe also davon aus das es funktioniert.

Gruß
Tino
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 12.08.04 14:09 
Ich meinte gleich im Schleifenkopf:

ausblenden Delphi-Quelltext
1:
for blubb in TMeinObject(Liste.Items) do					
Tino Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 12.08.04 14:11 
obbschtkuche hat folgendes geschrieben:
Ich meinte gleich im Schleifenkopf:

Das ist doch dort noch gar nicht notwendig, oder?
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 12.08.04 14:15 
Dann könnte man aber zum Beispiel auch noch auf sowas verzichten:

ausblenden Delphi-Quelltext
1:
2:
3:
for blubb in liste.items do
 with TMeinObject(blubb) do
  ...
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 12.08.04 15:01 
obbschtkuche hat folgendes geschrieben:
Dann könnte man aber zum Beispiel auch noch auf sowas verzichten:

ausblenden Delphi-Quelltext
1:
2:
3:
for blubb in liste.items do
 with TMeinObject(blubb) do
  ...


in dem For-in konstrukt musst du ja aber explizit mit blubb arbeiten, da nützt es dir nix, wenn es vorher mal gecasted wurde. Viel mehr sinn würde es machen, wenn du blubb schon als TMeinObject deklariert hättest und einen filternden iterator benutzt.

_________________
mfg.
mâximôv
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Fr 13.08.04 10:37 
Sieht so aus als hättest du genau erkannt was ich will. ;-)

Ob ich da gleich noch einen Filter einbauen würde... nein. Vor allem wie? Ich könnte mir da höchstens sowas wie:

ausblenden Delphi-Quelltext
1:
for blubb in Liste.items where blubb is TObject do					


Vorstellen, weil

ausblenden Delphi-Quelltext
1:
for blubb in TFooBar(Liste.items) do					


Für einrn Cast gehalten wird. (Was auch alles ist was ich sagen wollte. TFooBar kannst Du hier auch von mir aus noch in integer umwandeln, wenn es dann klarer wird (Da ein pointer wenn ich mich recht erinnere automatisch nach TObject und nachfolger gecastet wird... :gruebel:). blubb ist dann aber auch natürlich vom Typ TFooBar)

Abgesehen davon ist ein (automatischer) Filter wohl kaum möglich, weil meine Liste garnicht weiß was in ihr ist. Wenn es eine Reine Object-Liste ist, wäre es ja möglich, aber mich hält ja nichts davon ab auch noch einfach einen integer dazuzuschmeißen. Und bei der oberen Variante mit "where" wäre ein if ... then übersichtlicher und nur minimal mehr platzverbrauchend.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Fr 13.08.04 16:11 
obbschtkuche hat folgendes geschrieben:
...
ausblenden Delphi-Quelltext
1:
for blubb in TFooBar(Liste.items) do					


Für einrn Cast gehalten wird. (Was auch alles ist was ich sagen wollte. TFooBar kannst Du hier auch von mir aus noch in integer umwandeln, wenn es dann klarer wird (Da ein pointer wenn ich mich recht erinnere automatisch nach TObject und nachfolger gecastet wird... :gruebel:). blubb ist dann aber auch natürlich vom Typ TFooBar)
...


Wenn hier TFooBar = integer wäre, dann würde nix mehr gehen, da der kompilirer anstatt einer, zu enumerierenden, liste einen integer vorfinden würde.

Danny hat es relativ deutlich ausgedrückt: ( homepages.borland.com/dthorpe/blog/delphi/ )
Danny Thorpe hat folgendes geschrieben:
for <variable> in <container expression> do <statement>;
...
<container> is an expression whose type 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.


Mit filter-iterator meinte ich eigentlich ein konkrete implementierung des INumerator interfaces, welches dann nur die elemente liefert, die deinen anforderungen genügen, sprich TMeinObjecte sind.

Oder wie darf ich mir das vorstellen? Letztendlich erhält man doch immer den typ von <variable> und man muss selbst zusehen ob der gültig, nil oder 'cast-bar' ist :wink:

_________________
mfg.
mâximôv
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Fr 13.08.04 20:31 
Lesen macht schlau ;-)

obbschtkuche hat folgendes geschrieben:
Besonders interessant wäre es natürlich wenn man auch gleich noch auf TXYZ casten könnte (kann man das?)


Ich habe nie behauptet dass es so genau so sein sollte, sondern nur dass ich es gut fände wenn es möglich wäre und gleich noch ein Beispiel gepostet habe wie ich es mir vorstellen könnte.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Sa 14.08.04 11:50 
obbschtkuche hat folgendes geschrieben:
Lesen macht schlau ;-)

obbschtkuche hat folgendes geschrieben:
Besonders interessant wäre es natürlich wenn man auch gleich noch auf TXYZ casten könnte (kann man das?)

...


Schuldige das ich deine beiträge von ganz oben nicht auswendig konnte. Ich hab doch auch nix gegenteiliges behauptet. Ich denke wie sich die neue syntax genau verhalten wird, werden wir erst wissen wenn wir sie benutzen können. Imo ist der aspekt mit den iteratoren aber viel wichtiger, da in delphi iteratoren (enumeratoren) in zukunft eine grössere rolle spielen dürften. Wenn das jetzt per syntax unterstützt wird, so ist das ein grosse freude *green*

_________________
mfg.
mâximôv