2017-08-31 14 views
5

を使用してTextSettings.Font.Styleプロパティを取得するフォームコンポーネントのプロパティを取得するためにDelphiのGetObjectProp関数を使用していますが、いくつかのコンポーネントのすべてのプロパティを取得できますが、TextSettings.Font TLabelのようなコンポーネントの.Style(太字、斜体、...)プロパティ私はコンポーネントのテキストが太字かイタリックかを知る必要があります。これらのプロパティを取得しようとしている手順は、次のとおりです。Delphi Tokyo 10.2

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

を例では、私はよりよいのためのコードを簡素化理解することができますが、実際のアプリケーションでは、実行時に作成されたコンポーネントで任意のクラスにすることができるため、より複雑です。したがって、rttiを使用しています。私はそれをTFontStyles segestaoに変更しましたが、エラーは残ります。 – Anderson

+0

'Style'は' TFontStyles'型であり、オブジェクト型ではなくtypeプロパティのセットです。そして 'fsBold'はプロパティではなく、そのセットの可能なメンバーです。 – Victoria

+0

しかし、オブジェクト型でない場合は、どのようにプロパティを取得しますか? – Anderson

答えて

6

GetObjectProp(Fonte, 'Style')は、Styleがオブジェクトベースのプロパティではないため動作しません。これはSetベースのプロパティです。 fsBoldはプロパティではないため、はTFontStyle列挙型のメンバであるため、間違っています(これはとにかく十分に呼び出せません)。 Styleプロパティ値を取得するには、GetOrdProp(Fonte, 'Style'),GetSetProp(Fonte, 'Style')、またはGetPropValue(Fonte, 'Style')を代わりに使用する必要があります(それぞれ、integerstring、またはvariant)。

TextSettingsオブジェクトを取得した後は、Font.StyleプロパティにアクセスするためにRTTIをまったく使用する必要はなく、プロパティに直接アクセスするだけです。

代わりにこれを試してください。

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; 

読むエンバカデロのドキュメント:

Setting Text Parameters in FireMonkey

+0

ありがとう、私は桟橋の上の医者を見るつもりです。あなたが提供したコード例では、エラー[dcc64 Error] uPrincipal.pas(1343):E2003宣言されていない識別子: 'fsBold' – Anderson

+0

@Juliano:FMXが[スコープ付きenums]を使用しているためです(http://docwiki.embarcadero.com/RADStudio/ja/Simple_Types_(Delphi)#Scoped_Enumerations)。代わりに 'TFontStyle.fsBold'を使用してください –

+0

作品!君たちありがとう.. – Anderson

関連する問題