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

📄 addtree.pas

📁 客户档案管理-delphi开发
💻 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 + -