Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Установка фокуса на TEdit


Автор: TechnoMag 26.6.2014, 22:00
Не получается установить фокус на поле ввода.
Суть в том, чтобы пользователь сразу начал вводить пароль, а не кликал бы сначала на поле ввода.
В OnActivate главной формы создается диалоговое окно ввода пароля.
При появлении диалогового окна нет фокуса на поле ввода пароля.
Edit1.SetFocus не помогает где бы не писал: OnShow, OnActivate, OnCreate.
Delphi XE2.

Автор: CynicRus 27.6.2014, 00:02
А если попробовать вот так:
Код

Form1.ActiveControl := Form1.Edit1;
Form1.SetFocus;


Или сперва вызвать BringToFront() перед передачей фокуса эдиту?

Автор: kami 27.6.2014, 07:20
A Edit1.TabOrder = 0 ?

Автор: TechnoMag 12.7.2014, 17:19
Цитата(CynicRus @ 26.6.2014,  23:02)
А если попробовать вот так:
Код

Form1.ActiveControl := Form1.Edit1;
Form1.SetFocus;


Или сперва вызвать BringToFront() перед передачей фокуса эдиту?

Пробовал. Почему-то не получается. Для ввода пароля используется 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); - случайно помог, гарантий полной корректности нет!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)