Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schleife für Klassennamen (https://www.delphipraxis.net/80014-schleife-fuer-klassennamen.html)

Jibiel 1. Nov 2006 15:48


Schleife für Klassennamen
 
Hallo :>
Ich habe ein Projekt angefangen, bei dem Schneeflocken vorkommen. Dafür habe ich die Klasse TSchnee erstellt.
Da es sich natürlich um sehr viele Schneeflocken handeln wird, ist dieser Quellcode sehr ungünstig, da ich für jede Schneeflocke je eine Zeile brauche. In der folgenden Prozedur versuche ich die Prozedur TSchnee.Zeichnen aufzurufen:

Delphi-Quellcode:
procedure TMain.SchneeTimer(Sender: TObject);
begin

Schnee.Interval := 50;

Schnee1.Zeichnen;
Schnee2.Zeichnen;
Schnee3.Zeichnen;
Schnee4.Zeichnen;
end;
Deshalb möchte ich eine Schleife benutzen, um die endlose Schreiberei zu vermeiden:

Delphi-Quellcode:
procedure TMain.SchneeTimer(Sender: TObject);
var i: integer, Flocke : TObject;
begin

Schnee.Interval := 50;

for i:= 1 to 4 do
begin
Flocke := 'Schnee'+inttostr(1);
Flocke.Zeichnen;
end;
Das kann nur leider nicht funktionieren, da die Variable Flocke ein TObject ist und einen String zugewiesen bekommt. Fällt euch eine Lösung ein?

Vielen Dank im voraus :>

Jibi

Neutral General 1. Nov 2006 15:50

Re: Schleife für Klassennamen
 
Delphi-Quellcode:
var Schnee: Array of TSchnee;

for i:= 0 to High(Schnee) do
begin
 //ka
end;
Ich würds mit nem Array machen... :)

Gruß
Neutral General

hoika 1. Nov 2006 15:52

Re: Schleife für Klassennamen
 
Hallo,

ich würde TList benutzen.
Die hat den Vorteil, das sie automatisch grösser wird.


Heiko

mkinzler 1. Nov 2006 16:09

Re: Schleife für Klassennamen
 
Im Normalfall sollte ein dynamischer Array, wie in Neutral General vorgeschlagen hat ausreichen. Ihn kann man durch SetLength auch in der Größe anpassen.

Nur zu Vollständigkeit und nicht als Ratschlag:

Delphi-Quellcode:
for i:= 1 to 4 do
begin
    Form.FindComponent('Schnee'+inttostr(i) as TSchnee).Zeichnen;
end;

Flare 1. Nov 2006 16:29

Re: Schleife für Klassennamen
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
for i:= 1 to 4 do
begin
    Form.FindComponent('Schnee'+inttostr(i) as TSchnee).Zeichnen;
end;

Und was ist, wenn Schnee keine Komponente ist? Immerhin geht es aus dem Codebeispiel nicht heraus ob es eine Komponente auf der Form ist oder nicht...


Flare

//Edit: Geschlechtsneutraler vormuliert :oops:

mkinzler 1. Nov 2006 16:31

Re: Schleife für Klassennamen
 
Stimmt, ich bib davon augegangen, da0 es eine Komponente ist. hatte aber auch geschriebne das die lösunf mit Arrays/Listen so oder so besser ist!

Jibiel 1. Nov 2006 16:51

Re: Schleife für Klassennamen
 
Danke für die vielen Antworten =)

@Flare bin eine Sie^^


Ich hab mir sowohl TList als auch Arrays angeguckt, aber bei mir läuft es immer auf das gleiche raus. Schnee1, Schnee2, ... werden immer nur als strings abgespeichert und ich kann sie dadurch nie als ein Objekt der Klasse TSchnee benutzen.

Delphi-Quellcode:
procedure TMain.SchneeTimer(Sender: TObject);
var i : integer; Flockenarray: Array of TSchnee;
begin

Schnee.Interval := 50;

for i:= 1 to 4 do
begin
Flockenarray[i-1] := 'Schnee'+'i';
Flockenarray[i-1].zeichnen;
end;
Hier das Beispiel für die Array-Lösung. Was mach ich falsch?

[Fehler] mMain.pas(201): Inkompatible Typen: 'TSchnee' und 'String'


*wink* Jibi

mkinzler 1. Nov 2006 17:04

Re: Schleife für Klassennamen
 
Hallo Jibi,
Du hast das wohl falsch verstanden, gemeint war:

Erzeugen:
Delphi-Quellcode:
var
    Schnee = Array of TSchnee;
    i: Integer;
begin
    setLength( Schnee, 100);
    for i := 0 to 99 do
    begin
       Schnee[i] := TSchnee.Create( ...);
       ...
    end;
Zeichnen:
Delphi-Quellcode:
  for i := 0 to 99 do
    begin
       Schnee[i].Zeichnen;
       ...
    end;
[/delphi]

Jibiel 1. Nov 2006 20:27

Re: Schleife für Klassennamen
 
Danke euch allen, es klappt endlich :DD

Wer mal mein Projekt sehen möchte: http://jibichan.ji.funpic.de/PHaus.exe

Ist noch lang nicht fertig, aber wird schon noch^^


*alle mal drück* :>


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