国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

自制支持文件拖放的VCL組件

2019-11-18 18:54:43
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
   用過(guò)Winamp的朋友都知道,Winamp的界面能支持文件拖放,當(dāng)你想欣賞某MP3文件時(shí),只需要
將文件拖到Winamp的窗口上,然后放開(kāi)鼠標(biāo)就行了。那我們?nèi)绾巫屪约旱某绦蛞矊?shí)現(xiàn)這樣的功能
呢?我們可以通過(guò)改進(jìn)開(kāi)發(fā)工具提供的標(biāo)準(zhǔn)組件來(lái)實(shí)現(xiàn)。下面以Delphi環(huán)境中的ListBox組件為
例,讓ListBox支持文件拖放。
    首先介紹一下要用到的API函數(shù):
    DragAcceptFiles() 初始化某窗口使其允許/禁止接受文件拖放
    DragQueryFile() 查詢(xún)拖放的文件名
    DragFinish() 釋放拖放文件時(shí)使用的資源
    實(shí)現(xiàn)的基本原理如下:首先調(diào)用DragAcceptFiles()函數(shù)初始化組件窗口,使其允許接受文件
拖放,然后等待WM_DropFiles消息(一旦用戶(hù)進(jìn)行了拖放文件操作,組件窗口即可獲得此消息),
獲得消息后即可使用DragQueryFile()函數(shù)查詢(xún)被拖放的文件名,最后調(diào)用DragFinish()釋放資
源。
    
    因?yàn)樵赩CL類(lèi)庫(kù)中,ListBox組件,所屬類(lèi)名為:TListBox,所以我們可以從TListBox繼承建立
自己的組件。新組件名為:TDropFileListBox,它比標(biāo)準(zhǔn)TListBox增加了一個(gè)OnDropFiles事件和
一個(gè)DropEnabled屬性。當(dāng)DropEnabled為T(mén)rue時(shí)即可接受文件拖放,文件拖放完成后激發(fā)
OnDropFiles事件,該事件提供一個(gè)FileNames參數(shù)讓用戶(hù)獲得文件名。

    組件的代碼如下:

{       TDropFileListBox V1.00 Component                }
{       Copyright (c) 2000.5 by Shen Min, Sunisoft      }
{       Email: sunisoft@21cn.com                        }
{       Web: http://www.sunistudio.com                  }
unit DropFileListBox;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ShellApi; //增加ShellApi單元,因?yàn)樗褂玫娜齻€(gè)API函數(shù)聲明于此單元文件中
type
  TMyNotifyEvent = PRocedure (Sender: TObject;FileNames:TStringList) of object; //自定
義事件類(lèi)型。
  TDropFileListBox = class(TListBox) //新的類(lèi)從TListBox繼承
  private
    { Private declarations }
    FEnabled:Boolean; //屬性DropEnabled的內(nèi)部變量
  protected
    FDropFile:TMyNotifyEvent; //事件指針
    procedure DropFiles(var Mes:TMessage);message WM_DROPFILES;
    procedure FDropEnabled(Enabled:Boolean); //設(shè)置DropEnabled屬性的過(guò)程
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent);override;
    destructor Destroy;override;
    { Public declarations }
  published
    property OnDropFiles:TMyNotifyEvent read FDropFile write FDropFile;
    property DropEnabled:Boolean read FEnabled write FDropEnabled;
    { Published declarations }
  end;
procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Sunisoft', [TDropFileListBox]); //注冊(cè)組件到組件板上
end;

constructor TDropFileListBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnabled:=true; //類(lèi)被構(gòu)造時(shí),使DropEnabeld的默認(rèn)值為T(mén)rue
end;

destructor TDropFileListBox.Destroy;
begin
  inherited Destroy;
end;

//改變屬性DropEnabled的調(diào)用過(guò)程
procedure TDropFileListBox.FDropEnabled(Enabled:Boolean);
begin
  FEnabled:=Enabled;
  DragAcceptFiles(Self.Handle,Enabled);//設(shè)置組件窗口是否接受文件拖放
end;

//接受WM_DropFiles消息的過(guò)程
procedure TDropFileListBox.DropFiles(var Mes:TMessage);
var FN:TStringList;
    FileName:array [1..256] of char;
    sFN:String;
    i,Count,p:integer;
begin
  FN:=TStringList.Create;
  Count:=DragQueryFile(Mes.WParam,$FFFFFFFF,@FileName,256);//得到拖放文件的個(gè)數(shù)
  For i:=0 to Count-1 do
    begin
      DragQueryFile(mes.WParam,i,@FileName,256);//查詢(xún)文件名稱(chēng)
      sFN:=FileName;
      p:=pos(chr(0),sFN);//去掉文件名末尾的ASCII碼為0的字符
      sFN:=copy(sFN,1,p-1);
      FN.Add(sFN);
    end;
  DragFinish(mes.WParam); //釋放所使用的資源
  if Assigned(FDropFile) then
    FDropFile(self, FN); //調(diào)用事件,并返回文件名列表參數(shù)
  FN.Free;
end;

end.

    該組件安裝后即可使用,我們可以新建一個(gè)工程,將該組件放置在Form上,然后在
TDropFileListBox組件的OnDropFiles事件中寫(xiě)下具體處理拖放操作的代碼。

    例如將所有拖放的文件名加入該列表中,添加代碼如下:

procedure TForm1.DropFileListBox1DropFiles(Sender: TObject;FileNames: TStringList);
begin
  DropFileListBox1.Items.AddStrings(FileNames);
end;

    運(yùn)行一下看看,是不是很有趣?本文僅僅對(duì)于ListBox組件做了擴(kuò)展,你也可以對(duì)其它組件做
類(lèi)似的擴(kuò)展,實(shí)現(xiàn)支持文件的拖放。

上一篇:B/S和三層應(yīng)用--新一代的分布式網(wǎng)絡(luò)計(jì)算解決方案。(―)未完

下一篇:改造HINT的輸出方式

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門(mén)圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 双鸭山市| 双牌县| 阿克苏市| 咸阳市| 津南区| 禹城市| 赤水市| 禄丰县| 福建省| 长寿区| 罗甸县| 吕梁市| 泰宁县| 杭锦旗| 綦江县| 明光市| 大田县| 镇康县| 鄱阳县| 额尔古纳市| 铁岭市| 开远市| 石柱| 西安市| 淮安市| 巍山| 胶南市| 碌曲县| 宁阳县| 广西| 和林格尔县| 西昌市| 囊谦县| 裕民县| 娱乐| 仪陇县| 化隆| 龙山县| 惠东县| 达日县| 双牌县|