Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как запретить копирование из Memo?

481
02 мая 2007 года
Виктор
71 / / 09.04.2003
Как запретить копирование из Memo?
7.8K
02 мая 2007 года
Hrew
185 / / 23.04.2007
Первое, само собой напрашивающееся - установить Enabled:=false, но останетесь без скроллинга, да и коряво это.

Второе, более приемемое (на мой взгляд) - при нажатии 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;


P.S. Для работы с буфером: uses ClipBrd;
4.6K
03 мая 2007 года
Tokolist
268 / / 22.03.2007
нужно просто создать компонент наследник от TMemo, в котором обрабатывать сообщение WM_COPY
303
03 мая 2007 года
makbeth
1.0K / / 25.11.2004
Виктор, вот то, что предлагает Tokolist, только без наследования:
Код:
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;
481
04 мая 2007 года
Виктор
71 / / 09.04.2003
Спасибо.
В втором все равно Ctrl-C работает.
Третий еще не пробывал.
481
04 мая 2007 года
Виктор
71 / / 09.04.2003
Извините, с мышью не работает!
257
04 мая 2007 года
kosfiz
1.6K / / 18.09.2005
ты уверен? я вот что-то ничего скопировать из Memo не могу: использую код приведенный makbeth. там кстати содержимое буфера такое, которое было до копирования из Memo, так что может ты сначала вставил текст в Memo, а потом попробовал его оттуда скопировать вот и получил тоже самое.
7.8K
04 мая 2007 года
Hrew
185 / / 23.04.2007
kosfiz, думаю замечания Виктора относились не к коду makbeth :). Хотя и по поводу очистки буфера мне не совсем понятно, в смысле что у меня такой вариант работает (хотя он и не оптимален).
257
04 мая 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=Hrew]kosfiz, думаю замечания Виктора относились не к коду makbeth :)[/quote]
да что-то я совсем, просто мне показалось на идеальный вариант бочку катят.
[quote=Hrew]Хотя и по поводу очистки буфера мне не совсем понятно, в смысле что у меня такой вариант работает (хотя он и не оптимален).[/quote]
у меня не работает. с мышью нормалек, а вот с другим беда, хотя может и я глючу:)
4.6K
05 мая 2007 года
Tokolist
268 / / 22.03.2007
2 makbeth
ИМХО не очень хороший вариант.
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.
52K
25 июля 2009 года
volopas2
1 / / 25.07.2009
Цитата: Tokolist
2 makbeth
ИМХО не очень хороший вариант.
1. Во-первых если Memo у нас несколько, то прийдется такое прописывать для каждого.
2. Кроме того преимущество компонента в том, что он лежит себе на палитре и его можно ки....[/CODE]



Нихера не работает. Упростил он жизнь. Ты мне усложнил жизнь, валянок хренов. Чтоб ты всрался.

4.6K
25 июля 2009 года
Tokolist
268 / / 22.03.2007
Цитата: volopas2
Нихера не работает. Упростил он жизнь. Ты мне усложнил жизнь, валянок хренов. Чтоб ты всрался.



Вы всего лишь пустая трата природных ресурсов — будьте любезны, верните себя в круговорот питательных веществ. Идите умирать во сне, Вы бесполезный напыщенный тролль. ©

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог