更新: 以下のコメントで @David Heffernan が言及しているように、FilterIndex
実際のファイル拡張子と常に一致するとは限りません。したがって、FilterIndex
ファイル タイプの判別には使用しないでください。したがって、ファイル拡張子を抽出して使用する必要があります。
次のような既知のファイルタイプの列挙を定義できます。
TKnowFiles = (kfUnknown, kfJpg, kfTif, ...)
次のように名前を定義することもできます
const FilterNames = array[TKnownFiles] of string = ('Any file', ...);
次に、RTTI 関数getEnumName/getEnumValue
を使用して文字列表現に変換し、実行時に文字列kfJpg
を構築できます。Filter
また、列挙を使用すると、コードを簡単に維持および拡張できます (来週、tif と docx の間に BMP ファイルを挿入する必要がある場合はどうでしょう? docx、doc、pdf が 3,4,5 ではなく 4,5,6 になり、編集する必要があります)あなたのコード。)
可能な解決策の1つは次のとおりです。
type
TKnownFileTypes = (kftUnknown, kftJpg, kftTif, kftDocx, kftDoc, kftPdf);
const
FileFilterNames : array[TKnownFileTypes] of string = (
'Alle filer',
'Indscannet fil',
'Indscannet fil',
'Word 2007 dokument',
'Word 2003 dokument',
'PDF fil');
procedure TForm4.Button1Click(Sender: TObject);
const KnownFiles = [low(TKnownFileTypes) .. high(TKnownFileTypes)];
var filterString : string;
fext : string;
kf : TKnownFileTypes;
kfs : string;
resultFileType : TKnownFileTypes;
begin
for kf in KnownFiles - [kftUnknown] do begin
kfs := getEnumName(typeinfo(TKnownFileTypes), ord(kf));
Delete(kfs, 1, 3);
LowerCase(kfs);
FilterString := FilterString +
Format('%s (*.%s)|*.%s|', [FileFilterNames[kf], kfs, kfs]);
end;
FilterString := FilterString + Format('%s (*.*)|*.*', [FileFilterNames[kftUnknown]]);
OpenDialog1.Filter := FilterString;
if not OpenDialog1.Execute() then exit;
fext := ExtractFileExt(OpenDialog1.FileName);
Delete(fext, 1,1); //delete .dot
fext := 'kft' + fExt;
resultFileType := kftUnknown;
for kf in KnownFiles - [kftUnknown] do begin
kfs := getEnumName(typeinfo(TKnownFileTypes), ord(kf));
kfs := LowerCase(kfs);
if kfs <> fext then continue;
resultFileType := kf;
end;
ShowMessage(Format('File Type: %s', [FileFilterNames[resultFileType]]));
end;