TSaveTextFileDialog 和 Vcl 样式

问题描述 投票:0回答:1

我在 Delphi XE3 中使用 TSaveTextFileDialog 组件,但是当启用 VCL 样式时,encoding 组合框是使用当前 VCL 样式绘制的。

Delphi TSaveTextFileDialog

如何解决这个问题,我的意思是禁用组合框的 VCL 样式?

delphi vcl delphi-xe3 vcl-styles
1个回答
9
投票

TSaveTextFileDialog组件的父类(TOpenTextFileDialog)添加了一组Vcl组件来实现Encodings

EncodingIndex
属性,您可以使用
StyleElements
属性禁用这些Vcl控件上的Vcl样式。不幸的是,这些组件是私有的,因此您需要一些技巧才能获得访问权限并禁用 Vcl 样式。

这里您有两个选择。

使用班级助手。

您可以引入一个辅助函数来获取包含对话框的Vcl控件的Panel组件。

type TOpenTextFileDialogHelper=class helper for TOpenTextFileDialog function GetPanel : TPanel; end; function TOpenTextFileDialogHelper.GetPanel: TPanel; begin Result:=Self.FPanel; end;

然后你可以编写一个方法来禁用 Vcl 样式,如下所示:

procedure DisableVclStyles(const Control : TControl); var i : Integer; begin if Control=nil then Exit; Control.StyleElements:=[]; if Control is TWinControl then for i := 0 to TWinControl(Control).ControlCount-1 do DisableVclStyles(TWinControl(Control).Controls[i]); end;

最后用这种方式

DisableVclStyles(SaveTextFileDialog1.GetPanel); SaveTextFileDialog1.Execute;

RTTI

另一种选择是使用 RTTI 访问私有 Vcl 组件。

var LRttiContext : TRttiContext; LRttiField :TRttiField; begin LRttiContext:=TRttiContext.Create; for LRttiField in LRttiContext.GetType(SaveTextFileDialog1.ClassType).GetFields do if LRttiField.FieldType.IsInstance and LRttiField.FieldType.AsInstance.MetaclassType.ClassNameIs('TPanel') then DisableVclStyles(TPanel(LRttiField.GetValue(SaveTextFileDialog1).AsObject)); SaveTextFileDialog1.Execute; end;
    
© www.soinside.com 2019 - 2024. All rights reserved.