我有如下delphi6程序:
procedure TfrmUserCRUD.ShowErrorWithFocus(Message: string; FocusedField: TWinControl);
begin
try
raise Exception.Create(Message);
except
on E : Exception do
begin
ShowMessage(E.Message);
FocusedField.SetFocus;
abort;
end;
end;
end;
字符串
这个过程的目的是接收一个错误消息和表单中的一个字段(Checkbox,grid,TEEdit),每当调用这个函数时,它应该在屏幕上显示错误消息,然后聚焦它收到的字段,就像系统突出显示它一样,就像那些图片一样:
的数据
的
我一直在尝试使用不同的方法,这样它就可以专注于字段,但如果我使用raise
,程序会丢失字段变量,如果我使用abort
,程序不会做任何事情。我也尝试了不同的方法来关注TField,如使用perform
和事件更新,但它没有按预期工作,我可以做什么来解决这个问题的想法?
1条答案
按热度按时间wlwcrazw1#
抛出异常只是为了立即捕获它是完全没有意义的。你根本不需要
try..except
:字符串
也就是说,这取决于调用
ShowErrorWithFocus()
的上下文(您没有显示),立即设置焦点可能是无效/谨慎的(OS/VCL可能会对无序的焦点更改非常挑剔),所以您 * 可能 * 需要延迟焦点,直到消息队列首先稳定下来。PostMessage()
可以很好地处理这个问题,也就是说,你可以向Form发布一条消息,在消息的lParam
中传递FocusedField
指针,然后消息处理程序可以在该对象上调用SetFocus()
,例如:型