Delphi XE3でTSaveTextFileDialogコンポーネントを使用していますが、Vclスタイルを有効にすると、のエンコーディングのコンボボックスが現在のvclスタイルを使用して描画されます。私はこの問題を解決するにはどうすればよいTSaveTextFileDialogとVclスタイル
、私はコンボボックスのためのVCLスタイルを無効にする意味ですか?
Delphi XE3でTSaveTextFileDialogコンポーネントを使用していますが、Vclスタイルを有効にすると、のエンコーディングのコンボボックスが現在のvclスタイルを使用して描画されます。私はこの問題を解決するにはどうすればよいTSaveTextFileDialogとVclスタイル
、私はコンボボックスのためのVCLスタイルを無効にする意味ですか?
TSaveTextFileDialogコンポーネントの親クラス(TOpenTextFileDialog)はEncodings
とEncodingIndex
プロパティを実装するための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;
別のオプションがあり、このように使用します。
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;
ありがとう、とても完璧です。 – Salvador
個人的に私は根本的な問題を修正し、 'IFileDialogCustomize'を使ってダイアログをカスタマイズします。 –
このダイアログは嫌です。それはWindowsテーマを尊重するものではありません! Embaの貧しいショー。 –