📄 dbtreeview.pas
字号:
while not fdatasource.DataSet.Eof do
begin
try
curID:=trim(fdatasource.DataSet.FieldByName(FDataIdField).AsString);
nodeTxt:=curID+'-'+trim(fdatasource.DataSet.FieldByName(fdatalink.FieldName).AsString);
level:=GetNodeLevel(FTreeCodeFormat,curID);
except
ShowMessage(CurID+'/'+NodeTxt+'/'+inttostr(Level));
end;
//这里返回代码的层次数
if level-1>0 then
begin
//增加下一节点时,用添加子节点的方法可轻松实现节点间的层次关系
//注意:这里的父节点是用当前节点的上一级节点mynode[level-1]
mynode[level]:= items.addchild(mynode[level-1],nodeTxt);
if (fCheckFieldEnable) then
begin
if ( fdatasource.DataSet.FieldByName(fcheckfield).AsString=fcheckfieldvalue) then
begin
mynode[level].SelectedIndex:=0;
mynode[level].ImageIndex:=0
end else
begin
mynode[level].SelectedIndex:=1;
mynode[level].ImageIndex:=1;
end ;
end else
mynode[level].ImageIndex:=1;
end else
begin
mynode[level]:=items.add(topitem,nodeTxt);
if (fCheckFieldEnable) then
begin
if ( fdatasource.DataSet.FieldByName(fcheckfield).AsString=fcheckfieldvalue) then
begin
mynode[level].SelectedIndex:=0;
mynode[level].ImageIndex:=0
end else
begin
mynode[level].SelectedIndex:=1;
mynode[level].ImageIndex:=1;
end
end
else
mynode[level].ImageIndex:=1;
end;
fdatasource.DataSet.Next;//下一条记录
end;
end;
finally
//fdatasource.DataSet.Close;
End;
end;
// mynode[0].expand(False);
Screen.Cursor:=crDefault;
fdatasource.DataSet.First;
end;
procedure TDBtreeView.SetDataField(const Value: String);
begin
fdatalink.FieldName:=value;
end;
function TDBtreeView.GetDataIDField: string;
begin
result:=FDataIdfield;
end;
procedure TDBtreeView.SetDataIDField(const Value: string);
begin
FdataIDfield:=value;
end;
function TDBtreeView.GetTreeCodeFormat: string;
begin
result:=FtreecodeFormat;
end;
function TDBtreeView.GetTreeMaxLevel: integer;
begin
result:=FTreemaxlevel;
end;
function TDBtreeView.getTreeRootText: string;
begin
result:=FTreeRootText;
end;
procedure TDBtreeView.setTreeMaxLevel(const Value: integer);
begin
FtreeMaxlevel:=value;
end;
procedure TDBtreeView.setTreecodeFormat(const Value: string);
begin
FtreecodeFormat:=value;
end;
procedure TDBtreeView.setTreeRootText(const Value: string);
begin
FtreeRoottext:=value;
end;
function TDbtreeView.GetTreeDM(curNode:TTreeNode):string;//获得当前节点的编码
var
li_pos:integer;
bianma:string;
begin
li_pos:=pos('-',curNode.Text);
bianma:=MidStr(curNode.Text,1,li_pos-1);
result:=bianma;
end;
procedure TDBTreeView.CreateParams(var Params: TCreateParams);
begin
inherited;
if FshowCheckBox then
Params.Style:=Params.Style or TVS_CHECKBOXES;
{ TVS_CHECKBOXES declared in CommCtrl }
end;
function Tdbtreeview.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 Tdbtreeview.SetNodeChecked(Node :TTreeNode; Checked :Boolean);
const
TVIS_CHECKED = $2000;
var
TvItem :TTVItem;
//i,b,e:integer;
//Tn:TTreeNode;
begin
//设置为checkEd;
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;
{//设置Child的ChcekEd;
b:=Node.getFirstChild.Index;
e:=Node.GetLastChild.Index;
for i:=b to e do
begin
Tn:=Node.Item[i];
FillChar(TvItem, SizeOf(TvItem), 0);
with TvItem do
begin
hItem := TN.ItemId;
Mask := TVIF_STATE;
StateMask := TVIS_STATEIMAGEMASK;
if Checked then
TvItem.State :=TVIS_CHECKED
else
TvItem.State :=TVIS_CHECKED shr 1;
TreeView_SetItem(TN.TreeView.Handle, TvItem);
end;
end; }
end;
procedure Tdbtreeview.Change(Node: TTreeNode);
begin
inherited Change(Node);
OldState := IsNodeChecked(Node);
if self.TreeRootText='' then
fdatasource.DataSet.RecNo:=self.Selected.AbsoluteIndex+1
else if self.Selected.AbsoluteIndex>0 then fdatasource.DataSet.RecNo := self.Selected.AbsoluteIndex;
end;
procedure Tdbtreeview.Click;
var
NewState :Boolean;
// Bt:TTreeNode;
// Nt:TTreeNode;
// i:integer;
begin
inherited Click;
if self.Items.Count<=0 then exit;
NewState := IsNodeChecked(Self.Selected);
//更新子结点
If (Self.Selected.HasChildren) then
RecurseChildren(self.Selected.GetFirstChild,NewState);
if NewState = OldState then Exit;
if (NewState) and (Assigned(OnNodeChecked)) then
OnNodeChecked(self)
else
begin
if (not NewState) and (Assigned(OnNodeUnChecked)) then
OnNodeUnChecked(self);
end;
{for I:= Bt.IndexOf(bT) to Nt.IndexOf(nT) do
begin
Self.SetNodeChecked(self.Items[i],NewState);
end;
}
end;
function TDBtreeView.getFversion: string;
begin
result:=Fversion;
end;
function TDBtreeView.getFcheckfield: string;
begin
result:=fcheckfield;
end;
function TDBtreeView.getFcheckfieldvalue: string;
begin
result:=fcheckFieldvalue;
end;
procedure TDBtreeView.setfcheckfield(str: string);
begin
fcheckfield:=str;
end;
procedure TDBtreeView.setFcheckFieldvalue(str: string);
begin
fcheckfieldvalue:=str;
end;
procedure TDBtreeView.setVersion(str: string);
begin
fversion :=str;
end;
function TDBtreeView.getCheckFieldEnable: boolean;
begin
result:=fCheckFieldEnable;
end;
procedure TDBtreeView.setCheckFieldEnable(b: boolean);
begin
fCheckFieldEnable:=b;
end;
procedure TDBtreeView.RecurseChildren(Node: TTreeNode;
NodeChecked: Boolean);
begin
while Node <> nil do
begin
Self.SetNodeChecked(Node,NodeChecked);
if Node.GetFirstChild <> nil then
RecurseChildren( Node.GetFirstChild, NodeChecked );
Node := Node.GetNextSibling;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -