DELPHI Edit.OnExit by选项卡,显示焦点错误的窗口结果

DELPHI Edit.OnExit by选项卡,显示焦点错误的窗口结果,delphi,Delphi,我遇到以下情况的问题: 2编辑的 在Edit1中键入内容,然后按TAB键,焦点转到Edit2 Edit1.OnExit->显示带有消息处理的表单。。。进行冗长的验证 表单关闭后,Edit2上的焦点似乎崩溃了。。。 -未选择Edit2中的孔文字 -卡雷特没有闪光 例如: 创建一个新表单 放2个编辑 在Edit1中将此设置为OnExit事件: procedure TForm1.Edit1Exit(Sender: TObject); begin with TForm.CreateNew(self)

我遇到以下情况的问题:

2编辑的 在Edit1中键入内容,然后按TAB键,焦点转到Edit2 Edit1.OnExit->显示带有消息处理的表单。。。进行冗长的验证 表单关闭后,Edit2上的焦点似乎崩溃了。。。 -未选择Edit2中的孔文字 -卡雷特没有闪光

例如:

创建一个新表单 放2个编辑 在Edit1中将此设置为OnExit事件:

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  with TForm.CreateNew(self) do
     try
       Width := 100;
       Height := 50;
       Position := poMainFormCenter;
       show;
       sleep(200);
     finally
       Free;
     end;
end;
运行应用程序

在编辑器1中设置焦点,然后按TAB键 我正在使用:

德尔福7企业 Windows 7 x64
我不确定这里到底发生了什么,但看起来消息处理的顺序有点混乱。不要用Free杀死你的另一个表单,使用Release,焦点将按照你的意愿运行


另一个选项是使用ShowModal而不是Show。通常,您以模式显示处理对话框,因为您不希望用户在处理时修改主窗体。如果你这样做了,你就可以继续免费使用了。

我不确定这里到底发生了什么,但看起来信息处理的顺序有点混乱。不要用Free杀死你的另一个表单,使用Release,焦点将按照你的意愿运行


另一个选项是使用ShowModal而不是Show。通常,您以模式显示处理对话框,因为您不希望用户在处理时修改主窗体。如果你这样做了,你就可以继续免费使用。

这是一个已知的问题。Windows在上次焦点更改完成之前更改焦点时会出现问题,例如,焦点开始从Edit1更改为Edit2,但Edit1.OnExit会将焦点更改为另一个控件或窗体

例如,当应用程序尝试在OnExit事件中进行验证,然后在验证失败时尝试将焦点返回到原始控件时,就会发生这种情况

最简单的解决方案是将消息发布到OnExit中的表单句柄,并在那里处理所需的焦点更改。一旦目标控件获得输入焦点,它就会触发,Windows不会感到困惑

const
   UM_EDIT1_EXITED = WM_USER + 1;

type
  TForm1=class(TForm)
  ...
  private
    procedure UMEdit1Exited(var Msg: TMessage); message UM_EDIT1_EXITED;
  end;

implementation

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  PostMessage(Handle, UM_EDIT1_EXITED, 0, 0);
end;

procedure TForm1.UMEdit1Exited(var Msg: TMessage);
begin
  // Show your other form here
end;
来自以下Peter博士的Borland NG旧帖子:

以下是我在OnExit问题的show对话框中的一般讲道:

如果触发了OnExit处理程序,则响应 窗户 消息WM_KILLFOCUS Windows正在更改焦点。如果你这样做 处理程序中导致另一个焦点更改的内容,如弹出 消息框或执行SetFocus调用Windows会变得非常混乱。 这个 缺少光标就是一个症状

如果必须从OnExit处理程序向用户显示消息,请执行以下操作: 信息技术 这样:

为界面中的某个位置的用户消息定义一个常量 部分 在表格的类型声明上方

“康斯特 UM_VALIDATE=WM_用户+200;'

为表单提供此消息的处理程序,最好将其放置在私有文件夹中 类别声明部分:

程序UMVAR Msg:TMessage;消息UM_验证

如果需要,从OnExit处理程序向表单发布一条UM_验证消息 该字段的内容不正常。你可以通过额外的考试 消息的wparam和lparam参数中的信息,例如。 错误号和发件人对象。事实上,你可以做全部 UMValidate处理程序中的验证


这是一个已知的问题。Windows在上次焦点更改完成之前更改焦点时会出现问题,例如,焦点开始从Edit1更改为Edit2,但Edit1.OnExit会将焦点更改为另一个控件或窗体

例如,当应用程序尝试在OnExit事件中进行验证,然后在验证失败时尝试将焦点返回到原始控件时,就会发生这种情况

最简单的解决方案是将消息发布到OnExit中的表单句柄,并在那里处理所需的焦点更改。一旦目标控件获得输入焦点,它就会触发,Windows不会感到困惑

const
   UM_EDIT1_EXITED = WM_USER + 1;

type
  TForm1=class(TForm)
  ...
  private
    procedure UMEdit1Exited(var Msg: TMessage); message UM_EDIT1_EXITED;
  end;

implementation

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  PostMessage(Handle, UM_EDIT1_EXITED, 0, 0);
end;

procedure TForm1.UMEdit1Exited(var Msg: TMessage);
begin
  // Show your other form here
end;
来自以下Peter博士的Borland NG旧帖子:

以下是我在OnExit问题的show对话框中的一般讲道:

如果触发了OnExit处理程序,则响应 窗户 消息WM_KILLFOCUS Windows正在更改焦点。如果你这样做 处理程序中导致另一个焦点更改的内容,如弹出 消息框或执行SetFocus调用Windows会变得非常混乱。 这个 缺少光标就是一个症状

如果必须从OnExit处理程序向用户显示消息,请执行以下操作: 信息技术 这样:

为界面中的某个位置的用户消息定义一个常量 部分 在表格的类型声明上方

“康斯特 UM_VALIDATE=WM_用户+200;'

最好为表单提供此消息的处理程序 私下里 类别声明部分:

程序UMVAR Msg:TMessage;消息UM_验证

如果需要,从OnExit处理程序向表单发布一条UM_验证消息 该字段的内容不正常。你可以通过额外的考试 消息的wparam和lparam参数中的信息,例如。 错误号和发件人对象。事实上,你可以做全部 UMValidate处理程序中的验证