0

ファイルを開くダイアログにフィルターがあります

  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 個のドキュメントの場合、数分節約できます。

4

3 に答える 3

2

更新: 以下のコメントで @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 が 3,4,5 ではなく 4,5,6 になり、編集する必要があります)あなたのコード。)
可能な解決策の1つは次のとおりです。

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;
于 2012-05-25T08:15:58.220 に答える
1

ExtractFileExtフルパスからファイル拡張子を抽出するために使用できます。

または、openDialog.FilterIndexプロパティを使用して、選択したフィルターのインデックスを取得します(この場合、pdfの場合は5)。

于 2012-05-25T06:52:25.387 に答える
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;

これは私にとってはうまくいきます。

于 2012-05-31T15:30:12.133 に答える