2016-10-20 13 views
1

というTPanelから派生したカスタムコントロールがあります。それはTImage32(Graphics32から)を保持します。モーダルダイアログでフォーカスがアプリケーションに返されない

ユーザーが画像をダブルクリックすると、メッセージが表示されます。問題は、メッセージを閉じると、フォーカスがメインアプリケーションに返されないということです。したがって、最初のクリックは、メインのアプリケーション/メインフォームで何をクリックしても失われます。

奇妙なこと:シンプル/最小限のアプリケーション

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. 

:私はない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. 
+1

難解なgrapics32コンポーネントなしでMCVEを作成できますか?それとも必要なの?最も単純な可能なmcveを提示する。 –

+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

@Silvesterあなたはこれをテストしましたか?あなたがした場合は、それは動作しましたか? –

+0

はい、私はしました。 Delphi XE3の下で。それは私のために働く。 –

関連する問題