TEdit focus & caret - PullRequest
       23

TEdit focus & caret

6 голосов
/ 05 сентября 2011

Я получил два элемента управления TEdit. Когда я вкладываю из edit1, edit2 получает фокус. На моем событии OnExit Edit1 У меня есть следующий код:

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  edit2.Enabled := false;
  edit2.Enabled := true;
  edit2.setfocus;
end;

Edit2 имеет фокус. Однако в этом нет никакой кареты. Я могу начать печатать, но это сбивает с толку, так как я не знаю какой контроль имеет фокус.

Меня больше интересует, что происходит с переключением Включено свойство, из-за которого некоторые сообщения не правильно стрелять? Например, событие edit2 OnEnter не срабатывает.

Это на D2006, если это вообще имеет значение.

Спасибо за ответ.

Ответы [ 4 ]

9 голосов
/ 05 сентября 2011

Я не понимаю, почему вы отключаете и включаете edit2, но вы делаете это:

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  edit2.Enabled := false;
  edit2.Enabled := true;
  edit2.setfocus;
  PostMessage(edit2.Handle, WM_SETFOCUS, 0, 0);
end;

Кстати, я согласен с Андреасом Рейбрандом.

8 голосов
/ 05 сентября 2011

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

0 голосов
/ 12 октября 2016

Обнаружена проблема, когда OnActive for MainForm активирует другую форму.

TMainForm.OnActivate;
begin
ChildForm.ShowModal;
end;

Фокус управления установлен, но не работает. Обходной путь, который я нашел, отправлял PostMessage (Handle, WM_SETFOCUS, 0, 0); к ручке формы.

procedure TChildForm.FocusControl(AWinControl: TWinControl);
begin
  try
    // /4309617/tedit-focus-caret
    PostMessage(Handle, WM_SETFOCUS, 0, 0);
    PostMessage(AWinControl.Handle, WM_SETFOCUS, 0, 0); 
    if AWinControl.CanFocus then
       AWinControl.SetFocus;
  except
    on E: Exception do
    begin
      Error(Self, E);
    end;
  end;
end;
0 голосов
/ 06 сентября 2011

Существует множество кодов между отключением и включением редактирования 2.

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

Установите Screen.Cursor на crHourGlass, чтобы дать понять пользователю, что следующий активный элемент управления еще не готов.

...