接点如下:A--
|--B
|--C
|--D
|--E
|-F
现在想实现如下功能:1。多选
2。F,E,C和A只能选中一个。如果选中两个或以上需重新选。(既四个都不选中)。
|--B
|--C
|--D
|--E
|-F
现在想实现如下功能:1。多选
2。F,E,C和A只能选中一个。如果选中两个或以上需重新选。(既四个都不选中)。
解决方案 »
- delphi7怎么用ADO控件连接VFP的数据库文件
- 有谁知道TWizardNotebook控件是在哪个控件包的,急
- TDBGridE这个是那个组件里面的控件呀?
- 怎样在windows完成启动后锁定桌面和开始菜单以及任务档和任务管理器?但不能锁定键盘和鼠标?
- 一个窗体dock进一个panel后,按关闭按钮把窗体关闭,然后再show怎么就不出来呢?
- 请问下编写好的程序怎样进行打包
- 如何将一个sqlserver数据库中的所有表中的某一字段删除?
- 菜鸟求助
- 在什么地方可以下Delphi6新增加的帮助?在已经安装了UpdatePack 2以后如何安装Extreme Toys 里的InVokable?
- 有关数据窗体的DLL问题
- 我的delphi6.0 中的QuckiRep为什么没有帮助,Label有
- 请教几个问题
2、在onclick事件里面判断本次选中的结点和selection里面是不是有父子关系
.parent来...
2.在选中某个节点时,递归查找该节点的父节点和子节点是否被选中,有被选中就将相关节点的Selected都设为False
for i:=0 to TrvTaskList.SelectionCount-1 do
begin
showmessage(trim(IntToStr(Pmynode(TrvTaskList.Selections[i].Data).NodeID)));
showmessage(trim(IntToStr(Pmynode(TrvTaskList.Selections[i].Data).Nodejzq)));
showmessage(trim(IntToStr(Pmynode(TrvTaskList.Selections[i].Data).Nodecjj)));
end;
for i:=0 to TrvTaskList.SelectionCount-1 do
begin
case TrvTaskList.Selections[i].Level of
0: begin end;
1: begin
if TrvTaskList.Selections[i].Parent= nil then break;
if TrvTaskList.Selections[i].Parent.Selected= true then
begin
TrvTaskList.Selections[i].Parent.Selected:= false;
end;
end;
2: begin
if TrvTaskList.Selections[i].Parent= nil then break;
if TrvTaskList.Selections[i].Parent.Selected= true then
begin
TrvTaskList.Selections[i].Parent.Selected:= false;
end;
***********************************************************************************
if TrvTaskList.Selections[i].Parent.Parent= nil then break;
if TrvTaskList.Selections[i].Parent.Parent.Selected= true then
begin
***********************************************************************************
TrvTaskList.Selections[i].Parent.Parent.Selected:= false;
end;
end;
3: begin
if TrvTaskList.Selections[i].Parent= nil then break;
if TrvTaskList.Selections[i].Parent.Selected= true then
begin
TrvTaskList.Selections[i].Parent.Selected:= false;
end;
if TrvTaskList.Selections[i].Parent.Parent= nil then break;
***********************************************************************************
if TrvTaskList.Selections[i].Parent.Parent.Selected= true then
begin
***********************************************************************************
TrvTaskList.Selections[i].Parent.Parent.Selected:= false;
end;
***********************************************************************************
if TrvTaskList.Selections[i].Parent.Parent.Parent= nil then break;
if TrvTaskList.Selections[i].Parent.Parent.Parent.Selected= true then
begin
***********************************************************************************
TrvTaskList.Selections[i].Parent.Parent.Parent.Selected:= false;
end;
end;
else
end;
end;
着是代码。当选择节点的时候:先选子节点,后选父节点。
先选父节点,后选子节点。
带星号部分的代码会出错。因为当Selected:= false超做时。Parent的指针好象会释放掉。
不知道各位有什么好的方法解决。最好能贴出代码。
function TForm1.FindNodeParent(Node:TTreeNode):Boolean;
begin
Result:=false; if Node.Parent<>nil then
begin
Result:=FindNodeParent(Node.Parent);
end; if Node.Selected=true then
begin
TreeView1.Deselect(Node);
Result:=true;
end;
end;function TForm1.FindNodeChild(Node:TTreeNode):boolean;
var
i:integer;
begin
Result:=false; for i:=0 to Node.Count-1 do
begin
Result:=FindNodeChild(Node.Item[i]);
if Node.Item[i].Selected=true then
begin
TreeView1.Deselect(Node.Item[i]);
Result:=true;
end;
end;
end;procedure TForm1.TreeView1Click(Sender: TObject);
var
bFind:boolean;
begin
bFind:=false;
if TreeView1.SelectionCount>0 then
begin
if FindNodeChild(TreeView1.Selections[0]) then
bFind:=true;
if TreeView1.Selections[0].Parent<>nil then
if FindNodeParent(Treeview1.Selections[0].Parent) then
bFind:=true;
if bFind then
TreeView1.Deselect(TreeView1.Selections[0]);
end;
end;