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;