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

📄 ldqlb.~pas

📁 不完备信息的数据发现
💻 ~PAS
字号:
unit ldqlb;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, Db, DBTables, Grids, DBGrids, StdCtrls, Buttons, Mask, DBCtrls,
  ExtCtrls, DBClient, ADODB;

type
  Tldqlbf = class(TForm)
    DS_dqlb: TDataSource;
    Panel_xg: TPanel;
    Label2: TLabel;
    DBEdit_dqmc: TDBEdit;
    Label1: TLabel;
    DBEdit_dqbh: TDBEdit;
    Treeview_dqlb: TTreeView;
    Splitter2: TSplitter;
    Label_bmgz: TLabel;
    Label3: TLabel;
    Panel_top: TPanel;
    SB_insert: TSpeedButton;
    SB_delete: TSpeedButton;
    SB_edit: TSpeedButton;
    SB_save: TSpeedButton;
    SB_exit: TSpeedButton;
    Bevel1: TBevel;
    SB_cancel: TSpeedButton;
    Q_dqlb: TADOQuery;
    procedure FormShow(Sender: TObject);
    procedure SB_exitClick(Sender: TObject);
    procedure SB_insertClick(Sender: TObject);
    procedure SB_editClick(Sender: TObject);
    procedure SB_deleteClick(Sender: TObject);
    procedure SB_saveClick(Sender: TObject);
    procedure DBEdit_dqbhEnter(Sender: TObject);
    procedure DBEdit_dqbhKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DBEdit_dqbhExit(Sender: TObject);
    procedure SB_cancelClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Treeview_dqlbChange(Sender: TObject; Node: TTreeNode);
  private
    { Private declarations }
  public
    { Public declarations }
   procedure setfieldmask(Smask:boolean);//设置掩码格式
   function GetNodeLevel(sFormat,sCode:string):integer;//获取节点级数
   procedure UpdateTree(curNode:TTreenode; nodeTxt:string; state:string);//更新树
   procedure Dingwei;//定位
   function GetFieldFormat:boolean;
  end;

var
  ldqlbf: Tldqlbf;
  cTreeCodeFormat:string='22222';
  mynode:array[0..6] of TTreenode;
  curid,mystate,oldlbbh:string;
  curnode:TTreeNode;
  curlevel:integer;
  lbbh1,lbmc1:string;

implementation
uses DM,main_page;
{$R *.DFM}

//分析输入的编码格式是否合法
function Tldqlbf.GetFieldFormat:boolean;
var strlen,i:integer;
begin
  //分析编号是否含有空格
  if pos(' ',DBEdit_dqbh.Text)<>0 then
  begin
    result:=false;
    exit;
  end;
  //判断编码是否符合cTreeCodeFormat规范
  Strlen:=0;
  for i:=1 to length(cTreeCodeFormat) do
  begin
    Strlen:=Strlen+strtoint(cTreeCodeFormat[i]);
    if length(trim(DBEdit_dqbh.Text))=Strlen then
    begin
      result:=true;
      exit;
    end;
  end;
  result:=false;
end;

function Tldqlbf.GetNodeLevel(sFormat,sCode:string):integer;
var i,level,iLen:integer;
begin
  level:=-1;
  iLen:=0;
  if (sFormat<>'') and (sCode<>'') then
   for i:=1 to Length(sFormat) do //分析编码格式,找出当前代码层次
    begin
     iLen:=iLen+StrToInt(sFormat[i]);
     if Length(sCode)=iLen then
      begin
       level:=i;
       break;
      end;
    end;
  result:=level;
end;

procedure Tldqlbf.FormShow(Sender: TObject);
var lbbh,nodeTxt:string;
  level:integer;
  i,j:integer;
