TSaveTextFileDialog和Vcl样式

5
我正在使用Delphi XE3中的TSaveTextFileDialog组件,但是当启用Vcl样式时,编码组合框会使用当前的vcl样式进行绘制。

enter image description here

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

4
噢,这个对话框太难看了。甚至不尊重 Windows 主题!Emba 做得很差。 - David Heffernan
1个回答

9

TSaveTextFileDialog 组件的父类(TOpenTextFileDialog)添加了一组 Vcl 组件来实现 EncodingsEncodingIndex 属性,您可以使用 StyleElements 属性禁用这些 Vcl 控件上的 Vcl 样式。不幸的是,这些组件是私有的,因此您需要一点技巧才能获得访问权限并禁用 Vcl 样式。

在这里,您有两个选择。

使用类助手。

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

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;

个人而言,我会解决根本问题并使用 IFileDialogCustomize 来自定义对话框。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接