web-dev-qa-db-ja.com

新しいTFileOpenDialogと古いTOpenDialogの違いは何ですか?

新しいTFileOpenDialogと古いTOpenDialogの違いは何ですか?
私のコンピューター(Win 7/DXE)で、コードを実行すると、ダイアログは同じように見えます。

  • TOpenDialogは、従来のGetOpenFileNameをラップします。 Windowsのすべてのバージョンで動作します。
  • TFileOpenDialogは、Vistaで導入された新しいCOMベースのダイアログをラップします。したがって、Vista以降でのみ機能します。以前のダイアログよりも多くの機能があり、特に検索との緊密な統合が特徴です。

ビスタコモンダイアログ Vista common dialog

互換性共通ダイアログ Compatibility common dialog

GetOpenFileName AP​​Iは、正しく呼び出された場合、実際にはほとんどの状況で新しいダイアログを生成するため、実際に違いを区別することはできません。とはいえ、歴史的にGetOpenFileNameのVCLラッパーは不正確に実装されており、常に互換性ダイアログが表示されていました。

しかし、新しいCOMダイアログは何を提供する必要がありますか?

新しいダイアログは、一般性を失うことなく、はるかに簡単なカスタマイズインターフェイスを提供します。 Vista以降でGetOpenFileNameを使用して古いダイアログテンプレートベースのカスタマイズを使用すると、ダイアログは機能のない醜い互換性バージョンに劣化します。

新しいダイアログのもう1つの大きな利点は、無制限の数のファイルを選択できることです。古いGetOpenFileNameインターフェースは、固定サイズのバッファーで複数選択のファイル名を返しました。これは実際の制限となる可能性があり、私自身のコードでは、アプリをXPで実行するときにこのバッファーを大きくするために、VCLコードをハックする必要がありました。

TOpenDialogは、可能であれば作業をTFileOpenDialogに委任します。使用するテストでは、次のすべてが真である必要があります。

  • WindowsVista以降で実行しています。
  • Dialogs.UseLatestCommonDialogsグローバルブール変数はtrueです(デフォルトはtrue)。これにより、選択した場合に新しいCOMダイアログの使用を無効にすることができます。
  • ダイアログテンプレートが指定されていません。
  • OnIncludeItemOnClose、およびOnShowイベントはすべて割り当てられていません。おそらく、これらはTFileOpenDialogによって起動することはできません。

概要

TOpenDialogを引き続き使用すると、複数選択モードでファイル数に制限がないというメリットが得られます。ただし、ダイアログをカスタマイズし、醜い互換性ダイアログではなく新しいダイアログを使用する場合は、次の手順を実行する必要があります。

  • XP TOpenDialogとダイアログテンプレートメソッドを使用します。
  • Vista以降では、TFileOpenDialogを使用し、IFileDialogCustomizeを使用してカスタマイズを実装します。
34
David Heffernan

TOpenDialogは、次の条件が満たされたときにTFileOpenDialogを実行します。

  1. プログラムはVistaまたはWindows7で実行されています
  2. UseLatestCommonDialogsはtrueです(これがデフォルトです)
  3. OnIncludeItemOnClose、またはOnShowイベントは設定されていません

そのため、システムでTOpenDialogを使用していると、ほとんどの場合、自動的にTFileOpenDialogが実行される可能性があります。これが、同じように見える理由を説明しています。

備考:TFileOpenDialogは、古いWindowsシステムではフォールバックしません。例外が発生するだけです。反対に、TOpenDialogはある種の「フォールフォワード」を行います。

47
Uwe Raabe