begin
  SB_save.Enabled:=False;
  SB_cancel.Enabled:=False;
  Panel_xg.enabled:=false;
  DBEdit_dqbh.enabled:=false;

  Q_dqlb.Close;
  Q_dqlb.SQL.Text:='select dqbh,dqmc FROM '+DatabaseName+'CG_dqlb order by dqbh';
  Q_dqlb.Open;
  Q_dqlb.First;

  //初始化变量
  Treeview_dqlb.Enabled:=True;
  Treeview_dqlb.Items.Clear;
  level:=0;
  //设置根节点
  mynode[level]:=Treeview_dqlb.items.add(Treeview_dqlb.TopItem,'地区类别');
  //遍历数据表,利用编码字段记录排序规律,依次添加树节点
  Q_dqlb.first;
   while not Q_dqlb.Eof do
    begin
     lbbh:=trim(Q_dqlb.FieldByName('dqbh').AsString);
     nodeTxt:=lbbh+'-'+trim(Q_dqlb.FieldByName('dqmc').AsString);
     level:=GetNodeLevel(cTreeCodeFormat,lbbh);

     //这里返回代码的层次数
     if level>0 then
      begin
       //增加下一节点时,用添加子节点的方法可轻松实现节点间的层次关系。
       //注意:这里的父节点是用当前节点的上一级节点mynode[level-1]
       mynode[level]:=Treeview_dqlb.items.addchild(mynode[level-1],nodeTxt);
      end;
     Q_dqlb.next;//下一条记录
    end;
    mynode[0].expand(False);
    dingwei;
    //设置编码规则显示
    Label_bmgz.Caption :='';
    for i:=1 to length(cTreeCodeFormat) do
     begin
      for j:=1 to strtoint(cTreeCodeFormat[i]) do
        Label_bmgz.Caption:=Label_bmgz.Caption+'*';
      Label_bmgz.Caption:=Label_bmgz.Caption+' ';
     end;
  //设置颜色
  Panel_top.Color:=color_top;
  Panel_xg.Color:=color_panel;
end;

procedure Tldqlbf.UpdateTree(curNode:TTreenode; nodeTxt:string; state:string);
Begin
//以下过程在新增、删除、修改记录时,同步更新树形结构。
  if state='add' then
    begin
     curNode:=Treeview_dqlb.items.addchild(curNode,nodeTxt);
    end;
  if state='del' then  curNode.delete;
  if state='edi' then
   begin
    curNode.Text:=nodeTxt;
   end;
end;

procedure Tldqlbf.setfieldmask(sMask:boolean);
var i,j,level,nextbm:integer;
  maskstr:string;
  setfield:TField;
begin
  setfield:=Q_dqlb.fieldbyname('dqbh');
  //sMask为True时,允许设置掩码,否则不允许设置掩码
  if sMask<>true then
  begin
    setfield.EditMask:='';
    exit;
  end;

  maskstr:='';
  level:=GetNodeLevel(cTreeCodeFormat,curid);;
  if curid<>'' then
  begin
    if setfield.DataSet.State=dsInsert then
    begin   //插入状态
      j:=length(curid) ;    //j:当前节点编码长度
      nextbm:=strtoint(cTreeCodeFormat[level+1]); //nextbm:下一级编码长度
    end   else
    begin  //修改状态
      j:=length(curid)-strtoint(cTreeCodeFormat[level]);
      nextbm:=strtoint(cTreeCodeFormat[level]);
    end;
    for i:=1 to j do
     begin
      maskstr:=maskstr+'\'+curid[i];
     end;
    for i:=1 to nextbm do
     begin
      maskstr:=maskstr+'a'
     end;
    setfield.EditMask:='!'+maskstr;
  end else
  begin  //当前为根节点时编码长度
    for i:=1 to strtoint(cTreeCodeFormat[1]) do
     begin
      maskstr:=maskstr+'a'
     end;
    setfield.EditMask:='!'+maskstr;
  end;
end;

procedure Tldqlbf.dingwei;
var n:integer;
begin
  Treeview_dqlb.SetFocus;
  curnode:=Treeview_dqlb.Selected;
  curlevel:=Treeview_dqlb.Selected.Level;
  n:=pos('-',curnode.Text )-1;
  curid:=copy(curnode.text,1,n);
  Q_dqlb.Filter:='dqbh='+''''+curid+'''';
  Q_dqlb.Filtered:=true;
end;

procedure Tldqlbf.SB_exitClick(Sender: TObject);
begin
  close;
end;

procedure Tldqlbf.SB_insertClick(Sender: TObject);
begin
  if (curlevel<length(cTreeCodeFormat)) then
   begin
    ISinsert:=true;
    Q_dqlb.Filtered:=false;
    Q_dqlb.Insert;
    mystate:='add';
    //设置掩码格式
    setfieldmask(true);
    //按钮的控制:增加、删除、修改按钮变灰,保存取消按钮变实。
    SB_save.Enabled:=true;
    SB_cancel.Enabled:=true;
    SB_insert.Enabled:=false;
    SB_edit.Enabled:=false;
    SB_delete.Enabled:=false;
    Panel_xg.enabled:=true;
    //聚焦到类别编号,类别编号、类别名称可写。
    DBEdit_dqbh.Enabled:=True;
    DBEdit_dqbh.SetFocus;
   end;
end;

