Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi zur laufzeit erstelltes objekt ansprechen (https://www.delphipraxis.net/167346-zur-laufzeit-erstelltes-objekt-ansprechen.html)

blubber443 25. Mär 2012 15:48

Delphi-Version: XE2

zur laufzeit erstelltes objekt ansprechen
 
moin, ich bin dabei einen leveleditor für mein spiel zu erstellen und hab da ein kleines problem:
ich weiß zwar wie man objekte erzeugt; aber nicht wie man später eine funktion (etwa wie onclick oder onmousedown) erzeugt.
es sollte etwa so aussehen:

Delphi-Quellcode:
var
shape: TShape;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
shape:=TShape.Create(Form1);
 With shape do
  begin
   Parent:=Form1;
   Left:=0;
   Top:=0;
   Width:=100;
   Height:=50;
   Shape:=stRoundRect;
   Name:='Shape1';
  end;
end;
...
procedure Shape1.onklick; //und hier weiß ich nicht wie es richtig heißt
begin
...
end;

s.h.a.r.k 25. Mär 2012 16:02

AW: zur laufzeit erstelltes objekt ansprechen
 
Delphi-Quellcode:
var
shape: TShape;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
shape:=TShape.Create(Form1);
 With shape do
  begin
   Parent:=Form1;
   Left:=0;
   Top:=0;
   Width:=100;
   Height:=50;
   Shape:=stRoundRect;
   Name:='Shape1';
  end;

  // Hier weißt du dem shape den entsprechenden
  // OnClick-Handler zu
  shape.OnClick := Self.onklick;
end;
...

// Hier hast du den Parameter Sender vergessen.
procedure Shape1.onklick(Sender: TObject); //und hier weiß ich nicht wie es richtig heißt
begin
...
end;

mkinzler 25. Mär 2012 16:03

AW: zur laufzeit erstelltes objekt ansprechen
 
Delphi-Quellcode:
var
shape: TShape;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
shape:=TShape.Create(Form1);
 With shape do
  begin
   Parent:=Form1;
   Left:=0;
   Top:=0;
   Width:=100;
   Height:=50;
   Shape:=stRoundRect;
   Name:='Shape1';
   onClick = OnShapeKlick;
  end;
end;
...
procedure Form1.onShapeklick( Sender:...
begin
...
end;

DeddyH 25. Mär 2012 16:12

AW: zur laufzeit erstelltes objekt ansprechen
 
Und nun mal ohne with und benannte Instanz:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  shape := TShape.Create(self); //die aktuelle Instanz
  shape.Parent := self; //hier auch
  shape.Left := 0;
  shape.Top := 0;
  shape.Width := 100;
  shape.Height := 50;
  shape.Shape := stRoundRect;
  shape.Name := 'Shape1';
  shape.onClick := OnShapeKlick;
end;

himitsu 25. Mär 2012 16:26

AW: zur laufzeit erstelltes objekt ansprechen
 
Dynamisch erstellte Komponenten brauchen nicht unbedingt einen Namen. (Shape1)
Durch den statischen Namen knallt es, wenn man zweimal auf den Button drückt, da der Name eindeutig sein muß.

Statt der 4 Parameter kann man diese auch auf Einmal setzen
Delphi-Quellcode:
Shape.SetBounds(...)
.

Und ich hoffe mal, das "Shape" ist nicht wirklich eine globale Variable.

s.h.a.r.k 25. Mär 2012 16:28

AW: zur laufzeit erstelltes objekt ansprechen
 
Zitat:

Zitat von DeddyH (Beitrag 1158470)
Und nun mal ohne with und benannte Instanz:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  shape := TShape.Create(self); //die aktuelle Instanz
  shape.Parent := self; //hier auch
  shape.Left := 0;
  shape.Top := 0;
  shape.Width := 100;
  shape.Height := 50;
  shape.Shape := stRoundRect;
  shape.Name := 'Shape1';
  shape.onClick := OnShapeKlick;
end;

Man sollte hier auch noch dazu sagen, dass with sehr böse werden kann. Man spart sich zwar Schreibarbeit, ist aber imho einfach weniger präziser, als wenn man immer shape.[Property|Methode] verwendet. An diesem Beispiel sieht man auch warum, denn TForm1 hat auch eine OnClick-Methode. Klar, der Compiler wird hier immer erst nach dem with schauen, aber für andere könnte der Code weniger verständlich sein. Ebenso ist der Code mit dem with weniger robust gegenüber Änderungen. Aber es kann sich jeder selbst überlegen, was er bevorzugt. Wollte es nur der vollständigkeithalber erwähnen :stupid:

blubber443 25. Mär 2012 18:43

AW: zur laufzeit erstelltes objekt ansprechen
 
thx, probiers gleich mal aus ;)

blubber443 25. Mär 2012 20:32

AW: zur laufzeit erstelltes objekt ansprechen
 
ich hätt da nur noch eine einizige frage; da ich mit einer unbekannten anzahl an shapes arbeite wär es schön einen array zuzulegen, wie würde das gehen?

vagtler 25. Mär 2012 20:40

AW: zur laufzeit erstelltes objekt ansprechen
 
Zitat:

Zitat von blubber443 (Beitrag 1158503)
[...] da ich mit einer unbekannten anzahl an shapes arbeite wär es schön einen array zuzulegen [...]

Nein, wäre es nicht. Dafür gibt es geeignetere Container, wie z.B. Listen.

mkinzler 25. Mär 2012 20:43

AW: zur laufzeit erstelltes objekt ansprechen
 
Delphi-Quellcode:
Shapes: Array of TShape;
...
i := Length(Shapes);
Setlength( Shapes, i+1);
shapes[i] := TShape.Create(self);
...
Aber für die Events istr das garnicht notwendig, weil die Instanz ja im Parameter Sender übergeben wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 Uhr.
Seite 1 von 2  1 2      

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