TOpenDialog(FMX)でオープンするファイルの拡張子で処理を切り替える事を考えます。
フィルターには、
3種類拡張子を登録してあります。
TIFF、BMP、JPG
デフォルト用に、FilterIndex := 1;
として、TIFFが設定されています。
================
if OpenDialog1.Execute() then
begin
case OpenDialog1.FilterIndex of
1: operation1();
2: operation2();
3: operation3();
end;
operationA();
end
else
ShowMessage( 'Error' );
=================
の様にしてみましたが、正しく動作しません。
具体的には、実際のフィルター選択に関わらず常に同じフィルターが選択されてしまいます。
ヘルプでも、FilterIndexはダイアログを開いた時の選択フィルターと記述され実際の選択を示しているとは記述されていません。
また、Indexと言うプロパティがありましたが、こちらも実際の選択フィルターとは違う値でした。
何を参照すれば、実際のファイル選択時のフィルターを知る事ができるでしょう?
当方、32Bit Windows7Pro / Delphi XE6, FMX
例えばですね.
> 2: operation2();
を次のようにしたらどうなるか確認してみてください.
2: ShowMessage(IntToStr(OpenDialog1.FilterIndex));
実験してみた限りだと、選択されたフィルタのインデックスを知る術は無さそうな感じですね。
FilterIndexは、Execute前に指定した値から変わらないですし。
実際の選択されたファイルの拡張子を調べてそれによって処理を分けるって形じゃダメなんでしょうか?
ちょっと動作を追ってみましたが、FMX.Dialogs.Win.pasのTCustomFileDialog.Executeで
FDialog.SetFileTypeIndex(FDialogはIFileDialog)を呼び出してインデックスを設定しているものの、
Showの呼び出し後にFDialog.GetFileTypeIndexを呼び出しておらず、FFileTypeIndexが
更新されないため選択されたインデックスが取得されない、ということのようです。バグっぽい気はしますが…。
試しにFMX.Dialogs.Win.pasをプロジェクトのフォルダにコピーしてプロジェクトに追加し、
function TCustomFileDialog.Executeの491行目付近で
DoOnExecute;
try
Result := Succeeded(Show(ParentWnd));
if Result then
Result := Succeeded(GetResults);
finally
GetFileTypeIndex(FFileTypeIndex); // この行を追加
SetActiveWindow(ParentWnd);
end;
とGetFileTypeIndexを呼び出すようにすることでフィルタのインデックスが正しくフィードバックされることを
確認しました。
補足です。手元でソースを確認してみましたが、XE6以降のすべてのバージョンで同じ動作です。
もしご不満でしたらQPに登録することをお勧めします。
Mr.XRAYさん、auさん、通りすがりさん、ありがとうございました。
色々調べて頂きありがとうございます。
どうやら、実際に選択されたフィルターを知り得ないというバグの様ですね。
ちょっとびっくりです。
TOpenDialogでフィルターを設定してファイルの種類にマスクを掛けるのは、選択されたフィルターにより処理を変える為と思いますが、その為の選択されたフィルターを知る術がないとは、、、
通りすがりさんへ、QPとは何でしょうか?
武具修正の依頼の様なものと推察されますが、、、
Embarcaderoのホームページをみてみましたが、良く分かりませんでした。
よろしければ、QPとは何か教えて頂けるでしょうか?
> TOpenDialogでフィルターを設定してファイルの種類にマスクを掛けるのは、選択されたフィルターにより処理を変える為と思いますが、
多分その用途には使えないので…(フィルタに何を設定していても、ファイル名のところに*.*とか入れて[ENTER]押したら
台無しです)
QPは"Quality Portal"の略(すいません、つい説明もなく使ってしまいました)で、Embarcadero製品のバグトラッキングシステムです。
https://quality.embarcadero.com
ここからアクセスし、EDN(Embarcadero Develper Network)のアカウントでログインしてください。
http://docwiki.embarcadero.com/RADStudio/Berlin/ja/RAD_Studio_%E5%93%81%E8%B3%AA%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%90%E3%82%B0%E3%81%AE%E9%80%A3%E7%B5%A1%E6%96%B9%E6%B3%95
にも説明があります(システムそのものはAttlasianのJIRAを使用しています)。ここに登録されない不具合は基本的に修正されないと
思っていいので、修正してほしい不具合は登録することをお勧めします(こういう掲示板や公式フォーラム、Delphi-ML、Twitterなどで
QPへの登録をアピールしていただけるとvoteが集まりやすいのではないかと)。
yTakeです。
ここまでの経緯で明らかですが、
FilterIndexが1の時、ダイアログオープン時、TIFFが選択可能な状態で、フィルターでBMPを選択(FilterIndex=2のつもり)すると、
2: ShowMessage( IntToStr( IntToStr( OpenDialog1.FilterIndex )));
は通過しません。
FilterIndexが1のままの為です。
OpenDialog1.Indexでスイッチしてもダメでした。
通りすがりさんを真似て、"TCustomFileDialog.Execute"を修正してみました。
見事に、選択したフィルターで処理を切り替える事が出来ました。
みなさん、ありがとうございました。
通りすがりさん、QPの説明をありがとうございました。
念の為、VCLで試してみましたが、VCLでは選択されているFilterIndexを取得する事が出来ました。
VCLとFMXとで仕様が違うとも考え難いので、やはり、バグなのでしょうか?
問題は解消できましたので、ここは閉めさせて頂きます。
> 念の為、VCLで試してみましたが、VCLでは選択されているFilterIndexを取得する事が出来ました。
> VCLとFMXとで仕様が違うとも考え難いので、やはり、バグなのでしょうか?
なるほど、VCLと動作が異なるなら、バグとしてQPに登録すれば修正の可能性はありますね。