CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  Windows SDK/API

如何拖放文件到Memo中,得到文件路径

楼主ufo20020427(自由自在~)2006-02-08 16:47:02 在 Delphi / Windows SDK/API 提问

以下的代码是拖到窗口form中,我想改为拖到memo中,可是  
  procedure   Tform1.DropFiles(var   Message:TMessage);  
  改为   procedure   Tmemo1.DropFiles(var   Message:TMessage);   并不能实现  
  请问如何修改。我delphi不是很熟,希望能给出本题的答案,而不是一大段代码。谢谢!  
  我没多少分了。见谅!  
   
   
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   ShellApi,   StdCtrls;  
   
  type  
      TForm1   =   class(TForm)  
          procedure   FormCreate(Sender:   TObject);  
      private    
          {   Private   declarations   }  
      public  
  procedure   DropFiles(var   Message:TMessage);message   WM_DropFiles;  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}              
   
  procedure   Tform1.DropFiles(var   Message:TMessage);  
  var  
  bufsize,num:Cardinal;    
  FilePath:array   of   Char;  
  begin  
  num:=DragQueryFile(Message.wParam,$FFFFFFFF,nil,0);   //取得文件个数  
    for   num:=0   to   num-1     do     begin  
            bufsize:=DragQueryFile(Message.wParam,num,nil,0);  
            setlength(FilePath,bufsize+1);  
            DragQueryFile(Message.wParam,num,pchar(FilePath),bufsize+1);  
            showmessage(pchar(FilePath));       //显示拖入来的文件完整路径  
    end;  
    dragfinish(Message.wParam);  
  end;            
   
  procedure   Tform1.FormCreate(Sender:   TObject);  
  begin  
  DragAcceptFiles(Handle,True);    
  end;  
   
  end.  
   
   
  问题点数:40、回复次数:5Top

1 楼weizi2000(秋风啊)回复于 2006-02-08 17:10:39 得分 0

showmessage(pchar(FilePath));       //显示拖入来的文件完整路径  
  ->  
  Memo1.Lines.Append(StrPas(FilePath));   不行吗?Top

2 楼huanggj(新人)回复于 2006-02-09 18:02:27 得分 0

学习Top

3 楼xzhifei(饭桶超人(最讨厌两种人,一种是有种族歧视的人,一种是日本人!))回复于 2006-02-09 18:10:15 得分 40

