这是我找来的一端代码,希望可以帮助你
重载TreeView的CreateParams:
type
  TCheckBoxTreeView = class(TTreeView)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;procedure TCheckBoxTreeView.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style:=Params.Style or TVS_CHECKBOXES; 
  { TVS_CHECKBOXES declared in CommCtrl }
end;如果要Check这个CheckBox,可以用下面的代码:
function IsNodeChecked(Node :TTreeNode) :Boolean;
const
  TVIS_CHECKED = $2000;
var
  TvItem :TTVItem;
begin
  TvItem.Mask  := TVIF_STATE;
  TvItem.hItem := Node.ItemId;
  TreeView_GetItem(Node.TreeView.Handle, TvItem);
  Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;
end;procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);
const
  TVIS_CHECKED = $2000;
var
  TvItem :TTVItem;
begin
  FillChar(TvItem, SizeOf(TvItem), 0);
  with TvItem do begin
    hItem     := Node.ItemId;
    Mask      := TVIF_STATE;
    StateMask := TVIS_STATEIMAGEMASK;
    if Checked then
      TvItem.State :=TVIS_CHECKED
    else
      TvItem.State :=TVIS_CHECKED shr 1;
    TreeView_SetItem(Node.TreeView.Handle, TvItem);
  end;
end;
可以做成事件和封装成一个类:
private OldState :Boolean;procedure Change(Node: TTreeNode); override;
begin
  inherited Change(Node);
  OldState := IsNodeChecked(Node);
end;procedure Click; override;
var
  NewState :Boolean;
begin
  inherited Click;
  NewState := IsNodeChecked(Self.Selected);
  if NewState = OldState then Exit;
  if (NewState) and Assigned(OnNodeChecked) then OnNodeChecked()
  else if (not NewState) and Assigned(OnNodeUnChecked) then 
OnNodeUnChecked()// OnNodeChecked & OnNodeUnchecked will be events that you declare
end;

解决方案 »

  1.   

    to : eagle123(孤独的鹰)
       谢谢你的大力支持
       如果我要选择某个checkbox好象不必向你那么麻烦
       我遇到的问题是动态建树,树我可以建,就是节点前没有checkbox这个复选框
      

  2.   

    你的树以我上面说的TCheckBoxTreeView 为基类不就可以了吗
    treeview1:TCheckBoxTreeView
    或者你可以找到raize这个控件包的话,上面有这个控件
      

  3.   

    to  eagle123(孤独的鹰)  
      再次感谢  
      我用的是fctreeview
      

  4.   

    我做过,
    动态建树很简单 可以用 treeview1.Items.AddChild() 等建立起来,
    复选框,我的办法是:
    自己画两个图标,一个是方框,一个是方框加钩(选中),
    建树时给每个节点指定 图标
    node.ImageIndex :=0;
    编辑onchange事件,改变选中节点的图标;
    效果不错!
      

  5.   

    动态建树: 我是从数据库中调入数据,选了一段代码,参考一下吧: var tempNODE1:Ttreenode;
        tempnode2,tempnode3:Ttreenode;
        peno:^integer;
     begin
        treeview1.Items.Clear;
     
       if not atstation.Active then
        atstation.Open else
        atstation.First;
       while not atstation.Eof do
       begin
         tempNODE1:=treeview1.Items.Add(treeview1.selected,atstationsname.AsString);
         tempnode1.ImageIndex:=13;
         tempnode1.SelectedIndex:=13;     getmem(peno,sizeof(peno));
         peno^:=atstationsno.asinteger;
      //   peno:=@eno;
         tempnode1.Data:=peno;
        // tempnode1.EditText:=false;
         aq1.close;
         aq1.sql.clear;
         aq1.sql.add('select kno,kname from eqkind where sno='+atstationsno.AsString+ ' order by kno');
         aq1.Prepared;
         aq1.open;     while not aq1.eof do
         begin
           tempnode2:=treeview1.Items.AddChild(tempnode1,aq1.fields[1].asstring);
           getmem(peno,sizeof(peno));
           peno^:=aq1.Fields[0].asinteger;
            tempnode2.Data:=peno;       tempnode3:=treeview1.Items.AddChild(tempnode2,'A相');
            getmem(peno,sizeof(peno));               //将编号存入data pointer
            peno^:=aq1.Fields[0].asinteger*10+1;
            tempnode3.Data:=peno;
           tempnode3:=treeview1.Items.AddChild(tempnode2,'B相');         getmem(peno,sizeof(peno));
            peno^:=aq1.Fields[0].asinteger*10+2;
            tempnode3.Data:=peno;
           tempnode3:=treeview1.Items.AddChild(tempnode2,'C相');         getmem(peno,sizeof(peno));
            peno^:=aq1.Fields[0].asinteger*10+3;
            tempnode3.Data:=peno;
           aq1.next;
         end;    atstation.Next;
       end;
       aq1.close;
     end;
      

  6.   

    选中时改变节点图标
    procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
        IF node.ImageIndex=0 THEN
         begin
           node.ImageIndex:=1;
           node.SelectedIndex:=1;
         end;.........