という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.
難解なgrapics32コンポーネントなしでMCVEを作成できますか?それとも必要なの?最も単純な可能なmcveを提示する。 –
私たちはMCVEをしてもいいですか? –
ダイアログを起動する前に、フォームにフォーカスを当ててください。または、TImage32をデバッグします。 –