我正在使用Delphi的GetObjectProp函数来获取表单组件的属性,我获得了几个组件的所有属性,但我无法获得TextSettings.Font.Style(Bold,Italic,...)属性像TLabel这样的组件。我需要知道组件文本是粗体还是斜体。我正在尝试获取这些属性的程序如下:
procedure Tfrm1.aoClicarComponente(Sender: TObject);
var
TextSettings: TTextSettings;
Fonte: TFont;
Estilo: TFontStyle;
Componente_cc: TControl;
begin
Componente_cc := TControl(Label1);
if IsPublishedProp(Componente_cc, 'TextSettings') then
begin
TextSettings := GetObjectProp(Componente_cc, 'TextSettings') as TTextSettings;
if Assigned(TextSettings) then
Fonte := GetObjectProp(TextSettings, 'Font') as TFont;
if Assigned(Fonte) then
Estilo := GetObjectProp(Fonte, 'Style') as TFontStyle; // <-- error in this line
if Assigned(Estilo) then
Edit1.text := GetPropValue(Estilo, 'fsBold', true);
end
end;
我在上面标记的行上显示的错误是。
[dcc64错误] uPrincipal.pas(1350):E2015运算符不适用于此操作数类型
我做错了什么?
答案 0 :(得分:6)
GetObjectProp(Fonte, 'Style')
无效,因为Style
不是基于对象的属性,它是基于Set
的属性。并且GetPropValue(Estilo, 'fsBold', true)
是完全错误的(并不是说你无论如何都会调到它),因为fsBold
不是属性,它是TFontStyle
枚举的成员。要检索Style
属性值,您必须改为使用GetOrdProp(Fonte, 'Style')
,GetSetProp(Fonte, 'Style')
或GetPropValue(Fonte, 'Style')
(integer
,string
,或分别为variant
。
话虽如此,一旦您检索到TextSettings
对象,您根本不需要使用RTTI来访问其Font.Style
属性,只需直接访问该属性。
请改为尝试:
procedure Tfrm1.aoClicarComponente(Sender: TObject);
var
Componente_cc: TControl;
TextSettings: TTextSettings;
begin
Componente_cc := ...;
if IsPublishedProp(Componente_cc, 'TextSettings') then
begin
TextSettings := GetObjectProp(Componente_cc, 'TextSettings') as TTextSettings;
Edit1.Text := BoolToStr(TFontStyle.fsBold in TextSettings.Font.Style, true);
end;
end;
更好(和首选)的解决方案是根本不使用RTTI。具有TextSettings
属性的FMX类也实现了ITextSettings
接口以实现这种情况,例如:
procedure Tfrm1.aoClicarComponente(Sender: TObject);
var
Componente_cc: TControl;
Settings: ITextSettings;
begin
Componente_cc := ...;
if Supports(Componente_cc, ITextSettings, Settings) then
begin
Edit1.Text := BoolToStr(TFontStyle.fsBold in Settings.TextSettings.Font.Style, true);
end;
end;
阅读Embarcadero的文档了解更多详情: