Sal*_*dor 5 delphi vcl-styles delphi-xe3
我在Delphi XE3中使用TSaveTextFileDialog组件,但是当启用Vcl Style时,编码组合框是使用当前的vcl样式绘制的.

我怎么能解决这个问题,我的意思是禁用组合框的vcl风格?
在父类(TOpenTextFileDialog)TSaveTextFileDialog组件添加了一组VCL组件来实现Encodings和EncodingIndex性能,你可以禁用这些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;
Run Code Online (Sandbox Code Playgroud)
那么你可以编写一个方法来禁用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;
Run Code Online (Sandbox Code Playgroud)
最后用这种方式
DisableVclStyles(SaveTextFileDialog1.GetPanel);
SaveTextFileDialog1.Execute;
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
464 次 |
| 最近记录: |