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 Event wird nicht ausgelöst ?! (https://www.delphipraxis.net/117455-event-wird-nicht-ausgeloest.html)

ghost007 18. Jul 2008 12:17


Event wird nicht ausgelöst ?!
 
Hallo,

ich wollte mir eine eigenen kleine komponente basteln.
Hierfür bin ich nach dem tutorial von dsdt vorgegangen (Link: http://www.delphi-treff.de/tutorials...en-entwicklen/)

Meine unit schaut wie folgt aus:
Delphi-Quellcode:
unit ClipBoarder;

interface

uses
  SysUtils, Classes, Messages, Windows;

type
  TChangeEvent = procedure(Sender : TObject ) of Object;
  TClipBoarder = class(TComponent)
  private
    CChangeEvent: TChangeEvent;
    procedure ClipChange(var content: TMessage); message WM_DRAWCLIPBOARD;
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    property OnChange : TChangeEvent read CChangeEvent write CChangeEvent;
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Clipboarder', [TClipBoarder]);
end;

procedure TClipBoarder.ClipChange(var content: TMessage);
begin
 OnChange(self);
end;

end.
Wenn ich die kompo dann auf eine forum zieh und im onchange z.b.
Delphi-Quellcode:
 ShowMessage('changed');
mache, dann passiert nichts.

Was mach ich falsch?

MfG - Ghost007

Christian Seehase 18. Jul 2008 12:29

Re: Event wird nicht ausgelöst ?!
 
Moin Christian,

das funktioniert nicht, weil die Message nur an die Fenster geschickt wird, die sich als Clipboardviewer registriert haben.
Schau Dir mal die Doku dazu im MSDN an (MSDN-Library durchsuchenWM_DRAWCLIPBOARD)

ghost007 18. Jul 2008 14:04

Re: Event wird nicht ausgelöst ?!
 
Zitat:

Zitat von Christian Seehase
Moin Christian,

das funktioniert nicht, weil die Message nur an die Fenster geschickt wird, die sich als Clipboardviewer registriert haben.
Schau Dir mal die Doku dazu im MSDN an (MSDN-Library durchsuchenWM_DRAWCLIPBOARD)

Hey,
dafür sorge ich schon ;) im form create event der form über folgenden befehl:

Delphi-Quellcode:
 SetClipboardViewer(self.Handle);
MfG - Ghost007

P.S.: Das event wird trotzdem nicht ausgelöst.

Muetze1 18. Jul 2008 14:08

Re: Event wird nicht ausgelöst ?!
 
Moin!

Überschreib lieber CreateWnd um auch das neuerstellen deines Formulars im Hintergrund durch VCL Properties mit zu bekommen. Ich vermute eher, dass dein im FormCreate registrierte Fensterhandle gar nicht mehr gültig ist.

MfG
Muetze1

ralfschwalbe 18. Jul 2008 14:12

Re: Event wird nicht ausgelöst ?!
 
Hallo,

du setz dein Form als Clipboardviewer hast aber dein Change-Event in einer Componente. So geht das nicht. Entweder alles im Form oder wie Muetze1 geschrieben hat, in der Compo...

ghost007 18. Jul 2008 14:12

Re: Event wird nicht ausgelöst ?!
 
Zitat:

Zitat von Muetze1
Moin!

Überschreib lieber CreateWnd um auch das neuerstellen deines Formulars im Hintergrund durch VCL Properties mit zu bekommen. Ich vermute eher, dass dein im FormCreate registrierte Fensterhandle gar nicht mehr gültig ist.

MfG
Muetze1

Hm,
das komisch ist nur, wenn ich das ganze ohne komponente mach, sprich die auslöser procedure einfach in die normale form unit reinklatsche, geht es :(

Muetze1 18. Jul 2008 14:19

Re: Event wird nicht ausgelöst ?!
 
Moin!

Sorry, hatte dein Beitrag nicht richtig verarbeitet. Durch deine Aussage mit der Komponente wurde mir dies klar, ich dachte du implementierst es in einem Formular.

Zu dem Problem: Die VCL empfängt die Botschaften auf dem Fenster aber sie leitet nicht alle an ihre Clients weiter. Dies macht sie nur mit besonderen Botschaften, manche werden sogar explizit von der VCL zu den internen Notifier (CN_XXX) oder Messages (CM_XXX) umgesetzt. Deine Botschaft gehört mit zu den nicht weiter geleiteten.

Lösung: Bau dir eine Komponente mit eigenem Fensterhandle und dann bekommst du die Botschaft direkt. Also Leite von TWinControl ab und registriere dich in deiner Komponente selbst als Empfänger und dann bekommst du auch die Botschaft.

MfG
Muetze1

ghost007 18. Jul 2008 14:24

Re: Event wird nicht ausgelöst ?!
 
Zitat:

Zitat von Muetze1
Bau dir eine Komponente mit eigenem Fensterhandle und dann bekommst du die Botschaft direkt. Also Leite von TWinControl ab und registriere dich in deiner Komponente selbst als Empfänger und dann bekommst du auch die Botschaft.

Bleibt nur eine frage, wie registriere ich mich als empfänger? :D

MfG - Ghost007

//Edit: Oder meinst du mit registrieren, das einklicken in die clipboardviewer chain ?

SirThornberry 18. Jul 2008 14:42

Re: Event wird nicht ausgelöst ?!
 
Ich glaube dir fehlt noch das Verständnis.

Mit
Delphi-Quellcode:
SetClipboardViewer(self.Handle);
Sagst du das Self.Handle eine Message bekommen soll. Self.Handle ist aber in diesem Fall dein Form da Self ja für die Instanz des Forms steht und dieses bekommt die Nachricht auch.

Wenn du willst das deine Komponente die Nachricht bekommt darfst du nicht das Handle des Forms angeben sondern musst ein Handle übergeben welches zu deiner Komponente gehört.

ghost007 18. Jul 2008 14:58

Re: Event wird nicht ausgelöst ?!
 
Das hab ich spätestens nach dem beitrag von Muetze1 schon verstanden, nur welches handle geb ich der funktion dann ?
Ist meine erste kompo kenne mich damit noch nicht so aus :oops:

MfG - Ghost007


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.
Seite 1 von 2  1 2      

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