首先看我代码是不是有地方错了,再看我的思路是不是对了.最后望大家帮我测试一下代码.感激
function TForm2.GetPDFFile():string;
var
  saDlg:TSaveDialog;
  pfile,Ext:string;
begin
  saDlg:=TSaveDialg.Create(self);
  saDlg.filter:='(*.pdf)|*.pdf';
  if saDlg.Execture then
     pfile:=saDlg.FileName;
  
  Ext:=ExtractFileExt(pfile);
  
  if Ext='' then
     pfile:=pfile+'.pdf'
  else
     if Ext<>'.pdf' then
      begin
         showmessage('请输入正确的扩展名'); 
         abort;
      end;
  
  result:=pfile;
  saDlg.Free;
end;//调用
procedure TForm2.Button1Click(Sender:Object);
var
  str:string;
  falg:boolean;
begin
   str:=GetPDFFile;
   //这里是要害啊,帮忙啊
   falg:=copyFile(pchar('a.pdf'),pchar(str),true);
   {上面这一句要想得到TRUE,哪么这个STR的值必须不是通过TSAVEDIALOG得到的才行,如果是通过DIALGE得到的文件路径哪么这个COPYFILE返回的就是FALSE,不解啊,不解啊...}
   showmessage(booltostr(falg));
end;
声明:TSaveDialg对象申明为全局和局部对象都试过了.

解决方案 »

  1.   

    SaveDialog改变了你的当前路径,所以就找不到你的'a.pdf'了,最好采用绝对路径.
      

  2.   

    你看错了,我的a.pdf是想要COPY的文件,STR是要COPY后存放的文件.
      

  3.   

    建议你好好看看Windows SDK关于copyfile的定义
    BOOL CopyFile(    LPCTSTR lpExistingFileName, // pointer to name of an existing file 
        LPCTSTR lpNewFileName, // pointer to filename to copy to 
        BOOL bFailIfExists  // flag for operation if file exists 
       );第一个参数是源文件,第二个参数是目标文件,第三个参数如果指定为true,那么如果目标文件存在,则返回失败,如果指定为false,那么如果目标文件存在,则覆盖目标文件
    改成这样就行了嘛,要多加强英文呀!
    procedure TForm1.Button1Click(Sender: TObject);
    var
      str:string;
      falg:boolean;
    begin
       str:=GetPDFFile;
       falg:=copyFile(pchar(str),pchar('a.pdf'),true);
       showmessage(booltostr(falg));
      

  4.   

    刚才没看你的回答,原来a.pdf是原文件呀,那把falg:=copyFile(pchar('a.pdf'),pchar(str),true); 改为
    falg:=copyFile(pchar('a.pdf'),pchar(str),false);就可以了 
      

  5.   

    falg:=copyFile(pchar(路径+'a.pdf'),pchar(str),false); //第三个参数,表是目录文件存在,是否继续Copy
      

  6.   

    3,4,5,6楼的兄弟,我忘了说了,第三个我设为TRUE就是想复制到的地方不让他复盖了同名的文件,但我现在测试的是COPY到一个空的文件夹下,也就是说不可能存在复盖失败返回FALSE的问题,还有,通过DIALGO得到的是全绝对路径,而6样的说我的a.pdf要加上路径可能好点,这里可以答复你,我的a.pdf是在EXE同目录下,当然我也改成绝对路径试过,一样不行.
      

  7.   

    CopyFile调用失败之后,有没想过GetLastError来判断一下具体是为什么失败?
      

  8.   


    function TForm2.GetPDFFile(var: FileName:string):boolean; 
    var 
      saDlg:TSaveDialog; 
      pfile,Ext:string; 
    begin 
      Result := False;
      saDlg:=TSaveDialg.Create(self); 
      try
        saDlg.filter:='(*.pdf) ¦*.pdf';     if Not saDlg.Execture then Exit;
          pfile:=saDlg.FileName; 
       
        Ext:=ExtractFileExt(pfile); 
       
        if Ext='' then 
           pfile:=pfile+'.pdf' 
        else if Ext <>'.pdf' then 
          begin 
             showmessage('请输入正确的扩展名');  
             Exit; 
          end; 
        FileName := pFile;
        result:=True;
      finally 
        saDlg.Free; 
      end;
    end; //调用 
    procedure TForm2.Button1Click(Sender:Object); 
    var 
      str:string; 
      falg:boolean; 
    begin 
       if Not GetPDFFile(str) then Exit; 
       //这里是要害啊,帮忙啊 
       falg:=copyFile(pchar(ExtractFilePath(Application.ExeName)+'\a.pdf'),pchar(str),true); 
       {上面这一句要想得到TRUE,哪么这个STR的值必须不是通过TSAVEDIALOG得到的才行,如果是通过DIALGE得到的文件路径哪么这个COPYFILE返回的就是FALSE,不解啊,不解啊...} 
       showmessage(booltostr(falg)); 
       if Not falg then MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'复制文件出错',MB_OK or MB_ICONERROR);
    end;