我创建了一个模态表单,用户可以在其中设置(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被发送回(在主窗体下)并永久地丢失模态属性!
我做错了什么?
答案 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;