7

TSaveDialogDelphi XE6 でa を使用しようとしています:

if not SaveDialog1.Execute(0) then
   Exit;

この呼び出しは、ダイアログを表示せずにすぐにfalseを返します。シェルの Save Dialog COM オブジェクトを作成する行為までたどり着きました。

function TCustomFileSaveDialog.CreateFileDialog: IFileDialog;
var
       LGuid: TGUID;
begin
  LGuid := CLSID_FileSaveDialog;

  CoCreateInstance(LGuid, nil, CLSCTX_INPROC_SERVER,
    StringToGUID(SID_IFileSaveDialog), Result);
end;

への呼び出しCoCreateInstanceが失敗しています。問題を再現するための最小限のコードを作成しました。

procedure TForm1.Button1Click(Sender: TObject);
const
   CLSID_FileSaveDialog: TGUID = '{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}';
begin
   CreateComObject(CLSID_FileSaveDialog);
end;

EOleSysError例外をスローします。

0x80040111: ClassFactory は要求されたクラスを提供できません, ClassID: {C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}

私のアプリケーションバージョン 6 の Common Controls ライブラリ (6.0.7601.18837) を使用していますが、ユーザーがアプリケーションのビジュアル スタイルを無効にしている場合にのみ発生することに気付きました。

ここに画像の説明を入力

共通コントロール ライブラリのバージョン 6 をまだ使用していますが、それだけでIsAppThemedfalse が返されます。

: 多くの人が次のように誤って信じていることは知っています。

  • Visual Styles API は、バージョン 6 の Comctrl32.dll がロードされている場合にのみ機能します
  • Comctrl32.dll のバージョン 6 が読み込まれている場合、Visual Styles API は機能します。
  • ComCtrl v6 を使用していない場合は、Visual Styles が無効になっていることを意味します。
  • 古い共通コントロール ライブラリを使用している場合、ビジュアル スタイルは無効になります。

総当りの解決策は、グローバルなUseLatestCommonDialogsを false に設定することです。

ただし、アプリケーションで視覚スタイルを無効にしているユーザーにのみ適用されるため、これはかなり悪いことです。

  • ダイアログは、視覚スタイルのない OS (Windows Server 2008 R2 など) でも引き続き機能します。
  • ダイアログは、ビジュアル スタイルをオフにしても動作し続けます (例: ビジュアル スタイルがオフの Windows 7)。

これはIsAppThemed、 が false の場合も false を返すため、単純に を使用できないことを意味しIsThemeActiveます。

| IsThemeActive | IsAppThemed | Disable visual styles | Result    |
|---------------|-------------|-----------------------|-----------|
| True          | True        | Unchecked             | Works     |
| True          | False       | Checked               | Fails     |
| False         | False       | Unchecked             | Works     |
| False         | False       | Checked               | Fails     |

私が求めているのは、Disble Visual Styles compat フラグのステータスを確認する方法です。

私が本当に求めているのはTSaveDialog、Delphi で正しく動作させる方法です (compat フラグを読むことが解決策の一部であることを意味するものではありません)。

4

1 に答える 1