韩剧1988免费观看全集_久久影视三级福利片_亚洲视频在线观看免费_在线观看欧美日韩_国产亚洲激情在线_亚洲精品美女久久久_欧美国产日韩一区二区在线观看_91在线观看免费高清完整版在线观看_日韩av免费看_国产又爽又黄的激情精品视频_琪琪亚洲精品午夜在线_欧美性猛xxx_不卡毛片在线看_国产亚洲日本欧美韩国_91国内在线视频_精品国产福利视频

當(dāng)前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開(kāi)發(fā)教程 > 詳細(xì)頁(yè)面

用Delphi完成Windows文件夾管理樹(shù)

用Delphi完成Windows文件夾管理樹(shù)

更新時(shí)間:2022-10-09 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

摘要:本文利用Windows名空間所提供的IShellFolder接口,用Delphi實(shí)現(xiàn)了文件夾管理樹(shù)的生成。

關(guān)鍵字:文件夾 接口 Delphi


一、概述

Windows95/98視覺(jué)感觀上區(qū)別Windows3.1的一個(gè)重要方面就是大量采用了樹(shù)形視圖控件,資源管理器左側(cè)的文件夾管理樹(shù)便是如此,它將本地和網(wǎng)絡(luò)上的文件夾和文件等資源以層次樹(shù)的方式羅列出來(lái),為用戶(hù)集中管理計(jì)算機(jī)提供了極大便利,同時(shí)在外貌上也煥然一新。Delphi為我們提供了大量Windows標(biāo)準(zhǔn)控件,但遺憾的是在目錄瀏覽方面卻只提供了一個(gè)Windows3.1樣式的DirectoryListBox(Delphi5的測(cè)試版也是如此),因此,在Delphi中實(shí)現(xiàn)Windows文件夾管理樹(shù)對(duì)開(kāi)發(fā)更“地道”的Windows程序有著重大意義。

二、實(shí)現(xiàn)原理

Windows文件夾管理樹(shù)的實(shí)現(xiàn)實(shí)質(zhì)上是對(duì)Windows名空間(Namespace)的遍歷。名空間中每個(gè)文件夾都提供了一個(gè)IShellFolder接口,遍歷名空間的方法是:

1)調(diào)用SHGetDesktopFolder函數(shù)獲得桌面文件夾的IShellFolder接口,桌面文件夾是文件夾管理樹(shù)的根節(jié)點(diǎn)。

2)再調(diào)用所獲得的IShellFolder接口的EnumObjects成員函數(shù)列舉出子文件夾。

3)調(diào)用IShellFolder的BindToObject成員函數(shù)獲得子文件夾的IShellFolder接口。 4)重復(fù)步驟2)、3)列舉出某文件夾下的所有子文件夾,只至所獲得的IShellFolder接口為nil為止。

下面解釋將要用到的幾個(gè)主要函數(shù),它們?cè)赟hlObj單元中定義:

1)function SHGetDesktopFolder(var ppshf: IShellFolder): HResult;

該函數(shù)通過(guò)ppshf獲得桌面文件夾的IShellFolder接口。

2)function IShellFolder.EnumObjects(hwndOwner: HWND; grfFlags: DWORD;

out EnumIDList: IEnumIDList): HResult;

該函數(shù)獲得一個(gè)IEnumIDList接口,通過(guò)調(diào)用該接口的Next等函數(shù)可以列舉出IShellFolder接口所對(duì)應(yīng)的文件夾的內(nèi)容,內(nèi)容的類(lèi)型由grfFlags來(lái)指定。我們需要列舉出子文件夾來(lái),因此grfFlags的值指定為SHCONTF_FOLDERS。HwndOwner是屬主窗口的句柄。

3)function IShellFolder.BindToObject(pidl: PItemIDList; pbcReserved: Pointer;

const riid: TIID; out ppvOut: Pointer): HResult;