procedure Tldqlbf.SB_editClick(Sender: TObject);
var lbbh1:string;
begin
  mystate:='edi';
  //修改类别信息
  if curid<>'' then
   begin
    //修改时,修改按钮变灰,保存、取消按钮变实。
    SB_save.Enabled:=True;
    SB_cancel.Enabled:=true;
    SB_insert.Enabled:=false;
    SB_edit.Enabled:=false;
    SB_delete.Enabled:=false;
    Panel_xg.enabled:=true;
    lbbh1:=Q_dqlb.fieldbyname('dqbh').asstring;
    ISinsert:=false;
    Q_dqlb.Edit;
    oldlbbh:=DBEdit_dqbh.text;
   end;
end;

procedure Tldqlbf.SB_deleteClick(Sender: TObject);
var lbbh1:string;
begin
  if MessageBox(Handle,'是否删除地区信息?','提示信息', MB_ICONWARNING or MB_OKCANCEL )=IDOK then
   begin
    if Q_dqlb.IsEmpty then
      begin
        MessageBox(Handle,'没有记录可删除!','提示信息', MB_ICONINFORMATION or MB_OK);
        exit;
      end;
    if not Q_dqlb.IsEmpty then
     begin
       Q_dqlb.Delete;
       Q_dqlb.ExecSQL;
       curNode.delete;
     end;
  end;

end;

procedure Tldqlbf.SB_saveClick(Sender: TObject);
var nodetext:string;
begin
  //分析输入的编码格式是否合法
  if DBEdit_dqbh.Text<>'' then
   if GetFieldFormat=false then
    begin
      MessageBox(Handle,'地区编号错误!','提示信息', MB_ICONINFORMATION );
      if DBEdit_dqbh.Enabled then DBEdit_dqbh.SetFocus;
      exit;
    end;
  lbbh1:=DBEdit_dqbh.text;
  lbmc1:=DBEdit_dqmc.text;
  //保存
  try
   Q_dqlb.ExecSQL;
   if ErrorMessage<>'' then
    begin
      ErrorMessage:='';
      Q_dqlb.edit;
      exit;
    end;

   //更新树
   nodetext:=lbbh1+'-'+lbmc1;
   UpdateTree(curnode,nodetext,mystate);
   Treeview_dqlb.SetFocus;
   DBEdit_dqbh.enabled:=false;
   //按钮的控制:保存、取消按钮变灰,增加、删除修改按钮变实。
   SB_save.Enabled:=False;
   SB_cancel.Enabled:=False;
   SB_insert.Enabled:=true;
   SB_edit.Enabled:=true;
   SB_delete.Enabled:=true;
   Panel_xg.enabled:=false;
  //定位
  dingwei;
  //设置掩码格式
  setfieldmask(false);
  except
   //错误捕捉与处理
   on E:Exception do
    begin

    end;
  end;
end;

procedure Tldqlbf.DBEdit_dqbhKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=13 then //按的是回车键
   begin
    key:=0;
    perform(wm_nextdlgctl,0,0);
   end;
end;

procedure Tldqlbf.DBEdit_dqbhEnter(Sender: TObject);
begin
  dmf.ToEnter(Sender);
end;

procedure Tldqlbf.DBEdit_dqbhExit(Sender: TObject);
begin
  dmf.ToExit(Sender);
end;

procedure Tldqlbf.SB_cancelClick(Sender: TObject);
begin
  //取消操作
  Q_dqlb.CancelUpdates;
  DBEdit_dqbh.enabled:=false;
  //按钮的控制:增加、删除、修改按钮变实,保存取消按钮变灰。
  SB_save.Enabled:=False;
  SB_cancel.Enabled:=False;
  SB_insert.Enabled:=true;
  SB_edit.Enabled:=true;
  SB_delete.Enabled:=true;
  Panel_xg.enabled:=false;
  //重新定位
  dingwei;
  //设置掩码格式
  setfieldmask(False);
end;

procedure Tldqlbf.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Q_dqlb.close;
end;

procedure Tldqlbf.Treeview_dqlbChange(Sender: TObject; Node: TTreeNode);
begin
  //放弃修改
  Q_dqlb.CancelUpdates;
  DBEdit_dqbh.enabled:=false;
  //按钮的控制:保存取消按钮变灰,修改、增加、删除按钮变实。
  SB_save.Enabled:=False;
  SB_cancel.Enabled:=False;
  Panel_xg.enabled:=false;
  SB_insert.Enabled:=true;
  SB_edit.Enabled:=true;
  SB_delete.Enabled:=true;
  //定位
  dingwei;
  //设置掩码格式
  setfieldmask(false);
end;

end.

⌨️ 快捷键说明

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