📄 addtree.pas
字号:
unit addTree;
interface
uses
Windows, Forms, DB, ADODB, BusinessSkinForm, StdCtrls, bsSkinCtrls, Controls,
ExtCtrls, Menus, ComCtrls, bsSkinTabs, Classes, SysUtils, Grids, DBGridEh;
type
TFormAddTree = class(TForm)
bsBusinessSkinForm1: TbsBusinessSkinForm;
bsSkinPageControl1: TbsSkinPageControl;
bsSkinTabSheet1: TbsSkinTabSheet;
bsSkinToolBar1: TbsSkinToolBar;
bsSkinBevel1: TbsSkinBevel;
SBAdd: TbsSkinSpeedButton;
SBDel: TbsSkinSpeedButton;
sbSave: TbsSkinSpeedButton;
SBCancel: TbsSkinSpeedButton;
bsSkinBevel2: TbsSkinBevel;
SBExit: TbsSkinSpeedButton;
bsSkinBevel3: TbsSkinBevel;
cdsAdd: TADODataSet;
dsAdd: TDataSource;
bsSkinStdLabelDbStatus: TbsSkinStdLabel;
SBFlash: TbsSkinSpeedButton;
cdsTree: TADODataSet;
bsSkinTabSheet2: TbsSkinTabSheet;
dgMain: TDBGridEh;
bsSkinSplitter1: TbsSkinSplitter;
bsSkinTreeView1: TbsSkinTreeView;
procedure SBExitClick(Sender: TObject);
procedure SBAddClick(Sender: TObject);
procedure SBDelClick(Sender: TObject);
procedure sbSaveClick(Sender: TObject);
procedure SBCancelClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure dsAddStateChange(Sender: TObject);
procedure SBFlashClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure bsSkinTreeView1Click(Sender: TObject);
procedure dgMainTitleBtnClick(Sender: TObject; ACol: Integer;
Column: TColumnEh);
private
{ Private declarations }
procedure ReBuildFullTreeView; // 重建树, 显示全部节点
public
{ Public declarations }
wiTable, wiPkey, wiFather, wiLabel : String;
// 表名,主健字段,父字段,标签字段
wbPkInt : Boolean; // 主健是否为数值类型
end;
type
PDataPK = ^TDataPK; // 定义一个结构体,用于记录节点主健
TDataPK = record
pkInt : Integer; // integer类型主健
pkStr : string; // string类型主健
bChildAdded : Boolean; // 子节点已经增加
end;
var
FormAddTree: TFormAddTree;
implementation
uses
dm;
{$R *.dfm}
procedure TFormAddTree.SBExitClick(Sender: TObject);
begin
close;
end;
procedure TFormAddTree.FormCreate(Sender: TObject);
begin
//wiTable, wiPkey, wiFather, wiLabel
// 表名,主健字段,父字段,标签字段
wiTable := '地区';
wiPkey := '地区编号';
wiFather := '上级地区';
wiLabel := '地区名称';
wbPkInt := False;
end;
procedure TFormAddTree.FormShow(Sender: TObject);
var
sSQL : String;
begin
bsSkinPageControl1.TabIndex := 0;
with cdsAdd do
begin
if Active then Close;
sSQL := 'select * from ' + wiTable + ' order by 层次路径';
CommandText := sSQL;
Open;
end;
ReBuildFullTreeView;
end;
procedure TFormAddTree.SBAddClick(Sender: TObject);
begin // 增加
bsSkinPageControl1.TabIndex := 0;
if (not cdsAdd.Active) then
cdsAdd.Open;
cdsAdd.Append;
end;
procedure TFormAddTree.SBDelClick(Sender: TObject);
begin // 删除
if not cdsAdd.Active then Exit;
if cdsAdd.RecordCount <=0 then Exit;
if (dbs.ShowMsgDlgCfm('警告', '本操作将删除当前一条记录,删除后无法恢复,是否继续?') = mrYES) then
begin
cdsAdd.Delete;
SBFlash.ButtonClick;
end;
end;
procedure TFormAddTree.sbSaveClick(Sender: TObject);
begin // 保存
if dsAdd.State in [dsInsert, dsEdit] then
dbs.PostWithError(cdsAdd);
if not (dsAdd.State in [dsInsert, dsEdit]) then
dbs.ShowMsgDlgInf('当前数据已保存!');
end;
procedure TFormAddTree.SBCancelClick(Sender: TObject);
begin // 取消
if dsAdd.State in [dsInsert, dsEdit] then
cdsAdd.Cancel;
end;
procedure TFormAddTree.dsAddStateChange(Sender: TObject);
begin //
if (dsAdd.State in [dsEdit]) then
bsSkinStdLabelDbStatus.Caption := '编辑状态'
else
if (dsAdd.State in [dsInsert]) then
bsSkinStdLabelDbStatus.Caption := '增加状态'
else
bsSkinStdLabelDbStatus.Caption := '普通状态';
end;
procedure TFormAddTree.SBFlashClick(Sender: TObject);
begin
cdsAdd.Requery;
// 刷新树
ReBuildFullTreeView;
end;
procedure TFormAddTree.ReBuildFullTreeView; // 重建树, 显示全部节点
var
sSQL, sTmpLabel : String;
fartherTreeNode, currentTreeNode : TTreeNode; // 父节点,当前节点
lastLevel, currentLevel : Integer; // 最后,当前节点层次
nodePK : PDataPK; // 数据
procedure GetFatherTreeNode;
var
iTmp : Integer;
begin
if currentLevel = 1 then // 回到根节点
begin
fartherTreeNode := nil;
Exit;
end;
if currentLevel = lastLevel then // 等于的话相当于同一节点
fartherTreeNode := fartherTreeNode.Parent // 上一级节点
else // 回到上几级节点
begin
iTmp := lastLevel - currentLevel;
while (iTmp >= 0) do
begin
fartherTreeNode := fartherTreeNode.Parent;
iTmp := iTmp - 1;
end;
end;
end;
begin
fartherTreeNode := nil; // 缺省父节点为根节点
lastLevel := 1; // 缺省最后节点层次为1
bsSkinTreeView1.Items.Clear; // 清空树节点记录
//wiTable, wiPkey, wiFather, wiLabel
// 表名,主健字段,父字段,标签字段
// SELECT 地区编号,地区名称,上级地区,层次 FROM 地区 order by 层次路径
with cdsTree do
begin
if Active then Close;
sSQL := 'select ' + wiPkey + ',' + wiLabel + ',层次 from ' + wiTable + ' order by 层次路径';
CommandText := sSQL;
Open;
while not eof do
begin
if not FindField('层次').IsNull then // 得到层次
currentLevel := FindField('层次').Value
else
currentLevel := 1;
if not FindField(wiLabel).IsNull then // 得到显示标签
sTmpLabel := FindField(wiLabel).Value
else
sTmpLabel := '(无名称)';
New(nodePK); // 设置数据项
if wbPkInt then
begin
nodePK^.pkInt := FindField(wiPkey).Value;
nodePK^.pkStr := '';
end
else
begin
nodePK^.pkInt := 0;
nodePK^.pkStr := FindField(wiPkey).Value;
end;
nodePK^.bChildAdded := False;
GetFatherTreeNode;
// 增加节点
currentTreeNode := bsSkinTreeView1.Items.AddChildObject(fartherTreeNode, sTmpLabel, nodePK);
fartherTreeNode := currentTreeNode;
lastLevel := currentLevel;
Next;
end;
end;
end;
procedure TFormAddTree.bsSkinTreeView1Click(Sender: TObject);
var
iTmp : Integer;
sTmp : String;
begin
if bsSkinTreeView1.Items.Count = 0 then
Exit;
iTmp := PDataPK(bsSkinTreeView1.Selected.Data)^.pkInt;
sTmp := PDataPK(bsSkinTreeView1.Selected.Data)^.pkStr;
if wbPkInt then
cdsAdd.Locate(wiPkey, iTmp, [])
else
cdsAdd.Locate(wiPkey, sTmp, []);
end;
procedure TFormAddTree.dgMainTitleBtnClick(Sender: TObject; ACol: Integer;
Column: TColumnEh);
begin
// 排序
with ((Sender as TDBGridEh).DataSource.DataSet as TADODataSet) do
begin
if Active then
if (not FieldByName(Column.FieldName).IsBlob) and
(not (FieldByName(Column.FieldName).FieldKind = fkCalculated)) then
begin
if Column.Title.SortMarker = smDownEh then
Sort := Column.FieldName
else
Sort := Column.FieldName + ' DESC';
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -