📄 ldqlb.~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 + -