首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSaveTextFileDialog和Vcl样式

TSaveTextFileDialog和Vcl样式
EN

Stack Overflow用户
提问于 2013-01-02 16:43:33
回答 1查看 564关注 0票数 5

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-02 17:25:02

TOpenTextFileDialog组件的父类( TSaveTextFileDialog )添加一组Vcl组件来实现EncodingsEncodingIndex属性,您可以使用StyleElements属性在这些Vcl控件上禁用Vcl样式。不幸的是,这些组件是私有的,因此您需要进行一些黑客操作,以获得访问权限并禁用Vcl样式。

这里你有两个选择。

使用类助手。

您可以引入一个帮助函数来获取Panel组件,该组件包含对话框的Vcl控件。

代码语言:javascript
复制
type
 TOpenTextFileDialogHelper=class helper for TOpenTextFileDialog
  function GetPanel : TPanel;
 end;

function TOpenTextFileDialogHelper.GetPanel: TPanel;
begin
  Result:=Self.FPanel;
end;

然后可以编写一个方法来禁用Vcl样式,如下所示:

代码语言:javascript
复制
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;

最后用在这种方式上

代码语言:javascript
复制
  DisableVclStyles(SaveTextFileDialog1.GetPanel);
  SaveTextFileDialog1.Execute;

RTTI

另一个选项是使用RTTI访问私有Vcl组件。

代码语言:javascript
复制
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;
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14125741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档