Entwickler-Ecke
Sonstiges (Delphi) - Event zur Laufzeit zuweisen
Jakob_Ullmann - So 12.12.10 14:59
Titel: Event zur Laufzeit zuweisen
Ich möchte einer zur Laufzeit erstellten Komponente zwei Events zuweisen. Das habe ich so probiert (ich benutze Lazarus):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.WidgetMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ... end;
SetLength(Buttons, Length(Buttons) + 1); Buttons[Length(Buttons) - 1] := TButtonWidget.Create(TabSheet6); with Buttons[Length(Buttons) - 1] do begin Parent := TabSheet6; Name := 'wxButton' + IntToStr(Length(Buttons)); Caption := Name; OnMouseDown := WidgetMouseDown; OnClick := WidgetClick; end; |
Sein Compiler sagt dazu:
Quelltext
1: 2: 3: 4:
| main.pas(234,39) Error: Wrong number of parameters specified for call to "WidgetMouseDown" main.pas(185,18) Hint: Found declaration: TForm1.WidgetMouseDown(TObject, TMouseButton, TShiftState, LongInt, LongInt); main.pas(235,35) Error: Wrong number of parameters specified for call to "WidgetClick" main.pas(148,15) Hint: Found declaration: TForm1.WidgetClick(TObject); |
Ich habe gegooglet und (in einem Thread der DP) wurde das auch genauso gepostet.
bummi - So 12.12.10 15:05
hast Du in TButtonWidget die Events anders deklariert?
Sollte so funktionieren.
Jakob_Ullmann - So 12.12.10 15:11
Nein, TButtonWidget wird so deklariert:
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: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
| TButtonWidget = class(TToggleBox) constructor Create(AOwner: TComponent); override; public IsSelected: Boolean; end;
...
constructor TButtonWidget.Create(AOwner: TComponent); begin inherited Create(AOwner); Caption := 'Button'; IsSelected := False; AllowGrayed := True; State := cbGrayed; Width := 75; Height := 25; end;
TToggleBox = class(TCustomCheckBox) private public constructor Create(TheOwner: TComponent); override; published property AllowGrayed; property Anchors; property AutoSize default false; property BorderSpacing; property Caption; property Checked; property DragCursor; property DragKind; property DragMode; property Enabled; property Hint; property OnChange; property OnClick; property OnDragDrop; property OnDragOver; property OnEndDrag; property OnEnter; property OnExit; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnStartDrag; property ParentShowHint; property PopupMenu; property ShowHint; property State; property TabOrder; property TabStop; property Visible; end; |
Also an den Events habe ich gar nichts gemacht.
bummi - So 12.12.10 15:38
Ich kenne TToggleBox nicht, wie sieht die Implementierung dort aus?
Jakob_Ullmann - So 12.12.10 15:41
Deklaration ist im Post oben. Implementation könnte ich jetzt posten. Ist aber unwichtig, denn derselbe Fehler kommt, wenn ich alles auf TButton umändere (Also nicht nur TButtonWidget von TButton ableite, sondern auch Buttons als Array of TButton deklariere und TButton.Create(...) schreibe).
delfiphan - So 12.12.10 15:50
Lazarus verwendet eine etwas andere Syntax. Stell mal den Syntax-Modus um auf Delphi. Und/oder ersetze $mode objfpc durch $mode delphi. Oder verwende @ vor der Zuweisung.
Jakob_Ullmann - So 12.12.10 16:00
delfiphan hat folgendes geschrieben : |
Lazarus verwendet eine etwas andere Syntax. Stell mal den Syntax-Modus um auf Delphi. Und/oder ersetze $mode objfpc durch $mode delphi. Oder verwende @ vor der Zuweisung. |
Hey cool, das funktioniert!
Hatte das auch gerade mit diesem unschönen Workaround gelöst:
Delphi-Quelltext
1:
| Buttons[Length(Buttons) - 1].OnMouseDown := PaintBox1.OnMouseDown; |
PaintBox1 hatte auch die WidgetMouseDown verlinkt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!