我有一个dbgrid。当我的DataSource中的bcrypt()
事件出错时,我想将重点放在当前的 CELL 上。
datachanged
事件中的代码是:
OndataChanged
我怎么能这样做?
答案 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;