delphi 在异常发生后将焦点设置为TwinControl?

rjzwgtxy  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(105)

我有如下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和事件更新,但它没有按预期工作,我可以做什么来解决这个问题的想法?

wlwcrazw

wlwcrazw1#

抛出异常只是为了立即捕获它是完全没有意义的。你根本不需要try..except

procedure TfrmUserCRUD.ShowErrorWithFocus(Message: string; FocusedField: TWinControl);
begin
  ShowMessage(Message);
  FocusedField.SetFocus;
end;

字符串
也就是说,这取决于调用ShowErrorWithFocus()的上下文(您没有显示),立即设置焦点可能是无效/谨慎的(OS/VCL可能会对无序的焦点更改非常挑剔),所以您 * 可能 * 需要延迟焦点,直到消息队列首先稳定下来。PostMessage()可以很好地处理这个问题,也就是说,你可以向Form发布一条消息,在消息的lParam中传递FocusedField指针,然后消息处理程序可以在该对象上调用SetFocus(),例如:

const
  WM_APP_SETFOCUS = WM_APP + 1;

procedure TfrmUserCRUD.ShowErrorWithFocus(Message: string; FocusedField: TWinControl);
begin
  ShowMessage(Message);
  //FocusedField.SetFocus;
  PostMessage(Handle, WM_APP_SETFOCUS, 0, LPARAM(FocusedField));
end;

procedure TfrmUserCRUD.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_APP_SETFOCUS then
    TWinControl(Message.LParam).SetFocus
  else
    inherited;
end;

相关问题