Delphi 模态对话框不会将焦点返回到应用程序
我有一个从Delphi 模态对话框不会将焦点返回到应用程序,delphi,vcl,graphics32,Delphi,Vcl,Graphics32,我有一个从TPanel派生的自定义控件,名为TTestCtrl。它保存一个TImage32(来自图32) 当用户双击图像时,我会显示一条消息。问题是,在我关闭消息之后,焦点不会返回到主应用程序。因此,无论我在主应用程序/主窗体中单击什么,第一次单击都会丢失 奇怪的是:如果我不是从TTestCtrl调用Mesaj()过程,而是从主窗体调用该过程,它会工作(第一次单击不再丢失): 下面的简单/最小应用程序是测试仪: unit TesterForm; interface uses Syste
TPanel
派生的自定义控件,名为TTestCtrl
。它保存一个TImage32
(来自图32)
当用户双击图像时,我会显示一条消息。问题是,在我关闭消息之后,焦点不会返回到主应用程序。因此,无论我在主应用程序/主窗体中单击什么,第一次单击都会丢失
奇怪的是:如果我不是从TTestCtrl
调用Mesaj()
过程,而是从主窗体调用该过程,它会工作(第一次单击不再丢失):
下面的简单/最小应用程序是测试仪:
unit TesterForm;
interface
uses
System.SysUtils, System.Classes, Vcl.StdCtrls, Vcl.Samples.Spin, Vcl.Controls, vcl.Forms, DerivedControl;
type
TfrmTester = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
end;
var
frmTester: TfrmTester;
implementation
{$R *.dfm}
var
Ctrl: TTestCtrl;
procedure TfrmTester.FormCreate(Sender: TObject);
begin
Ctrl := TTestCtrl.Create(Self);
Ctrl.Parent := Self;
end;
procedure TfrmTester.Button1Click(Sender: TObject);
begin
Mesaj('Caption', 'From main form'); // works
end;
end.
试试这个:
procedure TTestCtrl.ChromaDblClick(Sender: TObject);
var F : TcustomForm;
begin
Mesaj('Caption', 'From derived control'); // focus lost
F := GetParentForm(Self);
if Assigned(F) then F.BringToFront;
end;
你能制作一个没有任何深奥图形32组件的MCVE吗。还是需要它们。请提供最简单的mcve。我们可以要一个mcve吗?在启动对话框之前,请将焦点放在表单上。重要提示:我使用了“焦点”这个词,但我不知道它是否正确。主窗体似乎没有失去焦点(作为背景窗口)。它只会忽略第一次单击。我将此复制到您以前的版本中。我的建议是不要双击image32启动对话框。gr32中的鼠标操作相当复杂。谢谢。星期一我试试。@Silvester你测试过这个吗?如果你这样做了,它能起作用吗?@Christophe-那好吧,谢谢。这是我用XE2测试的第一件没有帮助的事情之一。这就是我问的原因。我能找到的唯一解决办法就是发布我不喜欢的鼠标消息。这当然更好,只要它能工作。您还可以使用Windows API函数:SetForegroundWindow、SetActiveWindow和FlashWindow来实现更简单的功能。窗口已经在前景中,并且已经具有焦点。
procedure TTestCtrl.ChromaDblClick(Sender: TObject);
var F : TcustomForm;
begin
Mesaj('Caption', 'From derived control'); // focus lost
F := GetParentForm(Self);
if Assigned(F) then F.BringToFront;
end;