在一个目录中,文件名统一按照 日期_附加信息.gif 的格式保存 
现在目录中有4 个文件,但是用opendialog 准备打开文件的时候,opendialog 打开如下
2008-10-23  14:34           269,269 20081022_1.gif
2008-10-24  15:53           165,034 20081024_1.gif
2008-10-25  09:48           241,213 20081024_1(分析).gif
2008-10-30  09:29           290,094 20081027_1.gif这样文件越来越多的时候,我不能将最近保存的文件显示在最前面,这样操作起来很麻烦
请问如何对里面的文件名进行排序,以便将最近保存的文件放到最前面(如20081027_1.gif 拍在前面,20081022_2.gif 放在后面)便于使用呢?

解决方案 »

  1.   

    呵呵,请教能否通过编程在 opendialog 打开显示的时候,对显示的文件名进行排序呢?这样最新文件就可以自动排在前面,使用就方便多了!
      

  2.   

    看了一遍topendialog,files属性是tstrings,也没看到它读了时间,options里面也没有要的选项,估计你的要求不成。看来只有自己用SysUtils.FindFirst来弄
      

  3.   

    可以自己改造撒,设置默认浏览模式为REPORT
      

  4.   

    多谢几位帮忙,我这两天也看了一下topendialog, 看来改起来麻烦不小
    最后决定模仿windows 的最近打开文件处理模式,将最近的几个文件放到菜单中,然后通过菜单打开procedure TForm1.AddToRecentFile;
    var
      sp:string;           //查找文件名所用字符串,必须包含 *.* 通配符  sr:TSearchRec;
      FileAttrs: Integer; //结果文件属性定义
      strl:tstringlist;   //用于结果排序
      i:integer;
      y:integer;begin
        sp:= cfginitdir + '\*.*';
        strl:= tstringlist.Create;
        strl.Clear;    FileAttrs := faAnyFile - faDirectory;
        //提取目录下所有文件名,但是不包括 . 和 .. 默认目录    //取指定目录下所有文件名创建文件,并将结果存入 TstringList 中以便排序后取出最近
        //的4 个文件
        if FindFirst(sp, FileAttrs, sr) = 0 then
        begin
          repeat
              strl.Add(sr.Name);
          until FindNext(sr) <> 0;
          //FindClose(sr);
        end;    //将文件名进行排序,取出最新4 个文件存入最近打开文件列表
        strl.Sort;    //将最新4 个文件文件名放入最近打开文件菜单的caption中
        y:= 1 ;
        for i:= strl.Count -1 downto 0 do
        begin
          if y = 1 then
            begin
              MenuR1.Caption:= '';
              MenuR1.Caption := strl.Strings[i];
            end
          else if y = 2 then
            begin
              MenuR2.Caption := '';
              MenuR2.Caption := strl.Strings[i];
            end
          else if y = 3 then
            begin
              MenuR3.Caption := '';
              MenuR3.Caption := strl.Strings[i];
            end
          else if y = 4 then
            begin
              MenuR4.Caption := '';
              MenuR4.Caption := strl.Strings[i];
            end;      y:= y+1;      //showmessage('add to menu '+strl.Strings[i]);
        end ;
        //释放TstringList
        strl.Free;end;但是这段代码运作时候出现了两个问题:
    1、FindClose(sr); 无法编译,提示错误: [Error] FrameCapture.pas(554): Incompatible types: 'Cardinal' and 'TSearchRec'
       google 不到原因,请教一下大家
    2、将文件名插入menuR1.caption 时候,原始文件名为 abcd.gif ,但是插入menuR1.caption以后,菜单显示文字 ”abcd.gif(2)“,自动增加了一个 (2)在后面,是什么原因呢?   请教一下大家
      

  5.   

    多谢几位帮忙,我这两天也看了一下topendialog, 看来改起来麻烦不小
    最后决定模仿windows 的最近打开文件处理模式,将最近的几个文件放到菜单中,然后通过菜单打开procedure TForm1.AddToRecentFile;
    var
      sp:string;           //查找文件名所用字符串,必须包含 *.* 通配符  sr:TSearchRec;
      FileAttrs: Integer; //结果文件属性定义
      strl:tstringlist;   //用于结果排序
      i:integer;
      y:integer;begin
        sp:= cfginitdir + '\*.*';
        strl:= tstringlist.Create;
        strl.Clear;    FileAttrs := faAnyFile - faDirectory;
        //提取目录下所有文件名,但是不包括 . 和 .. 默认目录    //取指定目录下所有文件名创建文件,并将结果存入 TstringList 中以便排序后取出最近
        //的4 个文件
        if FindFirst(sp, FileAttrs, sr) = 0 then
        begin
          repeat
              strl.Add(sr.Name);
          until FindNext(sr) <> 0;
          //FindClose(sr);
        end;    //将文件名进行排序,取出最新4 个文件存入最近打开文件列表
        strl.Sort;    //将最新4 个文件文件名放入最近打开文件菜单的caption中
        y:= 1 ;
        for i:= strl.Count -1 downto 0 do
        begin
          if y = 1 then
            begin
              MenuR1.Caption:= '';
              MenuR1.Caption := strl.Strings[i];
            end
          else if y = 2 then
            begin
              MenuR2.Caption := '';
              MenuR2.Caption := strl.Strings[i];
            end
          else if y = 3 then
            begin
              MenuR3.Caption := '';
              MenuR3.Caption := strl.Strings[i];
            end
          else if y = 4 then
            begin
              MenuR4.Caption := '';
              MenuR4.Caption := strl.Strings[i];
            end;      y:= y+1;      //showmessage('add to menu '+strl.Strings[i]);
        end ;
        //释放TstringList
        strl.Free;end;但是这段代码运作时候出现了两个问题:
    1、FindClose(sr); 无法编译,提示错误: [Error] FrameCapture.pas(554): Incompatible types: 'Cardinal' and 'TSearchRec'
       google 不到原因,请教一下大家
    2、将文件名插入menuR1.caption 时候,原始文件名为 abcd.gif ,但是插入menuR1.caption以后,菜单显示文字 ”abcd.gif(2)“,自动增加了一个 (2)在后面,是什么原因呢?   请教一下大家
      

  6.   

    1、FindClose(sr); 无法编译,提示错误: [Error] FrameCapture.pas(554): Incompatible types: 'Cardinal' and 'TSearchRec'编译错误已经排除,在 uses 语句中,将windows 提前到 sysutils 之前即可。就是变成这样就没有问题了uses
      Windows,SysUtils, Messages, Classes, Graphics, Controls, Forms, Dialogs,
      Buttons, ExtCtrls, StdCtrls, ComCtrls, Menus,Jpeg,StrUtils,Clipbrd, Printers,GIFImage;2、问题请大家帮忙,现在还google 不出原因。我只好在打开时候,把文件名后面的 (2)等截掉,但是怪难看滴,请大家帮忙解答一下
      

  7.   

    呵呵,问题2 已经解决,谢谢大家的帮忙直接将menu的autohotkeys 设置成manual即可谢谢大家的热心帮助