我正在使用Delphi XE3中的TSaveTextFileDialog组件,但是当启用Vcl样式时,编码组合框会使用当前的vcl样式进行绘制。
TSaveTextFileDialog 组件的父类(TOpenTextFileDialog)添加了一组 Vcl 组件来实现 Encodings
和 EncodingIndex
属性,您可以使用 StyleElements
属性禁用这些 Vcl 控件上的 Vcl 样式。不幸的是,这些组件是私有的,因此您需要一点技巧才能获得访问权限并禁用 Vcl 样式。
在这里,您有两个选择。
您可以引入一个辅助函数来获取包含对话框的 Vcl 控件的面板组件。
type
TOpenTextFileDialogHelper=class helper for TOpenTextFileDialog
function GetPanel : TPanel;
end;
function TOpenTextFileDialogHelper.GetPanel: TPanel;
begin
Result:=Self.FPanel;
end;
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;
IFileDialogCustomize
来自定义对话框。 - David Heffernan