Цитата:
Сообщение от 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;