刚刚帮人解决了这种问题,现在稍稍改一下  
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls,   activeX,   shellapi,   shlobj;  
  type  
      TForm1   =   class(TForm)  
          Edit1:   TEdit;  
          procedure   FormCreate(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
          procedure   AppMessage(var   Msg:   TMsg;   var   Handled:   Boolean);  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
  type  
      LINK_FILE_INFO   =   record   ///快捷方式文件信息数据结构  
          FileName:   array[0..MAX_PATH]   of   char;   ///目标文件名  
          WorkDirectory:   array[0..MAX_PATH]   of   char;   ///工作目录  
          IconLocation:   array[0..MAX_PATH]   of   char;   ///图标文件  
          IconIndex:   integer;   ///图标索引  
          Arguments:   array[0..MAX_PATH]   of   char;   ///运行参数  
          Description:   array[0..255]   of   char;   ///文件描述  
          ItemIDList:   PItemIDList;   ///系统IDList,未使用  
          RelativePath:   array[0..255]   of   char;   ///相对路径  
          ShowState:   integer;   ///运行时的现实状态  
          HotKey:   word;   ///热键  
      end;  
   
  function   linkfileinfo(const   lnkfilename:   string;   var   info:   link_file_info;   const   bset:   boolean):   boolean;  
  var  
      hr:   hresult;  
      psl:   ishelllink;  
      wfd:   win32_find_data;  
      ppf:   ipersistfile;  
      lpw:   pwidechar;  
      buf:   pwidechar;  
  begin  
      result   :=   false;  
      getmem(buf,   max_path);  
      try  
          if   succeeded(coinitialize(nil))   then  
              if   (succeeded(cocreateinstance(clsid_shelllink,   nil,   clsctx_inproc_server,   iid_ishelllinka,   psl)))   then  
              begin  
                  hr   :=   psl.queryinterface(ipersistfile,   ppf);  
                  if   succeeded(hr)   then  
                  begin  
                      lpw   :=   stringtowidechar(lnkfilename,   buf,   max_path);  
                      hr   :=   ppf.load(lpw,   stgm_read);  
                      if   succeeded(hr)   then  
                      begin  
                          hr   :=   psl.resolve(0,   slr_no_ui);  
                          if   succeeded(hr)   then  
                          begin  
                              if   bset   then  
                              begin  
                                  psl.setarguments(info.arguments);  
                                  psl.setdescription(info.description);  
                                  psl.sethotkey(info.hotkey);  
                                  psl.seticonlocation(info.iconlocation,   info.iconindex);  
                                  psl.setidlist(info.itemidlist);  
                                  psl.setpath(info.filename);  
                                  psl.setshowcmd(info.showstate);  
                                  psl.setrelativepath(info.relativepath,   0);  
                                  psl.setworkingdirectory(info.workdirectory);  
                                  result   :=   succeeded(psl.resolve(0,   slr_update));  
                              end  
                              else  
                              begin  
                                  psl.getpath(info.filename,   max_path,   wfd,   slgp_shortpath);  
                                  psl.geticonlocation(info.iconlocation,   max_path,   info.iconindex);  
                                  psl.getworkingdirectory(info.workdirectory,   max_path);  
                                  psl.getdescription(info.description,   255);  
                                  psl.getarguments(info.arguments,   max_path);  
                                  psl.gethotkey(info.hotkey);  
                                  psl.getidlist(info.itemidlist);  
                                  psl.getshowcmd(info.showstate);  
                                  result   :=   true;  
                              end;  
                          end;  
                      end;  
                  end;  
              end;  
      finally  
          freemem(buf);  
      end;  
  end;  
   
  function   GetLinkFile_ExeName(LinkFile:   string):   string;  
  var  
      info:   link_file_info;  
  begin  
      Result   :=   '';  
      if   linkfileinfo(LinkFile,   info,   False)   then  
      begin  
          Result   :=   info.FileName;  
      end;  
  end;  
   
  procedure   TForm1.AppMessage(var   Msg:   TMsg;   var   Handled:   Boolean);  
  var  
      nFiles,   I:   Integer;  
      Filename:   string;  
  begin  
  //  
  //   注意!所有消息都将通过这里!  
  //   不要在此过程中编写过多的或者需要长时间操作的代码,否则将影响程序的性能  
  //  
  //   判断是否是发送到ListView1的WM_DROPFILES消息  
      if   (Msg.message   =   WM_DROPFILES)   and   (msg.hwnd   =   Memo1.Handle)   then  
      begin  
  //   取dropped   files的数量  
          nFiles   :=   DragQueryFile(Msg.wParam,   $FFFFFFFF,   nil,   0);  
  //   循环取每个拖下文件的全文件名  
          try  
              for   I   :=   0   to   nFiles   -   1   do  
              begin  
  //   为文件名分配缓冲   allocate   memory  
                  SetLength(Filename,   80);  
  //   取文件名   read   the   file   name  
                  DragQueryFile(Msg.wParam,   I,   PChar(Filename),   80);  
                  Filename   :=   PChar(Filename);  
  //file://将全文件名分解程文件名和路径  
                  if   UpperCase(ExtractFileExt(FileName))   =   '.LNK'   then  
                      Memo1.Line.Add(   GetLinkFile_ExeName(FileName))  
                  else  
                      Memo1.Line.Add(FileName);  
   
              end;  
          finally  
  //file://结束这次拖放操作  
              DragFinish(Msg.wParam);  
          end;  
  //file://标识已处理了这条消息  
          Handled   :=   True;  
      end;  
   
   
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
  //file://设置需要处理文件WM_DROPFILES拖放消息  
      DragAcceptFiles(Memo1.Handle,   TRUE);  
  //file://设置AppMessage过程来捕获所有消息  
      Application.OnMessage   :=   AppMessage;  
   
  end;  
   
  end.  
   
  Top

4 楼summersky204608()回复于 2006-02-10 09:35:32 得分 0

学习!留个爪印!Top

5 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2006-02-10 10:17:00 得分 0

文件拖放,用控件就最简单的  
  例如DropMasterTop

相关问题

  • 拖放文件获取文件名称和文件路径?请教高手?
  • 如何编写一个支持拖放操作的ListBox,就是把文件拖放入ListBox时,ListBox显示这些文件的全路径+文件名
  • 请问Delphi中某具体控件如何得到外部拖放的文件路径
  • 文件路径名
  • 文件的拖放问题?急!!!
  • 文件拖放问题(50分)
  • 文件的拖放打开问题
  • dll文件的路径
  • 文件路径一问
  • 文件路径的问题

关键词

  • 文件
  • 文件名
  • 代码
  • 消息
  • dropfiles
  • 拖放
  • 路径
  • dragqueryfile
  • memo
  • tform

得分解答快速导航

  • 帖主:ufo20020427
  • xzhifei

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo