2012-05-25 3 views
0

У меня есть фильтр на FileOpen диалогНахождение индекса строки

Docs := 'Indscannet fil (*.jpg)|*.jpg|Indscannet fil (*.tif)|*.tif|' + 
      'Word 2007 dokument (*.docx)|*.docx|Word 2003 dokument (*.doc)|*.doc|' + 
      'PDF fil (*.pdf)|*.pdf|Alle filer (*.*)|*.*'; 

Когда я выбрал файл, позволяет сказать, что это называется stack.pdf, я хочу знать, что это типа 5 (jpg = 1, tif = 2, docx = 3, doc = 4, pdf = 5)

Как сделать это самым простым способом?

Причина в том, что пользователи почти всегда добавляют несколько документов одного типа, и если это PDF, я знаю, что это номер 5 в моем фильтре, и в следующий раз пользователь добавит файл, который я могу установить dlgOpen. FilterIndex до 5e с самого начала, поэтому им не нужно будет выбирать его каждый раз. Если это 20 документов, это может сэкономить пару минут.

+1

@Blanktext Это для javascript, а не для Delphi – whosrdaddy

+1

Существует несколько толкований вашего вопроса. Вы можете просто спросить, как узнать тип файла, где будет достаточно простого «ExtractFileExt», а весь «индекс строки» бит не имеет значения. Но вы можете захотеть узнать, как получить '5' из ввода' stack.pdf'. Это совсем другой вопрос. Измените свой вопрос, чтобы уточнить, о чем вы действительно просите, и удалите любую информацию, которая действительно не нужна. –

ответ

1

Вы можете использовать ExtractFileExt, чтобы извлечь расширение файла из полного пути.

Или используйте свойство openDialog.FilterIndex, чтобы получить индекс выбранного фильтра (5 для pdf в вашем случае).

+1

Я бы также использовал 'if SameText (ExtractFileExt (OpenDialog1.FileName), '.ext') then ...', который будет игнорировать чувствительность к регистру расширения файла. –

2

ОБНОВЛЕНИЕ: как @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; 
+0

«Если FilterIndex меньше 6, вы можете использовать его». Нет, вы все равно можете выбрать файл, который не имеет расширения, соответствующего другим фильтрам. Все свойства индекса фильтра указывают, для чего был установлен фильтр. Он не дает конкретной информации о выбранном файле. –

+0

@DavidHeffernan тогда он должен извлечь расширение файла и определить тип файла вручную, как во втором примере кода, который не использует свойство 'FilterIndex' (ps: как выбрать файл jpg в диалоговом окне открытия при выборе фильтра PDF?) – teran

+0

Тип * в текстовое поле имени файла и нажмите клавишу ввода.Затем вы можете выбрать что-нибудь в этой папке. –

0

Мое решение было

function ExtensionIndex(const aFilter, aFile: string): integer; 
var 
    List: TStringList; 
    Buffer: TStringList; 
    i: Integer; 
    Key: string; 
    fExt: string; 
begin 
    Result := - 1; 
    i := 0; 
    List := TStringList.Create; 
    List.LineBreak := '|'; 
    List.Text := aFilter; 
    Buffer := TStringList.Create; 
    Buffer.Sorted := False; 
    try 
    while i < List.Count do 
     begin 
     inc(i); 
     Key := AnsiLowerCase(List[i]); 
     inc(i); 
     Buffer.Add(Key); 
     end; 
    fExt := AnsiLowerCase(ExtractFileExt(aFile)); 
    for i := 0 to Buffer.Count - 1 do 
     if Buffer[i] = '*' + fExt then 
     begin 
      Result := i + 1; 
      exit; 
     end; 
    finally 
    FreeAndNil(Buffer); 
    FreeAndNil(List); 
    end; 
end; 

Это делает трюк для меня.

Смежные вопросы