写了一个简单的在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的什么事件呢?

解决方案 »

  1.   

    FormCreate过程当中,Form还不存在,所以不能执行
    TreeView1.SetFocus ; 
    否则会提示错误:Cannot foces a disabled or invisible window
      

  2.   

      TreeView1.SetFocus ; 放到FormShow事件中去吧
      

  3.   

    TreeView1.SetFocus ; 添加到FormShow事件中去了。可是运行后TreeView还是显示为空~~~
      

  4.   

    把代码放到OnShow事件里去,Create的时候,TreeView都还没存在
      

  5.   

    把事件改为procedure TForm1.FormShow(Sender: TObject);了可是运行后TreeView还是为空啊~~~
      

  6.   

    直接“拖”到界面上来的控件如(TreeView)比Form先构造,所以TreeView是存在的.还是那句话,可能跟你的编译器有关系,我这里没有你所提到的问题.
      

  7.   

    我用的就是Delphi 7呀~~~怎么能是编译器的问题
      

  8.   

    菜鸟不会跟踪
    而且不只是Form的事件没有响应,TreeViewClick事件也没有响应
      

  9.   

    不需要修改你原先的调用事件,把你在MakeGroup方法中的TreeView1.SetFocus注释掉就可以了,显示正常,但是我不知道为什么你的代码只显示了<整个网络 - WORKGROUP>,你应该看看你网络查找部分的代码。
      

  10.   

    我试过注释掉MakeGroup方法中的TreeView1.SetFocus,但运行后Treeview还是空的
      

  11.   

    为空就是说TreeView里面什么都没有。连“整个网络”都没有
      

  12.   


    node := TreeView1.Items.Add(nil,'整个网络'); 该成node := TreeView1.Items.Add(TreeView1.Selected,'整个网络'); 不会出现你那情况的,你要调试跟踪下