Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Delphi. if пользователь выполнил команду "вставить" в Edit1 then...

Вячеслав Власов Гуру (3458), закрыт 5 лет назад
Нужно, чтобы срабатывала команда, если пользователь выполняет команду "вставить" (неважно, клавиатурой или контекстным меню), находясь в Edit1
Лучший ответ
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;
Ирина АнатольевнаПросветленный (20125) 5 лет назад
может ему стоит посмотреть в обработчике событий edit'a на комбинации клавиш?
kaiu Высший разум (115652) МОжет быть, мне не до него
Остальные ответы
Jurijus Zaksas Искусственный Интеллект (426528) 5 лет назад
В общем, план такой.
Делаем ActionList, в него ставим 2 экшна, на нажатие Ctrl-V и Shift-Insert. В каждом проверяем, какой активный контрол, если это твой эдит - запоминаем этот факт в глобальной переменной. Затем делаем вставку.
Самому эдиту делаем контекстное меню, схожее со стандартным. Но тоже запоминаем вставку.
В событии OnChange эдита ставишь свою проверку, затем сбрасываешь этот глобальный флаг.
Через задницу, конечно, но никаких стандартных событий на отлов этого дела нигде нет. Так что вот так вот.
Вячеслав ВласовГуру (3458) 5 лет назад
Тоже уже думаю над таким вариантом. Наверное, так и сделаю.
Валерий Шестаков Просветленный (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;

В конце отменить то, что сделали вначале.
Abysal BladeУченик (150) 5 лет назад
А почему вы так хорошо знаете делфи?)
Валерий Шестаков Просветленный (25520) 1. А что, это какое-то сакрально-эзотерическое знание? 2. От делфи тут только синтаксис. Вся "соль" решения в WinAPI. И она хорошо документирована.
Похожие вопросы