2014-09-16 12 views
8

Sto convertendo un progetto di grandi dimensioni in Firemonkey e abbiamo alcuni pulsanti personalizzati, che non vengono visualizzati nel modulo. Ho isolato il problema in un progetto molto semplice:Pulsante personalizzato ereditato da TButton non mostra

Con il codice seguente, sia su dispositivo mobile che desktop (utilizzando le nuove applicazioni predefinite in Delphi XE6), la creazione di tTestButton1 funziona correttamente, ma tTestButton2 non viene visualizzato nel modulo. Come è possibile?

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 eccellente domanda, meraviglioso codice di ripro, se solo fossero tutti così buoni –

+0

Può riprodurre lo stesso in Delphi XE3. – TLama

+0

E XE7. Sembra un bug FMX, anche se potrebbe essere difficile credere che potrebbe essere il caso ... –

risposta

4

Il problema è che il controllo non ha uno stile registrato per esso. Quindi la soluzione naturale è che tu lo faccia.

Ma questa è una quantità ragionevole di lavoro e mi aspetto che tutto ciò che si vuole veramente fare sia organizzare che il controllo usi lo stesso stile di TButton. Raggiungere che in questo modo:

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

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

Ora derivano le vostre classi da TButtonBase.

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

Invece di cercare stili basati sul nome della classe del controllo, classi derivate da TButtonBase utilizzeranno lo stile di nome Buttonstyle.

+1

Nel codice reale ora ho impostato StyleLookup nel costruttore di "tTestButton1" ed entrambe le classi ora appaiono come pulsanti sul modulo. Bello quando c'è una soluzione semplice a un problema :-) – Hans

+0

@Hans Questo è praticamente esattamente quello che ho suggerito. Ho inserito una classe extra 'TButtonBase' per darti l'opportunità di ricavare altre classi di pulsanti se desideri farlo. Ma forse 'tTestButton1' era già quella classe base. Apprezzo che tu abbia semplificato il codice reale per una riproduzione piccola e semplice a vantaggio di porre la domanda. E ancora una volta non posso raccomandarti di più per farlo. –

+1

Una soluzione molto più elegante è quella di sovrascrivere il metodo DefaultStyleLookupName per restituire "ButtonStyle". –