寻找

2012-05-25 44 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; 

这是否把戏对我来说。