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 Memo - STRG+V deaktivieren (https://www.delphipraxis.net/107354-memo-strg-v-deaktivieren.html)

der_kumpel 26. Jan 2008 11:57


Memo - STRG+V deaktivieren
 
Moin,


wie kann man verhindern, dass per STRG+V der Inhalt der Zwischenablage ins Memo eingefügt wird?

Ich würde dies gerne selber im OnKeyDown Event machen, da ich den Text zuvor noch überprüfen möchte.


Delphi-Quellcode:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if ((Key = Ord('V')) and (ssCtrl in Shift)) then
    begin
      Clipboard.Open;
        try
          // Text filtern...
        finally
          Clipboard.Close;
        end;
    end;
end;
So wird der Text einmal gefiltert und anschließend leider nochmal komplett eingefügt.


Danke,
kumpel

SirThornberry 26. Jan 2008 11:58

Re: Memo - STRG+V deaktivieren
 
ich würde sagen du kommst am besten wenn du die Window-message einfach abfängst. Bedenke aber das es auch ein Contextmenü gibt und auch wm_settext etc. Du kommst also am besten du korrigierst generell falsche Eingaben im OnChange

der_kumpel 27. Jan 2008 10:53

Re: Memo - STRG+V deaktivieren
 
Zitat:

Zitat von SirThornberry
du korrigierst generell falsche Eingaben im OnChange

Okay, danke, so hab ichs jetzt erstmal hinbekommen, allerdings hatte ich ursprünglich vor, nur den Text zu filtern, der per STRG+V eingefügt wird (und das lässt sich ja im OnChange nicht mehr feststellen :lol:).
Zitat:

Zitat von SirThornberry
ich würde sagen du kommst am besten wenn du die Window-message einfach abfängst

Wie mach ich das genau?

toms 27. Jan 2008 11:29

Re: Memo - STRG+V deaktivieren
 
Zitat:

Zitat von SirThornberry
ich würde sagen du kommst am besten wenn du die Window-message einfach abfängst

Zitat:

Wie mach ich das genau?
Hallo, wenn du keine neue Komponente erstellen möchtest, dann führst du ein
"Subclassing" durch. Und dann kannst du die entsprechende(n) Nachricht(en) abfangen
und den Text filtern, bevor er effektiv ins Memo eingefügt wird.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    FOldMemoProc: TWndMethod;
  protected
    procedure MemoWndProc(var Message: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.MemoWndProc(var Message: TMessage);
begin
  if (Message.Msg = WM_PASTE) then
  begin
    Message.Result := 1;
    // Hier text manuell filtern mit

 (* if ClipBoard.HasFormat(CF_TEXT) then
  begin
    ClipBoard.Open;
    try
     // hier: Clipboard auslesen, filtern, Text im Memo setzen
     ClipBoard.Close;
    end;
  *)
  end else
    FOldMemoProc(Message);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldMemoProc := Memo1.WindowProc;
  Memo1.WindowProc := MemoWndProc;
end;

der_kumpel 27. Jan 2008 12:27

Re: Memo - STRG+V deaktivieren
 
Einmalig, funktioniert tadellos.
Und ich glaub sogar, ich hab im Groben kappiert, was passiert. :mrgreen:


Großes Danke. :dp:

der_kumpel 16. Mär 2008 11:16

Re: Memo - STRG+V deaktivieren
 
Ich muss hier nochmal kurz stören, und zwar wollte ich eben versuchen, die Methode oben auf ein RichEdit anzuwenden, leider ohne Erfolg.

Ich hab eigentlich nur Folgendes geändert:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldMemoProc := RichEdit1.WindowProc; // da ich mal stark annehme, dass der Variablenname keine Rolle spielt,
  RichEdit1.WindowProc := MemoWndProc; // sonder nur der/die/das übergebene WindowProc
end;
Anstatt der Filterung hab ich testhalber ein showmesage() eingebaut, jedoch wird keine Nachricht angezeigt. :(
Warum geht das so nicht und was muss man anders machen?

toms 16. Mär 2008 12:47

Re: Memo - STRG+V deaktivieren
 
Hallo, beim RichEdit musst du noch zusätzlich Strg + V abfangen.

Delphi-Quellcode:
procedure TForm1.MemoWndProc(var Message: TMessage);
var
  ShiftState: TShiftState;
  bPasting: Boolean;
begin
  bPasting := False;
  if Message.Msg = WM_KEYDOWN then
  begin
    with TWMKey(Message) do
    begin
      ShiftState := KeyDataToShiftState(KeyData);
      bPasting := (ShiftState = [ssCtrl]) and (CharCode = Ord('V'));
    end;
  end else
    bPasting := (Message.Msg = WM_PASTE);

  if bPasting then
    Message.Result := 1
  else
    FOldMemoProc(Message);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldMemoProc := RichEdit1.WindowProc;
  RichEdit1.WindowProc := MemoWndProc;
end;

der_kumpel 16. Mär 2008 13:15

Re: Memo - STRG+V deaktivieren
 
Whoa, einmalig! Danke.
Noch eine kleine, evtl. unwichtige Frage, nur um sicherzugehen: Das Filtern dann am besten so?
Delphi-Quellcode:
 {...}
if bPasting then
  begin
    Message.Result := 1;
    //Filtern
  end
  else
  {...}
Danke nochmal. :thumb:

toms 16. Mär 2008 13:17

Re: Memo - STRG+V deaktivieren
 
Zitat:

Zitat von der_kumpel
Whoa, einmalig! Danke.
Das Filtern dann am besten so?

genau!

Jakson 2. Aug 2013 09:35

AW: Memo - STRG+V deaktivieren
 
Das mit dem MemoWndProc hat bei mir nicht geklappt. Stattdessen verwende ich OnKeyDown.

Bei mir schaut die Funktion so aus:
Delphi-Quellcode:
procedure TF_ReportConfig.Memo_RTF_KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var MyHandle : THandle;
    TextPtr : PChar;
    RtfEdit : TRichEdit;
    Format  : DWord;
begin // uses ClipBrd
{$IFNDEF UNICODE}
  Format := CF_TEXT;
{$ELSE}
  Format := CF_UNICODETEXT;
{$ENDIF}

 if (Sender IS TRichEdit) AND (ssCtrl IN Shift) AND (Key = ORD('V')) then
  begin
   RtfEdit := Sender AS TRichEdit;
   if RtfEdit.PlainText then
    begin
     if ClipBoard.HasFormat(Format) then
      begin
       ClipBoard.Open;
       try
        MyHandle       := Clipboard.GetAsHandle(Format);
        TextPtr        := GlobalLock(MyHandle);
        RtfEdit.SelText := StrPas(TextPtr);
        GlobalUnlock(MyHandle);
        Key := 0;
       finally
        Clipboard.Close;
       end;// finally
      end;
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:28 Uhr.

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