2013-01-02 16 views
5

Sto usando il componente TSaveTextFileDialog in Delphi XE3, ma quando è abilitato uno stile Vcl la casella combinata codifica viene disegnata utilizzando lo stile corrente vcl.TSaveTextFileDialog e Vcl Stili

enter image description here

Come posso risolvere questo problema, voglio dire disattivare lo stile VCL per il combobox?

+4

Ooh questa finestra di dialogo è disgustosa. Non rispetta nemmeno i temi di Windows! Povero spettacolo di Emba. –

risposta

9

La classe padre (TOpenTextFileDialog) del componente TSaveTextFileDialog aggiunge un insieme di componenti VCL per implementare le proprietà Encodings e EncodingIndex, è possibile disattivare gli stili Vcl su queste Vcl controlla utilizzando la proprietà StyleElements. sfortunatamente questi componenti sono privati ​​quindi è necessario un piccolo trucco per accedere e disabilitare gli stili Vcl.

Qui ci sono due opzioni.

Utilizzo di un helper di classe.

È possibile introdurre una funzione di supporto per ottenere il componente Pannello che contiene i controlli Vcl della finestra di dialogo.

type 
TOpenTextFileDialogHelper=class helper for TOpenTextFileDialog 
    function GetPanel : TPanel; 
end; 

function TOpenTextFileDialogHelper.GetPanel: TPanel; 
begin 
    Result:=Self.FPanel; 
end; 

allora si può scrivere un metodo per disabilitare Stili VCL in questo modo:

procedure DisableVclStyles(const Control : TControl); 
var 
    i : Integer; 
begin 
    if Control=nil then 
    Exit; 
    Control.StyleElements:=[]; 

    if Control is TWinControl then 
    for i := 0 to TWinControl(Control).ControlCount-1 do 
     DisableVclStyles(TWinControl(Control).Controls[i]); 
end; 

E infine utilizzare in questo modo

DisableVclStyles(SaveTextFileDialog1.GetPanel); 
    SaveTextFileDialog1.Execute; 

RTTI

Un'altra opzione è utilizzare RTTI per accedere ai componenti Vcl privati.

var 
    LRttiContext : TRttiContext; 
    LRttiField :TRttiField; 
begin 
    LRttiContext:=TRttiContext.Create; 
    for LRttiField in LRttiContext.GetType(SaveTextFileDialog1.ClassType).GetFields do 
    if LRttiField.FieldType.IsInstance and LRttiField.FieldType.AsInstance.MetaclassType.ClassNameIs('TPanel') then 
    DisableVclStyles(TPanel(LRttiField.GetValue(SaveTextFileDialog1).AsObject)); 

    SaveTextFileDialog1.Execute; 
end; 
+0

Grazie mille, funziona perfettamente. – Salvador

+0

Personalmente correggo il problema di root e uso 'IFileDialogCustomize' per personalizzare la finestra di dialogo. –

Problemi correlati