![]() |
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: ![]() Meine unit schaut wie folgt aus:
Delphi-Quellcode:
Wenn ich die kompo dann auf eine forum zieh und im onchange z.b.
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.
Delphi-Quellcode:
mache, dann passiert nichts.
ShowMessage('changed');
Was mach ich falsch? MfG - Ghost007 |
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 ( ![]() |
Re: Event wird nicht ausgelöst ?!
Zitat:
dafür sorge ich schon ;) im form create event der form über folgenden befehl:
Delphi-Quellcode:
MfG - Ghost007
SetClipboardViewer(self.Handle);
P.S.: Das event wird trotzdem nicht ausgelöst. |
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 |
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... |
Re: Event wird nicht ausgelöst ?!
Zitat:
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 :( |
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 |
Re: Event wird nicht ausgelöst ?!
Zitat:
MfG - Ghost007 //Edit: Oder meinst du mit registrieren, das einklicken in die clipboardviewer chain ? |
Re: Event wird nicht ausgelöst ?!
Ich glaube dir fehlt noch das Verständnis.
Mit
Delphi-Quellcode:
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.
SetClipboardViewer(self.Handle);
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. |
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 |
Re: Event wird nicht ausgelöst ?!
Moin!
Wie geschrieben haben alle Komponenten ab TWinControl ein Fensterhandle. Und dieses kann über die Eigenschaft ![]() MfG Muetze1 |
Re: Event wird nicht ausgelöst ?!
Ich halte es bei einer nicht-visuellen Komponente nicht für sinnvoll, von TWinControl abzuleiten. Gehe lieber so wie in TTimer vor: Mit AllocateWnd wird dort ein Fenster erzeugt, welches lediglich Nachrichten verarbeitet.
|
Re: Event wird nicht ausgelöst ?!
Zitat:
Danke MfG - Ghost007 P.S.: Kann leider atm nicht weitertesten ... irgdwie freezt bei mir jede application die ich compiliere ... auch eine leere form, sobald ich sie verscheiben will ... |
Re: Event wird nicht ausgelöst ?!
So,
mein delphi rennt wieder. Jedoch kann ich die von Apollonius angesprochene funktion allocatewnd weder im msdn noch in der OH finden. :( wie geb ich meiner kompo ein handle ? MfG - Ghost007 |
Re: Event wird nicht ausgelöst ?!
Hier mal der Konstruktor von TTimer:
Delphi-Quellcode:
constructor TTimer.Create(AOwner: TComponent);
begin inherited Create(AOwner); FEnabled := True; FInterval := 1000; {$IFDEF MSWINDOWS} FWindowHandle := Classes.AllocateHWnd(WndProc); {$ENDIF} {$IFDEF LINUX} FWindowHandle := WinUtils.AllocateHWnd(WndProc); {$ENDIF} end; |
Re: Event wird nicht ausgelöst ?!
danke, hat geholfen :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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