更新:正如@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 becoome 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;
@Blanktext這是爲JavaScript,而不是德爾爾 – whosrdaddy
有幾個解釋你的問題。您可能只是在問如何知道文件的類型,其中簡單的'ExtractFileExt'就足夠了,並且整個「字符串索引」位是不相關的。但是你可能想知道如何從輸入'stack.pdf'中獲得'5'。這是完全不同的問題。請編輯您的問題以澄清您真正要求的內容,並刪除任何不必要的信息。 –