数据库表如下:
hb     mc     sjbh     url
序号   名称   层级关系  网址
要点击一个根结点,打开一个相应该的网址,url该怎么引用出来,代码该怎么加判断是否是根节点unit Unit2;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, DB, DBClient;type
  TForm2 = class(TForm)
    TV1: TTreeView;
    ClientDataSet1: TClientDataSet;    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;type
  TMyData1 = ^TNodeData1;
  TNodeData1 = record
    ID1: Integer; //标签
    BH1: string; //编号
    MC1: string; //名称
    SJBH1: string; //上级编号
    end;
  TMyData2 = ^TNodeData2;
  TNodeData2 = record
    ID2: Integer; //标签
    BH2: string; //编号
    MC2: string; //名称
    SJBH2: string; //上级编号
    end;var
  Form2: TForm;
//procedure TForm1.Button1Click(Sender: TObject);
//function KHSTR(str: string): string;implementationuses UDMDATA;{$R *.dfm}function KHSTR(str: string): string;
begin
  result := '(' + str + ')';
end;function TreeFill1(FTV: Tobject; ID: Integer; TREEDSTNAMESHOW, TREEDSTNAME, TREEDSBHNAME, TREEDSMCNAME, TREEDSSJBHNAME: string): Boolean;
var
  TV1: TTreeView;
  TopNode1: TTreeNode;
  TempNode1: TTreeNode;
  MyData1: TMyData1;
  S1: array of TMydata1;
  CDS_Tree1: TClientDataset;
  I1, J1, COUNT1: Integer;
  F1: Boolean;
begin
  TV1 := TTreeView(FTV);
  TV1.Items.Clear;
  TV1.ReadOnly := True;
  TopNode1 := TV1.Items.GetFirstNode;
  New(MyData1);
  MyData1^.ID1 := ID;
  MyData1^.BH1 := '';
  MyData1^.MC1 := '';
  MyData1^.SJBH1 := '';
  TopNode1 := TV1.Items.Add(TopNode1, TREEDSTNAMEShow);
  TopNode1.ImageIndex := 0;
  TopNode1.SelectedIndex := 1;
  TopNode1.Data := MyData1;
  try
    CDS_Tree1 := TClientDataset.Create(DMDATA);
    CDS_Tree1.ProviderName := 'DSP_AQCMD';
    CDS_Tree1.CommandText := ' SELECT *  FROM ' + TREEDSTNAME + ' ORDER BY ' + TREEDSBHNAME;
    try
      CDS_Tree1.Open;
      COUNT1 := 0;
      COUNT1 := CDS_Tree1.RecordCount + 1;
      if COUNT1 > 1 then
      begin
        SetLength(S1, COUNT1);
        CDS_Tree1.First;
        while not CDS_Tree1.Eof do
        begin
          New(MyData1);
          MyData1^.ID1 := ID;
          MyData1^.BH1 := CDS_Tree1.fieldbyname(TREEDSBHNAME).AsString; ;
          MyData1^.MC1 := CDS_Tree1.fieldbyname(TREEDSMCName).AsString;
          MyData1^.SJBH1 := CDS_Tree1.fieldbyname(TREEDSSJBHNAME).AsString;          if (MyData1^.SJBH1 = null) or (MyData1^.SJBH1 = '') or (MyData1^.SJBH1 = '0') then
          begin
            //第二层
            TopNode1 := TV1.Items.GetFirstNode;
            TempNode1 := TV1.Items.AddChild(TopNode1, MyData1^.MC1);
            TempNode1.ImageIndex := 0;
            TempNode1.SelectedIndex := 1;
            TempNode1.Data := MyData1;
          end
          else
          begin
             //有上级
            F1 := False;
            for J1 := 0 to TV1.Items.Count - 1 do
            begin
              if TMyData1(TV1.Items[J1].data)^.BH1 = Mydata1^.SJBH1 then
              begin
                F1 := True;                TopNode1 := TV1.Items[J1];
                TempNode1 := TV1.Items.AddChild(TopNode1,  MyData1^.MC1);
                TempNode1.ImageIndex := 0;
                TempNode1.SelectedIndex := 1;
                TempNode1.Data := MyData1;                Break;
              end;
            end;
            if not F1 then //找不到上级
              S1[CDS_Tree1.RecNo] := Mydata1;
          end;
          CDS_Tree1.Next;
        end;
      end;
    except
      ShowMessage('打开表出错!');
    end;
  finally
    CDS_Tree1.Free;
  end;
  //处理未加入树的记录
  for I1 := 0 to COUNT1 - 1 do
  begin
    if S1[I1] <> nil then
    begin
      F1 := FaLSE;
      for J1 := 0 to TV1.Items.Count - 1 do
      begin
        if TMyData1(TV1.Items[J1].data)^.BH1 = s1[i1].SJBH1 then
        begin
          F1 := True;
          TopNode1 := TV1.Items[J1];
          TempNode1 := TV1.Items.AddChild(TopNode1,  s1[i1].MC1);
          TempNode1.ImageIndex := 0;
          TempNode1.SelectedIndex := 1;
          TempNode1.Data := s1[i1];
          Break;
        end;
      end;      if not F1 then
      begin
          //加入到第二层
        TopNode1 := TV1.Items.GetFirstNode;
        TempNode1 := TV1.Items.AddChild(TopNode1, s1[i1].MC1);
        TempNode1.ImageIndex := 0;
        TempNode1.SelectedIndex := 1;
        TempNode1.Data := s1[i1];
      end
    end;
  end;
  TV1.FullExpand;
  TV1.FullCollapse;
end;代码是这样的,能完整的从数据库里提出数据生成数,没有问题,但是我每个根结点都要有触发事件,请问大家该怎么写

解决方案 »

  1.   

    TreeView.OnChange:if Node.Parent=NIL then
      ...
      

  2.   

    if node.level = 0 then
      

  3.   

    TMyData1(node.data).值  去数据库中查找,
      

  4.   

    我把数据库里的BH换成URL了,就直接调用BH就是网页地址了,如下:procedure TForm2.TV1Change(Sender: TObject; Node: TTreeNode);
    begin
    if Node.HasChildren  then    //有下一级
      node.Expanded := true  //展开
    else                     //没下一级了,子叶,显示它
     form1.webbrowser1.Navigate(MyData1^.BH1);end;上面这个应该先查找是哪个节点,然后再调出这个节点的BH1打开,应该怎么判断,请求大家给个代码,谢谢了
      

  5.   

    if 是叶结点 then
    begin
        if node.data <> nil then
          form1.webbrowser1.Navigate(MyData1(Node.data).BH1);
    end;
      

  6.   

    我晕啊,就是form1.webbrowser1.Navigate(MyData1(Node.data).BH1);这一行报错
    [Pascal Error] Unit2.pas(326): E2066 Missing operator or semicolon不知道是怎么回事
      

  7.   

    解决了,给分,太谢谢你了,yq3woaini(哈哈镜 http://shop33546080.taobao.com(选择好心情!),你是我的偶象,谢谢!