2017-08-31 10 views
5

Używam funkcji GetObjectProp Delphi, aby uzyskać właściwości składników formularza, otrzymuję wszystkie właściwości kilku składników, ale nie mogę pobrać TextSettings.Font .Style (pogrubienie, kursywa, ...) właściwości komponentów takich jak np. TLabel. Muszę wiedzieć, czy tekst komponentu jest pogrubiony czy pochylony. Procedura pracuję nad próbując dostać się do tych właściwości następuje poniżej:Uzyskaj właściwość TextSettings.Font.Style za pomocą funkcji GetObjectProp za pomocą 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; 

Błąd wyświetlany na linii, gdzie zaznaczyłem powyżej jest.

[dcc64 Error] uPrincipal.pas (1350): E2015 Operator nie dotyczy tego argumentu typu

Co robię źle?

+0

W przykładzie I uproszczony kod lepiej zrozumienie, ale w obecnej aplikacji jest bardziej skomplikowane, ze składnikami tworzonymi w czasie wykonywania i mogą być dowolnej klasy, więc używam rtti. Zmieniłem go na TFostStyles segestao, ale błąd pozostaje. – Anderson

+0

'Styl' jest typu' TFontStyles' i nie jest typem obiektu, ale zbiorem właściwości type. A 'fsBold' nie jest właściwością, ale możliwym członkiem tego zestawu. – Victoria

+0

Ale jak uzyskać właściwość, jeśli nie jest to typ obiektu? – Anderson

Odpowiedz

6

GetObjectProp(Fonte, 'Style') nie będzie działać, ponieważ Style nie jest właściwością opartą na obiektach, jest to właściwość oparta na Set. I GetPropValue(Estilo, 'fsBold', true) jest po prostu błędne (nie, że dostaniesz wystarczająco daleko, aby zadzwonić i tak), ponieważ fsBold nie jest własnością, jest członkiem enum TFontStyle. Aby odzyskać wartość właściwości Style, należy zamiast tego użyć GetOrdProp(Fonte, 'Style'), GetSetProp(Fonte, 'Style') lub GetPropValue(Fonte, 'Style') (odpowiednio jako integer, string lub).

Mimo że po pobraniu obiektu TextSettings nie trzeba wcale korzystać z RTTI, aby uzyskać dostęp do jego właściwości Font.Style, wystarczy uzyskać bezpośredni dostęp do właściwości.

Spróbuj zamiast:

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; 

lepiej (i korzystnie) rozwiązaniem jest, aby nie używać RTTI wcale. Klasy FMX, które mają właściwość TextSettings także implementować interfejs ITextSettings dokładnie tej sytuacji, np:

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; 

dokumentacja Przeczytaj Embarcadero więcej szczegółów:

Setting Text Parameters in FireMonkey

+0

Dziękuję, idę zobaczyć dokument na molo. Podany kod przykładowy wyświetla błąd [błąd dcc64] uPrincipal.pas (1343): E2003 Identyfikator niezadeklarowany: 'fsBold' – Anderson

+0

@Juliano: to dlatego, że FMX używa [wyliczenia na podstawie zakresu] (http://docwiki.embarcadero.com/RADStudio/en/Simple_Types_ (Delphi) #Scoped_Enumerations). Użyj 'TFontStyle.fsBold' zamiast –

+0

działa! dzięki chłopaki.. – Anderson

Powiązane problemy