![]() |
paste abfangen
hallo,
kann mir jemand sagen, wie ich strg+v und linxklick-einfügen bei einem tedit abfangen und abändern kann? habs mit erst TApplicationEvents und dann mit einer eigenen routine: hier mal der code:
Delphi-Quellcode:
nur leider passiert bei beiden garnix .. was mach ich falsch?
//eigene routine (iss jez für alle paste-vorgänge ...)
//declaration: procedure WMPASTEFTPURL(var Msg: TMessage); message WM_PASTE; procedure TfClient.WMPASTEFTPURL(var Msg: TMessage); var buffer : PChar; s : string; begin showmessage('paste'); try buffer := StrAlloc(msg.WParam+1); GlobalGetAtomName(Msg.lParam, Buffer, Msg.wParam + 1); S := StrPas(Buffer); finally StrDispose(buffer); showmessage(s); end; end; //ODER: per TApplicationEvents procedure TfClient.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); var buffer : PChar; s : string; begin if msg.message = WM_PASTE then begin showmessage('paste'); try buffer := StrAlloc(msg.WParam+1); GlobalGetAtomName(Msg.lParam, Buffer, Msg.wParam + 1); S := StrPas(Buffer); finally StrDispose(buffer); showmessage(s); end; end; end; mfg, eyeless |
Re: paste abfangen
Hast du das beim Form oder bei der Komponente wo etwas eingefügt werden soll abgeleitet?
Beim Form wäre falsch. WM_PASTE mußt du bei dem Fenster abfangen wo es passiert (also zB ein TEdit ableiten und dort abfangen). |
Re: paste abfangen
wird wenigstens in die den zweig bzw. die methode reingesprungen wenn du einfügst (haltepunkt gesetzt)? Ich selbst hab das ganze auch schonmal umgesetzt und bei mir kam die wm_paste an. Wenn diese nicht ankommt musst du mal schauen warum. Und ein ShowMessage in einer Routine die Messages handelt geht sehr oft schief.
|
Re: paste abfangen
@olli: aber wenigsten tApplicationEvents müsste doch ALLe messages abfangen, oder?
@SirThornberry: nein der haltepunkt springt nicht an ... weißt du noch, wie du es damals gemacht hast? |
Re: paste abfangen
Zitat:
Zitat:
|
Re: paste abfangen
und wie mache ich das da jez am dümmsten?
ich will nähmlich ftp-urls gleich aufsplitten und die komponenten ind die entsprechenden felder eintagen ... |
Re: paste abfangen
Zitat:
|
Re: paste abfangen
huch, ich habe gerade gesehen, dass das edit sonundso schon eine von abgeleitete komponente ist ;)
werde gleich mal eine onpaste anweisung reinmachen DANKE!!! das wars fürs erste! mfg :. sic00rn |
Re: paste abfangen
hmm, wohl zu früh gefreut, passiert nix ...
hier mal die komponente:
Delphi-Quellcode:
wenn ich dann in der anwendung im onpaste showmessage(text) mache passiert nichts! NIX!
unit JEdit;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, stdctrls, clipbrd; type TPasteNotifyEvent = procedure(Sender: TObject; Text: string) of object; type TJEdit = class(TEdit) private { Private declarations } FOnPaste: TPasteNotifyEvent; procedure WMPaste(var Message: TMessage); message WM_COPY; protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property OnPaste: TPasteNotifyEvent read FOnPaste write FOnPaste; end; procedure Register; implementation uses Variants; constructor TJEdit.Create(AOwner: TComponent); begin inherited create(AOwner); BorderStyle := bsNone; BevelKind := bkTile; end; procedure TJEdit.WMPaste(var Message: TMessage); var Accept: Boolean; Handle: THandle; CText: string; LText: string; AText: string; begin if IsClipboardFormatAvailable(CF_TEXT) then begin try OpenClipBoard(Self.Handle); Handle := GetClipboardData(CF_TEXT); if Handle = 0 then Exit; CText := StrPas(GlobalLock(Handle)); GlobalUnlock(Handle); Accept := True; if Assigned(FOnPaste) then FOnPaste(Self, CText); if not Accept then Exit; LText := ''; if SelStart > 0 then LText := Copy(Text, 1, SelStart); LText := LText + CText; AText := ''; if (SelStart + 1) < Length(Text) then AText := Copy(Text, SelStart + SelLength + 1, Length(Text) - SelStart + SelLength + 1); Text := LText + AText; finally CloseClipBoard; end; end; end; procedure Register; begin RegisterComponents('selfmade', [TJEdit]); end; end. warum? mfg, eyeless |
Re: paste abfangen
Faszinierend. Es sollte aber funzen. Kann es sein, daß im Code beim Kopieren des Strings bereits etwas falsch ist? Du könntest als Test mal ein paar Writeln()-Aufrufe in deinen WM_PASTE-Handler reinmachen und die Anwendung als Konsolenanwendung kompilieren. Dann siehst du, ob das überhaupt aufgerufen wird - auch ohne ShowMessage und dennoch live.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 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 by Thomas Breitkreuz