Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Funktion erwartet unbekannten Parameter


ConditionZero - Sa 05.09.09 14:06
Titel: Funktion erwartet unbekannten Parameter
Tag,
Habe heute morgen mit dem Grundgerüst eines neuen Spiel begonnen.
Bei einer simplen Funktion wird jedoch ein Parameter verlangt, den ich in der Kopfzeile nicht angegeben habe. Hoffe ihr könnt helfen :)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function TForm2.GetBitmapMitte(ABitmap: Bitmap): TPoint;
begin
result.X:= ABitmap.bmWidth div 2;
result.Y:= ABitmap.bmHeight div 2;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
DoubleBuffered:= true;


  Image1.Left:= ShapeD4.Left + GetBitmapMitte.X(ShapeD4) - GetBitmapMitte.X(Image1.Picture.Bitmap);
  Image1.Top:= ShapeD4.Top + GetBitmapMitte.Y(ShapeD4) - GetBitmapMitte.Y(Image1.Picture.Bitmap);


  (*
  //Alternativ
  Image1.Left:= ShapeD4.Left + (ShapeD4.Width div 2) - (Image1.Width div 2);
  Image1.Top:= ShapeD4.Top + (ShapeD4.Height div 2) - (Image1.Height div 2);
  *)

end;



Grüße Zero


alzaimar - Sa 05.09.09 14:11


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function TForm2.GetBitmapMitte(ABitmap: Bitmap): TPoint;
begin
result.X:= ABitmap.bmWidth div 2;
result.Y:= ABitmap.bmHeight div 2;
end;

procedure TForm2.FormCreate(Sender: TObject);
Var
  M1, M2 : TPoint;
begin
  DoubleBuffered:= true;
  M1 := GetBitmapMitte(ShapeD4);
  M2 := Image1.Picture.Bitmap;
  Image1.Left:= ShapeD4.Left + M1.X - M2.X;
  Image1.Top:= ShapeD4.Top + M1.Y - M2.Y;
end;


Delete - Sa 05.09.09 14:11

Ist ShapeD4 eine Bitmap? Wenn es ein TShape ist, worauf der Name hindeutet, geht das natürlich nicht, da die Funktion ja eine Bitmap erwartet.


ConditionZero - Sa 05.09.09 14:17

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Ist ShapeD4 eine Bitmap? Wenn es eiin TShape ist, worauf der Name hindeutet, geht das natürlich nicht, da die Funktion ja eine Bitmap erwartet.



Hoppla, hatte ich nicht drauf geachtet, danke :roll:
Gibt es denn einen Typ, der allgemein auf Objekte angewandt werden kann?
Habe hier gerade kein Delphi, ca. in 10 Minuten aber. Die Version von alzaimar hat dann doch das selbe Problem, oder?

Danke für die schnellen Antworten, ging ja echt flott :D

Grüße Zero



PS:

Delphi-Quelltext
1:
2:
var
aObject: Object;

geht das? :?:


//Edit2: Die Shapes sind jetzt nur zur Visualisierung des Rasters (für spätere Pfadfindung) und wird später durch ein 2-Dimensionales Array ersetzt; Nur am Rande.


Delete - Sa 05.09.09 14:27

Es kommt nun darauf an, ob Du die Breite des TImage haben willst oder diejenige der enthaltenen Grafik, die beiden können ja unterschiedlich sein. Wenn Ersteres, könntest Du es mal mit TControl versuchen.


ConditionZero - Sa 05.09.09 14:31

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Es kommt nun darauf an, ob Du die Breite des TImage haben willst oder diejenige der enthaltenen Grafik, die beiden können ja unterschiedlich sein. Wenn Ersteres, könntest Du es mal mit TControl versuchen.


Breite und Höhe des Images sin immer identisch mit der, der enthaltenen Grafik.
Installiere gerade Delphi, kanns gleich probieren.
Danke schonmal

Gebe gleich Rückmeldung

Grüße Zero



// Edit:

So habe jetzt mal 2 Varianten zum testen probiert:

1.
Parameter wie davor als Bitmap definiert und versucht die Funktion mit einem Bitmap (woran der Fehler anscheinend lag) als Parameter aufzurufen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function TForm2.GetBitmapMitte(ABitmap: Bitmap): TPoint;
begin
result.X:= ABitmap.bmWidth div 2;
result.Y:= ABitmap.bmHeight div 2;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
DoubleBuffered:= true;

Image1.Left:= GetBitmapMitte.X(Image1.Picture.Bitmap);
end;


Fehler: Nicht genügend wirkliche Parameter


2.
Parameter als TControl definiert und versucht mit einem Shape als Parameter die Funktion aufzurufen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function TForm2.GetBitmapMitte(ABitmap: TControl): TPoint;
begin
result.X:= ABitmap.Width div 2;
result.Y:= ABitmap.Height div 2;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
DoubleBuffered:= true;

Image1.Left:= GetBitmapMitte.X(ShapeD4);
end;





//Und wieder ein Nachtrag..

Das hat Funktioniert, bringt mir aber so nichts..


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
function TForm2.GetBitmapMitte(ABitmap: TControl): TPoint;
begin
result.X:= ABitmap.Width div 2;
result.Y:= ABitmap.Height div 2;



//result.X:= ABitmap.bmWidth div 2;
//result.Y:= ABitmap.bmHeight div 2;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
P1: TPoint;

begin
DoubleBuffered:= true;

P1:= GetBitmapMitte(ShapeD4);

  //Image1.Left:= ShapeD4.Left + GetBitmapMitte.X(ShapeD4) - GetBitmapMitte.X(Image1.Picture.Bitmap);
  //Image1.Top:= ShapeD4.Top + GetBitmapMitte.Y(ShapeD4) - GetBitmapMitte.Y(Image1.Picture.Bitmap);



  //Alternativ
  //Image1.Left:= ShapeD4.Left + (ShapeD4.Width div 2) - (Image1.Width div 2);
  //Image1.Top:= ShapeD4.Top + (ShapeD4.Height div 2) - (Image1.Height div 2);

end;



Grüße Zero


uall@ogc - Sa 05.09.09 14:51

GetBitmapMitte.X(Image1.Picture.Bitmap);

-> GetBitmapMitte(Image1.Picture.Bitmap).X;


und besser ist das 2.

P1:= GetBitmapMitte(ShapeD4);

bla.left := P1.X;
bla.top := P1.Y


ConditionZero - Sa 05.09.09 15:11

Okay klappt alles wie gewollt 8)

Danke für die schnelle Hilfe an alle Antworter.

So sieht nun die fertige Funktion mit Aufruf aus. (Für Googler etc.)

Funktion um ein beliebiges Objekt exakt in die Mitte eines anderen Objekts zu legen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function TForm2.GetObjectMitte(aObject: TControl): TPoint;
begin
result.X:= aObject.Width div 2;
result.Y:= aObject.Height div 2;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
P1,P2: TPoint;

begin
P1:= GetObjectMitte(ShapeD4);
P2:= GetObjectMitte(Image1);
Image1.Left:= ShapeD4.Left + P1.X - P2.X;
Image1.Top:= ShapeD4.Top + P1.Y - P2.Y;


  //Alternativ
  //Image1.Left:= ShapeD4.Left + (ShapeD4.Width div 2) - (Image1.Width div 2);
  //Image1.Top:= ShapeD4.Top + (ShapeD4.Height div 2) - (Image1.Height div 2);

end;




Grüße Stuck