熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

實現應用程序的文件拖放功能

2013-11-23 17:29:57  來源: Delphi編程 

  在Delphi中有許多控件支持拖放操作但僅限於 應用程序內部而不能實現從Windows環境裡向應用程序拖放文件本文將要介紹的就是如 何用Delphi編寫支持文件拖放的應用程序由於主要使用WindowsAPI函數因此也可供其 它語言使用者參考

  首先要說明的是下面的三個API函數為通用起見 函數說明使用C語言格式

  VOIDDragAcceptFiles(

  HWNDhWnd

  BOOLfAccept);

  DragAcceptFiles函數是用來為拖放文件作初始化 它的第一個參數hWnd指明目標窗體的句柄第二個參數fAccept是一個布爾型變量為True時 則hWnd所指向的窗體可以接受拖放的文件

  UINTDragQueryFile(

  HDROPhDrop

  UINTiFile

  LPTSTRlpszFile

  UINTcch)

  DragQueryFile函數用來查詢拖放文件的文件名其 本身的返回值是一個無符號整數參數hDrop是一個存放所拖放文件名稱的數據結構的句柄 也就是文件名緩沖區的句柄需要從Windows消息WM_DROPFILES中獲得iFile指明所要查詢 文件的序號它有兩種取值方式值為十六進制數FFFFFFFF時DragQueryFile的返回值為 所拖放文件的數目;值在到拖放文件總數之間時DragQueryFile函數將相應序號的文件 名放入參數lpszFile所指向的緩沖區內若此時lpszFile的值為NULL則DragQueryFile會返 回相應文件名的長度參數cch決定緩沖區的長度由於Windows支持長文件名它的值不能 設得太小

  VOIDDragFinish(HDROPhDrop);

  使用DragFinish函數告訴Windows拖放操作結束使 其釋放文件名緩沖區它的參數hDrop與DragQueryFiles函數中的一樣也由Windows消息WM_DROPFILES 的hDrop參數獲得

  下面將結合一個我編寫的例子來說明具體的編程 步驟本例中窗體上放置了一個Memo控件memo在Windows中選取數個文件拖至程序窗體 放下則memo中便會顯示所選文件的總數及每個文件的各自名稱程序代碼如下:

  unitUnit;

  interface

  uses

  WindowsMessagesSysUtilsClasses

  GraphicsControlsFormsDialogs

  StdCtrls;

  type

  TForm=class(TForm)

  Memo:TMemo;

  procedureFormCreate(Sender:TObject);

  procedureLabelClick(Sender:TObject);

  procedureLabelClick(Sender:TObject);

  private

  PROCEDUREFinishDropped(Varmsg:TMessage);

  MessageWM_DropFiles;

  {Privatedeclarations}

  public

  {Publicdeclarations}

  end;

  var

  Form:TForm;

  implementation

  usesshellapi;

  {$R*DFM}

  pro   ureTFormFormCreate(Sender:TObject);

  begin

  //initializethedragprocess;

  DragAcceptFiles(HandleTrue);

  end;

  ProcedureTFormFinishDropped(Varmsg:TMessage);

  Var

  hDrop:THandle;

  iFile:Uint;

  lpszFile:pchar;

  CountOfFiles:integer;

  FileIndex:integer;

  ReSults:string;

  begin

  hDrop:=MsgWParam;

  getmem(pchar);

  iFile:=$FFFFFFFF;

  CountOfFiles:=DragQueryFile(hDropiFilelpszFile);

  ReSults:=;

  forFileIndex:=CountOfFilesdo

  begin

  iFile:=FileIndex;

  DragQueryFile(hDropiFilelpszFile);

  //GettheFilenamesbyorder;

  ReSults:=ReSults+##+lpszFile;

  end;

  Dispose(lpszFile);

  memoClear;

  memolinesadd(拖放了+IntToStr

  (CountOfFiles)+個文件:+ReSults);

  DragFinish(hDrop);

  end;

  end

  從以上代碼可以看出首先應該在窗體的OnCreate事 件中用DragAccepteFiles來說明程序窗體支持文件的拖放

  另外除了調用以上個API函數在Delphi中還應 編寫針對WM_DROPFILES的消息處理過程FinishDropped截取了WM_DROPFILES由其wParam 才能夠得到文件名緩沖區的句柄

  在FinishDropped過程裡有兩處DragQueryFile 函數第一處其iFile參數為$FFFFFFFF得到拖放文件的總數;第二處iFile參數為每個文 件的序號則可在lpszFile中可得到相應的文件名當然為了明顯的對比iFile的值對DragQueryFile 函數的影響這裡的代碼不夠簡練有一點需要注意的是lpszFile是Pchar型的變量為了 程序運行安全它使用前需用getmem過程為其分配內存使用後再用dispose過程將其釋放 在FinishDropped過程的最後用DragFinish函數釋放文件名緩沖區

  以上范例代碼在Delphi中通過


From:http://tw.wingwit.com/Article/program/Delphi/201311/24695.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.