Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dynamische Procedur-Zuordnung (https://www.delphipraxis.net/64298-dynamische-procedur-zuordnung.html)

ste_ett 1. Mär 2006 20:44


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.

Christian Seehase 1. Mär 2006 20:48

Re: Dynamische Procedur-Zuordnung
 
Moin Stefan,

Zitat:

Zitat von ste_ett
Parameteranzahl/-art stimmt mit denen der normalen Events überein.

auch wenn es auf den ersten Blick so aussieht: Diese Aussage stimmt nicht.
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.

xaromz 1. Mär 2006 20:49

Re: Dynamische Procedur-Zuordnung
 
Hallo,

Du musst den Ereignissen Methoden einer Klasse übergeben. Sonst fehlt die "Self"-Referenz.

Gruß
xaromz

sniper_w 1. Mär 2006 20:59

Re: Dynamische Procedur-Zuordnung
 
Zitat:

Zitat von xaromz
Hallo,

Du musst den Ereignissen Methoden einer Klasse übergeben. Sonst fehlt die "Self"-Referenz.

Gruß
xaromz

Nicht unbedingt.
Delphi-Quellcode:
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;
Aber das ist keine Lösung die man braucht. Man SOLLTE den Ereignissen Methoden einer Klasse übergeben.

ste_ett 1. Mär 2006 21:05

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?

Christian Seehase 1. Mär 2006 21:35

Re: Dynamische Procedur-Zuordnung
 
Moin Stefan,

eine Möglichkeit:
Sammle alle Deine erforderlichen Methoden in einer eigenen Klasse:

Delphi-Quellcode:
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;
Wenn Du diese dann noch als Klassenmethoden deklarierst, brauchst Du nicht einmal eine Instanz des Objektes zu erzeugen.

ste_ett 1. Mär 2006 21:44

Re: Dynamische Procedur-Zuordnung
 
Ja, so geht's, danke! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz