delphi DBGrid设置当前单元格的焦点

delphi DBGrid设置当前单元格的焦点,delphi,focus,dbgrid,Delphi,Focus,Dbgrid,我有一个dbgrid。当我在数据源中的datachanged事件上出错时,我想将焦点设置在当前单元格上 OndataChanged事件中的我的代码是: if (Field.Text = '') then begin Application.MessageBox('ERROR','',MB_ICONWARNING); Field.Tag:= Field.DataSet.RecNo; Abort; end 我如

我有一个dbgrid。当我在数据源中的datachanged事件上出错时,我想将焦点设置在当前单元格上

OndataChanged事件中的我的代码是:

if (Field.Text = '') then
begin                   

        Application.MessageBox('ERROR','',MB_ICONWARNING);
        Field.Tag:= Field.DataSet.RecNo;
        Abort;
end

我如何做到这一点?

下面的代码显示了如何

安装全局异常处理程序

聚焦DBGrid中的给定单元格,例如发生异常时的当前单元格。 参见FocusGridCell

将TField的Required属性设置为True,这是Ken White建议您执行的操作

如您所见,TForm1的OneException将当前网格行和列保存到 变量ERow和ECol,以便稍后返回

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

希望这就是你想要做的一切

顺便说一句,通常使用弹出消息在屏幕上显示内容是个坏主意 TDataSet事件处理程序:最好将自定义消息发布到应用程序的消息队列中,并在自定义消息的处理程序中进行弹出,以便在数据集事件完成后进行弹出

代码:


用户在网格中进行就地编辑时是否触发datachanged事件?b你所说的当前单元格是什么意思?在你得到错误之前被聚焦的单元格还是什么?a我的数据源中有一个OnDataChanged事件。。。b当前单元格:是我输入错误数据的单元格,需要MCVE。嗯,是的。当然,您可以单击另一个单元格。你还期望有什么其他行为?如果不再尝试使用DBGrid作为数据输入工具,而是创建一个表单来编辑数据,则可以避免所有这些困难。如果您正确地使用字段的属性,您也可以停止在DBGrid中拼命工作;将字段的Required属性设置为true将允许Delphi自动处理此问题。如何设置Required。。。?DataSet.FieldByName'SomeField'。必需:=Truei get tmydbgridbgrid1.FocusCellACol,ARow,True;未声明的标识符FocusCell@userPro:您使用的是哪个Delphi版本?未声明的标识符FocusCell确保您的单元使用网格以及DBGrids。它应该自动完成。FocusCell是TCustomGrid的受保护范围方法,我的代码中的TMyDBGrid声明应该允许编译器在您的单元中访问它。我刚刚检查了,我的代码在Delphi 7到Delphi Seattle的版本上编译,因此如果您遇到您所说的错误,那是由于单元代码中的错误造成的。试着用你的网格、数据集和数据源创建一个新项目,只使用我答案中的代码。Delphi5不会有任何区别。如果仍然出现未声明的标识符错误,请按照我所说的创建测试项目。否则,我想我再也帮不了你了。
  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;