Обработать не обработанную кнопку
От: Utruk  
Дата: 15.12.12 15:33
Оценка:
Дано: форма или фрейм. На нем лежит туева хуча контролов, в т.ч. и других фреймов, в т.ч. и создаваемых в рантайме. Некоторые могут принимать пользовательский ввод, некоторые нет.
Требуется: получить|обработать нажатие клавиши в форме или фрейме только если эта клавиша не была обработана ни одним из дочерних элементов управления.

Пример: Есть форма, на ней фрейм, внутри фрейма TEdit, TMemo, TListBox. Из них только TMemo обрабатывает Enter. На форме создан обработчик события OnKeyUp. Хочется чтобы он срабатывал когда к примеру текущий контрол TEdit или TListBox и пользователь нажал клавишу Enter, которую ни один из этих контролов не обрабатывает. При этом, если в фокусе TMemo, то OnKeyUp на форме не должен вызываться.

Как такое сделать и возможно ли вообще?
Re: Обработать не обработанную кнопку
От: Softwarer http://softwarer.ru
Дата: 15.12.12 16:40
Оценка:
Здравствуйте, Utruk, Вы писали:

Cколь мне помнится, в принципе всё так и работает (до тех пор, пока не играть с KeyPreview). Правда, есть проблема с тем, что глядя на виндовый контрол, довольно трудно сказать, собирается ли он обработать некую клавишу.
Re: Обработать не обработанную кнопку
От: Aniskin  
Дата: 15.12.12 21:27
Оценка:
Здравствуйте, Utruk, Вы писали:

U>Как такое сделать и возможно ли вообще?


Попробуй так:

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var R: Integer;
begin
  if Key <> VK_RETURN then Exit;
  if Assigned(ActiveControl) then
    begin
      R := ActiveControl.Perform(WM_GETDLGCODE, 0, 0);
      if (R and DLGC_WANTALLKEYS = DLGC_WANTALLKEYS) or (R and DLGC_BUTTON = DLGC_BUTTON) then Exit;
    end;
  // Твой код
end;


Form.KeyPreview := True;
Re[2]: Обработать не обработанную кнопку
От: Utruk  
Дата: 17.12.12 05:28
Оценка:
Здравствуйте, Softwarer, Вы писали:
S>Cколь мне помнится, в принципе всё так и работает (до тех пор, пока не играть с KeyPreview). Правда, есть проблема с тем, что глядя на виндовый контрол, довольно трудно сказать, собирается ли он обработать некую клавишу.

Не. Не работает. Обработчик KeyUp просто не срабатывает, точнее срабатывает но далеко не всегда. Сказать обрабатывает эту клавишу виндовый контрол или нет, можно только если послать её ему и поглядеть, обработал или нет.
Re[2]: Обработать не обработанную кнопку
От: Utruk  
Дата: 17.12.12 05:30
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Здравствуйте, Utruk, Вы писали:


U>>Как такое сделать и возможно ли вообще?


A>Попробуй так:


A>
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
A>var R: Integer;
A>begin
A>  if Key <> VK_RETURN then Exit;
A>  if Assigned(ActiveControl) then
A>    begin
A>      R := ActiveControl.Perform(WM_GETDLGCODE, 0, 0);
A>      if (R and DLGC_WANTALLKEYS = DLGC_WANTALLKEYS) or (R and DLGC_BUTTON = DLGC_BUTTON) then Exit;
A>    end;
A>  // Твой код
A>end;
A>


A>Form.KeyPreview := True;


Попробую. Вопрос только в том что WM_GETDLGCODE не даёт информации обрабатывает контрол конкретно эту клавишу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.