AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamische Procedur-Zuordnung

Ein Thema von ste_ett · begonnen am 1. Mär 2006 · letzter Beitrag vom 1. Mär 2006
Antwort Antwort
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#1

Dynamische Procedur-Zuordnung

  Alt 1. Mär 2006, 21:44
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.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Dynamische Procedur-Zuordnung

  Alt 1. Mär 2006, 21:48
Moin Stefan,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Dynamische Procedur-Zuordnung

  Alt 1. Mär 2006, 21:49
Hallo,

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

Gruß
xaromz
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Dynamische Procedur-Zuordnung

  Alt 1. Mär 2006, 21:59
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.
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#5

Re: Dynamische Procedur-Zuordnung

  Alt 1. Mär 2006, 22:05
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?
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Dynamische Procedur-Zuordnung

  Alt 1. Mär 2006, 22:35
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#7

Re: Dynamische Procedur-Zuordnung

  Alt 1. Mär 2006, 22:44
Ja, so geht's, danke!
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 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