delphi - 如何检测 TWinControl 是否具有 FONT 属性?
问题描述
我需要更改通过Controls
容器控件的属性收集的控件的 FONT 属性:
for i := 0 to ContainerControl.ControlCount - 1 do
begin
ContainerControl.Controls[i].Font.Size := 8; // error
end;
为此,我需要将类型转换ContainerControl.Controls[i]
为具有 FONT 属性的 TWinControl 类。有这样的课吗?或者如何检测特定的 TWinControl 是否具有 FONT 属性?或者我怎么能将特定的 TWincontrol 类型转换为特定的其他 TWinControl 的类型?
解决方案
所有可视控件都有一个Font
属性,但它protected
位于TControl
图层上,并非所有派生控件都将其提升为published
. 如果您只对已发布 Font
的控件感兴趣,则必须使用 RTTI 对其进行测试,例如:
uses
..., TypInfo;
var
Ctrl: TControl;
i: Integer;
begin
for i := 0 to ContainerControl.ControlCount - 1 do
begin
Ctrl := ContainerControl.Controls[i];
if IsPublishedProp(Ctrl, 'Font') then
TFont(GetObjectProp(Ctrl, 'Font', TFont)).Size := 8;
end;
end;
或者:
uses
..., TypInfo;
var
Ctrl: TControl;
Prop: PPropInfo;
i: Integer;
begin
for i := 0 to ContainerControl.ControlCount - 1 do
begin
Ctrl := ContainerControl.Controls[i];
Prop := GetPropInfo(Ctrl, 'Font', [tkClass]);
if Prop <> nil then
TFont(GetObjectProp(Ctrl, Prop, TFont)).Size := 8;
end;
end;
或者,仅在 Delphi 2010 及更高版本中:
uses
..., System.Rtti;
var
Ctrl: TControl;
Ctx: TRttiContext;
Prop: TRttiProperty;
i: Integer;
begin
Ctx := TRttiContext.Create;
try
for i := 0 to ContainerControl.ControlCount - 1 do
begin
Ctrl := ContainerControl.Controls[i];
Prop := Ctx.GetType(Ctrl.ClassType).GetProperty('Font');
if (Prop <> nil) and (Prop.Visibility = TMemberVisibility.mvPublished) then
TFont(Prop.GetValue(Ctrl).AsObject).Size := 8;
end;
finally
Ctx.Free;
end;
end;
推荐阅读
- r - How can I list unexported functions of a package?
- c# - 使用 MVVM Light Messager 发送和接收多个变量
- java - gradle 中的 Multi-Release jar
- javascript - 如何在其中创建具有不同样式单词的 html 选项标签?
- javascript - 将html和js添加到wordpress
- sockets - 何时关闭套接字 tcp
- continuous-integration - 如何将 VSTS 生成的构建版本关联到 VS App Center 中的发布?
- jquery-ui - Jquery UI:当不接受可拖动时想要效果被“丢弃”到可放置
- python-3.x - 如何在python中从文本文件中读取和存储k、m和数据点
- php - 将表单数据发送到 WordPress 数据库表