写了一个简单的在TreeView中显示局域网内工作组的程序,想让程序一运行即在Treeview中显示局域网内的所有工作组。代码如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls , registry, Buttons, ComCtrls;type
TForm1 = class(TForm)
TreeView1: TTreeView;
procedure FormCreate(Sender: TObject);
private
function MakeGroup(var strlist:Tstringlist):boolean;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
node:TTreeNode;implementation{$R *.dfm}
function TForm1.MakeGroup(var strlist:Tstringlist):boolean;
type
TNetRes=^TNetResource;
var
Netres:TNetResource;
Buf:Pointer;
Count,Bufsize,Res:DWORD;
lphEnum:THandle;
Netr:TNetRes;
i,j:integer;
Netlist:TList;
MyNode:TTreeNode;
begin
node := TreeView1.Items.Add(nil,'整个网络');
TreeView1.SetFocus ;
Result:=False;
Netlist:=TList.Create;
strlist.Clear;
Res:=WNetOpenEnum(RESOURCE_GLOBALNET,resourcetype_disk,Resourceusage_container,nil,lphEnum);
if res<>no_error then exit;
count:=$FFFFFFFF;
BufSize:=5000;
GetMem(Buf,BufSize);
Res:=WNetEnumResource(lphEnum,Count,Buf,BufSize);
if ((Res=Error_no_more_items) or (Res<>No_ERROR)) then Exit;
Netr:=TNetRes(Buf);
for I:=0 to Count-1 do
begin
Netlist.Add(Netr);
Inc(Netr);
end;
for j:=0 to Netlist.Count-1 do
begin
Netres:=TNetResource(Netlist.Items[j]^);
Res:=WNetOpenEnum(ReSource_globalnet,resourcetype_disk,Resourceusage_container,@Netres,lphEnum);
if res<>no_Error then break;
while true do
begin
Count:=$FFFFFFFF;
BufSize:=8192;
GetMem(Buf,BufSize);
Res:=WNetEnumResource(lphEnum,Count,Buf,BufSize);
if (Res=Error_no_more_items) or (Res<>No_error) then break;
Netr:=TNetRes(Buf);
For i:=0 to Count-1 do
begin
MyNode := TreeView1.Items.AddChild(node,StrPas(Netr^.lpRemoteName ));
inc(Netr);
end;
end;
end;
Freemem(Buf);
Netlist.Destroy;
end;procedure TForm1.FormCreate(Sender: TObject);var
Str:TStringlist;
begin
Str:=TStringlist.Create;
MakeGroup(str);
Str.Free;
end;
end.但是运行后TreeView中是空的。这是为什么呢?是不是不能在FormCreate()中触发?
还有如果我想选中TreeView中的某一节点后即调用方法使其展开应该使用TreeView的什么事件呢?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls , registry, Buttons, ComCtrls;type
TForm1 = class(TForm)
TreeView1: TTreeView;
procedure FormCreate(Sender: TObject);
private
function MakeGroup(var strlist:Tstringlist):boolean;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
node:TTreeNode;implementation{$R *.dfm}
function TForm1.MakeGroup(var strlist:Tstringlist):boolean;
type
TNetRes=^TNetResource;
var
Netres:TNetResource;
Buf:Pointer;
Count,Bufsize,Res:DWORD;
lphEnum:THandle;
Netr:TNetRes;
i,j:integer;
Netlist:TList;
MyNode:TTreeNode;
begin
node := TreeView1.Items.Add(nil,'整个网络');
TreeView1.SetFocus ;
Result:=False;
Netlist:=TList.Create;
strlist.Clear;
Res:=WNetOpenEnum(RESOURCE_GLOBALNET,resourcetype_disk,Resourceusage_container,nil,lphEnum);
if res<>no_error then exit;
count:=$FFFFFFFF;
BufSize:=5000;
GetMem(Buf,BufSize);
Res:=WNetEnumResource(lphEnum,Count,Buf,BufSize);
if ((Res=Error_no_more_items) or (Res<>No_ERROR)) then Exit;
Netr:=TNetRes(Buf);
for I:=0 to Count-1 do
begin
Netlist.Add(Netr);
Inc(Netr);
end;
for j:=0 to Netlist.Count-1 do
begin
Netres:=TNetResource(Netlist.Items[j]^);
Res:=WNetOpenEnum(ReSource_globalnet,resourcetype_disk,Resourceusage_container,@Netres,lphEnum);
if res<>no_Error then break;
while true do
begin
Count:=$FFFFFFFF;
BufSize:=8192;
GetMem(Buf,BufSize);
Res:=WNetEnumResource(lphEnum,Count,Buf,BufSize);
if (Res=Error_no_more_items) or (Res<>No_error) then break;
Netr:=TNetRes(Buf);
For i:=0 to Count-1 do
begin
MyNode := TreeView1.Items.AddChild(node,StrPas(Netr^.lpRemoteName ));
inc(Netr);
end;
end;
end;
Freemem(Buf);
Netlist.Destroy;
end;procedure TForm1.FormCreate(Sender: TObject);var
Str:TStringlist;
begin
Str:=TStringlist.Create;
MakeGroup(str);
Str.Free;
end;
end.但是运行后TreeView中是空的。这是为什么呢?是不是不能在FormCreate()中触发?
还有如果我想选中TreeView中的某一节点后即调用方法使其展开应该使用TreeView的什么事件呢?
TreeView1.SetFocus ;
否则会提示错误:Cannot foces a disabled or invisible window
而且不只是Form的事件没有响应,TreeViewClick事件也没有响应
node := TreeView1.Items.Add(nil,'整个网络'); 该成node := TreeView1.Items.Add(TreeView1.Selected,'整个网络'); 不会出现你那情况的,你要调试跟踪下