![]() |
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:
So wird der Text einmal gefiltert und anschließend leider nochmal komplett eingefügt.
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; Danke, kumpel |
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
|
Re: Memo - STRG+V deaktivieren
Zitat:
Zitat:
|
Re: Memo - STRG+V deaktivieren
Zitat:
Zitat:
"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; |
Re: Memo - STRG+V deaktivieren
Einmalig, funktioniert tadellos.
Und ich glaub sogar, ich hab im Groben kappiert, was passiert. :mrgreen: Großes Danke. :dp: |
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:
Anstatt der Filterung hab ich testhalber ein showmesage() eingebaut, jedoch wird keine Nachricht angezeigt. :(
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; Warum geht das so nicht und was muss man anders machen? |
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; |
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:
Danke nochmal. :thumb:
{...}
if bPasting then begin Message.Result := 1; //Filtern end else {...} |
Re: Memo - STRG+V deaktivieren
Zitat:
|
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 06:24 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