// 转载自CoDelphi
// 如何创建目录树
procedure MakeDir(Dir: String);
function Last(What: String; Where: String): Integer;
var
Ind : Integer;
begin
Result := 0;
for Ind := (Length(Where)-Length(What)+1) downto 1 do
if Copy(Where, Ind, Length(What)) = What then
begin
Result := Ind;
Break;
end;
end;
var
PrevDir : String;
Ind : Integer;
begin
if Copy(Dir,2,1) <> ':' then
if Copy(Dir,3,1) <> '\' then
if Copy(Dir,1,1) = '\' then
Dir := 'C:'+Dir
else
Dir := 'C:\'+Dir
else
Dir := 'C:'+Dir;
if not DirectoryExists(Dir) then
begin
// 如果目录不存在,取得上一个目录名
Ind := Last('\', Dir);
// 最后一个 '\'的位置
PrevDir := Copy(Dir, 1, Ind-1);
// 上一个目录
// 如果上一个目录不存在
// 传递给此递归过程
if not DirectoryExists(PrevDir) then
MakeDir(PrevDir);
// 在这里,上一个目录必须存在
// 创建(in "Dir"; variable)目录
CreateDir(Dir);
end;
end;
投稿人:liusm
// 如何创建目录树
procedure MakeDir(Dir: String);
function Last(What: String; Where: String): Integer;
var
Ind : Integer;
begin
Result := 0;
for Ind := (Length(Where)-Length(What)+1) downto 1 do
if Copy(Where, Ind, Length(What)) = What then
begin
Result := Ind;
Break;
end;
end;
var
PrevDir : String;
Ind : Integer;
begin
if Copy(Dir,2,1) <> ':' then
if Copy(Dir,3,1) <> '\' then
if Copy(Dir,1,1) = '\' then
Dir := 'C:'+Dir
else
Dir := 'C:\'+Dir
else
Dir := 'C:'+Dir;
if not DirectoryExists(Dir) then
begin
// 如果目录不存在,取得上一个目录名
Ind := Last('\', Dir);
// 最后一个 '\'的位置
PrevDir := Copy(Dir, 1, Ind-1);
// 上一个目录
// 如果上一个目录不存在
// 传递给此递归过程
if not DirectoryExists(PrevDir) then
MakeDir(PrevDir);
// 在这里,上一个目录必须存在
// 创建(in "Dir"; variable)目录
CreateDir(Dir);
end;
end;
投稿人:liusm
解决方案 »
- 往Excel表里写类似:“1-15”的内容,怎样阻止自动变成日期型?
- 如何将本地执行目录下的数据库,另存到别的路径?在线等待
- 关于日期!好像不是太好处理是为何?
- 一程山水一程歌,寥作在DELPHI版升星的纪念----我也来酸一把吧,请版主勿删
- 用语句怎么设置数据集的displayformat := '#0.0';
- 请问delphi自带数据库IBLocal,USERNAME=SYSDAN,PASSWORD=?谢谢!
- boyqing过来拿分!请版主不要删除本贴!!!
- 说说你对类工厂的理解
- fastcopy 原理
- 中文的朗读怎样实现
- 我想做一个图书馆管理系统,前端是用DELPHI,后端是MS-SQL2000。我想请各位高手指导一下我怎么做,最好给一份设计方案我。多谢。
- ADO如何与SQL SERVER数据库相连?()
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ShlObj,StdCtrls, ComCtrls;type
PTreeViewItem = ^TTreeViewItem;
TTreeViewItem = record
ParentFolder: IShellFolder; // 节点对应的文件夹的父文件夹的IShellFolder接口
Pidl, FullPidl: PItemIDList; // 节点对应的文件夹的相对和绝对项目标识符列表
HasExpanded: Boolean; // 节点是否展开
end;
type
TfrmTreeView = class(TForm)
TreeView1: TTreeView;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
private
{ Private declarations }
FItemList: TList;
procedure SetTreeViewImageList;
procedure FillTreeView(Folder: IShellFolder; FullPIDL: PItemIDList; ParentNode: TTreeNode);
public
{ Public declarations }
end;var
frmTreeView: TfrmTreeView;implementation{$R *.DFM}uses
ActiveX, ComObj, ShellAPI, CommCtrl;procedure DisposePIDL(ID: PItemIDList); //释放ItemIDList项
var
Malloc: IMalloc;
begin
if ID = nil then Exit;
OLECheck(SHGetMalloc(Malloc));
Malloc.Free(ID);
end;//复制ItemIDList
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; //获得下一个ItemIDList项
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;//建立ItemIDList项
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;//获得ItemIDList相对应的文件夹在树形列表中的显示名称
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;//获得ItemIDList项相对应的图标句柄
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;// 获得每个文件夹在系统中的图标
procedure GetItemIcons(FullPIDL: PItemIDList; TreeNode: TTreeNode);
begin
with TreeNode do
begin
ImageIndex := GetIcon(FullPIDL, False);
SelectedIndex := GetIcon(FullPIDL, True);
end;
end;// 将ItemIDList列表项转换成有可识的项目名
procedure TfrmTreeView.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
// 你可在此处对异常进行处理
end;
end;procedure TfrmTreeView.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;procedure TfrmTreeView.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 TfrmTreeView.FormCreate(Sender: TObject);
var
Folder: IShellFolder;
begin
SetTreeViewImageList;
//获得桌面的IShellFolder接口
OLECheck(SHGetDesktopFolder(Folder));
FItemList := TList.Create;
FillTreeView(Folder, nil, nil);
end;procedure TfrmTreeView.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
var
TVItem: PTreeViewItem;
SHFolder: IShellFolder;
begin
TVItem := PTreeViewItem(Node.Data);
if TVItem.HasExpanded then Exit; //获得绑定到节点的Pidl项相对应的IShellFolder接口
OLECheck(TVItem.ParentFolder.BindToObject(TVItem^.Pidl,
nil, IID_IShellFolder, Pointer(SHFolder)));
FillTreeView(SHFolder, TVItem^.FullPidl, Node);
Node.AlphaSort;
TVItem^.HasExpanded := True;
end;//获得用户选择的节点上绑定的的ItemIDList对应的路径名称
procedure TfrmTreeView.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
sPath:string;
TVItem: PTreeViewItem;
begin
TVItem := PTreeViewItem(Node.Data);
SetLength(sPath,512);
SHGetPathFromIDList(TVItem.FullPidl,PChar(sPath));
Self.Caption := sPath;
end;end.
对啊,才注意到它是xml。老大好厉害!
chechy老大,能不能推荐以下内容的书籍?SOAP, XML, WebService...现在想搞这方面的,感觉无从下手,怕买到垃圾
倒是需要掌握一下XSL技术,国内这方面的书不多,有一本教XSLT Programmer's Reference值得一看。关于XSLT,karma非常熟悉。