2013-01-02 38 views
5

我使用TSaveTextFileDialog组件在Delphi XE3,但在启用的Vcl风格的编码组合框是使用当前VCL风格借鉴。TSaveTextFileDialog和Vcl的样式

enter image description here

我怎样才能解决这个问题,我的意思是禁用VCL风格的组合框?

+4

哦,这个对话框是令人反感的。它甚至不尊重Windows主题!来自Emba的糟糕表演。 –

回答

9

TSaveTextFileDialog组件的父类(TOpenTextFileDialog)增加了一套VCL组件来实现EncodingsEncodingIndex属性,您可以禁用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

另一种选择是使用使用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; 
+0

非常感谢,作品完美。 – Salvador

+0

我个人会修复根问题并使用'IFileDialogCustomize'来定制对话框。 –

相关问题