2013-01-02 14 views
5

Delphi XE3でTSaveTextFileDialogコンポーネントを使用していますが、Vclスタイルを有効にすると、のエンコーディングのコンボボックスが現在のvclスタイルを使用して描画されます。私はこの問題を解決するにはどうすればよいTSaveTextFileDialogとVclスタイル

enter image description here

、私はコンボボックスのためのVCLスタイルを無効にする意味ですか?

+4

このダイアログは嫌です。それはWindowsテーマを尊重するものではありません! Embaの貧しいショー。 –

答えて

9

TSaveTextFileDialogコンポーネントの親クラス(TOpenTextFileDialog)はEncodingsEncodingIndexプロパティを実装するためのVCLコンポーネントのセットを追加し、あなたはStyleElementsプロパティを使用して、これらのVCLコントロール上のVCLスタイルを無効にすることができます。残念ながらこれらのコンポーネントはプライベートなので、Vclスタイルにアクセスして無効にするにはちょっとハックする必要があります。

ここには2つのオプションがあります。

クラスヘルパーの使用。

ヘルパー機能を導入して、ダイアログのVclコントロールを含むPanelコンポーネントを取得することができます。

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; 

を最後に

DisableVclStyles(SaveTextFileDialog1.GetPanel); 
    SaveTextFileDialog1.Execute; 

RTTI

別のオプションがあり、このように使用します。

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

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

あなたがそうのような、のVCLスタイルを無効にする方法を書くことができますRTTIを使用してプライベートVclコンポーネントにアクセスします。

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

ありがとう、とても完璧です。 – Salvador

+0

個人的に私は根本的な問題を修正し、 'IFileDialogCustomize'を使ってダイアログをカスタマイズします。 –

関連する問題