Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Constructor per Button starten (änderbar)


IhopeonlyReader - Sa 21.04.12 13:38
Titel: Constructor per Button starten (änderbar)
guten Tag,
ich weiß aus der Überschrift kann man nicht viel erfahren. Das liegt daran das ich noch ein z8iemlicher Anfänger bin und mich Programm für Programm durch einige Foren lese und immer weiter komme... nun bin ich bei einem Towerdefense Spiel angekommen... theoretisch habe ich mir überlegt wie es geht, jedoch fehlt es mir an der Praxis.

Ich würde gerne wissen, wie ich einen Constructor immer wieder aufrufe und den alten bestehen lasse, alles durch ein und denselbem Button. Beispiel;
ich drücke auf einen button und ein Kreis bewegt sich von links oben nach rechts oben, drück ich nochmal auf den button soll der alte kreis sich weiter nach rechts bewegen, aber es soll zusätzlich ein neuer kreis erscheinen, der für sich selbst läuft (auch von links nach rechts) die Y Koordinaten (und Start X) koordinate werden per Edit festgelegt.

Istz es möglich ohne eine andeuernde Schliefe zu machen??
(ich hatte es bis jetzt so gedacht)(a1,a2.. sind entsprechend uzgeweisen bei den var miz a1, a2...:TForm1;
und x ist eine einfache integer Zahl, variable ist eine integer zahl (begintn mir 1) also var variable:integer=1;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1click(Sender: TObject);
begin
x:= x+1;
if x=1 then
a1.schusscreate(Mausposx,Mausposy);

if x=2 then
a2.schusscreate(Mausposx,Mausposy);
... (immer so weiter)
end;


und im Timer dann

Delphi-Quelltext
1:
2:
if x>=1 then a1.schussbewegen;
if x>=2 then a2.schussbewegen;...


kann man das, ohne diese Schleife machen? irgendwie mit a[x].schusscreate(Mausposx,Mausposy);
und im timer dann entsprechend while variable<x begin
a[variable].schussbewegen(Mausposx,Mausposy);
variable:=variable+1;
end;

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


bummi - Sa 21.04.12 15:52

Erst mal herzlich willkommen im Forum.
Der Konstruktor ist Teil der Klasse, die Klasse selbst wird nie verändert.
Über den Konstruktor bekommst Du Objekte.
Das kann man sich vorstellen wie MeinKuchen := MeinRezepte.Backe.
Du kannst Dir beliebig viele Instanzen erstellen um mit diesen etwas zu tun wirst Du um eine Schleife nicht herumkommen, allerdings keine Schleife für die Aktion sondern eine über Deine Objekte.
Deine Objekte könntest könntest Du in einem Array verwalten, anbieten würde sich hierfür aber eine Liste, oder spezieller hier gleich eine Objektliste. Wie bequem damit zu arbeiten ist hängt ein wenig von Deiner Delphiversion ab, ab D2009 könntest Du Generics verwenden, quasi Objektlisten die schon wissen was für eine Sorte Objekt sie verwalten.
Ich gehe jetzt mal davon aus daß Du Delphi < 2009 verwendest.

Als erstes würdest Du eine Objektliste anlegen.

FObjectlist := TObjectlist.Creste;

diese musst Du am Schluss wieder freigeben, hierbei werden standardmäßig alle Objekte die Du hinzugefügt hast ebenfalls freigegeben (da kannst dies über die Eigenschaft ownsobject umschalten, musst dann aber Deine Objekte sebst wieder frei geben)


Das Erzeugen funktioniert grob so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
DummyVar:TMyObject;
begin
   DummyVar := TMyObject.Create;
   DummyVar.Irgendwas ...
   FMyObjectList.Add(DummyVar);  
end;


in Deinem Timer benötigst Du jetzt eine Schleife

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
 i:Integer;
 DummyVar:TMyObject;
begin 
  For i := 0 to FMyObjectList.Count - 1 do
  begin
          DummyVar:=TMyObject(FMyObjectList[i]);
          DummyVar.RechneUndZeichnewasauchimmer        
        end;
end;


Objekte die Du nicht mehr benötigst kannst Du per FMyObjectList.Delete(Nr) entfernen

Das nur als grober Anriss...

EDIT

Ich habe ein kleines Beispiel angehängt ...


IhopeonlyReader - Sa 21.04.12 16:22

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Ich gehe jetzt mal davon aus daß Du Delphi < 2009 verwendest.

das ist richtig, ich benutze Delphi 7 PE !

Und danke für dein beigeletegtes Project, jedoch fehlt Form 2 :DD (so hab ich das aus der Fehlermeldung gelsen)

Fehlermeldung

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.

Moderiert von user profile iconNarses: Beiträge zusammengefasst

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Erst mal herzlich willkommen im Forum

danke ;)

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:

