如何在不访问源的情况下更改模态表单的标题?

nor*_*aul 6 delphi delphi-xe2

我有一个显示打印预览表单的第三方组件.我想将预览表单的标题更改为更合适的标题.不幸的是,我没有第三方组件的源代码,组件也没有提供功能.

是否有可能以某种方式捕获模态形式,因为它正在显示并在显示之前设置它的属性?

Ser*_*yuz 10

模态窗体将使调用窗体无效,您可以WM_ACTIVATE在显示模式窗体之前监听活动窗体上的消息.您将在消息处理程序中拥有激活窗口的句柄,如果它是模式窗体类型的形式,则可以测试它.下面是类名称的示例测试,您可以使用Spy ++之类的东西.请注意,在模态窗体变得可见之后会暂停,但我认为不会注意到不同的标题.

type
  TForm1 = class(TForm)
    ..
  protected
    procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE;
  end;

procedure TForm1.WMActivate(var Message: TWMActivate);
var
  Form: TWinControl;
begin
  if Message.Active = WA_INACTIVE then begin
    Form := FindControl(Message.ActiveWindow);
    if Form is TCustomForm then begin
      if TCustomForm(Form).ClassName = 'TThirdPartyModalForm' then
        TCustomForm(Form).Caption := 'My caption';
    end;
  end;
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)


Rem*_*eau 6

尝试使用TScreen.OnActiveFormChange事件,使用TScreen.ActiveCustomFormTScreen.ActiveForm属性知道哪个TForm具有焦点:

procedure TMainForm.DoSomething; 
begin 
  Screen.OnActiveFormChange := ActiveFormChanged;
  try
    // do something that triggers the modal form ...
  finally
    Screen.OnActiveFormChange := nil;
  end;
end;

procedure TMainForm.ActiveFormChanged(Sender: TObject);
var
  Form: TCustomForm;
begin
  Form := Screen.ActiveCustomForm; 
  if (Form <> nil) and (Form.ClassName = 'TModalFormClassName') then 
    Form.Caption := 'My caption'; 
end;
Run Code Online (Sandbox Code Playgroud)