У меня есть пользовательский элемент управления, полученный от 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.
Можете ли вы сделать MCVE без каких-либо эзотерических компонентов grapics32. Или они нужны. Представьте простейший возможный мкс. –
Можем ли мы иметь MCVE, пожалуйста. –
Дайте фокус форме перед запуском диалога. Или отлаживаем TImage32. –