新しいTFileOpenDialogと古いTOpenDialogの違いは何ですか?
私のコンピューター(Win 7/DXE)で、コードを実行すると、ダイアログは同じように見えます。
TOpenDialog
は、従来のGetOpenFileName
をラップします。 Windowsのすべてのバージョンで動作します。TFileOpenDialog
は、Vistaで導入された新しいCOMベースのダイアログをラップします。したがって、Vista以降でのみ機能します。以前のダイアログよりも多くの機能があり、特に検索との緊密な統合が特徴です。ビスタコモンダイアログ
互換性共通ダイアログ
GetOpenFileName
APIは、正しく呼び出された場合、実際にはほとんどの状況で新しいダイアログを生成するため、実際に違いを区別することはできません。とはいえ、歴史的にGetOpenFileName
のVCLラッパーは不正確に実装されており、常に互換性ダイアログが表示されていました。
しかし、新しいCOMダイアログは何を提供する必要がありますか?
新しいダイアログは、一般性を失うことなく、はるかに簡単なカスタマイズインターフェイスを提供します。 Vista以降でGetOpenFileName
を使用して古いダイアログテンプレートベースのカスタマイズを使用すると、ダイアログは機能のない醜い互換性バージョンに劣化します。
新しいダイアログのもう1つの大きな利点は、無制限の数のファイルを選択できることです。古いGetOpenFileName
インターフェースは、固定サイズのバッファーで複数選択のファイル名を返しました。これは実際の制限となる可能性があり、私自身のコードでは、アプリをXPで実行するときにこのバッファーを大きくするために、VCLコードをハックする必要がありました。
TOpenDialog
は、可能であれば作業をTFileOpenDialog
に委任します。使用するテストでは、次のすべてが真である必要があります。
Dialogs.UseLatestCommonDialogs
グローバルブール変数はtrueです(デフォルトはtrue)。これにより、選択した場合に新しいCOMダイアログの使用を無効にすることができます。OnIncludeItem
、OnClose
、およびOnShow
イベントはすべて割り当てられていません。おそらく、これらはTFileOpenDialog
によって起動することはできません。概要
TOpenDialog
を引き続き使用すると、複数選択モードでファイル数に制限がないというメリットが得られます。ただし、ダイアログをカスタマイズし、醜い互換性ダイアログではなく新しいダイアログを使用する場合は、次の手順を実行する必要があります。
TOpenDialog
とダイアログテンプレートメソッドを使用します。TFileOpenDialog
を使用し、IFileDialogCustomize
を使用してカスタマイズを実装します。TOpenDialog
は、次の条件が満たされたときにTFileOpenDialog
を実行します。
UseLatestCommonDialogs
はtrueです(これがデフォルトです)OnIncludeItem
、OnClose
、またはOnShow
イベントは設定されていませんそのため、システムでTOpenDialog
を使用していると、ほとんどの場合、自動的にTFileOpenDialog
が実行される可能性があります。これが、同じように見える理由を説明しています。
備考:TFileOpenDialog
は、古いWindowsシステムではフォールバックしません。例外が発生するだけです。反対に、TOpenDialog
はある種の「フォールフォワード」を行います。