ОБНОВЛЕНИЕ: как @David Хеффернан, упомянутый в его комментарии ниже FilterIndex
, не всегда соответствует фактическому расширению файла; Поэтому вы не используете FilterIndex
для определения типа файла. Итак, вам нужно извлечь расширение файла и использовать его;
Вы можете определить список файлов известных типов перечисления, как:
TKnowFiles = (kfUnknown, kfJpg, kfTif, ...)
Вы можете также определить их имена, как
const FilterNames = array[TKnownFiles] of string = ('Any file', ...);
, то вы можете использовать функции RTTI getEnumName/getEnumValue
для преобразования kfJpg
в строковое представление и построить Filter
строка во время выполнения. также с помощью перечисления позволяет легко поддерживать и расширять ваш код (что делать, если вам нужно вставлять файлы BMP между tif и docx на следующей неделе? Docx, doc, pdf becomome 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, а не для Delphi – whosrdaddy
Существует несколько толкований вашего вопроса. Вы можете просто спросить, как узнать тип файла, где будет достаточно простого «ExtractFileExt», а весь «индекс строки» бит не имеет значения. Но вы можете захотеть узнать, как получить '5' из ввода' stack.pdf'. Это совсем другой вопрос. Измените свой вопрос, чтобы уточнить, о чем вы действительно просите, и удалите любую информацию, которая действительно не нужна. –