К вопросу о создании login-формы

Источник: delphikingdom

В login-форме не получается установить фокус на текстовом поле для ввода имени пользователя. Пользователь вынужден щелкать мышью на текстовом поле, что, конечно, не очень ему удобно. Предлагается вариант решения этой проблемы.

Несколько раз я на форумах встречал вопрос по следующей ситуации:

  1. Запускается Главная форма.
  2. После ее загрузки автоматически запускается login-форма в модальном режиме (ShowModal).
  3. В появившейся login-форме не получается установить фокус на текстовом поле для ввода имени пользователя. Пользователь вынужден щелкать мышью на текстовом поле, что, конечно, не очень ему удобно.

Меня тоже коснулась эта проблема. Возможно она давно уже решена, но мне найти решение на форумах не удалось. Зато удалось как-то получить решение самому.

Итак:

  1. Главная форма - frm_Main, login-форма - frm_Security2_Login. Поле ввода имени пользователя в login-форме - edt_Login
  2. В событии Activate Главной формы автоматически вызывается login-форма: frm_Security2_Login.ShowModal;
  3. В событии Show login-формы делаем три вещи:
    • Имитируем щелчок левой кнопки мыши в поле ввода имени пользователя.
    • Имитируем щелчок левой кнопки мыши в левом верхнем углу login-формы.
    • Вытаскиваем login-форму на передний план и активизируем ее.

Вот и все. Наверное, мною изобретен очередной велосипед, а специалисты найдут массу изъянов, но ...

Собственно код

procedure Tfrm_Security2_Login.FormShow(Sender: TObject);
var x,y: Integer;
    pt: TPoint;
begin
  // Имитируем щелчок левой кнопки мыши в поле ввода имени пользователя
  x:=edt_Login.Left+7;
  y:=edt_Login.Top+7;
  SetCursorPos(x,y);
  mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
  mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);

  // Имитируем щелчок левой кнопки мыши в левом верхнем углу login-формы
  SetCursorPos(7,7);
  Application.ProcessMessages;
  GetCursorPos(pt);
  SetCursorPos(pt.x,pt.y);

  // Вытаскиваем login-форму на передний план и активизируем ее  
  Windows.SetForegroundWindow(Self.Handle);
end;

Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=20668