Ошибка фокусировки DBGrid на MDI

Я получил ошибку фокуса DbGrid, когда он у меня внутри MDIChildForm.

Для повторного устранения ошибки:

  • Создать приложение MDI
  • В основную форму поместите панель и правку внутри нее
  • Создать детскую форму MDI
  • Поставь DBGrid и назначь данные (с более чем 1 записью)

ошибка фокусировки dbgrid на mdi

Теперь запустите приложение и выполните следующие действия:

  • Нажмите на сетку, чтобы сосредоточиться на первом ряду
  • Нажмите на Edit, чтобы сфокусировать его
  • Теперь попробуйте щелкнуть по другому ряду dbgrid.

ошибка:

  • Dbgrid не получает фокус, ничего не происходит!

Я использую Delphi 7.

Может ли кто-нибудь помочь мне с обходным путем?

2 ответа

Решение

Проблема создается с помощью Form.ActiveControl.

В этом случае дочерний элемент MDI сохраняет DBGrid в качестве активного элемента управления после фокусировки на редактирование, и из-за этого Windows.SetFocus не вызывается после нажатия dbgrid.

Я решаю проблему путем переопределения TDBGrid.SetFocus:

type
    TMyDBGrid = class(TDBGrid)
    public
       procedure SetFocus; override;
    end;

procedure TMyDBGrid.SetFocus;
var
  form: TCustomForm;
begin
  inherited;

  // BUG-FIX: force the SetFocus if the current Control is Self but not focused!
  form := GetParentForm(Self);
  if (form <> nil) and (form.ActiveControl = Self) and not Focused then
    Windows.SetFocus(Self.Handle);
end;

Я решил проблему, поставив строку

self.setfocus2

в случае OnShow, Я также добавил этот код в OnActivate событие. Теперь это прекрасно работает.

Другие вопросы по тегам