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