| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Установка фокуса на TEdit |
| Автор: TechnoMag 26.6.2014, 22:00 |
| Не получается установить фокус на поле ввода. Суть в том, чтобы пользователь сразу начал вводить пароль, а не кликал бы сначала на поле ввода. В OnActivate главной формы создается диалоговое окно ввода пароля. При появлении диалогового окна нет фокуса на поле ввода пароля. Edit1.SetFocus не помогает где бы не писал: OnShow, OnActivate, OnCreate. Delphi XE2. |
| Автор: CynicRus 27.6.2014, 00:02 | ||
А если попробовать вот так:
Или сперва вызвать BringToFront() перед передачей фокуса эдиту? |
| Автор: kami 27.6.2014, 07:20 |
| A Edit1.TabOrder = 0 ? |
| Автор: TechnoMag 12.7.2014, 17:19 | ||||
Пробовал. Почему-то не получается. Для ввода пароля используется TLabeledEdit. Менял на простой TEdit - результат тот же. |
| Автор: PointerToNil 12.7.2014, 18:34 |
| 1. edit.tabstop часом не false? 2. диалогу часом parent'а не назначаешь? |
| Автор: TechnoMag 12.7.2014, 18:53 |
| 1. TabStop := true; 2. Только Owner: TForm.Create(mainForm) |
| Автор: PointerToNil 12.7.2014, 20:19 |
| Сделай минимальный проект, воспроизводящий ошибку. Ибо не воспроизводится. Пытаясь, наверняка разберешься сам. Если нет - выложишь. |
| Автор: PointerToNil 12.7.2014, 21:31 |
| Ага, получилось. С ShowModal - есть такой глюк. Причем Edit1 таки в фокусе, что подтверждается переключением по альт-таб на другое приложение и затем обратно. Но фокус не показывается. Возможно, потому, что после вызова твоего обработчика MainForm.OnActivate, VCL делает еще что-то касающееся активации этой MainForm, при этом отображение фокуса слетает. выходы: а) Show вместо ShowModal б) вызывать в OnShow вместо OnActivate - с фокусом ОК, но главная не успевает нарисоваться (наверное, так не годится) в) вызывать не сразу в OnActivate, а отложенно (по таймеру, Application.OnIdle+флаг, свой спец. PostMessage и т.п.) г) перед DialogForm.ShowModal сделать PostMessage(DialogForm.Handle, WM_ACTIVATE, 1, 0); - случайно помог, гарантий полной корректности нет! |