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

📄 kmbmgl.pas

📁 这是一个用Delphi和access做的一个treeview控件的小练习 希望大家多指教
💻 PAS
字号:
unit kmbmgl;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, Buttons, DBCtrls, Mask, ExtCtrls, Grids, Math,
  DBGrids, DBTables, StrUtils, DB, ADODB, ComCtrls;

type
  TFkmbmgl = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    SBzq: TSpeedButton;
    SBfq: TSpeedButton;
    PopupMenu1: TPopupMenu;
    N2: TMenuItem;
    StatusBar1: TStatusBar;
    TreeView1: TTreeView;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    MainMenu1: TMainMenu;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    Label4: TLabel;
    Label5: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit3: TMaskEdit;
    N11: TMenuItem;
    N12: TMenuItem;
    N1: TMenuItem;
    N13: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure BgbClick(Sender: TObject);
    procedure SBzqClick(Sender: TObject);
    procedure SBfqClick(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure TreeView1Expanded(Sender: TObject; Node: TTreeNode);
    procedure TreeView1Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure PopupMenu1Popup(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
    procedure Edit4KeyPress(Sender: TObject; var Key: Char);
  private
  procedure Tadditem(Node: TTreeNode);
  procedure treechild(xnode:TTreeNode;bzf,lx:string);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Fkmbmgl: TFkmbmgl;
  _sjbh:string;
  xNode:TTreeNode;xgzt:boolean;
  _kmbmgz,_kmbmjb,oldkmbm,oldkmmc:string;
  oldsjmc,oldbmjb:integer;

implementation

uses dmu;

{$R *.dfm}
procedure TFkmbmgl.Tadditem(Node:TTreeNode);
VAR NodeA:TTreeNode;
    bsc:string;
begin
  dm.table1.Filtered:=false;
  dm.table1.Filter:='sjbm='+QuotedStr(copy(node.Text,1,POS(' ',node.Text)-1));
  dm.table1.Filtered:=true;
  dm.table1.first;
  while not dm.table1.eof do begin
    bsc:=trim(dm.table1.Fieldbyname('kmbm').AsString)+' '+trim(dm.table1.Fieldbyname('kmmc').AsString);
    NodeA:=treeview1.Items.Addchild(node,bsc);
    if not dm.table1.Fieldbyname('sjbz').asboolean then
       treeview1.Items.Addchild(nodeA,'temp');
    dm.table1.next;
  end;
  dm.table1.Filtered:=false;
end;

procedure TFkmbmgl.FormCreate(Sender: TObject);
var bsc:string;NodeA,Nodeb:TTreeNode;
begin
  caption:='科目编码管理'; //窗体标题
  _kmbmgz:='323';  //每级编码长度
  _kmbmjb:='3';    //编码级数
  treeview1.Items.Clear;
  dm.Table1.Open;
  dm.Table2.Open;
  dm.table2.First;
  while not dm.table2.Eof do
  begin
    bsc:=trim(dm.table2.Fieldbyname('kmlb').AsString)+' '+trim(dm.table2.Fieldbyname('kmlbmc').AsString);
    Nodeb:=treeview1.Items.Add(treeview1.Selected,bsc);
    dm.table1.Filtered:=false;
    dm.table1.Filter:='kmlb='+quotedstr(dm.table2.Fieldbyname('kmlb').AsString)+' and bmjb=1';
    dm.table1.Filtered:=true;
    dm.table1.first;
    while not dm.table1.eof do begin
      if dm.table1.Fieldbyname('bmjb').AsInteger=1 then
      begin
      bsc:=trim(dm.table1.Fieldbyname('kmbm').AsString)+' '+trim(dm.table1.Fieldbyname('kmmc').AsString);
      NodeA:=treeview1.Items.Addchild(nodeb,bsc);
      if not dm.table1.Fieldbyname('sjbz').asboolean then
         treeview1.Items.Addchild(nodeA,'temp');
    end;
      dm.table1.next;
    end;
    dm.table2.next;
  end;
  dm.table1.Filtered:=false;
  if treeview1.Items.Count>0 then xnode:=treeview1.Items[0];
  statusbar1.Panels[0].Text:='浏览';
  panel1.Enabled:=false;
end;

procedure TFkmbmgl.BgbClick(Sender: TObject);
begin
  close;
end;

procedure TFkmbmgl.SBzqClick(Sender: TObject);
var SavePlace: TBookmark;
  pNode:TTreeNode;
begin
  if (edit4.Text='') or (edit5.Text='') then
  begin
    showmessage('科目名称或拼音不能为空');
    exit;
  end;
  dm.table1.Edit;
  dm.table1.fieldbyname('kmbm').AsString:=edit3.Text;
  dm.table1.fieldbyname('kmmc').AsString:=edit4.Text;
  dm.table1.fieldbyname('kmpy').AsString:=edit5.Text;
  dm.table1.fieldbyname('xgsj').AsDateTime:=now;
  dm.table1.Post;
  xnode.Text:=trim(dm.table1.Fieldbyname('kmbm').AsString)+' '+trim(dm.table1.Fieldbyname('kmmc').AsString);
  dm.table1.Requery([]);
  panel2.Visible:=false;
  treeview1.Enabled:=true;
  TreeView1Click(Sender);
end;

procedure TFkmbmgl.treechild(xnode:TTreeNode;bzf,lx:string);
var pNode:TTreeNode;
begin
  TreeView1Expanded(TreeView1,xNode);
  pnode:=xnode.getFirstChild;
  while pnode<>nil do
  begin
    if (lx='-') and (pos(bzf,pnode.Text)>0) then
      pnode.Text:=copy(pnode.Text,1,pos(bzf,pnode.Text)-1);
    if (lx='+') and (pos(bzf,pnode.Text)<1) then
      pnode.Text:=pnode.Text+bzf;
    treechild(pnode,bzf,lx);
    pnode:=xnode.GetNextChild(pnode);
  end;
end;


procedure TFkmbmgl.SBfqClick(Sender: TObject);
begin
  panel2.Visible:=false;
  treeview1.Enabled:=true;
  TreeView1Click(Sender);
end;

procedure TFkmbmgl.N2Click(Sender: TObject);
var pnode:TTreenode;msql,sckmbm:string;
begin
  sckmbm:=oldkmbm;
  if MessageDlg('删除当前及其下级科目吗?'+
      chr(13)+chr(13)+sckmbm+
      chr(13)+chr(13)+oldkmmc,
      mtconfirmation,[mbyes,mbno],0)=mrno then exit;
  Pnode:=xnode.Parent;
  xnode.Delete;
  try
    msql:='delete from y_kmbmb where kmbm like'+quotedstr(trim(sckmbm)+'%');
    dm.ADOConnection1.Execute(msql);
    if (Pnode<>nil) and (Pnode.getFirstChild=nil) then
    begin
      msql:='update y_kmbmb set sjbz=1 where kmbm='+quotedstr(sckmbm);
      dm.ADOConnection1.Execute(msql);
    end;
  dm.table1.Requery([]);
  treeview1.Selected:=Pnode;
    MessageDlg('删除成功!',mtInformation,[mbok],0);
  except
    MessageDlg('删除失败!',mtError,[mbok],0);
  end;
  Xnode:=treeview1.Selected;
  TreeView1Click(Sender);
end;

procedure TFkmbmgl.FormDestroy(Sender: TObject);
var yebm,msql:string;
begin
  dm.table1.Close;
  dm.table2.Close;
end;

procedure TFkmbmgl.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=n10.Enabled;
end;

procedure TFkmbmgl.TreeView1Expanded(Sender: TObject; Node: TTreeNode);
var tempnode:TTreenode;
begin
 xNode:=Node;
 if (node.Count=1) then
   begin
    tempnode:=node.getFirstChild ;
    if (tempnode.text='temp') then
        BEGIN
         tempnode.Delete;
         Tadditem(node);
        END;
   END;
end;

procedure TFkmbmgl.TreeView1Click(Sender: TObject);
var pnode:TTreenode;pname:string;i:integer;
begin
  xgzt:=false;
  xnode:=treeview1.Selected;
  if (xnode=nil) or (xnode.Level=0) then
  begin
    edit1.Text:='';
    edit2.Text:='';
    edit3.Text:='';
    edit4.Text:='';
    edit5.Text:='';
    edit3.Enabled:=false;
    edit4.Enabled:=false;
    edit5.Enabled:=false;
    //最高层,非科目,不允许修改;
    exit;
  end;
  //属于科目,允许修改;
  edit4.Enabled:=true;
  edit5.Enabled:=true;
  dm.table1.Locate('kmbm',leftstr(xnode.Text,POS(' ',Xnode.Text)-1),[]);
  //定位
  oldbmjb:=dm.table1.fieldbyname('bmjb').AsInteger;
  oldkmmc:=dm.table1.fieldbyname('kmmc').AsString;
  oldkmbm:=dm.table1.fieldbyname('kmbm').AsString;
  oldsjmc:=0;
  for i:=1 to oldbmjb-1 do
    oldsjmc:=oldsjmc+strtoint(copy(_kmbmgz,i,1));
  //保存当前科目的原值
  pnode:=xnode;
  pname:='';
  while pnode.Level>1 do
  begin
    pnode:=pnode.Parent;
    if pname<>'' then
      pname:=trim(copy(pnode.Text,POS(' ',pnode.Text)+1,120))+'.'+pname
    else
      pname:=trim(copy(pnode.Text,POS(' ',pnode.Text)+1,120));
  end;
  if pnode.Level=1 then
    edit1.Text:=trim(copy(pnode.Parent.Text,3,40))
  else
    edit1.Text:=trim(copy(pnode.Text,3,40));
  edit2.Text:=pname;
  //找到并显示它的祖宗
  edit3.Text:=dm.table1.fieldbyname('kmbm').AsString;
  edit4.Text:=dm.table1.fieldbyname('kmmc').AsString;
  edit5.Text:=dm.table1.fieldbyname('kmpy').AsString;
end;

procedure TFkmbmgl.N4Click(Sender: TObject);
var sjb,x,sjmc,cs,i:integer;sbm,xbm,pbm,bsc:string;pnode:TTreenode;
begin
  //增加下级
  TreeView1Expanded(Sender,xNode);
  sjb:=xnode.Level+1;
  if sjb>strtoint(_kmbmjb) then exit;
  sjmc:=0;
  x:=strtoint(copy(_kmbmgz,sjb,1));
  if sjb=1 then
  begin
   sjmc:=1;
   x:=x-1;
  end
  else
  for i:=1 to sjb-1 do
    sjmc:=sjmc+strtoint(copy(_kmbmgz,i,1));
  sbm:=copy(xnode.Text,1,sjmc);
  cs:=strtoint(floattostr(power(10,x)))+1;
  //找到编号最大的儿子
  pnode:=xnode.getFirstChild;
  pbm:='0';
  while pnode<>nil do
  begin
    if copy(pnode.Text,sjmc+1,x)>pbm then
      pbm:=copy(pnode.Text,sjmc+1,x);
    pnode:=xnode.GetNextChild(pnode);
  end;
  xbm:=sbm+rightstr(inttostr(strtoint(pbm)+cs),x);
  //生成新编码
  try
    if sjb>1 then
    begin
      //把其上级科目的相关标志改为false;
      dm.table1.Locate('kmbm',sbm,[]);
      dm.table1.Edit;
      dm.table1.FieldByName('sjbz').AsBoolean:=false;
      dm.table1.Post;
    end;
    //写入新科目
    dm.table1.Append;
    dm.table1.FieldByName('kmbm').AsString:=xbm;
    dm.table1.FieldByName('kmmc').AsString:='XXXXXXXXXXXXX';
    IF SJB=1 THEN
      dm.table1.FieldByName('sjbm').AsString:=''
    ELSE
      dm.table1.FieldByName('sjbm').AsString:=sbm;
    dm.table1.FieldByName('kmlb').AsString:=copy(sbm,1,1);
    dm.table1.FieldByName('kmpy').AsString:='';
    dm.table1.FieldByName('bmjb').AsInteger:=sjb;
    dm.table1.FieldByName('sjbz').AsBoolean:=true;
    dm.table2.Locate('kmlb',copy(xbm,1,1),[]);
    dm.table1.FieldByName('yefx').AsString:=dm.table2.FieldByName('yefx').AsString;
    dm.table1.Post;
    bsc:=trim(dm.table1.Fieldbyname('kmbm').AsString)+' '+trim(dm.table1.Fieldbyname('kmmc').AsString);
    xnode:=treeview1.Items.AddChild(xnode,bsc);
    treeview1.Selected:=xnode;
  except
    MessageDlg('编码有错!',mtError,[mbok],0);
  end;
  TreeView1Click(Sender);
end;

procedure TFkmbmgl.N3Click(Sender: TObject);
var i,sjb,sjmc,x,cs:integer;sbm,xbm,pbm,bsc:string;pnode:TTreenode;
begin
  //增加同级
  xnode:=treeview1.Selected.Parent;
  pnode:=xnode;
  sjb:=xnode.Level+1;
  x:=strtoint(copy(_kmbmgz,sjb,1));
  sjmc:=0;
  for i:=1 to sjb-1 do
    sjmc:=sjmc+strtoint(copy(_kmbmgz,i,1));
  sbm:=copy(xnode.Text,1,sjmc);
  cs:=strtoint(floattostr(power(10,x)))+1;
  //找到编号最大的儿子
  pnode:=xnode.getFirstChild;
  pbm:='0';
  while pnode<>nil do
  begin
    if copy(pnode.Text,sjmc+1,x)>pbm then
      pbm:=copy(pnode.Text,sjmc+1,x);
    pnode:=xnode.GetNextChild(pnode);
  end;
  xbm:=sbm+rightstr(inttostr(strtoint(pbm)+cs),x);
  //生成新编码
  try
    dm.table1.Append;
    dm.table1.FieldByName('kmbm').AsString:=xbm;
    dm.table1.FieldByName('kmmc').AsString:='XXXXXXXXXXXXX';
    dm.table1.FieldByName('kmpy').AsString:='';
    dm.table1.FieldByName('yhzh').AsString:='';
    dm.table1.FieldByName('sjbz').AsBoolean:=true;
    IF SJB=1 THEN
      dm.table1.FieldByName('sjbm').AsString:=''
    ELSE
      dm.table1.FieldByName('sjbm').AsString:=sbm;
    dm.table1.FieldByName('kmlb').AsString:=copy(xbm,1,1);
    dm.table1.FieldByName('bmjb').AsInteger:=sjb;
    dm.table2.Locate('kmlb',copy(xbm,1,1),[]);
    dm.table1.FieldByName('yefx').AsString:=dm.table2.FieldByName('yefx').AsString;
    dm.table1.Post;
    bsc:=trim(dm.table1.Fieldbyname('kmbm').AsString)+' '+trim(dm.table1.Fieldbyname('kmmc').AsString);
    xnode:=treeview1.Items.AddChild(xnode,bsc);
    treeview1.Selected:=xnode;
  except
    MessageDlg('编码有错!',mtError,[mbok],0);
  end;
  TreeView1Click(Sender);
end;

procedure TFkmbmgl.PopupMenu1Popup(Sender: TObject);
begin
  //在菜单弹出前,确定哪些项目可以使用
    TreeView1Click(Sender);
    treeview1.Selected:=xnode;
    n2.Enabled:=false;
    n3.Enabled:=false;
    n4.Enabled:=false;
  if (xnode<>nil) then
  begin
    n2.Enabled:=(xnode.Level>0) ;
    n3.Enabled:=xnode.Level>0;
    n4.Enabled:=xnode.Level<strtoint(_kmbmjb);
  end;
end;

procedure TFkmbmgl.FormActivate(Sender: TObject);
begin
  Treeview1.SetFocus;
  TreeView1Click(Sender);
end;

procedure TFkmbmgl.N7Click(Sender: TObject);
begin
  n7.Enabled:=false;
  n8.Enabled:=true;
  n10.Enabled:=false;
  n11.Enabled:=false;
  panel1.Enabled:=true;
  Treeview1.PopupMenu:=PopupMenu1;
  statusbar1.Panels[0].Text:='修改';
end;

procedure TFkmbmgl.N8Click(Sender: TObject);
begin
  n7.Enabled:=true;
  n8.Enabled:=false;
  n10.Enabled:=true;
  n11.Enabled:=true;
  panel1.Enabled:=false;
  Treeview1.PopupMenu:=nil;
  statusbar1.Panels[0].Text:='浏览';
  statusbar1.Panels[1].Text:='';
end;

procedure TFkmbmgl.N10Click(Sender: TObject);
begin
  close;
end;

procedure TFkmbmgl.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  TreeView1Click(Sender);
end;

procedure TFkmbmgl.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
  panel2.Visible:=true;
  treeview1.Enabled:=false;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -