Newsgroup: it.comp.lang.delphi
Titolo: RichEdit e Copy (WM_COPY)

Salve,
sto cercando di disattivare le funzionalità della clipboard (copy, cut e
past) nel componenti RichEdit ma senza successo.
Ho tentanto derivando da TCustomRichEdit e reimplementando i gestori di
messaggi WM_COPY e simili ed effettivamente questi funzionano se invio da
codice un messaggio (SendMessage (...) ) ma se da tastiera faccio CTRL+C e
CTRL+V la funzionalità resta attiva.
Ho provato con un hook dei messaggi e con questo ho ottenuto lo stesso
risultato di cui sopra.
Ho cercato nelle classi superiori di TCustomRichEdit e non ho trovato dove
viene gestito il messaggio WM_COPY, ho implementato anche una WndProc ma con
CTRL+C e CTRL+V non viene inviato un messaggio WM_COPY o WM_PASTE.
Qualcuno saprebbe come risolvere il problema?
Grazie

Non so di preciso, senza nessuna prova, creati un derivato del
CustomRichEdit e inserisci le procedure ai messaggi Copy e Paste nel
private, es:
  TMioRE=class(TCustomRichEdit)
  private
    procedure WMCopy(var Message: TWMCopy); message WM_COPY;
    procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
  public
etc...
Nell'implementazione delle procedure ovviamente non mettere la chiave
"inherited;" altrimenti lasci l'evento proseguire all'indietro e non risolvi
niente. Puoi tranquillamene lasciare quindi le due procedure con il begin e
l'end senza niente dentro.
Dovrebbe funzionare, anche se ripeto non ho alcuna esperienza in merito.
Ciao,
  Fabio

 CTRL+V la funzionalità resta attiva.
Puoi provare ad intercettare il messaggio di notificazione CN_KEYDOWN e a
interrogare lo stato del vk_control. Nel caso disabiliti la gestione. Di
seguito uno stralcio. Sembra funzionare ma non l'ho testata molto.
procedure TMyRich.CNKeyDown(var Message: TWMKeyDown);
var
  KeyState: integer;
begin
  KeyState := GetAsyncKeyState(VK_CONTROL);
  if KeyState < 0 then
  begin
    with Message do
      case CharCode of
        Ord('C'):
        begin
            Result := 1;
            Exit;
        end;
        Ord('V'):
        begin
            Result := 1;
            Exit;
        end;
     end;
  end;
  inherited;
end;
ciao
Antonio

"Fabio Cillo" <fabio...@TOGLIQUESTOtiscali.it> wrote in message
news:aoeuof$uqq$1...@newsreader.mailgate.org...

Avevo già provato con questo metodo e funziona nel caso in cui invio con
SendMessage il messaggio WM_COPY, solamente che se da tastiera faccio CTRL+C
e CTRL+V il testo viene comunque copiato ed incollato.
Grazie lo stesso, se ci riesco posto sul newsgroup la soluzione.
Saluti

 past) nel componenti RichEdit ma senza successo.
Ed ecco la soluzione in collaborazione con Antonio (alias guastatore)
type
  TVeryRichEdit = class(TCustomRichEdit)
  private
    { Private declarations }
    fAllowCopy: boolean;
    procedure CNKeyDown(var Message: TWMKeyDown); message WM_KeyDown;
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property Align;
    property Alignment;
    property Anchors;
    property BevelEdges;
    property BevelInner;
    property BevelOuter;
    property BevelKind default bkNone;
    property BevelWidth;
    property BiDiMode;
    property BorderStyle;
    property BorderWidth;
    property Color;
    property Ctl3D;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Font;
    property HideSelection;
    property HideScrollBars;
    property ImeMode;
    property ImeName;
    property Constraints;
    property Lines;
    property MaxLength;
    property ParentBiDiMode;
    property ParentColor;
    property ParentCtl3D;
    property ParentFont;
    property ParentShowHint;
    property PlainText;
    property PopupMenu;
    property ReadOnly;
    property ScrollBars;
    property ShowHint;
    property TabOrder;
    property TabStop default True;
    property Visible;
    property WantTabs;
    property WantReturns;
    property WordWrap;
    property OnChange;
    property OnContextPopup;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnMouseWheel;
    property OnMouseWheelDown;
    property OnMouseWheelUp;
    property OnProtectChange;
    property OnResizeRequest;
    property OnSaveClipboard;
    property OnSelectionChange;
    property OnStartDock;
    property OnStartDrag;
    property AllowCopy: boolean read fAllowCopy write fAllowCopy default
true;
  end;
implementation
{ implementation: }
{ TVeryRichEdit }
procedure TVeryRichEdit.CNKeyDown(var Message: TWMKeyDown);
var
  KeyState: integer;
begin
  if (not fAllowCopy) then
  begin
    KeyState := GetAsyncKeyState(VK_CONTROL);
    if KeyState < 0 then
    begin
      with Message do
        case CharCode of
          Ord('C'):
            begin
              Result := 1;
              Exit;
            end;
          Ord('V'):
            begin
              Result := 1;
              Exit;
            end;
          45: //Ins
            begin
              Result := 1;
              Exit;
            end;
        end;
    end;
    KeyState := GetAsyncKeyState(VK_SHIFT);
    if KeyState < 0 then
    begin
      with Message do
        case CharCode of
          45: //Ins
            begin
              Result := 1;
              Exit;
            end;
        end;
    end;
  end;
  inherited;
end;

>     procedure CNKeyDown(var Message: TWMKeyDown); message WM_KeyDown;
Funziona lo stesso, ma secondo me č preferibile intercettare il CN_KeyDown;
rispetta di piů il ciclo dei messaggi della VCL ed č piů OOP in un certo
senso ;-)
ciao
Antonio Sanguigni

 wrote in message
news:NZWq9.6195$6n3.1...@news1.tin.it...

Mia svista.