Дано: форма или фрейм. На нем лежит туева хуча контролов, в т.ч. и других фреймов, в т.ч. и создаваемых в рантайме. Некоторые могут принимать пользовательский ввод, некоторые нет.
Требуется: получить|обработать нажатие клавиши в форме или фрейме только если эта клавиша не была обработана ни одним из дочерних элементов управления.
Пример: Есть форма, на ней фрейм, внутри фрейма TEdit, TMemo, TListBox. Из них только TMemo обрабатывает Enter. На форме создан обработчик события OnKeyUp. Хочется чтобы он срабатывал когда к примеру текущий контрол TEdit или TListBox и пользователь нажал клавишу Enter, которую ни один из этих контролов не обрабатывает. При этом, если в фокусе TMemo, то OnKeyUp на форме не должен вызываться.
Cколь мне помнится, в принципе всё так и работает (до тех пор, пока не играть с KeyPreview). Правда, есть проблема с тем, что глядя на виндовый контрол, довольно трудно сказать, собирается ли он обработать некую клавишу.
Здравствуйте, 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;
Здравствуйте, Softwarer, Вы писали: S>Cколь мне помнится, в принципе всё так и работает (до тех пор, пока не играть с KeyPreview). Правда, есть проблема с тем, что глядя на виндовый контрол, довольно трудно сказать, собирается ли он обработать некую клавишу.
Не. Не работает. Обработчик KeyUp просто не срабатывает, точнее срабатывает но далеко не всегда. Сказать обрабатывает эту клавишу виндовый контрол или нет, можно только если послать её ему и поглядеть, обработал или нет.
Здравствуйте, 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 не даёт информации обрабатывает контрол конкретно эту клавишу.