如何使listbox只显示文件名(不含路径)而单击时又能取得相应文件的路径?

C:\windows\1345.jpg
在listbox中显示为
1345.jpg
而在上面单击时却能取得包含路径的全文件名C:\windows\1345.jpg并且要求可以在listbox中进行各种操作如删除、添加、移动等。

解决方案 »

  1.   


    TListBox.Items.AddObject
    方法,可以让字符串关联一个对象,而这个对象里面随便你放什么
      

  2.   

    在设置一个Tstringlist与之对应,记住要以数字为序,不要以文件名为序,考虑到可能重名
      

  3.   

    得到文件名:ExtractFileName(C:\windows\1345.jpg);
      

  4.   

    程序实现如下:
    ListBox1.Items里的内容要为全路径,如C:\windows\1345.jpg;
    设置属性 ListBox1.Style := lbOwnerDrawFixed;
    然后在ListBox1的OnDrawItem事件里写如下代码:
    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    var
      c: TCanvas;
    begin
        c := TCanvas.Create;
        c.Handle := GetDC(Control.Handle);
      if odSelected in State then begin
        c.Brush.Color := clActiveCaption;
        c.Font.Color := clWhite;
        c.FillRect(rect);
        c.TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index])
      end
      else begin
        c.FillRect(rect);
        c.TextOut(Rect.Left, Rect.Top, ExtractFileName(ListBox1.Items[Index]));
      end;
      c.Free;
    end;
      

  5.   

    sysu(死树) 
    呵呵,老大又是你啊,你的方法我还没试过可是总觉得有点复杂。
     ysai(赛赛) 
    你的办法好像不错,能给出具体点的实现吗
      

  6.   

    再放一个stringlist 对像,对应上一个存文件名,一个存路径,选中文件名的时候,取出它的序列号,对应的另一个stringlist就可以以这个序列号取出路径。
      

  7.   

    楼上几位说的都有道理,sysu(死树) 和ysai(赛赛)的方法比较可行
      

  8.   

    吃饭去了~~~~~刚回来,最灵活的方法来也
    随手写的,保不定有BUG哦
    定义对象:
    Type
      TFileInfo=class(TObject)
        FileName:String;
        FilePathName:String;
        FileSize:Integer;
      end;
    保存数据:
    var
      fi:TFileInfo;
    begin
      fi:=TFileInfo.Create;
      fi.FilePathName :=  'C:\A.TXT';
      fi.FileName     :=  'A.TXT';
      fi.FileSize     :=  10;
      lw.Items.AddObject(fi.FileName,fi);
    end;
    取出数据:
    ShowMessage(TFileInfo(lw.Items.Objects[lw.ItemIndex]).FilePathName);
      

  9.   

    To sysu(死树)  
    我看到画画就头昏
    To ysai(赛赛 )
    你的方法比较直观,看得懂,决定试试,等下再结帐
      

  10.   

    to  zouwenyan(珠穆) 
    你的方法是我最初所想的,但发觉不实用,因为要同时操作两个tstrings太麻烦了
      

  11.   

    sysu(死树)  :
    你的办法不行啊,添加文件时出错!!代码如下:
    procedure TfrmMain.ListBoxDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    var
      MyCanvas:TCanvas;
    begin//自已画出列表中的项目
      MyCanvas.Create;
      MyCanvas.Handle:=GetDC(Control.Handle );
      MyCanvas.FillRect(Rect);
      MyCanvas.TextOut(Rect.Left,Rect.Top ,ExtractFileName(Listbox.Items[Index]));
      MyCanvas.Free;
    end;是哪里错了???
      

  12.   

    1.用TSTRINGLIST记住你的路径。只显示名称
    2。在LISTBOX中DRAW一次
    两者都可
      

  13.   

    感谢 sysu(死树)  及 ysai(赛赛 ),问题已经解决了,虽然用的方法和两位有点出入,但还是多谢指点!
    老规矩,挂一夜,明天结帐