DBGrid关注MDI的bug

时间:2014-02-17 16:46:55

标签: delphi focus delphi-7 dbgrid

当我将它放在MDIChildForm中时,我得到了一个DbGrid焦点错误。

重新编写错误:

  • 创建MDI应用程序
  • 在主窗体中,将一个Panel和一个Edit放在其中
  • 创建MDI子表单
  • 放置DBGrid并分配数据(包含多条记录)

dbgrid focus bug on mdi

现在,运行该应用程序,然后按照以下步骤操作:

  • 点击网格,将焦点放在第一行
  • 点击编辑,将其聚焦
  • 现在尝试单击dbgrid的另一行。

错误:

  • dbgrid没有收到焦点,没有任何事情发生!

我正在使用 Delphi 7

有人可以帮我解决问题吗?

2 个答案:

答案 0 :(得分:2)

问题是由Form.ActiveControl创建的。

在这种情况下,在编辑焦点之后,MDI子节点将DBGrid保留为活动控件,因此在单击dbgrid后不会调用Windows.SetFocus。

我通过覆盖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;

答案 1 :(得分:0)

我通过放行

来解决问题
self.setfocus2
事件OnShow中的

。我还在OnActivate事件中添加了相同的代码。它现在完美无缺。