delphi DBGrid设置当前单元格的焦点
我有一个dbgrid。当我在数据源中的datachanged事件上出错时,我想将焦点设置在当前单元格上 OndataChanged事件中的我的代码是: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 我如
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;