該函數(shù)獲得某個(gè)子文件夾的IShellFolder接口,該接口由ppvOut返回。pidl是一個(gè)指向元素標(biāo)識(shí)符列表的指針,Windows95/98中用元素標(biāo)識(shí)符和元素標(biāo)識(shí)符列表來(lái)標(biāo)識(shí)名空間中的對(duì)象,它們分別類(lèi)似于文件名和路徑。需要特別指出的是:pidl作為參數(shù)傳遞給Shell API函數(shù)時(shí),必須是相對(duì)于桌面文件夾的絕對(duì)路徑,而傳遞給IShellFolder接口的成員函數(shù)時(shí),則應(yīng)是相對(duì)于該接口所對(duì)應(yīng)文件夾的相對(duì)路徑。pbcReserved應(yīng)指定為nil,riid則應(yīng)指定為IID_IShellFolder。

其它函數(shù)可以查閱Delphi提供的《Win32 Programmer's Reference》。

三、程序清單

下面的源代碼在Windows98中實(shí)現(xiàn),并在Windows2000測(cè)試版中測(cè)試無(wú)誤(程序運(yùn)行結(jié)果如圖1所示),有興趣的讀者可以將其改寫(xiě)成Delphi組件,以備常用。

unit BrowseTreeView;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ShlObj, ComCtrls;

type

PTreeViewItem = ^TTreeViewItem;

TTreeViewItem = record

ParentFolder: IShellFolder; // 接點(diǎn)對(duì)應(yīng)的文件夾的父文件夾的IShellFolder接口

Pidl, FullPidl: PItemIDList; // 接點(diǎn)對(duì)應(yīng)的文件夾的相對(duì)和絕對(duì)項(xiàng)目標(biāo)識(shí)符列表

HasExpanded: Boolean; // 接點(diǎn)是否展開(kāi)

end;

TForm1 = class(TForm)

TreeView1: TTreeView;

procedure FormDestroy(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode;

var AllowExpansion: Boolean);

private

FItemList: TList;

procedure SetTreeViewImageList;

procedure FillTreeView(Folder: IShellFolder; FullPIDL: PItemIDList; ParentNode: TTreeNode);

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

uses

ActiveX, ComObj, ShellAPI, CommCtrl;

// 以下是幾個(gè)對(duì)項(xiàng)目標(biāo)識(shí)符進(jìn)行操作的函數(shù)

procedure DisposePIDL(ID: PItemIDList);

var

Malloc: IMalloc;

begin

if ID = nil then Exit;

OLECheck(SHGetMalloc(Malloc));

Malloc.Free(ID);

end;

function CopyItemID(ID: PItemIDList): PItemIDList;

var

Malloc: IMalloc;

begin

Result := nil;

OLECheck(SHGetMalloc(Malloc));

if Assigned(ID) then

begin

Result := Malloc.Alloc(ID^.mkid.cb + sizeof(ID^.mkid.cb));

CopyMemory(Result, ID, ID^.mkid.cb + sizeof(ID^.mkid.cb));

end;

end;

function NextPIDL(ID: PItemIDList): PItemIDList;

begin

Result := ID;

Inc(PChar(Result), ID^.mkid.cb);

end;

function GetPIDLSize(ID: PItemIDList): Integer;

begin

Result := 0;

if Assigned(ID) then

begin

Result := sizeof(ID^.mkid.cb);

while ID^.mkid.cb <> 0 do

begin

Inc(Result, ID^.mkid.cb);

ID := NextPIDL(ID);

end;

end;

end;

function CreatePIDL(Size: Integer): PItemIDList;

var

Malloc: IMalloc;

HR: HResult;

begin

Result := nil;

HR := SHGetMalloc(Malloc);

if Failed(HR) then Exit;

try

Result := Malloc.Alloc(Size);

if Assigned(Result) then

FillChar(Result^, Size, 0);

finally

end;

end;

function ConcatPIDLs(ID1, ID2: PItemIDList): PItemIDList;

var

cb1, cb2: Integer;

begin

if Assigned(ID1) then

cb1 := GetPIDLSize(ID1) - sizeof(ID1^.mkid.cb)

