Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TNotifyEvent - Eigenschaft, Aktion, oder was? (https://www.delphipraxis.net/38787-tnotifyevent-eigenschaft-aktion-oder.html)

Tyler 24. Jan 2005 07:22


TNotifyEvent - Eigenschaft, Aktion, oder was?
 
Hallo!

Ich bin grad dabei einem PopUp-Menü dynamische Einträge zuzufügen, was ja bisher auch ganz gut klappt.
Nun hab ich versucht dem OnClick Ereignis eine Prozedure zuzufügen. Bei anderen dynamischen Komponenten hat das auch immer wunderbar geklappt - ich hab einfach eine Prozedur zugewiesen.

Nun verlangt TMenuItem bei OnClick aber ein TNotifyEvent. Nun hab ich im Forum mal danach gesucht, und bin jetzt noch mehr verwirrt, also vorher.

Da find ich dann diesen Beitrag:
http://www.delphipraxis.net/internal...t=tnotifyevent

bei dem unteren Quellcode von Steve seh ich gar keine Sonne mehr. Er weisst dort zwar ein NotifyEvent zu, aber das entspricht keiner "Aktion" sondern nur einer Eigenschaft :shock:

Und auch was die Delphi Hilfe mir hier liefert, trägt nicht gerade zum Verständnis bei:
>> In einer Ereignisbehandlungsroutine für OnClick können Sie die Aktionen implementieren, die
>> ausgeführt werden, wenn der Benutzer den Menüeintrag auswählt.

Ja wie, also ist das DOCH ein Ereigniss?

Wär lieb wenn jemand mir da ein wenig auf die Sprüng helfen könnte. Und vor allem wie ich am Ende meinem dynamischen PopUp-Menü eine Aktion zuweisen kann :)

danke
tyler

Binärbaum 24. Jan 2005 07:26

Re: TNotifyEvent - Eigenschaft, Aktion, oder was?
 
Zitat:

Zitat von Tyler
Ja wie, also ist das DOCH ein Ereigniss?

Ja, ist es. Alles, was TNotifyEvent oder allgemeiner T....Event heißt, ist auch von Delphi als Ereignis ausgelegt.

MfG
Binärbaum

Luckie 24. Jan 2005 07:26

Re: TNotifyEvent - Eigenschaft, Aktion, oder was?
 
In der Kürze liegt die Würze:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure MyBtnClick(Sender: TObject);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyBtnClick(Sender: TObject);
begin
  ShowMessage('foobar');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  MyButton: TButton;
begin
  MyButton := TButton.Create(Form1);
  MyButton.Parent := Form1;
  MyButton.OnClick := MyBtnClick;
end;

Steve 24. Jan 2005 07:40

Re: TNotifyEvent - Eigenschaft, Aktion, oder was?
 
Hi,

man könnte sagen, dass Folgendes hinter einem Event steckt:
In Delphi ist ein Event ist eigentlich eine Methode, die beim Eintreten des eigentlichen Ereignisses aufgerufen wird. (z.B. Windows-Botschaften). Dies ist aber bereits in der VCL gekapselt.
Delphi-Quellcode:
FMyEvent : TNotifyEvent;
Der "Delphi-Event" wird ausgelöst, indem beim Eintreten eines Ereignisses folgender Code ausgeführt wird:
Delphi-Quellcode:
// z.B. Bei Empfang einer Message:
IF Assigned(FMyEvent) THEN FMyEvent(Parameter);
Das heißt, wenn der Ereignisbehandlung eine Routine zugewiesen ist, wird diese ausgeführt.

Somit stellt TNotifyEvent eine Ereignisbehandlung dar. Dahinter steckt eine Methode, die als Eigenschaft deklariert wird. Es geht also um die Behandlung eines Ereignisses mit einer Methode. Man teilt dem Objekt mit, welche Methode aufgerufen werden soll, wenn z.B. OnClick ausgelöst wird / eintritt...


Bin im Erklären nicht so der Meister, sorry :?

Gruß
Stephan :dance:

Tyler 24. Jan 2005 08:58

Re: TNotifyEvent - Eigenschaft, Aktion, oder was?
 
Danke euch für die schnellen Antworten!

Schlussendlich hat es bei Lucky'S Beitrag "Klick" gemacht.

Der Unterschied (so hab ich mir das jetzt erklärt) liegt einfach nur darin, dass ich normalerweise eine Procedure so aufrufe "myProc(Self);" - bei der Zuweisung eines Ereignisses geschieht das aber ohne das Anhängsel, nämlich so "OnClick := myProc".

Und die fachliche Begründung kam ja dann von Sven. Thx :)


tyler

freak4fun 24. Jan 2005 10:04

Re: TNotifyEvent - Eigenschaft, Aktion, oder was?
 
