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 Komponentenentwicklung: Eigenes Ereignis (https://www.delphipraxis.net/93318-komponentenentwicklung-eigenes-ereignis.html)

little-x 4. Jun 2007 12:23


Komponentenentwicklung: Eigenes Ereignis
 
Hallo,

nachdem ich das Handbuch gequält habe (oder besser mich), und auch über die Suche nichts darüber gefunden habe.

Einfach ausgedrückt: Meine Komponente sollte darauf reagieren, wenn sich eine (applikationsweit) globale Variable ändert. Es handelt sich bei der Variable nicht um eine Property der Komponente. Bin bisher nur bis zur Deklaration des Ereignisses gekommen und hänge da jetzt fest :-D

Delphi-Quellcode:
  private
        { Private-Deklarationen }
        FOnMyVarChange: TNotifyEvent;
  protected
      { Protected-Deklarationen }
  public
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
        property OnMyVarChange: TNotifyEvent read FOnMyVarChange write FOnMyVarChange;

Irgendwo muss ich das Ereignis letztlich auslösen. Über Sinn und Unsinn, und wo die Variable letztlich deklariert ist, soll man sich an der Stelle keine Gedanken machen. Setzt mal voraus dass es diese gibt... Wie programmiert man das, dass auf Änderungen dieser Variable meine Komponente ein Ereignis auslöst?


Viele Grüße

shmia 4. Jun 2007 12:26

Re: Komponentenentwicklung: Eigenes Ereignis
 
Bisher hast du alles richtig gemacht.
Es fehlt noch:
Delphi-Quellcode:
procedure TMyCompo.DoMyChange; // virtual, protected
begin
   if Assigned(FOnMyVarChange) then
      FOnMyVarChange(self);
end;
Wenn sich was ändert einfach innerhalb der Komponente obige Methode aufrufen.

Thanatos81 4. Jun 2007 12:28

Re: Komponentenentwicklung: Eigenes Ereignis
 
Wenn die Variable eine Eigenschaft der Komponente ist, dieser Eigenschaft eine Setter-Methode verpassen und dort das Ereignis feuern.

Ist die Variable aber kein Teil des Objekts, und so ist es ja bei dir, falls ich das richtig verstanden habe, wirst du wohl an jeder Stelle im Code, an der die Variable gesetzt wird, das Ereignis einzeln auslösen müssen.

Zum Auslösen von Ereignissen findest du mehr in der OH.

//Edit
Wie man das Ereignis auslöst hat shmia ja bereits demonstriert ;-)

little-x 4. Jun 2007 15:51

Re: Komponentenentwicklung: Eigenes Ereignis
 
Also danke erstmal für Eure Hilfe...

Ich muss dann doch etwas genauer werden. Meine Komponente ist ein abgeleitetes DBEdit. Im Grunde muss ich das Ereignis OnStateChange der verbundenen DataSource reagieren.

Zitat:

Ist die Variable aber kein Teil des Objekts, und so ist es ja bei dir, falls ich das richtig verstanden habe, wirst du wohl an jeder Stelle im Code, an der die Variable gesetzt wird, das Ereignis einzeln auslösen müssen.
Das dumme ist ja dass ich mich in der Komponente befinde, und demnach an die Ereignissteuerung der verbundenen DataSource nicht rankomme. Die Einstellung OnStateChange der DataSource will ich auch ungern zur Laufzeit überschreiben, da ich mir nciht die Möglichkeit nehmen möchte, dieses Ereignis später in der Anwendung zu nutzen.

Demzufolge ist meiner Ansicht nach ein eigenes Ereignis für den DBEdit erforderlich. Ich dachte so in etwa an die Windows-Messages, und dann über das Handle der DataSource irgendwie die Dinger abzufangen...
Aber da verlassen mich meine Kenntnisse...

SirThornberry 4. Jun 2007 15:55

Re: Komponentenentwicklung: Eigenes Ereignis
 
für mich sieht das so aus als ob du von DataSource ableiten solltest.
Das abgeleitete Object sollte dann die Möglichkeit bieten das sich weitere Objecte bei dem Datasorce registrieren und bei änderungen benachrichtigt werden.

Die sauberste Lösung ist also von DataSource und von DBEdit abzuleiten und beide Nachfahren so zu erweitern das sie miteinander kommunizieren können.

shmia 4. Jun 2007 18:50

Re: Komponentenentwicklung: Eigenes Ereignis
 
Zitat:

Zitat von SirThornberry
für mich sieht das so aus als ob du von DataSource ableiten solltest.
Das abgeleitete Object sollte dann die Möglichkeit bieten das sich weitere Objecte bei dem Datasorce registrieren und bei änderungen benachrichtigt werden.

Es gibt zwei fast unbekannte Klassen, die intern ein DB-sensitives Control mit einer DataSource verknüpfen:
TDataLink und TFieldDataLink
Im Fall eines DBEdit wäre TFieldDataLink richtig.
Die Sache ist etwas komplex; deshalb sollte man auf Torry's nach datensensitiven Controls Ausschau halten, downloaden, lernen und dann abkupfern.


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