Autor Beitrag
Bruce
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 80



BeitragVerfasst: Fr 02.01.04 17:17 
Hallo, bin am verzweifeln.

Ich erzeuge einen Button zur Laufzeit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure ZielPunktErstellen;
begin
GetCursorPos(mouseposition);
mouseposition := Form1.ScreenToClient(mouseposition);
If (Mouseposition.x > 630OR (Mouseposition.y < 64then exit;
BZiel := TFlatButton.Create(Form1);
BZiel.Parent := Form1;
BZiel.Left := mouseposition.x-12;
BZiel.Top := mouseposition.y-12;
BZiel.Color := clred;
BZiel.ColorBorder := $FFFFFFFF;
BZiel.ColorDown := clred;
BZiel.ColorFocused := clred;
BZiel.ColorHighLight := $FFFFFFFF;
BZiel.ColorShadow := $FFFFFFFF;
BZiel.OnClick := ZielPunktClick;
end;


Die aufgerufene Prozedur ZielPunktClick :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure ZielPunktClick(Sender: TObject);
begin
Form2.Show;
end.


Die Zeile die das OnClick zuweist erzeugt den Fehler "Inkompatible Typen: Methodenzeiger und reguläre Prozedur".
Was ist da falsch, alle Beispiele die ich dazu gefunden habe funktionieren doch so simple, oder überseh ich das dauernd was?
Danke, Gruß, Stephan

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 02.01.04 17:26 
Hallo!

Die Prozedur für das OnClick-Ereignis muss ein Member von einer Form sein.

Mfg
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Bruce Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 80



BeitragVerfasst: Fr 02.01.04 17:36 
Hmm... Was heisst das genau?
Die Prozedur die den Button erstellt ist in eine eigene Unit ausgelagert.
Der Button wird auf Form1 angezeigt. Was muss ich jetzt tun? Hab OnClick-Prozedur mal in Unit1 reingeschrieben aber das funktioniert auch nicht. Die Syntax Form1.ZielPunktClick im Prozedur-Header nimmt er auch nicht. Blicke noch nicht ganz durch...??
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 02.01.04 17:48 
Hallo!

Sieh Dir doch mal an, wie Delphi die OnClick-Prozedur generiert, wenn Du einen Doppelklick auf einen Button ausführst. Deine Prozedur muss irgendwie so aussehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TForm1 = class(TForm)
    procedure ZielPunktClick(Sender: TObject); 
  private
  public
  end;

{...}

procedure TForm1.ZielPunktClick(Sender : TObject);
begin
  {machwas}
end;


MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Fr 02.01.04 18:10 
Peter Lustig hat dir ja eh schon einen sehr brauchbaren Tipp gegeben... parallel dazu kannst du noch hier im Forum suchen, zu diesem Problem gibt es schon jede Menge Topics...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Bruce Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 80



BeitragVerfasst: Fr 02.01.04 18:11 
Vielen Dank Peter, jetzt gehts!

Ich musste zwar die Prozedur zur Erzeugung des Buttons in die Unit von Form1 schreiben, sonst kam wieder ein Fehler. Aber ich muss die auch nicht unbedingt auslagern. Hauptsache es funktioniert jetzt.
Nochmal Danke für die schnelle Hilfe.

Gruß, Stephan
Lotoreo
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 03.01.04 19:26 
Wenn ich nun einen Array von Timages habe, und bei allen die selbe On-Klick-Funktion benötige, so funktioniert das zu Beginn normal. Doch wie finde ich heraus, welches Objekt die Funktion ausgelößt hat? Gibt es da eine Möglichkeit?
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Sa 03.01.04 19:31 
Jedes Ereignis hat einen Parameter "Sender" der eine Referenz auf das Objekt enthält, das das Ereignis ausgelöst hat...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 03.01.04 19:31 
Hallo!

Komponenten haben die Property "Tag". Diese ist für den Programmierer zur freien Verfügung. Dort kannst Du beim Erstellen zum Beispiel speichern, welchen Index im Array das Image hat.
Diesen Tag kannst Du über den Sender-Parameter des OnClick-Ereignissen wieder abfragen. Irgendwie so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.klick(Sender : TObject);
VAR i : Integer;
begin
  if Sender is TComponent then
  i := TComponent(Sender).Tag;
end;


MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Lotoreo
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 03.01.04 20:21 
Hmm, das müste gehen! Werd ich gleich mal probieren... Danke für die Hilfe!