TEdit focus & caret

Я получил два элемента управления TEdit. Когда я выхожу из edit1, процедура TForm1 . Edit1Exit ( отправитель : TObject ); начать редактирование2 . Enabled : = false ; edit2 . Enabled : = true ; edit2 . setfocus ; конец ; получает фокус. В моем событии OnExit Edit1 у меня есть следующий код:

edit2

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

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

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

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

delphi,caret,setfocus,

5

Ответов: 4


8 принят

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

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

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


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


0

Между отключением и включением edit2 существует куча кодов.

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

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


0

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

TMainForm.OnActivate;
begin
ChildForm.ShowModal;
end;

Фокус управления установлен, но не работает. Работа вокруг, которую я обнаружил, отправляла PostMessage (Handle, WM_SETFOCUS, 0, 0); к ручке формы.

procedure TChildForm.FocusControl(AWinControl: TWinControl);
begin
  try
    // http://stackoverflow.com/questions/7305296/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;
Дельфы, каретка, SetFocus,
Похожие вопросы