如何实现带有checkbox的ttreeviw,我是想做个类似瑞兴杀毒的那个操作界面。
解决方案 »
- 如何得到ACTIVEXFORM里TWEBBROWSER里的HTML页面里的一个文本编辑框的HANDLE
- 条码打印机打印中文(高分求,急等)
- 求救 为什么sql查询说列名无效?
- 关于用Delphi开发桌面型小软件怎么选择数据库的问题
- idhttp的关于get的问题
- 关于TDBChart的连线画图的用法(连线时,判断如果值为空就不连)
- 二维数组,如何让a:TEdit类,b:TLabel类?
- 急急急!关于三层结构的几个基本问题,我们正在确定一个方案,请高手赐教!!一定给分!
- 小生向各位请教一类似于Foxpro中宏代换功能。
- 请问谁有列车时刻表的最新数据库,能发送一份给我么?
- 寻<<PC游戏编程--人机博弈>>的电子版或下载网址,马上结帐!最好有源码!
- 求算法(老菜鸟都可以进)
TTreeNode.Data作为是否选中的信息。
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ChildFrm, ImgList, ComCtrls, ExtCtrls, CodeTreeView, Db, DBTables;type
Tfrm_gz_setup = class(TChildForm)
Panel1: TPanel;
StatusBar1: TStatusBar;
ImageList1: TImageList;
TreeView1: TTreeView;
Query1: TQuery;
Panel2: TPanel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure TreeView1DblClick(Sender: TObject);
private
{ Private declarations }
one_level,two_level:array of string;
procedure CreateTree; public
{ Public declarations }
end;var
frm_gz_setup: Tfrm_gz_setup;implementation
uses pub_tree, dm_sbgl,publicVar;
{$R *.DFM}procedure Tfrm_gz_setup.FormCreate(Sender: TObject);
Var code ,Text : string;
begin
inherited;
CreateTree;
end;procedure Tfrm_gz_setup.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
inherited;
frm_gz_setup:=nil;
end;procedure Tfrm_gz_setup.CreateTree;
var
tt,querysql:string;
tmp,c,d:TTreeNode;
i:integer;
begin
i:=0;
tmp:=TreeView1.Items.AddChild(nil,'工种目录');
tt:='select a.gzbh,a.gzmc,b.gzbh cc from RDGZML a,SB_MAN_GZ b where '
+' length(a.gzbh)=2 and a.gzbh=b.gzbh(+)';
OpenSql(Query1,tt); SetLength(one_level,Query1.RecordCount); while Not Query1.Eof do
begin
c:=TreeView1.Items.AddChild(tmp,Query1.FieldByname('gzmc').AsString);
if Query1.FieldByName('cc').AsString='' then
begin
c.SelectedIndex:=2;
c.ImageIndex:=2;
end else
begin
c.ImageIndex:=1;
c.SelectedIndex:=1;
end;
one_level[i]:=Query1.FieldByName('gzbh').AsString;
c.Data:=Pointer(one_level[i]);
i:=i+1;
Query1.Next;
end; querysql:= 'select a.gzbh,a.gzmc,b.gzbh cc from RDGZML a,SB_MAN_GZ b where '
+' length(a.gzbh)=4 and a.gzbh=b.gzbh(+) and substr(a.gzbh,1,2)=''%s'''; tt:='select gzbh from rdgzml where length(gzbh)=4';
OpenSql(query1,tt);
SetLength(two_level,Query1.RecordCount); i:=0;
c:=tmp.getFirstChild;
if c=nil then exit; tt:=Format(querysql,[String(c.data)]);
OpenSql(Query1,tt);
while not Query1.Eof do
begin
d:=TreeView1.Items.AddChild(c,Query1.FieldByname('gzmc').AsString);
if Query1.FieldByName('cc').AsString='' then
begin
d.SelectedIndex:=2;
d.ImageIndex:=2;
end else
begin
d.ImageIndex:=1;
d.SelectedIndex:=1;
end;
two_level[i]:=Query1.FieldByName('gzbh').AsString;
d.Data:=Pointer(two_level[i]);
i:=i+1;
Query1.Next;
end;
c:=tmp.GetNextChild(c);
while c<>nil do
begin
tt:=Format(querysql,[String(c.data)]);
OpenSql(Query1,tt);
while not Query1.Eof do
begin
d:=TreeView1.Items.AddChild(c,Query1.FieldByname('gzmc').AsString);
if Query1.FieldByName('cc').AsString='' then
begin
d.SelectedIndex:=2;
d.ImageIndex:=2;
end else
begin
d.ImageIndex:=1;
d.SelectedIndex:=1;
end;
two_level[i]:=Query1.FieldByName('gzbh').AsString;
d.Data:=Pointer(two_level[i]);
i:=i+1;
Query1.Next;
end;
c:=tmp.GetNextChild(c);
end;
end;procedure Tfrm_gz_setup.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
i:integer;
tt:string;
begin
inherited;
{if node.Level<>0 then
begin
tt:=string(node.data);
Query1.Close;
Query1.Sql.Text:='select gzbh from SB_MAN_GZ where gzbh='''+tt+'''';
Query1.Open;
if Query1.FieldByName('gzbh').AsString='' then
Node.ImageIndex:=2
else
Node.ImageIndex:=1;
end; }
end;procedure Tfrm_gz_setup.TreeView1DblClick(Sender: TObject);
var
gzbh,tt:string;
Node,c:TTreeNode;
begin
inherited;
Node:= TreeView1.Selected;
if Node=nil then exit;
if Node.Level=1 then
begin
gzbh:=string(Node.data);
if Node.ImageIndex=1 then //表示开始选择,现在去掉
begin
tt:='delete from SB_MAN_GZ where gzbh like'''+gzbh+'%''';
ExecSqlEX(tt);
Node.ImageIndex:=2;
Node.SelectedIndex:=2;
c:=Node.getFirstChild;
if c=nil then exit;
c.ImageIndex:=2;
c.SelectedIndex:=2;
c:=Node.GetNextChild(c);
while c<>NIl do
begin
c.ImageIndex:=2;
c.SelectedIndex:=2;
c:=Node.GetNextChild(c)
end;
end else //没有选择,现在增加
begin
tt:='insert into SB_MAN_GZ select gzbh from rdgzml where gzbh like '''+gzbh+'%'''
+' and gzbh not in (select gzbh from SB_MAN_GZ)';
ExecSqlEX(tt); Node.ImageIndex:=1;
Node.SelectedIndex:=1; c:=Node.getFirstChild;
if c=nil then exit;
c.ImageIndex:=1;
c.SelectedIndex:=1;
c:=Node.GetNextChild(c);
while c<>NIl do
begin
c.ImageIndex:=1;
c.SelectedIndex:=1;
c:=Node.GetNextChild(c)
end;
end;
end; if Node.Level=2 then
begin
gzbh:=string(Node.data);
if Node.ImageIndex=1 then //表示开始选择,现在去掉
begin
tt:='delete from SB_MAN_GZ where gzbh='''+gzbh+'''';
ExecSqlEX(tt);
Node.ImageIndex:=2;
Node.SelectedIndex:=2;
end else //没有选择,现在增加
begin
tt:='select gzbh from SB_MAN_GZ where gzbh='''+gzbh+'''';
OpenSql(Query1,tt);
if Query1.FieldByName('gzbh').AsString='' then
begin
tt:='insert into SB_MAN_GZ values('''+gzbh+''')';
ExecSqlEX(tt);
end;
Node.ImageIndex:=1;
Node.SelectedIndex:=1;
end;
end;
end;end.
请你给出SetLength, OpenSql的实现代码!谢谢!
Add_group: TAdd_group;
Cur_Left,Cur_Top,Cur_Right,Cur_Bottom:Integer;
Cur_Node,Old_Node:TTreeNode;
Cur_StateIndex:Integer;
G_GroupID:Integer;
//上面是定义的全局变量 procedure TAdd_group.tBSW_treeView1Change(Sender: TObject;
Node: TTreeNode);
begin
Cur_Node := Node;
Cur_Left := Node.DisplayRect(True).Left;
Cur_Top := Node.DisplayRect(True).Top;
Cur_Right := Node.DisplayRect(True).Right;
Cur_Bottom := Node.DisplayRect(True).Bottom;
Cur_StateIndex := Node.StateIndex;
end;procedure TAdd_group.tBSW_treeView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
Parent_Node,Pri_Node:TTreeNode;
i_loop :integer;
i_Sum:integer;
begin
if (X>Cur_Left -16) and (X <Cur_Left) and (Y >Cur_Top) and (Y<Cur_Top+ 16) then
begin
if Cur_Node.HasChildren then
begin
//设置状态
if Cur_Node.StateIndex = 1 then
Cur_Node.StateIndex := 2
else
Cur_Node.StateIndex := 1;
Cur_StateIndex := Cur_Node.StateIndex;
//////////
Pri_Node := Cur_Node.getFirstChild;
Pri_Node.StateIndex := Cur_StateIndex;
for i_loop := 1 to Cur_Node.Count -1 do
begin
Pri_Node := Pri_Node.GetNext;
Pri_Node.StateIndex := Cur_StateIndex;
end; end
else
begin
if Cur_Node.StateIndex = 1 then
Cur_Node.StateIndex := 2
else
Cur_Node.StateIndex := 1;
Cur_StateIndex := Cur_Node.StateIndex;
try
Parent_Node := Cur_Node.Parent;
i_Sum := 0;
Pri_Node := Parent_Node.getFirstChild;
if Pri_Node.StateIndex = 2 then i_Sum := i_Sum + 1;
for i_loop := 1 to Parent_Node.Count -1 do
begin
Pri_Node := Pri_Node.GetNext;
if Pri_Node.StateIndex = 2 then i_Sum := i_Sum + 1;
end;
if i_Sum = Parent_Node.Count then
Parent_Node.StateIndex := 2
else
if i_Sum = 0 then
Parent_Node.StateIndex := 1
else
Parent_Node.StateIndex := 3;
except
end;
end;
Old_Node.Selected := True;
exit;
end;
if (x>Cur_left) and (x<Cur_right) and (y>Cur_top) and (y<Cur_Bottom) then
Old_Node := Cur_Node;end;在Change的时候记录信息,在MouseDown的时候判断鼠标点在字上还是前面的图片做的复选框
图片1是空的,图片2是代表全选了,图片3代表子节点中至少有一个没选,这个是操作的时候的代码,初始化的代码如果要的话,我也可以发给你看
谢谢!
急用