更改应用程序样式后的表单损失模式属性

时间:2015-05-19 14:46:02

标签: delphi delphi-xe7

我创建了一个模态表单,用户可以在其中设置(vcf)样式。

我使用此代码:

procedure TfrmMain.btnChangeSkinClick(Sender: TObject);
begin
  frmSkins:= TfrmSkins.Create(NIL);
  frmSkins.ShowModal;
end;

procedure TfrmSkins.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action:= caFree;
end;

然后在frmSkins中,我在列表框中列出了所有可用的vcf文件。当用户单击某个样式时,我会加载这样的样式:

procedure TfrmSkins.lBoxClick(Sender: TObject);
VAR  StyleInfo : TStyleInfo;
begin
    ...
    sSkinFile:= lBox.Items[lBox.ItemIndex];
    if TStyleManager.IsValidStyle(sSkinFile, StyleInfo) then
      begin
       TStyleManager.LoadFromFile(sSkinFile);
       TStyleManager.SetStyle(StyleInfo.Name);
      end;

    // this will 'fix' half of the problem, bringing the form up. But it won't make the form modal again.
    Application.ProcessMessages;
    BringToFront;
end;

调用SetStyle后,frmSkins被发送回(在主窗体下)并永久地丢失模态属性!

我做错了什么?

2 个答案:

答案 0 :(得分:0)

此问题仍然存在于Delphi Rio.3中。只有一个真正的解决方案。而不是使用模式形式,而是创建一个不会失去焦点,允许用户单击控件并使用“保存”按钮以更新主应用程序注册表的微型应用程序。然后在主应用程序中使用某种方案来恢复执行,读取注册表,并在需要时读取TrySetStyle。

答案 1 :(得分:0)

如果主窗体显示模态窗体,则可以使用以下解决方法:

type
  TChildForm = class(TForm)
    procedure FormDestroy(Sender: TObject);
  protected
    procedure WndProc(var Msg: TMessage); override;
  end;

implementation

procedure TChildForm.FormDestroy(Sender: TObject);
begin
    Application.MainForm.Enabled := true;
end;

procedure TChildForm.WndProc(var Msg: TMessage);
begin
    case Msg.Msg of
    CM_CUSTOMSTYLECHANGED:
    begin
        Application.MainForm.Enabled := false;
    end;
    end;
    inherited WndProc(Msg);
end;