Ввод в невидимые TEdit
Модератор: Модераторы
Ввод в невидимые TEdit
Доброго времени! Господа-граждане, подскажите!
Столкнулся со странной (на мой взгляд) особенностью Lazarus - чего ни в Delphi, ни в Kylih не замечалось:
Имеем TPanel, на ней TEdit с фокусом ввода, ставим TPanel.Visible=False - тем не менее все OnKeyPress и
OnKeyDown в TEdit отрабатываются! Может я испорчен временем, но установка свойства формы KeyPreviiew=True
должна включать обработку нажатия клавиш на пустой форме и забывать о невидимых TEdit?
P.s. Был вынужден запретить обработку нажатия клавиш, если данная панель не видна. Обидно.
Столкнулся со странной (на мой взгляд) особенностью Lazarus - чего ни в Delphi, ни в Kylih не замечалось:
Имеем TPanel, на ней TEdit с фокусом ввода, ставим TPanel.Visible=False - тем не менее все OnKeyPress и
OnKeyDown в TEdit отрабатываются! Может я испорчен временем, но установка свойства формы KeyPreviiew=True
должна включать обработку нажатия клавиш на пустой форме и забывать о невидимых TEdit?
P.s. Был вынужден запретить обработку нажатия клавиш, если данная панель не видна. Обидно.
Этого не может быть, т.к. TEdit (в данном случае) сам тоже не видим и в нем производить ввод нет возможности.Владимир писал(а):тем не менее все OnKeyPress и OnKeyDown в TEdit отрабатываются!
KeyPreview позволяет обрабатывать события OnKeyPress, OnKeyDown, OnKeyUp сначала как событие формы, а потом (если описан обработчик) как событие компонента, в котором оно наступило.Владимир писал(а): Может я испорчен временем, но установка свойства формы KeyPreviiew=True
должна включать обработку нажатия клавиш на пустой форме и забывать о невидимых TEdit?
Вот элементарный код, который поможет разобраться:
Код: Выделить всё
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
begin
ShowMessage('FromEdit: ' + Key);
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin
ShowMessage('FromForm: ' + Key);
end;
procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: char);
begin
ShowMessage('FromListBox: ' + Key);
end; На форме (Form1) расположен список (ListBox1) и редактор (Edit), в которых нажимаем кнопки. Обрати внимание на то, как обрабатываются простые ключи (типа 'T', '6', 'п' и т.п.) и командные (типа 'Enter', 'Esc' и т.п.) в ListBox1, а как в Edit1 - тут могут быть неоднозначности.
Если спрятать компонент, то будет обрабатываться только событие TForm1.FormKeyPress.
Забудем про форму (на время) и ее обработчики.
Имеем НЕВИДИМУЮ панель, на котрой TEdit с ОСТАВШИМСЯ фокусом - работает, гадюка!
Обнаружил случайно - этот TEdit принимает символы со сканера (в разрыв клавиатуры) - случайно просканировал что-то и получил...
Добавлено спустя 2 часа 47 минут 49 секунд:
Еще интересней...
Сделал тестовый пример - все на классе - TEdit невидим - ввода нет!
Проект был портирован из Kylih - может, в этом проблема? Разберусь - отпишу.
Всем спасибо. И не стоит меня носом тыкать по обработчикам событий - я в дельфях еще с Win 3.11...
Добавлено спустя 1 час 34 минуты 19 секунд:
И наконец...
TPanel, на ней TEdit, фокус- на TEdit
делаем обработчик OnKeyDown (например, по Esc)- Tpanel.Visible:=False
после чего TEdit.OnKeyPress отрабатывается замечательно!
Если Tpanel.Visible:=False делать по клику отдельной кнопки - все штатно!
Вот так вот.
Имеем НЕВИДИМУЮ панель, на котрой TEdit с ОСТАВШИМСЯ фокусом - работает, гадюка!
Обнаружил случайно - этот TEdit принимает символы со сканера (в разрыв клавиатуры) - случайно просканировал что-то и получил...
Добавлено спустя 2 часа 47 минут 49 секунд:
Еще интересней...
Сделал тестовый пример - все на классе - TEdit невидим - ввода нет!
Проект был портирован из Kylih - может, в этом проблема? Разберусь - отпишу.
Всем спасибо. И не стоит меня носом тыкать по обработчикам событий - я в дельфях еще с Win 3.11...
Добавлено спустя 1 час 34 минуты 19 секунд:
И наконец...
TPanel, на ней TEdit, фокус- на TEdit
делаем обработчик OnKeyDown (например, по Esc)- Tpanel.Visible:=False
после чего TEdit.OnKeyPress отрабатывается замечательно!
Если Tpanel.Visible:=False делать по клику отдельной кнопки - все штатно!
Вот так вот.
Код: Выделить всё
Panel1.Hide;
if edit1.Focused then
form1.Caption := 'F'
else
form1.Caption := 'N';Edit1 находится на Panel1 и form1.Caption при этом (у меня) = 'N'. Так что фокус не остается на Edit1...
Из примера не очевидно, что перед закрытием панели фокус был в Edit.
Попробуй так:
После нажатия <Esc> KeyPress продолжает работать.
В Delphi такой фокус не проходит - проверил.
Попробуй так:
Код: Выделить всё
Edit1.OnKeyPress(key Char...)
begin
Form1.Caption:=key;
end;
Edit1.OnKeyDown(key Word...)
begin
if key=27 then Panel1.Visible:=False;
end;
После нажатия <Esc> KeyPress продолжает работать.
В Delphi такой фокус не проходит - проверил.
-
ViruZ
- постоялец
- Сообщения: 175
- Зарегистрирован: 30.05.2005 17:41:12
- Откуда: Украина
- Контактная информация:
Владимир писал(а):Из примера не очевидно, что перед закрытием панели фокус был в Edit.
Попробуй так:Код: Выделить всё
Edit1.OnKeyPress(key Char...)
begin
Form1.Caption:=key;
end;
Edit1.OnKeyDown(key Word...)
begin
if key=27 then Panel1.Visible:=False;
end;
После нажатия <Esc> KeyPress продолжает работать.
В Delphi такой фокус не проходит - проверил.
А если попробовать в конце обработчика Key:=#0?
Дело не в том, как это блокировать - можно напридумывать много вариантов, а в том, что
а) является ли это багом версии Лазаруса 0.9.24 и было исправлено в 0.9.26
б) не сделано ли это намеренно - не знаю уж, из каких соображений..
а) является ли это багом версии Лазаруса 0.9.24 и было исправлено в 0.9.26
б) не сделано ли это намеренно - не знаю уж, из каких соображений..
Lazarus 0.9.26, FPC 2.2.0, GTK-2
Работает все нормально. Эдит теряет фокус и никакого ввода не происходит.
Или я что то не понимаю? Вложеный пример:
Работает все нормально. Эдит теряет фокус и никакого ввода не происходит.
Или я что то не понимаю? Вложеный пример:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Интересно. А пример, что я показал с месаджами пробовался? Там же ясно видно, что обработка разных ключей при использовании разных компонент происходит не однозначно. Иногда по одному проходу на ключ, а иногда и больше.
Например с ListBox бывает 2 прохода по форме с обычным ключем и один проход с командным, и т.д... Варианты разные бывают.
А баг это или нет - я так и не узнал. Но иметь это в виду нужно.
Например с ListBox бывает 2 прохода по форме с обычным ключем и один проход с командным, и т.д... Варианты разные бывают.
А баг это или нет - я так и не узнал. Но иметь это в виду нужно.
Logo писал(а):Lazarus 0.9.26, FPC 2.2.0, GTK-2
Работает все нормально. Эдит теряет фокус и никакого ввода не происходит.
Или я что то не понимаю? Вложеный пример:
Повторяю - если закрывать панель по кнопке - в Вашем примере SpeedButton - все работает штатно!
Ввод в TEdit продолжается при закрытии панели по Edit.OnKeyDown, как в моем примере
Ну тогда нужно по Edit.OnKeyDown снять фокус с Edita и, если нужно, передать его другому. Я уже поднимал такую тему гдет здесь недавно.
VirtUX писал(а):Интересно. А пример, что я показал с месаджами пробовался?
А баг это или нет - я так и не узнал. Но иметь это в виду нужно.
У меня нет 0.9.26 - прошу потестить МОЙ пример - будет понятно, исправили или нет...
Потестил вот таким образом:Владимир писал(а):прошу потестить МОЙ пример - будет понятно, исправили или нет...
Код: Выделить всё
procedure TForm1.FormShow(Sender: TObject);
begin
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
begin
if ord(Key) = 27 then
begin
Panel1.Hide;
if edit1.Focused then form1.Caption := 'Yes'
else form1.Caption := 'No';
end;
end; В заголовке увидел: No.
PS по KeyDown результат тот же.
=======================
Используемые приборы:
ОС - Mandriva 2009.0 PWP i586
KDE 4.1.2
Kernel - 2.6.27
Lazarus 0.9.26 (QT)(0.9.24 не использую - там плохая поддержка QT; под GTK2 не могу проверить)
FPC 2.2.2
В заголовке увидел: No.
PS по KeyDown результат тот же.
====================
Да не надо в EditKeyPress ничего отбрабатывать - только показ нажатой клавиши!
Закрыть панель нужно по EditOnKeyDown и посмотреть ввод. Все.
PS по KeyDown результат тот же.
====================
Да не надо в EditKeyPress ничего отбрабатывать - только показ нажатой клавиши!
Закрыть панель нужно по EditOnKeyDown и посмотреть ввод. Все.
Чет я не понимаю... Выложи пример или код.
Закрыть панель нужно по EditOnKeyDown
я ж написал, что пробовал и с EditOnKeyDown прятать панель
и посмотреть ввод. Все.
Как можно что-то вводить в невидимый и неимеющий фокус компонент, кроме как программно?
Закрыть панель нужно по EditOnKeyDown
я ж написал, что пробовал и с EditOnKeyDown прятать панель
и посмотреть ввод. Все.
Как можно что-то вводить в невидимый и неимеющий фокус компонент, кроме как программно?
