![]() |
Dynamische Procedur-Zuordnung
Hi,
ich möchte gerne einem Button (z.B.) die Proceduren für einige Events dynamisch zuordnen. Der Code unten funktioniert auch in so weit, dass die entsprechenden Befehle in der neuen Procedure ausgeführt werden, allerdings bekomme ich bei ControlMove/-Down/-Up nach Beendigung der Procedure eine Exception. Mal eine EAccessViolation, mal eine EExternalException. ControlClick wirft keine Exception. Einer eine Idee? Parameteranzahl/-art stimmt mit denen der normalen Events überein. Danke schon mal, :) Stefan
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; Button: TButton; implementation {$R *.dfm} procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Form1.Caption := 'ControlMouseDown'; end; procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Form1.Caption := 'ControlMouseMove'; end; procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Form1.Caption := 'ControlMouseUp'; end; procedure ControlClick(Sender: TObject); begin Form1.Caption := IntToStr(GetTickCount); end; procedure TForm1.FormCreate(Sender: TObject); begin Button := TButton.Create(nil); Button.Left := 100; Button.Top := 100; Button.Width := 100; Button.Height := 25; @Button.OnClick := @ControlClick; @Button.OnMouseMove := @ControlMouseMove; @Button.OnMouseDown := @ControlMouseDown; @Button.OnMouseUp := @ControlMouseUp; Button.Parent := Form1; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Button.Free; end; end. |
Re: Dynamische Procedur-Zuordnung
Moin Stefan,
Zitat:
Die "normalen" Ergeignisprozeduren sind Methoden einer Klasse und haben somit noch einen, unsichtbaren, Parameter self, der vom Typ der Klasse der ist, in der sich die Methode befindet. Deklariere mal die Prozeduren als Methoden des Formulares, dann kannst Du Dir auch die @ für die Zuweisung sparen. |
Re: Dynamische Procedur-Zuordnung
Hallo,
Du musst den Ereignissen Methoden einer Klasse übergeben. Sonst fehlt die "Self"-Referenz. Gruß xaromz |
Re: Dynamische Procedur-Zuordnung
Zitat:
Delphi-Quellcode:
Aber das ist keine Lösung die man braucht. Man SOLLTE den Ereignissen Methoden einer Klasse übergeben.
procedure Klick;
begin Form1.Caption := 'ha!'; end; procedure TForm1.FormCreate(Sender: TObject); var m:TMethod; begin m.Code := @Klick; m.Data := Self; Button1.OnClick := TNotifyEvent(m); end; |
Re: Dynamische Procedur-Zuordnung
Ok, danke an Alle.
Mit der zusätzlichen Deklaration in der Klasse klappt es. :) Komme ich irgendwie drumherum, in jeder Klasse die Procedure zu deklarieren, wenn ich Events von verschiedenen Klassen dieselbe Procedure (gleicher Code) zuweisen will, oder muss ich überall die Procedure deklarieren? |
Re: Dynamische Procedur-Zuordnung
Moin Stefan,
eine Möglichkeit: Sammle alle Deine erforderlichen Methoden in einer eigenen Klasse:
Delphi-Quellcode:
Wenn Du diese dann noch als Klassenmethoden deklarierst, brauchst Du nicht einmal eine Instanz des Objektes zu erzeugen.
type
TMyProcs = class(TObject) public class procedure MyClick(Sender : TObject); end; implementation procedure TForm1.FormCreate(Sender: TObject); begin Button1.OnClick := TMyProcs.MyClick; end; class procedure TMyProcs.MyClick(Sender: TObject); begin ShowMessage('Click'); end; |
Re: Dynamische Procedur-Zuordnung
Ja, so geht's, danke! :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz