尋找

2012-05-25 74 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個文件,它可能會節省幾個minuttes。

+1

@Blanktext這是爲JavaScript,而不是德爾爾 – whosrdaddy

+1

有幾個解釋你的問題。您可能只是在問如何知道文件的類型,其中簡單的'ExtractFileExt'就足夠了,並且整個「字符串索引」位是不相關的。但是你可能想知道如何從輸入'stack.pdf'中獲得'5'。這是完全不同的問題。請編輯您的問題以澄清您真正要求的內容,並刪除任何不必要的信息。 –

回答

1

您可以使用ExtractFileExt從完整路徑中提取文件擴展名。

或使用openDialog.FilterIndex屬性來獲取所選過濾器的索引(對於您的案例,pdf爲5)。

+1

我也會使用'如果SameText(ExtractFileExt(OpenDialog1.FileName),'.ext')然後......'這將忽略文件擴展名的大小寫敏感性。 – 2012-05-25 09:43:36

2

更新:正如@David Heffernan在他的評論中提到的FilterIndex並不總是匹配實際的文件擴展名;所以你不應該使用FilterIndex來確定文件類型。所以,你必須提取文件擴展名並使用它;

可以定義已知文件類型的枚舉,如:

TKnowFiles = (kfUnknown, kfJpg, kfTif, ...) 

你也可以這樣定義

const FilterNames = array[TKnownFiles] of string = ('Any file', ...); 

自己的名字,那麼你可以使用RTTI功能getEnumName/getEnumValuekfJpg轉換爲字符串表示和構建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; 
+0

「如果FilterIndex小於6,則可以使用它」。不,您仍然可以選擇沒有與其他過濾器匹配的擴展名的文件。所有的過濾器索引屬性都告訴過濾器設置的是什麼。它沒有提供有關所選文件的具體信息。 –

+0

@DavidHeffernan然後他必須手動提取文件擴展名並確定文件類型,就像在第二個代碼示例中那樣,它不使用「FilterIndex」屬性(ps:如何在選擇PDF過濾器時選擇打開對話框中的jpg文件?) – 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; 

這是否把戲對我來說。