Ошибка фокусировки DBGrid на MDI
Я получил ошибку фокуса DbGrid, когда он у меня внутри MDIChildForm.
Для повторного устранения ошибки:
- Создать приложение MDI
- В основную форму поместите панель и правку внутри нее
- Создать детскую форму MDI
- Поставь DBGrid и назначь данные (с более чем 1 записью)
Теперь запустите приложение и выполните следующие действия:
- Нажмите на сетку, чтобы сосредоточиться на первом ряду
- Нажмите на 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
событие. Теперь это прекрасно работает.