2014-09-16 15 views
8

Konwertuję duży projekt na Firemonkey i mamy kilka niestandardowych przycisków, które nie są wyświetlane w formularzu. Wyodrębniłem ten problem do bardzo prostego projektu:Przycisk niestandardowy odziedziczony po TButton nie pokazuje

Z poniższym kodem, zarówno na telefonie komórkowym, jak i na komputerze stacjonarnym (przy użyciu domyślnych nowych aplikacji w Delphi XE6), tworzenie tTestButton1 działa dobrze, ale tTestButton2 nie jest wyświetlany w formularzu. Jak to możliwe?

type 
tTestButton1 = class(TButton); 
tTestButton2 = class(tTestButton1); 

tMainForm = class(TForm) 
private 
    fTestButton: TButton; 
public 
    constructor Create(aOwner: TComponent); override; 
end; 

constructor tMainForm .Create(aOwner: TComponent); 
begin 
    inherited; 

// fTestButton := tTestButton1.Create(Self); // this works fine (used instead of next line) 
    fTestButton := tTestButton2.Create(Self); //this button does not show up 
    fTestButton.Text := 'Test'; 
    fTestButton.Parent := Self; 
    fTestButton.Visible := True; 
    fTestButton.Position.X := 20; 
    fTestButton.Position.Y := 20; 
end; 
+6

+1 doskonałe pytanie, cudowny kod repro, jeśli tylko oni wszyscy byli tak dobrzy –

+0

Może odtworzyć to samo w Delphi XE3. – TLama

+0

I XE7. Wygląda jak błąd FMX, ciężko, ale może się wydawać, że tak może być ...... –

Odpowiedz

4

Problem polega na tym, że sterowanie nie ma zarejestrowanego stylu. Zatem naturalnym rozwiązaniem jest to, abyś to zrobił.

Ale to rozsądna ilość pracy, i spodziewam się, że wszystko, co naprawdę chcesz zrobić, to ustawić, że kontrola używa tego samego stylu, co TButton. Osiągnij to w ten sposób:

type 
    TButtonBase = class(TButton) 
    protected 
    function GetDefaultStyleLookupName: string; override; 
    end; 

function TButtonBase.GetDefaultStyleLookupName: string; 
begin 
    Result := 'Buttonstyle'; 
end; 

Teraz wypróbuj swoje zajęcia od TButtonBase.

type 
    tTestButton1 = class(TButtonBase); 
    tTestButton2 = class(tTestButton1); 

Zamiast szukać stylów na podstawie nazwy klasy kontrolki, ćwiczenia pochodzące z TButtonBase użyje styl nazwany Buttonstyle.

+1

W prawdziwym kodzie ustawiłem teraz stylLookup w konstruktorze "tTestButton1" i obie klasy są teraz wyświetlane jako przyciski w formularzu. Miło, gdy istnieje proste rozwiązanie problemu :-) – Hans

+0

@Hans To dokładnie to, co zasugerowałem. Dodałem dodatkową klasę 'TButtonBase', aby dać ci możliwość wyprowadzenia innych klas przycisków, jeśli chcesz to zrobić. Ale może 'tTestButton1' był już tą klasą bazową. Rozumiem, że uprościłeś prawdziwy kod do małej i prostej reprodukcji, z korzyścią dla zadania pytania. I po raz kolejny nie mogę cię bardziej pochwalić. –

+1

O wiele bardziej eleganckim rozwiązaniem jest nadpisanie metody DefaultStyleLookupName w celu zwrócenia "ButtonStyle". –

Powiązane problemy