お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"シェルのツリーを表示(1/2)"

この発言に対し以下のコメントが寄せられています
#01291 アイクビー さん シェルのツリーを表示(2/2)

もう何度も話題になっていますが、シェルのネーム スペースからツリーを表示 する方法です。オブジェクトの名前とアイコンをツリー表示する以外は何もしな いので、ネーム スペースへのアクセスを理解する参考にするには手ごろではな いかと思い、アップすることにしました。 APIとかCOMの使い方は一応ヘルプに従っているつもりですが、間違いや改善のご 指摘をいただければ幸いです。動作は、Windows 2000 + SP1とWindows 95(A) + SP1でオッケーでした。デスクトップ以下、全部表示できるようです。コードが 300行を越えるので、この発言へのレスに続きを入れておきます。 5タブ(笑)とか見慣れない変数名のつけ方で見づらいとは思いますが、ご容赦く ださいまし。フォーム(Form1)のOnCreateをFormCreateに、OncloseをFormClose に設定し、TTreeView(TreeView1)を乗せて、OnExpandingをTreeView1Expanding に設定すると動くと思います。 (ここから) uses ..., CommCtrl, ShellAPI, ShlObj, ActiveX; type // ノードの情報(TTreeNode.Data) PTreeNodeData = ^TTreeNodeData; TTreeNodeData = record fFolder: IShellFolder; // nil: フォルダー以外 fIDList: PItemIDList; // 親ノードからの相対 fExpand: Boolean; // True: Enum済み end; //********************************************************************** // TForm1: フォームの消滅 //********************************************************************** procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var i: Integer; begin for i := 0 to TreeView1.Items.Count - 1 do begin with TreeView1.Items[i] do begin if Assigned(PTreeNodeData(Data).fFolder) then begin PTreeNodeData(Data).fFolder._Release(); end; FfMalloc.Free(PTreeNodeData(Data).fIDList); Dispose(PTreeNodeData(Data)); end; end; FfIcon._Release(); FfFolder._Release(); FfMalloc._Release(); end; //********************************************************************** // TForm1: フォームの生成 //********************************************************************** procedure TForm1.FormCreate(Sender: TObject); var hRE: HRESULT; fII: PItemIDList; hIL: HImageList; fFI: TSHFileInfo; fTN: TTreeNode; fND: PTreeNodeData; begin hRE := SHGetMalloc(FfMalloc); if not (hRE = NOERROR) then begin ShowMessage('SHGetMalloc: '+IntToHex(hRE, 8)); Exit; end; FfMalloc._AddRef(); hRE := SHGetDesktopFolder(FfFolder); if not (hRE = NOERROR) then begin ShowMessage('SHGetDesktopFolder: '+IntToHex(hRE, 8)); Exit; end; FfFolder._AddRef(); hRE := FfFolder.QueryInterface(IID_IShellIcon, FfIcon); if not (hRE = NOERROR) then begin ShowMessage('IShellFolder.QueryInterface: '+IntToHex(hRE, 8)); Exit; end; FfIcon._AddRef(); hRE := SHGetSpecialFolderLocation(Handle, CSIDL_DESKTOP, fII); if not (hRE = NOERROR) then begin ShowMessage('SHGetSpecialFolderLocation: '+IntToHex(hRE, 8)); Exit; end; hIL := SHGetFileInfo( PAnsiChar(fII), 0, fFI, SizeOf(TSHFileInfo), SHGFI_PIDL or SHGFI_DISPLAYNAME or SHGFI_SYSICONINDEX or SHGFI_SMALLICON ); if (hIL = 0) then begin FfMalloc.Free(fII); ShowMessage( 'SHGetFileInfo: '+SysErrorMessage(GetLastError()) ); Exit; end; TreeView1.Images := TImageList.Create(TreeView1); TreeView1.Images.ShareImages := True; TreeView1.Images.Handle := hIL; New(fND); fND.fFolder := FfFolder; fND.fIDList := fII; fND.fExpand := False; fTN := TreeView1.Items.AddChildObject( nil, fFI.szDisplayName, fND ); fTN.OverlayIndex := -1; fTN.HasChildren := True; fTN.ImageIndex := fFI.iIcon; fTN.SelectedIndex := fFI.iIcon; end; //********************************************************************** // TForm1: ノードを展開する //********************************************************************** procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean); // ******************************************************************* // アイコンのインデックスを設定する(ファイル システム) // ******************************************************************* function SetIconIndex( fNode: TTreeNode ): Boolean; var iSI: Integer; begin Result := True; if (FfIcon.GetIconOf( PTreeNodeData(fNode.Data).fIDList, GIL_FORSHELL, iSI ) = NOERROR) then begin fNode.ImageIndex := iSI; end else begin Result := False; end; if (FfIcon.GetIconOf( PTreeNodeData(fNode.Data).fIDList, GIL_OPENICON, iSI ) = NOERROR) then begin fNode.SelectedIndex := iSI; end else begin Result := False; end; end; // ******************************************************************* // アイコンのインデックスを設定する(仮想、リンク フォルダー用) // ******************************************************************* procedure SetIconIndexOf( fNode: TTreeNode; fList: PItemIDList ); var fFI: TSHFileInfo; begin if (SHGetFileInfo( PAnsiChar(fList), 0, fFI, SizeOf(TSHFileInfo), SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_SMALLICON ) = 0) then begin ShowMessage( 'SHGetFileInfo: '+SysErrorMessage(GetLastError()) ); Exit; end else begin fNode.ImageIndex := fFI.iIcon; end; if (SHGetFileInfo( PAnsiChar(fList), 0, fFI, SizeOf(TSHFileInfo), SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_SELECTED ) = 0) then begin ShowMessage( 'SHGetFileInfo: '+SysErrorMessage(GetLastError()) ); Exit; end else begin fNode.SelectedIndex := fFI.iIcon; end; end; (続く) アイクビー  Original document by アイクビー 氏 ID:(KHB01350)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum