下面的代码是显示桌面及其以下的文件夹,通过但不能显示中文,为什么?(50分)

  • 主题发起人 星期一
  • 开始时间

星期一

Unregistered / Unconfirmed
GUEST, unregistred user!
unit BrowseTreeView;

interface

uses
; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
; ShlObj,ComCtrls;

type
; PTreeViewItem=^TTreeViewItem;
; TTreeViewItem=record
; ;ParentFolder:IShellFolder;
; ;//节点对应的文件夹的父文件夹的IShellFolder接口
; ;Pidl,FullPidl:pItemIDList;
; ;//节点对应的文件夹的相对和绝对项目标识符列表
; ;HasExpanded:Boolean;//节点是否展开
; end;
; TForm1 = class(TForm)
; ; TreeView1: TTreeView;
; ; procedure FormCreate(Sender: TObject);
; ; procedure FormDestroy(Sender: TObject);
; ; procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode;
; ; ; var AllowExpansion: Boolean);

; private
; ; { Private declarations }
; ; FItemList:TList;
; ; procedure SetTreeViewImageList;
; ; procedure FillTreeView(Folder:IShellFolder;FullPIDL:pItemIDList;ParentNode:TTreeNode);

; public
; ; { Public declarations }
; end;

var
; Form1: TForm1;

implementation

{$R *.DFM}
uses
; ActiveX,ComObj,ShellAPI,CommCtrl;
; //以下是几个对项目标识符进行操作的函数

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;
//将二进制表示的项目标识符列表转换成有可识的项目名

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,StrLen(StrRet.cStr));
; ; ; STRRET_OFFSET:
; ; ; begin
; ; ; ; P:=@PIDL.mkid.abID[StrRet.uOffset-sizeof(PIDL.mkid.cb)];
; ; ; ; SetString(Result,P,PIDL.mkid.cb-StrRet.UOffset);
; ; ; end;
; ; 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;
//获得每个文件夹在系统中的图标
; ;
procedure GetItemIcons(FullPIDL:pItemIDList;TreeNode:TTreeNode);
begin
; with TreeNode do
; begin
; ; ImageIndex:=GetIcon(FullPIDL,False);
; ; SelectedIndex:=GetIcon(FullPIDL,True);
; end;
end;
//获得系统的图标列表

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;
//生成文件夹管理树

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
; // 你可在此处对异常进行处理
; end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
; I:Integer;
begin
; try
; ; for I:=0 to FItemList.Count-1 do
; ; begin
; ; ; DisposePIDL(PTreeViewItem(FItemList).PIDL);
; ; ; DisposePIDL(PTreeViewItem(FItemList).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.
 
如果不能显示中文,那么显示的是什么呢?说出来看看。。
 
没有测试(你试试这样看行不行,其它同理)
TreeView1.Font.Name:='宋体';
 
to zhihuali:不行
to CJF:可以显示所有的目录,英文名称的有显示,中文名称的是空白
 
会不会是你的系统有问题!
 
WIN2000,应该不是吧,因为其他程序都可以啊,比如说“资源管理器”。你试过代码了吗?
 
没有试过,我也不是太清楚。不好意思!
 
我以经一年多没用过Delphi了
 
我测试过了(win98),显示中文没有问题,应该是你的系统的原因.

另外,我发现,当将一文件夹的属性设为控制面板时(超级兔子魔法设置有该功能),
点击时会出错.
 
我的是WIN2000:(
 
你用的D5还是D6,如果是D5,改用D6试试,我没用2000不能帮你试了
 
在WINME下我也测试通过了,但谁能告诉我为什么在2000下不能?
 
可能win2000下是unicode的原因,试一下用widestring
 
你的程序中遗漏了两行:
function GetDisplayName(Folder:IShellFolder;PIDL:pItemIDList;ForParsing:Boolean):String;
.....
.... ;
;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;//此行
 
楼上的兄弟,多谢!
 
顶部