gpt4 book ai didi

delphi - TSaveTextFileDialog 和 Vcl 样式

转载 作者:行者123 更新时间:2023-12-03 15:07:41 25 4
gpt4 key购买 nike

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

enter image description here

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

最佳答案

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

关于delphi - TSaveTextFileDialog 和 Vcl 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14125741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com