// 转载自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

解决方案 »

  1.   

    CSDN的XML没有设计好,或者说XSL也没有设计好(连一个回车都搞不定)。导致空格被xsl解析器忽略。这就是没有缩进的原因。
      

  2.   

    给你一个代码,可以使TreeView变成象资源管理器一样的:unit UnitTreeView;interfaceuses
      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.
      

  3.   

    本贴http://www.csdn.net/expert/topic/524/524305.xml
    对啊,才注意到它是xml。老大好厉害!
    chechy老大,能不能推荐以下内容的书籍?SOAP, XML, WebService...现在想搞这方面的,感觉无从下手,怕买到垃圾
      

  4.   

    Web Service本身没有多少内容,D6DG只有十几页,Profession C#也只有十几页。
    倒是需要掌握一下XSL技术,国内这方面的书不多,有一本教XSLT Programmer's Reference值得一看。关于XSLT,karma非常熟悉。