else

cb1 := 0;

cb2 := GetPIDLSize(ID2);

Result := CreatePIDL(cb1 + cb2);

if Assigned(Result) then

begin

if Assigned(ID1) then

CopyMemory(Result, ID1, cb1);


CopyMemory(PChar(Result) + cb1, ID2, cb2);

end;

end;

// 將二進(jìn)制表示的項(xiàng)目標(biāo)識(shí)符列表轉(zhuǎn)換成有可識(shí)的項(xiàng)目名

function GetDisplayName(Folder: IShellFolder; PIDL: PItemIDList;

ForParsing: Boolean): String;

var

StrRet: TStrRet;

P: PChar;

Flags: Integer;

begin

Result := '';

if ForParsing then

Flags := SHGDN_FORPARSING

else

Flags := SHGDN_NORMAL;

Folder.GetDisplayNameOf(PIDL, Flags, StrRet);

case StrRet.uType of

STRRET_CSTR:

SetString(Result, StrRet.cStr, lStrLen(StrRet.cStr));

STRRET_OFFSET:

begin

P := @PIDL.mkid.abID[StrRet.uOffset - sizeof(PIDL.mkid.cb)];

SetString(Result, P, PIDL.mkid.cb - StrRet.uOffset);

end;

STRRET_WSTR:

Result := StrRet.pOleStr;

end;

end;

function GetIcon(PIDL: PItemIDList; Open: Boolean): Integer;

const

IconFlag = SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_SMALLICON;

var

FileInfo: TSHFileInfo;

Flags: Integer;

begin

if Open then

Flags := IconFlag or SHGFI_OPENICON

else

Flags := IconFlag;


SHGetFileInfo(PChar(PIDL), 0, FileInfo, sizeof(TSHFileInfo), Flags);

Result := FileInfo.iIcon;

end;

// 獲得每個(gè)文件夾在系統(tǒng)中的圖標(biāo)

procedure GetItemIcons(FullPIDL: PItemIDList; TreeNode: TTreeNode);

begin

with TreeNode do

begin

ImageIndex := GetIcon(FullPIDL, False);

SelectedIndex := GetIcon(FullPIDL, True);

end;

end;

// 獲得系統(tǒng)的圖標(biāo)列表

procedure TForm1.SetTreeViewImageList;

var

ImageList: THandle;

FileInfo: TSHFileInfo;

begin

