Как запретить копирование из Memo?
Как запретить копирование из Memo?
Второе, более приемемое (на мой взгляд) - при нажатии ctrl+c, ctrl+ins и попытке скопировать через правую кнопку мыши - чистить буфер обмена.
В OnMouseUp:
Код:
ClipBoard.Clear;
В OnKeyDown:
Код:
if ( (Key = ord('С')) and (ssCtrl in Shift)) then ClipBoard.Clear;
if ( (Key=vk_Insert) and (ssCtrl in Shift)) then ClipBoard.Clear;
if ( (Key=vk_Insert) and (ssCtrl in Shift)) then ClipBoard.Clear;
P.S. Для работы с буфером: uses ClipBrd;
нужно просто создать компонент наследник от TMemo, в котором обрабатывать сообщение WM_COPY
Код:
type
TForm1 = class (TForm)
//...
Memo1: TMemo;
private
oldMemoWnd: TWndMethod;
procedure MemoHook(var Message: TMessage);
//...
end;
procedure Form1.Create(Sender: TObject);
begin
//...
oldMemoWnd:=Memo1.WindowProc;
Memo1.WindowProc:=MemoHook;
//...
end;
procedure Form1.Destroy(Sender: TObject);
begin
//...
Memo1.WindowProc:=oldMemoWnd;
//...
end;
procedure Form1.MemoHook(var Message: TMessage);
begin
if Message.Msg <> WM_COPY then oldMemoWnd(Message);
end;
TForm1 = class (TForm)
//...
Memo1: TMemo;
private
oldMemoWnd: TWndMethod;
procedure MemoHook(var Message: TMessage);
//...
end;
procedure Form1.Create(Sender: TObject);
begin
//...
oldMemoWnd:=Memo1.WindowProc;
Memo1.WindowProc:=MemoHook;
//...
end;
procedure Form1.Destroy(Sender: TObject);
begin
//...
Memo1.WindowProc:=oldMemoWnd;
//...
end;
procedure Form1.MemoHook(var Message: TMessage);
begin
if Message.Msg <> WM_COPY then oldMemoWnd(Message);
end;
В втором все равно Ctrl-C работает.
Третий еще не пробывал.
Извините, с мышью не работает!
ты уверен? я вот что-то ничего скопировать из Memo не могу: использую код приведенный makbeth. там кстати содержимое буфера такое, которое было до копирования из Memo, так что может ты сначала вставил текст в Memo, а потом попробовал его оттуда скопировать вот и получил тоже самое.
kosfiz, думаю замечания Виктора относились не к коду makbeth :). Хотя и по поводу очистки буфера мне не совсем понятно, в смысле что у меня такой вариант работает (хотя он и не оптимален).
да что-то я совсем, просто мне показалось на идеальный вариант бочку катят.
[quote=Hrew]Хотя и по поводу очистки буфера мне не совсем понятно, в смысле что у меня такой вариант работает (хотя он и не оптимален).[/quote]
у меня не работает. с мышью нормалек, а вот с другим беда, хотя может и я глючу:)
ИМХО не очень хороший вариант.
1. Во-первых если Memo у нас несколько, то прийдется такое прописывать для каждого.
2. Кроме того преимущество компонента в том, что он лежит себе на палитре и его можно кинуть на формочку в любое время изменив всего лишь одно свойство CanCopy.
3. Кроме того если тебе прийдется динамически в рантайм режиме разрешать/запрещать копирование, то твой код еще немножко усложнится.
4. Далее подмену оконной процедуры лучше вообще не использовать если нет необходимости.
5. Основной код не захламляется.
6. И наконец сила Дельфи в компонентах ;)
Вот код на написание, отладку и тестирование которого ушло не более 5 минут, но я упростил себе всю оставшуюся жизнь :) Кроме того я могу постепенно улучшать компонент: добавлять новые свойства, методы и при этом не захламлять основной код.
Код:
unit MemoEx;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TMemoEx = class(TMemo)
private
FCanCopy: Boolean;
procedure WMCopy(var Message: TWMCopy); message WM_COPY;
protected
public
constructor Create(AOwner: TComponent); override;
published
property CanCopy: Boolean read FCanCopy write FCanCopy default True;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Pelesh', [TMemoEx]);
end;
{ TMemoEx }
constructor TMemoEx.Create(AOwner: TComponent);
begin
FCanCopy := True;
inherited;
end;
procedure TMemoEx.WMCopy(var Message: TWMCopy);
begin
if FCanCopy then
inherited;
end;
end.
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TMemoEx = class(TMemo)
private
FCanCopy: Boolean;
procedure WMCopy(var Message: TWMCopy); message WM_COPY;
protected
public
constructor Create(AOwner: TComponent); override;
published
property CanCopy: Boolean read FCanCopy write FCanCopy default True;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Pelesh', [TMemoEx]);
end;
{ TMemoEx }
constructor TMemoEx.Create(AOwner: TComponent);
begin
FCanCopy := True;
inherited;
end;
procedure TMemoEx.WMCopy(var Message: TWMCopy);
begin
if FCanCopy then
inherited;
end;
end.
Цитата: Tokolist
2 makbeth
ИМХО не очень хороший вариант.
1. Во-первых если Memo у нас несколько, то прийдется такое прописывать для каждого.
2. Кроме того преимущество компонента в том, что он лежит себе на палитре и его можно ки....[/CODE]
ИМХО не очень хороший вариант.
1. Во-первых если Memo у нас несколько, то прийдется такое прописывать для каждого.
2. Кроме того преимущество компонента в том, что он лежит себе на палитре и его можно ки....[/CODE]
Нихера не работает. Упростил он жизнь. Ты мне усложнил жизнь, валянок хренов. Чтоб ты всрался.
Цитата: volopas2
Нихера не работает. Упростил он жизнь. Ты мне усложнил жизнь, валянок хренов. Чтоб ты всрался.
Вы всего лишь пустая трата природных ресурсов — будьте любезны, верните себя в круговорот питательных веществ. Идите умирать во сне, Вы бесполезный напыщенный тролль. ©