Ввод в невидимые TEdit

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ввод в невидимые TEdit

Сообщение Владимир » 28.10.2008 00:30:11

Доброго времени! Господа-граждане, подскажите!
Столкнулся со странной (на мой взгляд) особенностью Lazarus - чего ни в Delphi, ни в Kylih не замечалось:
Имеем TPanel, на ней TEdit с фокусом ввода, ставим TPanel.Visible=False - тем не менее все OnKeyPress и
OnKeyDown в TEdit отрабатываются! Может я испорчен временем, но установка свойства формы KeyPreviiew=True
должна включать обработку нажатия клавиш на пустой форме и забывать о невидимых TEdit?
P.s. Был вынужден запретить обработку нажатия клавиш, если данная панель не видна. Обидно.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Ввод в невидимые TEdit

Сообщение VirtUX » 28.10.2008 15:26:19

Владимир писал(а):тем не менее все OnKeyPress и OnKeyDown в TEdit отрабатываются!
Этого не может быть, т.к. TEdit (в данном случае) сам тоже не видим и в нем производить ввод нет возможности.
Владимир писал(а): Может я испорчен временем, но установка свойства формы KeyPreviiew=True
должна включать обработку нажатия клавиш на пустой форме и забывать о невидимых TEdit?
KeyPreview позволяет обрабатывать события OnKeyPress, OnKeyDown, OnKeyUp сначала как событие формы, а потом (если описан обработчик) как событие компонента, в котором оно наступило.
Вот элементарный код, который поможет разобраться:
Код: Выделить всё
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.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Ввод в невидимые TEdit

Сообщение Владимир » 28.10.2008 18:43:16

Забудем про форму (на время) и ее обработчики.
Имеем НЕВИДИМУЮ панель, на котрой 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 делать по клику отдельной кнопки - все штатно!
Вот так вот.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Ввод в невидимые TEdit

Сообщение VirtUX » 29.10.2008 10:46:07

Код: Выделить всё
Panel1.Hide;
  if edit1.Focused then
    form1.Caption := 'F'
  else
    form1.Caption := 'N';

Edit1 находится на Panel1 и form1.Caption при этом (у меня) = 'N'. Так что фокус не остается на Edit1...
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Ввод в невидимые TEdit

Сообщение Владимир » 29.10.2008 15:21:18

Из примера не очевидно, что перед закрытием панели фокус был в 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 такой фокус не проходит - проверил.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Ввод в невидимые TEdit

Сообщение ViruZ » 29.10.2008 18:30:13

Владимир писал(а):Из примера не очевидно, что перед закрытием панели фокус был в 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?
ViruZ
постоялец
 
Сообщения: 175
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Re: Ввод в невидимые TEdit

Сообщение Владимир » 29.10.2008 18:45:08

Дело не в том, как это блокировать - можно напридумывать много вариантов, а в том, что
а) является ли это багом версии Лазаруса 0.9.24 и было исправлено в 0.9.26
б) не сделано ли это намеренно - не знаю уж, из каких соображений..
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Ввод в невидимые TEdit

Сообщение Logo » 30.10.2008 01:20:25

Lazarus 0.9.26, FPC 2.2.0, GTK-2
Работает все нормально. Эдит теряет фокус и никакого ввода не происходит.
Или я что то не понимаю? Вложеный пример:
test_TPanel.tar
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Ввод в невидимые TEdit

Сообщение VirtUX » 30.10.2008 10:11:13

Интересно. А пример, что я показал с месаджами пробовался? Там же ясно видно, что обработка разных ключей при использовании разных компонент происходит не однозначно. Иногда по одному проходу на ключ, а иногда и больше.
Например с ListBox бывает 2 прохода по форме с обычным ключем и один проход с командным, и т.д... Варианты разные бывают.
А баг это или нет - я так и не узнал. Но иметь это в виду нужно.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Ввод в невидимые TEdit

Сообщение Владимир » 30.10.2008 10:17:01

Logo писал(а):Lazarus 0.9.26, FPC 2.2.0, GTK-2
Работает все нормально. Эдит теряет фокус и никакого ввода не происходит.
Или я что то не понимаю? Вложеный пример:
test_TPanel.tar

Повторяю - если закрывать панель по кнопке - в Вашем примере SpeedButton - все работает штатно!
Ввод в TEdit продолжается при закрытии панели по Edit.OnKeyDown, как в моем примере
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Ввод в невидимые TEdit

Сообщение VirtUX » 30.10.2008 10:29:33

Ну тогда нужно по Edit.OnKeyDown снять фокус с Edita и, если нужно, передать его другому. Я уже поднимал такую тему гдет здесь недавно.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Ввод в невидимые TEdit

Сообщение Владимир » 30.10.2008 10:32:11

VirtUX писал(а):Интересно. А пример, что я показал с месаджами пробовался?
А баг это или нет - я так и не узнал. Но иметь это в виду нужно.


У меня нет 0.9.26 - прошу потестить МОЙ пример - будет понятно, исправили или нет...
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Ввод в невидимые TEdit

Сообщение VirtUX » 30.10.2008 10:49:05

Владимир писал(а):прошу потестить МОЙ пример - будет понятно, исправили или нет...
Потестил вот таким образом:
Код: Выделить всё
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
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Ввод в невидимые TEdit

Сообщение Владимир » 30.10.2008 11:17:40

В заголовке увидел: No.
PS по KeyDown результат тот же.
====================
Да не надо в EditKeyPress ничего отбрабатывать - только показ нажатой клавиши!
Закрыть панель нужно по EditOnKeyDown и посмотреть ввод. Все.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Ввод в невидимые TEdit

Сообщение VirtUX » 30.10.2008 11:45:35

Чет я не понимаю... Выложи пример или код.
Закрыть панель нужно по EditOnKeyDown
я ж написал, что пробовал и с EditOnKeyDown прятать панель
и посмотреть ввод. Все.
Как можно что-то вводить в невидимый и неимеющий фокус компонент, кроме как программно?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

Рейтинг@Mail.ru