Delphi-PRAXiS
Seite 1 von 2  1 2      

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 paste abfangen (https://www.delphipraxis.net/51733-paste-abfangen.html)

eyeless 17. Aug 2005 20:23


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:
//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;
nur leider passiert bei beiden garnix .. was mach ich falsch?

mfg, eyeless

Olli 17. Aug 2005 20:25

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).

SirThornberry 17. Aug 2005 20:26

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.

eyeless 17. Aug 2005 20:35

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?

Olli 17. Aug 2005 20:55

Re: paste abfangen
 
Zitat:

Zitat von eyeless
@olli: aber wenigsten tApplicationEvents müsste doch ALLe messages abfangen, oder?

Nur wenn die VCL WM_PASTE quasi forwardet! Ansonsten wird WM_PASTE nur an das jeweilige Fenster (bzw. Komponente) geschickt!
Zitat:

An application sends a WM_PASTE message to an edit control or combo box to copy the current content of the clipboard to the edit control at the current caret position. Data is inserted only if the clipboard contains data in CF_TEXT format.

eyeless 17. Aug 2005 21:03

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 ...

Olli 17. Aug 2005 21:07

Re: paste abfangen
 
Zitat:

Zitat von eyeless
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 ...

Wenn du aktuell zB ein TEdit benutzt, dann leite es ab. So einfach ist das. In deiner abgeleiteten Klasse mußt du dann die Nachricht so abfangen, wie du es wohl oben versucht hast.

eyeless 17. Aug 2005 21:08

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

eyeless 17. Aug 2005 21:20

Re: paste abfangen
 
hmm, wohl zu früh gefreut, passiert nix ...

hier mal die komponente:

Delphi-Quellcode:
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.
wenn ich dann in der anwendung im onpaste showmessage(text) mache passiert nichts! NIX!

warum?

mfg, eyeless

Olli 17. Aug 2005 21:29

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 02:40 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