ImageList := SHGetFileInfo(PChar('C:\'), 0, FileInfo,

sizeof(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);

if ImageList <> 0 then

TreeView_SetImageList(TreeView1.Handle, ImageList, 0);

end;

// 生成文件夾管理樹(shù)

procedure TForm1.FillTreeView(Folder: IShellFolder;

FullPIDL: PItemIDList; ParentNode: TTreeNode);

var

TreeViewItem: PTreeViewItem;

EnumIDList: IEnumIDList;

PIDLs, FullItemPIDL: PItemIDList;

NumID: LongWord;

ChildNode: TTreeNode;

Attr: Cardinal;

begin

try

OLECheck(Folder.EnumObjects(Handle, SHCONTF_FOLDERS, EnumIDList));

while EnumIDList.Next(1, PIDLs, NumID) = S_OK do

begin

FullItemPIDL := ConcatPIDLs(FullPIDL, PIDLs);

TreeViewItem := New(PTreeViewItem);

TreeViewItem.ParentFolder := Folder;

TreeViewItem.Pidl := CopyItemID(PIDLs);

TreeViewItem.FullPidl := FullItemPIDL;

TreeViewItem.HasExpanded := False;

FItemList.Add(TreeViewItem);

ChildNode := TreeView1.Items.AddChildObject(ParentNode,

GetDisplayName(Folder, PIDLs, False), TreeViewItem);

GetItemIcons(FullItemPIDL, ChildNode);

Attr := SFGAO_HASSUBFOLDER or SFGAO_FOLDER;

Folder.GetAttributesOf(1, PIDLs, Attr);

if Bool(Attr and (SFGAO_HASSUBFOLDER or SFGAO_FOLDER)) then

if Bool(Attr and SFGAO_FOLDER) then

if Bool(Attr and SFGAO_HASSUBFOLDER) then

ChildNode.HasChildren := True;

end;

except

// 你可在此處對(duì)異常進(jìn)行處理

end;

end;

procedure TForm1.FormDestroy(Sender: TObject);

var

I: Integer;

begin

try

for I := 0 to FItemList.Count-1 do

begin

DisposePIDL(PTreeViewItem(FItemList[i]).PIDL);

DisposePIDL(PTreeViewItem(FItemList[i]).FullPIDL);

end;

FItemList.Clear;

FItemList.Free;

except

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

var

Folder: IShellFolder;

begin

SetTreeViewImageList;

OLECheck(SHGetDesktopFolder(Folder));

FItemList := TList.Create;

FillTreeView(Folder, nil, nil);

end;

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;

var AllowExpansion: Boolean);

var

TVItem: PTreeViewItem;

SHFolder: IShellFolder;

begin

TVItem := PTreeViewItem(Node.Data);

if TVItem.HasExpanded then Exit;

OLECheck(TVItem.ParentFolder.BindToObject(TVItem^.Pidl,

nil, IID_IShellFolder, Pointer(SHFolder)));

FillTreeView(SHFolder, TVItem^.FullPidl, Node);

Node.AlphaSort;

TVItem^.HasExpanded := True;

end;
end.

溫馨提示:喜歡本站的話(huà),請(qǐng)收藏一下本站!

本類(lèi)教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
黄页视频在线播放| 亚洲欧美aaa| 91久久偷偷做嫩草影院电| 日韩h在线观看| 精品成人免费一区二区在线播放| 影音先锋5566资源网| 久草免费福利视频| 一区二区电影在线观看| 久久综合五月天| 一色道久久88加勒比一| 91国产精品视频在线| 天天综合网日韩| 国产精品美女无圣光视频| 99thz桃花论族在线播放| 欧美伊人久久大香线蕉综合69| 大香伊人久久精品一区二区| 国产精品成人免费精品自在线观看| 亚洲中文字幕无码中文字| 国产欧美日韩伦理| 51精产品一区一区三区| www.综合网.com| 九色porny91| 国产嫩草在线观看| 在线性视频日韩欧美| 亚洲成色999久久网站| 欧美边添边摸边做边爱免费| 精品一区二区三区影院在线午夜| fc2ppv在线播放| 欧美国产在线观看| 国产成人激情视频| 国产欧美自拍视频| 奇米影视四色在观看线| 国产情人综合久久777777| 日本在线不卡一区| 午夜久久黄色| 国产精品亚洲综合| 裸体一区二区| 免费下载黄色软件| 亚洲黄色在线播放| 欧美激情videos| 国产精品1区在线| 2018中文字幕一区二区三区| 26uuu国产电影一区二区| 99久久婷婷国产综合精品电影√| 欧美日本色图| 男人资源在线播放| 日韩最新中文字幕电影免费看| 成人精品国产一区二区4080| 欧美猛男男男激情videos| 色悠悠国产精品| 久久er热在这里只有精品66| 99re视频在线播放| 波多野结衣加勒比| 国产成人av一区二区| 日韩欧美不卡一区| 国产九九九视频| 欧美黄色性视频| 国产真实乱偷精品视频免| 成人在线播放免费观看| 国产真实乱子伦| 日韩av黄色| 91精品国产品国语在线不卡| 欧美熟妇精品一区二区蜜桃视频| 欧美日韩一区二区三区四区不卡| 免费观看日批视频| youjizz在线视频| 亚洲欧美国产一区二区三区| 国产在线观看h| 中文在线日韩| 性欧美孕妇孕交| 亚洲精品a级片| 成人看片在线观看| 亚洲成人中文| 精品欧美一区二区精品久久| 精品中文视频在线| 亚洲男同gay网站| 一色屋精品亚洲香蕉网站| 黄色一级免费视频| 国内精品在线观看视频| 欧美最猛黑人xxxx黑人猛交黄| 日韩在线一区视频| 少妇无码一区二区三区| 久久青青草原亚洲av无码麻豆| 国产精品777777| 国产女人水真多18毛片18精品视频| 国产精品探花一区二区在线观看| 日韩高清一二三区| 日韩欧美国产一区在线观看| 久久av一区二区三| 亚洲精品97久久| 被陌生人带去卫生间啪到腿软| 无码国产色欲xxxx视频| 激情视频国产| 欧美男人的天堂一二区| 最近中文字幕免费mv2018在线| 欧美精品一区二区三区四区五区| 97人妻精品一区二区三区| 久久精品xxxxx| 中文欧美日本在线资源| 福利视频久久| 亚洲精品视频网| 日韩在线视频精品| 精品三级在线| 久久久久久97三级| 538国产视频| 蜜桃视频在线播放| 98精品视频| 国产在线拍揄自揄视频不卡99| 日韩人妻无码精品综合区| 午夜黄色小视频| 国产精品xxx电影| 欧美97人人模人人爽人人喊视频| 高清无码一区二区在线观看吞精| 午夜美女久久久久爽久久| 国产福利视频网站| 日本欧洲一区二区| 538在线视频观看| 国产乱色精品成人免费视频| 九色免费视频| 精品成人av一区二区三区| 欧美高清不卡| 久久一级免费视频| 亚洲一区欧美一区| 99久久精品免费看国产| 天堂av手机在线| 日本年轻的继坶中文字幕| 国产浴室偷窥在线播放| 亚洲欧美日韩精品一区二区| 欧美日韩国产一区二区| 国产精品99久久精品| 日韩成人精品一区二区| 91久久免费观看| 91国产在线精品| 精品国产91亚洲一区二区三区www| 不卡高清视频专区| 亚洲视频在线观看三级| 欧美国产日韩一区二区| 性做久久久久久久久| 日本免费在线一区| 日韩免费高清| 欧美午夜精品一区二区蜜桃| 久久久久国产免费| 精品国产一区二区三区四区vr| 暖暖日本在线观看| 福利精品视频在线| 日韩欧美一区二区在线| 久久福利网址导航| 四虎国产精品永久在线| 中文字幕精品一区二区三区精品| 国产黄视频在线| 91国产精品视频在线观看| 国内精品伊人| 影音先锋人妻啪啪av资源网站| 国产ts在线观看| 吴梦梦av在线| 免费一级毛片在线观看| 亚洲一级二级| 精品视频免费在线观看| 国产精品一二三区视频| 久久精品国产96久久久香蕉| 中文字幕一区不卡| 一级片免费网址| 久久久国产精品成人免费| 成年人在线免费观看视频网站| 久久久久久无码精品人妻一区二区| 国产午夜精品免费一区二区三区| 中文字幕在线看高清电影| 91精品一区二区三区在线观看| 亚洲一线在线观看| 久久婷婷综合色| 精品一区日韩成人| 在线电影av不卡网址| 视频一区欧美日韩| 欧美黑人孕妇孕交| 奇米一区二区| www.美色吧.com| 国产精品乱码一区二区视频| 李宗瑞91在线正在播放| 女主播福利一区| 97在线看福利| 亚洲国产精品久久不卡毛片| 日韩一级av毛片| 日本a级c片免费看三区| 91精品国产一区二区在线观看| 国产成人精品一区二区三区福利| 色综合欧美在线| 国产精品久久久久影院| 国产一区二区毛片| 91视频在线视频| 神马久久久久久久久| 精品视频一区二区在线观看| 免费网站在线高清观看| 特级西西人体wwwww| 亚洲欧美综合图片| 久久99蜜桃精品久久久久小说| 日韩激情一区二区| 不卡av在线网站| 精品国产乱子伦| 精品久久国产视频| 中文字幕有码在线视频| 性感小视频在线看免费| 三上悠亚在线免费观看| 日韩精品一区二区三区中文字幕| 99国内精品久久| 亚洲人成77777男人| 久久午夜宅男免费网站| 国产免费成人| 国产福利久久久| 中文在线视频观看| 中文字幕精品www乱入免费视频| 免费欧美一级片| 久久精品国产68国产精品亚洲| 欧美国产成人在线| 久久九九精品| 亚洲国产高清av| 一卡二卡三卡四卡五卡| 日本精品一区二区三区四区的功能| 懂色一区二区三区| 性欧美又大又长又硬| 国产1区2区| 亚洲a成v人在线观看| 天堂资源在线| 国产精品99视频| 亚洲国产一区二区视频| 色中色777| 中国av在线播放| 蜜臂av日日欢夜夜爽一区| 男人日女人下面视频| 日本aⅴ亚洲精品中文乱码| 久久久久久久久精| 97超碰免费在线观看| 粉嫩蜜臀av国产精品网站| 久久久精品91| 久久国产福利| 欧洲在线/亚洲| 欧美精品国产精品久久久| www.成人在线| 亚洲精品成人图区| 亚洲第一区视频| 欧美艳星kaydenkross| 亚洲天堂国产| 亚洲成色999久久网站| 麻豆一区二区三区视频| 国产91九色蝌蚪| www日韩视频| 九九九热视频| 亚洲成人久久久久| 草草草视频在线观看| 国产精品免费麻豆入口| 人成免费电影一二三区在线观看| 性欧美精品男男| 免费人成在线观看| 伊人久久免费视频| 国产乱妇乱子| 综合伊思人在钱三区| 伊人春色精品| 无码人妻精品一区二区蜜桃色欲| 久久99这里只有精品| 性娇小13――14欧美| 青青青草网站免费视频在线观看| 成人影院在线看| 欧美日韩国产不卡| 日产精品久久久久久久蜜臀| 国产精品老女人视频| 国产精品美女久久福利网站| 电影在线一区| 久久www人成免费看片中文| 国产白丝精品91爽爽久久| 国产精品电影一区二区三区| 日韩五码在线| 天天插天天干| 日韩电影在线观看完整免费观看| 欧美日韩在线综合| 牛牛影视久久网| 国内露脸中年夫妇交换精品| 欧美日韩精品在线一区| 麻豆视频免费看| 男女无套免费视频网站动漫| 欧美在线观看视频一区| 国产香蕉在线观看| 日韩无码精品一区二区三区| 这里只有精品视频在线| 成人h视频在线观看播放| 国产一区观看| 国产精品视频中文字幕| 一区二区在线观看视频在线观看| 亚洲最大的黄色网| www.色综合.com| 26uuu另类亚洲欧美日本一| 成人性视频免费看| 超级碰碰视频| 蜜桃av一区二区在线观看| 日韩av在线导航| 天天干天天爽天天操| 午夜一区不卡| 国产日韩欧美中文字幕| 欧美—级高清免费播放| 丝袜美腿小色网| 国产精品久久久久久久app| 日韩一级片免费视频| 国产欧美日韩在线一区二区| 九九热在线免费观看| 在线观看亚洲天堂| 国外成人在线视频| 人妻巨大乳一二三区| 欧美黄色网页| 免费在线观看污视频| 91精品久久久久久综合五月天| 欧美艾v福利视频在线观看| 国产欧美一区二区三区久久人妖| 91av视频在线免费观看| 91在线视频一区| 老司机av在线免费看| 欧美xxxx老人做受| 婷婷av一区二区三区| 国产精品99久久久久久久久| 91久久国产精品91久久性色| 国产高清在线a视频大全| 欧美日韩精品在线观看| av资源网站在线观看| 青娱乐在线视频免费观看| 久久视频国产精品免费视频在线| 精品自拍偷拍| 欧美a级成人淫片免费看| 国产一区二区三区在线观看免费视频| 四季av中文字幕| 亚洲欧美国产日韩中文字幕| 国产精品二区三区四区|