Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Dynamisch erzeugte Event Handler (https://www.delphipraxis.net/176769-dynamisch-erzeugte-event-handler.html)

GeorgWa 25. Sep 2013 14:28

Dynamisch erzeugte Event Handler
 
Hallo lieber Delphi-Praxis Community,
ich habe eine Klasse die jeweils ein Shape und Ein Timer beinnhaltet.
Diese wird je nach anforderung beliebig oft erzeugt, nun will ich eine OnTimer
Event einfügen was immer eine prozedur auslöst.
Dabei scheiter ich leider aktuell da ich nicht weis wie man einem NotifyEvent eine procedur zuordnet.

Delphi-Quellcode:
 
auto[index].TmrMovement := TTimer.Create(Form1);
  With auto[index].TmrMovement do
  begin
    enabled := true;
    interval := 30;
    name := 'TmrMovement' + IntToSTr(Index);
  end;
mit freundlichen grüßen Georg

DeddyH 25. Sep 2013 14:34

AW: Dynamisch erzeugte Event Handler
 
Du kannst einen beliebigen TNotifyEvent nehmen und zuweisen.
Delphi-Quellcode:
type
  TDeineKlasse = class(TIrgendwas)
  private
    procedure TimerProc(Sender: TObject);
  ...
  end;

...

DeinTimer.OnTimer := TimerProc;

GeorgWa 26. Sep 2013 07:14

AW: Dynamisch erzeugte Event Handler
 
Das war auch meine erste Idee wobei dann wenn man die
Prozedur Namen mit Klammer schreibt folgender fehler kommt:
Delphi-Quellcode:
[Fehler] Unit1.pas(76): Inkompatible Typen: 'TNotifyEvent' und 'procedure, untyped pointer or untyped parameter'
Und wenn man den Prozedur Namen mit Klammern am Ende schreibt:
Delphi-Quellcode:
[Fehler] Unit1.pas(76): Inkompatible Typen: Liste der Parameter ist unterschiedlich

Furtbichler 26. Sep 2013 07:15

AW: Dynamisch erzeugte Event Handler
 
Wieso schreibst Du das mit Klammer?

Der schöne Günther 26. Sep 2013 09:47

AW: Dynamisch erzeugte Event Handler
 
Kann es sein, dass du eine klassenlose Prozedur dem Event zuweisen willst? Das geht nämlich nicht. Die Definition von
Delphi-Quellcode:
TNotifyEvent
ist
Delphi-Quellcode:
procedure(Sender: TObject) of object;
. Die Methode muss also einen Parameter vom Typ TObject entgegennehmen und eine Instanzmethode einer Klasse sein.

Also nicht
Delphi-Quellcode:
procedure meineTimerProzedur(Sender:TObject)
sondern z.B.
Delphi-Quellcode:
procedure TMeinFormular.meineTimerProzedur(Sender:TObject)

Den Grund dafür habe ich nie ganz verstanden. Wäre das nicht so, könnte man auch anonyme Prozeduren als Eventhandler setzen. Vielleicht ist das aber auch besser so. Würde man das brutal ausnutzen wird das sicher unübersichtlich...

Furtbichler 26. Sep 2013 10:29

AW: Dynamisch erzeugte Event Handler
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1229976)
Den Grund dafür habe ich nie ganz verstanden.

Eine
Delphi-Quellcode:
TMethod
ist einfach etwas anderes als eine
Delphi-Quellcode:
TProcedure
. Und wir wollen ja nicht mehr prozedural programmieren.

Ich fasse noch einmal zusammen:
Zitat:

Zitat von DeddyH (Beitrag 1229894)
Delphi-Quellcode:
...
DeinTimer.OnTimer := TimerProc;

Zitat:

Zitat von GeorgWa (Beitrag 1229953)
...wobei dann wenn man die Prozedur Namen mit Klammer schreibt folgender fehler kommt:...

Zitat:

Zitat von Furtbichler (Beitrag 1229954)
Wieso schreibst Du das mit Klammer?

Würde mal denken, es liegt an den Klammern. Seufz.

GeorgWa 26. Sep 2013 19:21

AW: Dynamisch erzeugte Event Handler
 
Ok danke :)
so wie ihr es erklärt habt habe ich es jetzt endlich richtig verstanden ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:39 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