Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ctrl-V: конфликт между меню и find-диалогом


Автор: ilyalyu 25.10.2006, 20:52
Итак, на первый взгляд простая задача: в главном меню на кнопке "Paste" ("Вставить") необходимо указать отвечающую данной операции горячую клавишу, т.е. Ctrl-V.

Казалось бы, все просто - достаточно указать горячую клавишу в свойстве ShortCut и написать обработчик события OnClick, который будет выполнять необходимую операцию (вставлять текст из Clipboard в TMemo компоненту). Я так и сделал, и столкнулся с такой проблемой...

Оказалось, что я не могу вставить текст в Find диалог с помощью горячей клавиши Ctrl-V. Вместо этого, приложение вызывает обработчик события OnClick, который вставляет текст в TMemo компоненту.

Ни одного простого способа обойти эту проблему я так и не нашел. Например:
1. Найти компоненту, заменяющую Find диалог - не удалось, кроме того, такая компонента наверняка будет отличаться по стилю от других диалогов.
2. Написать собственную компоненту - сложно (хотя, похоже, в больших приложениях именно так и делают).
3. Вместо того чтобы использовать свойство ShortCut, рисовать меню, используя событие OnDrawItem - тоже очень сложно, кроме того, где гарантия, что такое меню не будет отличаться по стилю от остальных компонент.
4. Вставлять текст из Clipboard в Find диалог внутри обработчика события OnClick с помощью Windows message WM_Paste  - не получилось (в TEdit текст вставляется, а в TFindDialog - нет).

Может, я упускаю из вида какое-то простое решение? Ведь, задача, которую я описал, не относится к разряду экзотических.





Автор: Seraphim 25.10.2006, 20:57
А может лучше так, не проверенно конечно smile
Вообщем, на твой TEdit поставить событие по нажатию клавишь Ctrl+v и если этот TEdit.Focused:=True; Постлать твою комманду вставки кода. Попробуй так ;)

Автор: ilyalyu 25.10.2006, 21:11
Тут вопрос не в том, как вставить текст в TMemo по нажатию Ctrl+V - он туда и так автоматически вставляется. Проблема в том, как простым способом поместить текст Ctrl+V на кнопку меню, и чтоб при этом Find диалог продолжал работать как надо.

Автор: Yanis 26.10.2006, 11:01
ilyalyu
А разве так не проще?

Код
procedure TForm1.FindDialog1Show(Sender: TObject);
begin
  N1231.ShortCut := 0;
end;

procedure TForm1.FindDialog1Close(Sender: TObject);
begin
  N1231.ShortCut := ShortCut(Ord('V'), [ssCtrl]);
end;


P. S. Ну по крайней мере пользоваться где нужно 3 и 8 строкой.

Автор: Akella 26.10.2006, 12:11
Цитата(ilyalyu @  25.10.2006,  20:52 Найти цитируемый пост)
Оказалось, что я не могу вставить текст в Find диалог с помощью горячей клавиши Ctrl-V. 

что за Find диалог, откуда он, это твой Find диалог???
возможно, что в событии onKeyDown можно перехватить Ctrl-V.

Добавлено @ 12:12 
я так понимаю, что это компонента TFindDialog?
Тогда можно создать свою орму поиска.

Автор: ilyalyu 26.10.2006, 18:41
Yanis,

Спасибо за совет. Правда пришлось еще деактивировать форму, чтобы пользователь не мог смотреть меню в то время, когда показывается диалог:

Код

procedure TForm1.FindDialog1Show(Sender: TObject);
begin
  N1231.ShortCut := 0;
  Enabled := False;
end;
procedure TForm1.FindDialog1Close(Sender: TObject);
begin
  N1231.ShortCut := ShortCut(Ord('V'), [ssCtrl]);
  Enabled := True;
end;


Автор: Yanis 27.10.2006, 10:32
ilyalyu
Пожалуйста, но помоему с блокирование формы ты перегнул smile Может просто определять какое окно активно и в зависимости от этого устанавливать горячую клавишу или нет.

Автор: ilyalyu 28.10.2006, 21:40
Действительно, можно проверять свойство active. Не могу понять, почему сразу так не сделал. Наверное - заскок... Еще раз спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)