我使用TSaveTextFileDialog组件在Delphi XE3,但在启用的Vcl风格的编码组合框是使用当前VCL风格借鉴。TSaveTextFileDialog和Vcl的样式
我怎样才能解决这个问题,我的意思是禁用VCL风格的组合框?
我使用TSaveTextFileDialog组件在Delphi XE3,但在启用的Vcl风格的编码组合框是使用当前VCL风格借鉴。TSaveTextFileDialog和Vcl的样式
我怎样才能解决这个问题,我的意思是禁用VCL风格的组合框?
的TSaveTextFileDialog组件的父类(TOpenTextFileDialog)增加了一套VCL组件来实现Encodings
和EncodingIndex
属性,您可以禁用VCL的方式对这些Vcl的使用StyleElements
属性控制。不幸的是,这些组件是私人的,所以你需要一些小技巧才能访问并禁用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访问私有的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;
非常感谢,作品完美。 – Salvador
我个人会修复根问题并使用'IFileDialogCustomize'来定制对话框。 –
哦,这个对话框是令人反感的。它甚至不尊重Windows主题!来自Emba的糟糕表演。 –