⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbtreeview.pas

📁 自己写的delphi treeView控件含demo
💻 PAS
📖 第 1 页 / 共 2 页
字号:
                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 + -