2016-10-20 3 views
1

У меня есть пользовательский элемент управления, полученный от 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

Можете ли вы сделать MCVE без каких-либо эзотерических компонентов grapics32. Или они нужны. Представьте простейший возможный мкс. –

+0

Можем ли мы иметь MCVE, пожалуйста. –

+0

Дайте фокус форме перед запуском диалога. Или отлаживаем TImage32. –

ответ

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; 
+0

Спасибо. Я попробую в этот понедельник. – Ampere

+0

@ Сильвестрр вы это испытали? Это сработало, если вы это сделали? –

+0

Да, я сделал. В Delphi XE3. Это работает для меня. –

Смежные вопросы