delphi DBGrid设置焦点在当前单元格上

时间:2016-09-02 10:26:48

标签: delphi focus dbgrid

我有一个dbgrid。当我的DataSource中的bcrypt()事件出错时,我想将重点放在当前的 CELL 上。

datachanged事件中的代码是:

OndataChanged

我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

以下代码显示了如何

  • 安装全局异常处理程序

  • 将给定单元格聚焦在DBGrid中,例如异常发生时当前的那个。 请参阅FocusGridCell

  • 将TField的Required属性设置为True,这是Ken White建议你做的。

如您所见,TForm1的OnException将当前网格行和列保存到 变量ERow和ECol,以便您以后可以返回它们。

FocusGridCell允许您将焦点返回到已保存的网格单元格 聚焦后的ERow和ECol值已从网格中拉出,例如通过 您的OnDataChange处理程序中的Application.MessageBox

希望你应该做的就是做你想做的事。

顺便说一下,使用弹出式消息来显示内容通常是一个的想法 TDataSet事件处理程序:最好将自定义消息发布到应用程序的消息队列并在自定义消息的处理程序中执行弹出窗口,以便弹出窗口数据集事件之后发生完成。

代码:

  TForm1 = class(TForm)
    [...]
  protected
    ERow,
    ECol : Integer;
    procedure OnException(Sender : TObject; E : Exception);
    procedure FocusGridCell(ACol, ARow: Integer);
  public
  end;

[...]

type
 TMyDBGrid = class(TDBGrid);

procedure TForm1.FormCreate(Sender: TObject);
begin
  ERow := -1;
  ECol := -1;
  Application.OnException := OnException;
end;

procedure TForm1.OnException(Sender: TObject; E: Exception);
begin
  ERow := TMyDBGrid(DBGrid1).Row;
  ECol := TMyDBGrid(DBGrid1).Col;
  //  the following shows a non-intrusive way to display status info without
  //  interfering with what's focused on the form, etc
  Caption := Format('Row: %d, Col: %d', [ERow, ECol]);
end;

procedure TForm1.FocusGridCell(ACol, ARow : Integer);
begin
  //  Unless the grid's dgAlwaysShowSelection  is True, the following
  //  call to DBGrid1.SetFocus is necessary, otherwise
  //  the call to SetFocus has no visible effect. 
  if not (dgAlwaysShowSelection in DBGrid1.Options) then
    DBGrid1.SetFocus;
  TMyDBGrid(DBGrid1).FocusCell(ACol, ARow, True);
end;