Listview有一Checkboxes属性,设置为TRUE就会显示出一个CHECKBOX
解决方案 »
- 急急急--- 单击Form1的Button,在Form2上生成Button?
- 简单SQL语句,老是查询不出正确结果。。。。。。
- 在线等,如何把字符串转为类似date函数的值
- 菜鸟提个老问题(在线等待...............)
- 高分求助,如果能解决再加100分(一次给不了更多的分)谢谢各位了!
- 例程代码运行时,出现动态连接库和内存地址读取错误,帮帮菜鸟?
- 为什么ClientDataSet只能升序排序
- 怎么判断终端下的鼠标键盘时候空闲?!
- 如何自动更新C/S结构的客户端程序?
- 在98,NT下怎样读取端口(并行口)寄存器数据。
- 如何在delphi中捕捉错误、捕捉后想显示定制的信息
- 我有五六个问题,实在是结不了分。因为回答不甚满意,没有那种一锤定音的回答。有些遗憾。
---------------------------------------------------------------
图层 可视 可编辑 可选
---------------------------------------------------------------河流 checkbox[1] checkbox[2] checkbox[3]
道路 checkbox[1] checkbox[2] checkbox[3]
var
R : TRect;
Widths : array of Integer;
I,Count : Integer;
CheckBox : TCheckBox;
CheckBox1: TCheckBox;
begin
Count := ListView1.Columns.Count;
SetLength(Widths,Count);
for I := 0 to Count -1 do
Widths[I] := ListView1.Columns[I].Width;
R := self.ListView1.Items[1].DisplayRect(drBounds); R.Left := widths[1] + 2;
Dec(R.Bottom,2);
Dec(R.Top,2);
R.Right := Widths[0] + widths[1] - 2;
CheckBox := TCheckBox.Create(Self);
CheckBox.Parent := ListView1;
CheckBox.BoundsRect := R;
R.Left := widths[0] + widths[1] + 2;
R.Right := widths[0] + widths[1] + widths[2] - 2;
CheckBox1 := TCheckBox.Create(self);
CheckBox1.Parent := ListView1;
CheckBox1.BoundsRect := R;
end;
这是个非常简单的例子,实际上我把R的范围硬性编码了,这样不好,你修改一下,最好将代码放到OnDraw事件中去。
TTreeView的结点如何具有CheckBox?
TreeView有个Images属性,做三张小图片:
全选中、部分选中、不选状态(直接拍下CheckBox三种状态的图片在加工一下就可以了),然后在点击事件中根据具体情况设置TTreeNodes的ImageIndex就OK了。
重载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;
谁能帮我解释一下上面例子。我有好多不懂。
我再加100分求上面treeview的解释。up
直接设置TreeView的节点TreeNode的StateImageIndex就可以了。它对应的StateImages为一个TImageList,且里面有三张图片,分别表达选中,部分选中,不选中三种状态即可。//设置一个节点的状态为选中TreeNode := TreeView.Selected;
if TreeNode <> nil then
node.StateIndex := 0;//同样可以设置为不选中TreeNode := TreeView.Selected;
if TreeNode <> nil then
node.StateIndex := 2;//部分选中TreeNode := TreeView.Selected;
if TreeNode <> nil then
node.StateIndex := 1;很简单吧!如果不想用StateImages(有时候可能看起来不大漂亮),也可以用ImageIndex和SelectedIndex.注意控制就可以了。
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;
谁能帮我解释一下?另有高分相送。
重载了创建参数,其他的几个接口很简单阿!很容易懂的,
function IsNodeChecked(Node :TTreeNode) :Boolean;
检测节点是否被选中,
procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);
设置节点的选择状态!
人家问的是listview,你们却贴treeview的。
使用简单使用就行了!
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;
这样可以做很多的有趣东西!!!