Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - einem dynamischen Array Methoden zuweisen


TiRoCkx - So 17.03.19 17:10
Titel: einem dynamischen Array Methoden zuweisen
Hey Leute,

Folgender Code:

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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
private
    { Private-Deklarationen }
    Shapes: array of TShape;
public
    Madn: TMadn;
    procedure OnShapeClick(Sender: TObject);
  end;

var
  Form2: TForm2;
  count,anz,z: byte;

procedure TForm2.CreateShapes(n: word; wc: TWinControl);
begin
  SetLength(Shapes, n);
  Field.Parent := Panel1;
  while n > 0 do
  begin
    Shapes[n] := TShape.Create(Self);
    Shapes[n].Parent := wc;
    case n of
      1,2,3,4: Shapes[n].Brush.Color := rgb(255,0,0);
      5,6,7,8: Shapes[n].Brush.Color := RGB(255,216,0);
      9,10,11,12: Shapes[n].Brush.Color := RGB(58,196,0);
      13,14,15,16: Shapes[n].Brush.Color := RGB(0,148,255);
    end;
    Shapes[n].Shape := stcircle;
    Shapes[n].Height := 30;
    Shapes[n].Width := 30;
    Shapes[n].Left := UMadn.Start[n].X;
    Shapes[n].Top := UMadn.Start[n].Y;
    Shapes[n].Pen.Width := 3;
    Shapes[n].Visible := true;
    Shapes[n].Enabled := false;
    n := n-1;
    OnClick := Self.OnShapeClick(Self); //hier liegt das Problem --> siehe 2. Quelltext
  end;
end;

procedure TForm2.OnShapeClick(Sender: TObject);
begin
  showmessage('Läuft');
end;


Mein Problem ist folgendes:

Ich habe je nach Spieleranzahl verschieden viele Figuren (Anzahl stellt Übergabewert n dar).
Diese Figuren stelle ich somit in einem dynamischem Array dar, um sie leichter ansprechen zu können.
Nun möchte ich durch die OnClick Methode der Figuren(Shapes) diese setzen.

Ich habe ein bisschen rumprobiert, komme aber auf keine Lösung.
Wie setze ich das um?


Delphi-Quelltext
1:
[Fehler] Unewgame.pas(105): Inkompatible Typen: 'TNotifyEvent' und 'procedure, untyped pointer or untyped parameter'                    



Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 17.03.2019 um 19:02


Holgerx - So 17.03.19 17:28

Hmm..

Mal ne Frage:

Delphi-Quelltext
1:
2:
3:
4:
    Shapes[n].Enabled := false;
    n := n-1;
    OnClick := Self.OnShapeClick(Self); //hier liegt das Problem --> siehe 2. Quelltext
  end;



Wessen OnCLick wird da das Self.OnShapeClick zugewiesen?

Könnte es sein, dass das so lauten müsste ( ohne das (self))?


Delphi-Quelltext
1:
2:
3:
4:
    Shapes[n].Enabled := false;
    Shapes[n].OnClick := Self.OnShapeClick;
    n := n-1;
  end;


Mit dem (self) würdest Du nicht die Methode zuweisen, sondern das Ergebnis des Methodenaufruf Self.OnShapeClick(Self) ;)


TiRoCkx - So 17.03.19 20:22

Ja das mit dem Shapes[n]. habe ich vergessen.

Aber das wirft immer mehr Fragen auf:

Es gibt ja nur ein MouseDown und MouseUp Event für Shapes.
Und ich muss ja einen Sender übergeben....

Es wird immer komplizierter. :oops: :(


Holgerx - So 17.03.19 20:27

Hmm..

Wenn Du einem Object eine Event-Methode zuweißt, dann wird beim Aufrufen (vom Object selber, wenn innerhalb dessen das Event passiert) als 'Sender' das Object selber übergeben.

Somit kannst Du in deiner zugewiesenen Methode über 'Sender' auf das Object zugreifen, welches die Methode aufgerufen hat... ;)


TiRoCkx - So 17.03.19 20:36

ok ich probiers dann gleich mal und schreibe evtl. noch mal. Danke erst mal!


TiRoCkx - So 17.03.19 21:33

Hab es jetzt so geschrieben:


Delphi-Quelltext
1:
Shapes[n].OnMouseDown := OnShapeClick;                    


Fehlermeldung:


Delphi-Quelltext
1:
[Fehler] Unewgame.pas(103): Inkompatible Typen: 'Liste der Parameter ist unterschiedlich'                    


Ich verzweifel...


Gausi - So 17.03.19 22:03

Vielleicht so?

Delphi-Quelltext
1:
Shapes[n].OnClick:= OnShapeClick;                    


Das OnClick-Event hat nunmal andere Parameter als OnMouseDown. ;-)


TiRoCkx - So 17.03.19 23:49

Aber Shapes haben kein OnClick Event...

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Wenn ich es als OnClick schreibe, stimmen die Parameter wahrscheinlich.

Wie könnte ich denn dem Array von TShape eine OnClick-Methode zuweisen?


Delete - Mo 18.03.19 07:30

- Nachträglich durch die Entwickler-Ecke gelöscht -


TiRoCkx - Mo 18.03.19 11:04

Ich habs endlich!

Danke an alle bemühten Helfer! :D :wink: