更新:正如@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 变成 4、5、6 而不是 3、4、5 并且您可以编辑您的代码。)
可能的解决方案之一是:
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;