Die Prozedur muss aber einen Sender haben, oder? :gruebel:

MfG
freak

Luckie 24. Jan 2005 10:08

Re: TNotifyEvent - Eigenschaft, Aktion, oder was?
 
Siehe mein Beipiel.

TStringlist 24. Jan 2005 15:56

Re: TNotifyEvent - Eigenschaft, Aktion, oder was?
 
Grundsätzlich kann man auch sagen, dass diese ganzen On...-Properties (ala OnClick, OnCreate, OnShow, OnClose usw.) alles nur procedurale Variablen sind. Es sind also alles Pointer-Variablen, die auf jeweils einen ganz bestimmten Typ von Procedure zeigen oder Nil sind. Und logischerweise gibt man diesen proceduralen Variablen dann natürlich auch den gleichen Typ, den die dadurch gepointeten & aufrufbaren Procedures selbst haben. (...Wobei der "Typ einer Procedure" sich in erster Linie nur in der Machart seiner Parameterliste ausdrückt.)


Wenn OnClick nun von diesem Typ TNotifyEvent ist, dann muss man also wissen, wie der Procedure-Kopf für diese Sorte von Procedure aussieht. Nämlich so:

type TNotifyEvent = procedure (Sender: TObject) of object;

Was also speziell heißt, dass deine Procedure, die du jetzt mittels OnClick aufrufen möchtest, auch eine exakt ebenso geartete Parameterliste haben muss ('of object' gehört da natürlich nicht mehr dazu).


Solltest du also irgendwann mal eine On...-Property von einem anderen Typ als TNotifyEvent laden wollen, z.B. die OnMouseDown-Property vom Typ TMouseEvent, dann heißt das eben jetzt auch wieder nur: Die Parameterliste der fraglichen Procedure muss nun genauso auszusehen, wie das jetzt eben durchs TMouseEvent definiert wird. ...Und sowas steht ja immer in der OH.

jensw_2000 24. Jul 2006 07:43

Re: TNotifyEvent - Eigenschaft, Aktion, oder was?
 
Die parameterlosen NotifyEvents (z.B. OnStatus) funktionieren alle gut.

Jetzt möchte ich meiner Klasse ein NotifyEvent mit zusätzlichen Parametern hinzufügen (OnLogMessage).
Wenn ich versuche Parameter zu dem NotiifyEvent hinzuzufügen, kann ich das Projekt nicht mehr compilieren.
Fehler:
Code:
Eigenschaft 'OnLogMessage' existiert nicht in der Basisklasse.
Natürlich gibt es kein Event "OnLogMessage" in der Basisklasse TThread. Es gibt aber auch kein Event namens "OnStatus". Warum wird "OnStatus" nicht angemeckert und was muss ich machen, um "OnLogMessage(<Params>)" richtig zu deklarieren ?

Delphi-Quellcode:
Type
  TWorkerThread = class(TThread)
    private
      ...
      ...
      //-- Notify Events
      ...
      FOnStatus : TNotifyEvent;
      FOnLogMessage : TNotifyEvent;

      public
      // -- Notify Events
      ...
      property OnStatus : TNotifyEvent READ FOnStatus WRITE FOnStatus;
      property OnLogMessage(
                             Sender:TObject;
                             LogMessageType: TLogMessageType;
                             LogMessageLevel: TLogMessageLevel;
                             LogMessageText: String
                           ) : TNotifyEvent READ FOnLogMessage WRITE FOnLogMessage;
      protected
      ...
end;

Schöne Grüße,
Jens
:hi:

xaromz 24. Jul 2006 09:07

Re: TNotifyEvent - Eigenschaft, Aktion, oder was?
 
Hallo,
Zitat:

Zitat von jensw_2000
Die parameterlosen NotifyEvents (z.B. OnStatus) funktionieren alle gut.

Jetzt möchte ich meiner Klasse ein NotifyEvent mit zusätzlichen Parametern hinzufügen (OnLogMessage).

So, wie Du das machst, wird es nicht funktionieren.
Du musst einen neuen Typ deklarieren:
Delphi-Quellcode:
type
  TLogEvent = procedure(Sender: TObject; LogMessageType: TLogMessageType;
    LogMessageLevel: TLogMessageLevel; LogMessageText: String) of object;

  TWorkerThread = class(TThread)
    private
      ...
      ...
      //-- Notify Events
      ...
      FOnStatus : TNotifyEvent;
      FOnLogMessage : TLogEvent;

      public
      // -- Notify Events
      ...
      property OnStatus : TNotifyEvent READ FOnStatus WRITE FOnStatus;
      property OnLogMessage: TLogEvent READ FOnLogMessage WRITE FOnLogMessage;
      protected
      ...
end;
Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 Uhr.
Seite 1 von 2  1 2      

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