AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memo - STRG+V deaktivieren

Ein Thema von der_kumpel · begonnen am 26. Jan 2008 · letzter Beitrag vom 2. Aug 2013
Antwort Antwort
der_kumpel

Registriert seit: 30. Jun 2007
42 Beiträge
 
#1

Memo - STRG+V deaktivieren

  Alt 26. Jan 2008, 12:57
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Memo - STRG+V deaktivieren

  Alt 26. Jan 2008, 12:58
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
der_kumpel

Registriert seit: 30. Jun 2007
42 Beiträge
 
#3

Re: Memo - STRG+V deaktivieren

  Alt 27. Jan 2008, 11:53
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 ).
Zitat von SirThornberry:
ich würde sagen du kommst am besten wenn du die Window-message einfach abfängst
Wie mach ich das genau?
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

Re: Memo - STRG+V deaktivieren

  Alt 27. Jan 2008, 12:29
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;
Thomas
  Mit Zitat antworten Zitat
der_kumpel

Registriert seit: 30. Jun 2007
42 Beiträge
 
#5

Re: Memo - STRG+V deaktivieren

  Alt 27. Jan 2008, 13:27
Einmalig, funktioniert tadellos.
Und ich glaub sogar, ich hab im Groben kappiert, was passiert.


Großes Danke.
  Mit Zitat antworten Zitat
der_kumpel

Registriert seit: 30. Jun 2007
42 Beiträge
 
#6

Re: Memo - STRG+V deaktivieren

  Alt 16. Mär 2008, 12:16
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?
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

Re: Memo - STRG+V deaktivieren

  Alt 16. Mär 2008, 13:47
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;
Thomas
  Mit Zitat antworten Zitat
der_kumpel

Registriert seit: 30. Jun 2007
42 Beiträge
 
#8

Re: Memo - STRG+V deaktivieren

  Alt 16. Mär 2008, 14:15
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.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#9

Re: Memo - STRG+V deaktivieren

  Alt 16. Mär 2008, 14:17
Zitat von der_kumpel:
Whoa, einmalig! Danke.
Das Filtern dann am besten so?
genau!
Thomas
  Mit Zitat antworten Zitat
Jakson

Registriert seit: 10. Mär 2006
34 Beiträge
 
#10

AW: Memo - STRG+V deaktivieren

  Alt 2. Aug 2013, 10:35
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15: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