Показать сообщение отдельно
  #6  
Старый 27.02.2009, 01:22
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
Сообщение Обработка

Цитата:
Сообщение от Aristarh Dark
Rokuell, метод хорош, тут ничего не скажешь (кста, delete можно и не указывать, и так нормально удаляет) я сам его долгое время использовал, но, как говорится, есть одно "но". Данный метод не спасает от copy/paste

Ну что ж, если надо ещё контроль над вставкой, то:

1. В моём варианте комбинация Ctrl+C и так не работает ( т.к. 'C' - это не цифра )

2. Есть ещё комбинация клавиш для вставки Shift+Ins
Для её контроля можно добавить код:
Код:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 if ( ssShift in Shift ) and ( Key = VK_INSERT ) then Key := 0;
end;

3. Но! Вставить в Edit можно ещё одним способом - кликнув правой кнопкой мыши и выбрав пункт меню "Вставить".
И вот если надо контролировать ещё и это, то надо использовать другой вариант.

Общий вариант для всех 3х случаев:

1. В секцию формы private добавляем переменную и новую процедуру:
Код:
private
    StdEditProc : procedure (var Msg:TMessage) of object;
    procedure EditProc(var Msg:TMessage);

2. При создании формы заменяем стандартый обработчик сообщения у Edit на самописный, предварительно сохраняя стандартный:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
 StdEditProc := Edit1.WindowProc;
 Edit1.WindowProc := EditProc;
end;

3. И в нашем обработчике пишем:
Код:
procedure TForm1.EditProc(var Msg: TMessage);
begin
 Case Msg.Msg of
  WM_PASTE: ; // ничего не делаем, поэтому вставка не происходит
  WM_KEYDOWN,WM_KEYUP,WM_CHAR: begin
                        // Если это запятая ( 44 - это её ASCII код )
                        if Msg.WParam = 44 then
                         begin
                          // Заменяем на точку
                          Msg.WParam := 46;
                          // И вызываем стандартный обработчик 
                          StdEditProc(Msg); 
                         end
                        else
                         if Msg.WParam in [8,37,39,46,48..57]
                         then StdEditProc(Msg);
                         // 8 - backspace
                         // 37 и 39 - VK_LEFT и VK_RIGHT
                         // 46 - точка
                         // 48..57 - '0'..'9'
                         // Для других символов ничего не происходит
                       end;
  Else StdEditProc(Msg);
 End;
end;
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием