一个exe文件,他在c:/swdt/目录下,在软件中有一个listbox,listbox中有一系列的文件列表比如:
d:/bg/2008.jpg
e:/dvd/i.avi
c:/pro/music/aimo.mp3
双击listbox中这3行中的任意一行,listbox.Items.Strings[integer(listbox.ItemIndex)]取得当前行中的字符创,使用FileExists(listbox.Items.Strings[integer(listbox.ItemIndex)])判断该文件是否存在(这里列表的3个文件都存在),出现如下问题:
双击listbox中第一行判断文件是否存在返回 True,从第二行开始均返回false,原因是从第二行开始判断的路径发生了变化,这里第二行为e:/dvd/i.avi,在使用FileExists(listbox.Items.Strings[integer(listbox.ItemIndex)])判断的时候,他获取的是d:/bg/e:/dvd/i.avi这样一个路径,请问如何改变这种情况,怎么路径自己改变了呢?使用setCurrentDir设置当前工作目录也不行,盼望赐教,不慎感谢!

解决方案 »

  1.   

    如果listbox.Items里有三行:
    d:/bg/2008.jpg 
    e:/dvd/i.avi 
    c:/pro/music/aimo.mp3那么, listbox.Items.Strings[listbox.ItemIndex])是不会返回'd:/bg/e:/dvd/i.avi'这样一个字符串的, 检查其他代码吧。
      

  2.   

    listbox.Items.Strings[listbox.ItemIndex])获取的确实是e:/dvd/i.avi,但是使用FileExists(listbox.Items.Strings[listbox.ItemIndex]))这样判读返回false,提示路径'd:/bg/e:/dvd/i.avi'不对!
      

  3.   

    FileExists函数是不会有提示的。要有提示是你自己的代码在提示的,问题就出在你自己的代码上了。
      

  4.   

    FileExists确实没有提示,我用FileExists判断是否存在,然后使用image控件打开图片文件,比如有如下3行:
    e:/dvd/i.avi 
    d:/bg/2008.jpg   
    c:/pro/music/aimo.mp3
    这样双击第二行的时候使用image控件打开的时候会提示e:/dvd/d:/bg/2008.jpg目录、卷标语法错误 
      

  5.   

    如果给image控件loadFromFile传递一个字符串,比如c:/bg/123.jpg,有时候loadfromfile为该字符串当成当前路径下的一个目录,如果程序在d:/下,这样loadfromfile就会从d:/c:/bg/123/jpg,这个问题如何解决呢?
      

  6.   

    在Listbox的双击事件中跟踪一下获取的字符串
    应该是你的代码写错了。如FileName初始化等问题
      

  7.   

    filename是另外一个窗口的变量
    在listbox窗口中:
    procedure TdackFrm.ListBoxDblClick(Sender: TObject);
    var dir:string;
    begin
     yxFrm.filename:=listBox.Items.Strings[integer(listbox.ItemIndex)];
     yxFrm.Show;
    end;
    yxFrm中image加载代码:
    procedure TyxFrm.FormShow(Sender: TObject);
    begin
     image1.Visible:=true;
     yxfrm.Width:=582;
     yxfrm.Height:=496;
     showmessage(filename);//这里正确显示filename
     image1.Picture.LoadFromFile(filename);//加载的时候filename就变成从当前目录下了
    end;
      

  8.   

    yxfrm.pas:
    private 
    procedure SetImage(value:string);
    property Image:string write SetImage;procedure SetImage(value:string);
    begin
      if FileExists(value) then
        Image1.Picture.LoadFromFile(value);
    end;
    --调用
    yxfrm.Image:=listBox.Items.Strings[listbox.ItemIndex];
    yxfrm.show;
      

  9.   

    yxfrm.pas:
    private 
    procedure SetImage(value:string);
    public
    property Image:string write SetImage;procedure SetImage(value:string);
    begin
      if FileExists(value) then
        Image1.Picture.LoadFromFile(value);
    end;
    --调用
    yxfrm.Image:=listBox.Items.Strings[listbox.ItemIndex];
    yxfrm.show;
      

  10.   

    谢谢月亮的回答!
    我想在yxFrm显示的时候加载图片,不能:
    procedure TyxFrm.FormShow(Sender: TObject);
    begin
    yxFrm.SetImage(image);
    end;
    提示[Error] yxplay.pas(40): Cannot read a write-only property
    请问月亮,如何在窗口打开的时候加载图片呢?
      

  11.   

    你不需要在show里面再写代码了
      

  12.   

      private
        { Private declarations }
        procedure SetImage(value:string);  public
        { Public declarations }
        filename:string;
        property Image:string write SetImage;
      end;var
      yxFrm: TyxFrm;implementation{$R *.dfm}
    procedure TyxFrm.SetImage(value:string);
    begin
      if FileExists(value) then
        Image1.Picture.LoadFromFile(value);
    end;
    procedure TyxFrm.FormShow(Sender: TObject);
    begin
    //怎么在窗口显示的时候image加载图片呢
    end;
      

  13.   

    procedure TyxFrm.SetImage(value:string);
    begin
      if FileExists(value) then
        Image1.Picture.LoadFromFile(value);
    end;
    这部分代码在你对属性赋值得时候Image1已经加载图片了
      

  14.   

    按照月亮说的做了,结果还是一样,只有listbox中的第一行能加载,其他的还是路径不对!如果你给FileExists这个判断去掉就会提示路径不对,路径还是当前工作目录(如果打开了第一行的就是第一张图片目录)+listbox中的行字符串
      

  15.   

      private
        { Private declarations }
        procedure SetImage(value:string);  public
        { Public declarations }
        filename:string;
        property Image:string write SetImage;
      end;var
      yxFrm: TyxFrm;implementation{$R *.dfm}
    procedure TyxFrm.SetImage(value:string);
    begin
      showmessage(value);//这里弹出的路径都是正确的
      //if FileExists(value) then
        Image1.Picture.LoadFromFile(value)//加载的时候就变了// else
     // Application.MessageBox('图片不存在!','提醒');
    end;
      

  16.   

    楼主,你就用
    form1.caption := ListBox1.Items.Strings[0];form1.caption := ListBox1.Items.Strings[1];form1.caption := ListBox1.Items.Strings[2];分别看看取出来的是什么?
      

  17.   

    还有,判断的时候,先把ListBox1.Items.Strings[ListBox1.ItemIndex]的值放到一个变量里,然后FileExists(str)
      

  18.   

    FileExists(str)ListBox1.Items.Strings[ListBox1.ItemIndex]值是对的,FileExists(str)也提示不存在
      

  19.   

    那就把str赋到一个edit控件里,然后将控件里的字符串copy一下,直接粘贴到资源管理器的地址栏里,回车看看有什么效果,也有可能是有中文的冒号或者其它符号,再查不出来就见鬼了!