Das Erzeugen funktioniert grob so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
DummyVar:TMyObject;
begin
   DummyVar := TMyObject.Create;
   DummyVar.Irgendwas ...
   FMyObjectList.Add(DummyVar);  
end;


in Deinem Timer benötigst Du jetzt eine Schleife

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
 i:Integer;
 DummyVar:TMyObject;
begin 
  For i := 0 to FMyObjectList.Count - 1 do
  begin
          DummyVar:=TMyObject(FMyObjectList[i]);
          DummyVar.RechneUndZeichnewasauchimmer        
        end;
end;


Objekte die Du nicht mehr benötigst kannst Du per FMyObjectList.Delete(Nr) entfernen



dann muss ich anstatt das (unübersichtlich) im Quelltext zu schreiben das in der FMyobjectlist reinmachen?
vom aufwand sehe ich da keinen unterschied... gibt es keine möglichkeit mit steigernde variable auch einen immer einen neues Object per Constructor aufzurufen? (OHNE schleife)


bummi - Sa 21.04.12 16:43

Die Meldung kannst Du ignorieren, liegt and Deiner Delphiversion, das Projekt sollte bis auf das Res das neu erstellt wird komplett sein.
Die "steigende Variable" ergibt sich beim einfügen in die Objectlist (Liste.Count).
Ich wüsste keinen Weg es noch einfacher umzusetzen.


IhopeonlyReader - Sa 21.04.12 17:51

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Die Meldung kannst Du ignorieren, liegt and Deiner Delphiversion, das Projekt sollte bis auf das Res das neu erstellt wird komplett sein.
Die "steigende Variable" ergibt sich beim einfügen in die Objectlist (Liste.Count).
Ich wüsste keinen Weg es noch einfacher umzusetzen.


[Fehler] BallProject.dpr(11): Undefinierter Bezeichner: 'MainFormOnTaskbar'

Mainformontaskbar? was ist das? sowohl ich als auch meine delphi version kennen das noch nicht :D <- neuling ;)

Edit: Programm funzt und ich bin gerade dabei das zu verstehen, aber ich habe jetzt die Frage, kann jede Position (jedes Balles) bestimmt werden?


bummi - So 22.04.12 00:27

Ja X und Y, wie man an die Bälle kommst siehst Du z.B. dort wo b := TBall(BL[i]);
steht


IhopeonlyReader - So 22.04.12 14:00

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Ja X und Y

x und Y des Mittelpunktes des Kreises? oder beide X und beide Y Koordinaten? oder die X ganz libnks und die Y ganz oben?
oder kommt es darauf an, wie ich den Ball zeichnen lasse?


bummi - So 22.04.12 14:50

siehst Du wenn Du Dir die Setter/Getter von Top und Left anschaust ....


IhopeonlyReader - Mo 23.04.12 16:02

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
siehst Du wenn Du Dir die Setter/Getter von Top und Left anschaust ....

Setter und Getter? sowas wie property?


bummi - Mo 23.04.12 17:23

Die Prozeduren / Funtionen der Properties ja ..