kaiu
Высший разум
(115652)
5 лет назад
Тут поройся www. cyberforum. ru/delphi-beginners/thread696797.html
Хотя верно всегда обрабатывать изменение, тогда не важно вставлено это или нажата клавиша
Вячеслав ВласовГуру (3458)
5 лет назад
Ну, я и так в onChange пишу, только вот нужно командой "вставить" не вставлять текст сразу, а сначала проверить, что за строка в буфере и как ее вставлять. Но активироваться эта проверка должна если пользователь что-то пастит. В этом и вопрос :)
Я, кстати, только что из этой темы. Пробовал вот тот код, но ShowMessage в нем не срабатывает:
TEdit = class(StdCtrls.TEdit)
protected
procedure WndProc( var Message: TMessage ); override;
end;
// ...
procedure TEdit.WndProc(var Message: TMessage);
begin
inherited;
if Message.Msg = WM_PASTE then
begin
ShowMessage('Paste!!!');
end;
end;
Jurijus Zaksas
Искусственный Интеллект
(426528)
5 лет назад
В общем, план такой.
Делаем ActionList, в него ставим 2 экшна, на нажатие Ctrl-V и Shift-Insert. В каждом проверяем, какой активный контрол, если это твой эдит - запоминаем этот факт в глобальной переменной. Затем делаем вставку.
Самому эдиту делаем контекстное меню, схожее со стандартным. Но тоже запоминаем вставку.
В событии OnChange эдита ставишь свою проверку, затем сбрасываешь этот глобальный флаг.
Через задницу, конечно, но никаких стандартных событий на отлов этого дела нигде нет. Так что вот так вот.
Валерий Шестаков
Просветленный
(25520)
5 лет назад
вначале:
FEditInstance := Classes.MakeObjectInstance(EditWndProc);
FDefEditProc := Pointer(GetWindowLong(Edit1.Handle, GWL_WNDPROC));
SetWindowLong(FEditHandle, GWL_WNDPROC, LongInt(FEditInstance));
отлов:
procedure TForm1.EditWndProc(var Message: TMessage);
begin
if Message.Msg = WM_PASTE then
begin
Caption := 'Paste';
end else
Message.Result := CallWindowProc(FDefEditProc, Edit1.Handle, Message.Msg, Message.WParam, Message.LParam);
end;
В конце отменить то, что сделали вначале.