Модальное диалоговое окно не возвращает фокус на приложение

У меня есть пользовательский элемент управления, полученный из TPanel названный TTestCtrl, Он держит TImage32 (из Graphics32).

Когда пользователь дважды щелкает изображение, я показываю сообщение. Проблема в том, что после закрытия сообщения фокус не возвращается обратно в основное приложение. Таким образом, первый щелчок, независимо от того, на что я нажимаю в основной форме приложения / приложения, теряется.

Странная вещь: если я позвоню Mesaj() процедура не из TTestCtrl но из основной формы это работает (первый клик больше не теряется):

unit DerivedControl;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Vcl.Dialogs, Vcl.Forms, GR32, GR32_Image;

type
  TTestCtrl = class(TPanel)
  private
    Img: TImage32;
  protected
    procedure ChromaDblClick(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
  published
  end;

procedure Mesaj(const MessageText, Title: string);

implementation

procedure Mesaj(const MessageText, Title: string);
begin
{$IFDEF MSWINDOWS}
   Application.MessageBox(PChar(MessageText), PChar(Title), 0)  { 'Title' will appear in window's caption }
{$ELSE}
   MessageDlg(MessageText, mtInformation, [mbOk], 0);
{$ENDIF}
end;

constructor TTestCtrl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width         := 200;
  Height        := 86;
  Img := TImage32.Create(Self);
  Img.Parent        := Self;
  Img.Align         := alClient;
  Img.OnDblClick    := ChromaDblClick;
end;

procedure TTestCtrl.ChromaDblClick(Sender: TObject);
begin
  Mesaj('Caption', 'From derived control');      // focus lost
end;

end.

Простое / минимальное приложение ниже - это тестер:

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.

1 ответ

Решение

Попробуй это:

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;
Другие вопросы по тегам