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

📄 fframcommclass.pas

📁 财务软件:功能尚可,基于UML设计开发的delphi系统,文档齐全
💻 PAS
字号:
unit FframCommClass;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ComCtrls, ImgList, Menus, FCommClass,db,adodb,MakeCodeTree;

type
  TframCommClass = class(TFrame)
    tvClass: TTreeView;
    ilClass: TImageList;
    pmClass: TPopupMenu;
    mnAddClass: TMenuItem;
    mnDeleteClass: TMenuItem;
    procedure mnAddClassClick(Sender: TObject);
    procedure mnDeleteClassClick(Sender: TObject);
  private
    { Private declarations }
    vDBClass:TSQLCommClass;
    tc:TCodeTree;
    function AddNode(vParentCode,vCode,vName:String):Boolean;
    function AddTreeNode(vParentCode,vCode,vName:String):Boolean;
    function AddDBNode(vParentCode,vCode,vName:String):Boolean;
    function GetString(s,se:String;n:Integer):String;
  public
    { Public declarations }
    procedure SetConnectionString(vConnStr,vTypeName:String);
    procedure SetConnection(vCon:TADOConnection;vTypeName:String);
    function GetNodeCode(vNode:TTreeNode):String;
    function GetNodeName(vNode:TTreeNode):String;
    procedure BuildTree;
    function GetNode(vCode:String):TTreeNode;
  end;

const
  SepStr:string='-';

implementation

uses FfrmAddCommClass, MakeCodeTree;

{$R *.dfm}

function TframCommClass.AddDBNode(vParentCode,vCode, vName: String): Boolean;
begin
  vDBClass.AddClass(vParentCode,vCode, vName);
end;

function TframCommClass.AddNode(vParentCode,vCode, vName: String): Boolean;
begin
  if AddDBNode(vParentCode,vCode, vName) then
    AddTreeNode(vParentCode,vCode, vName)
  else
    MessageBox(Application.Handle,'写入数据失败!','提示信息',MB_ICONINFORMATION);
end;

function TframCommClass.AddTreeNode(vParentCode,vCode, vName: String): Boolean;
begin
  tvClass.Items.AddChild(GetNode(vParentCode),vCode+SepStr+vName);
end;

procedure TframCommClass.BuildTree;
var
  aDataSet:TDataSet;
begin
  aDataSet:=vDBClass.GetDataSet;
  tvClass.Items.Clear;
  aDataSet.First;
  with aDataSet do
  while not Eof do
  begin
    AddTreeNode(FieldByName('ParentID').AsString,FieldByName('ID').AsString,FieldByName('名称').AsString);
    next;
  end;
end;

function TframCommClass.GetNode(vCode: String): TTreeNode;
  function GetNodeByCode(vNode:TTreeNode;vCode:string):TTreeNode;
  var
    i:Integer;
  begin
    if vNode.HasChildren then
    begin
      //浏览本节点
      if GetNodeCode(vNode)=vCode then     //找到节点
      begin
         Result:=tvClass.Items[i];
         exit;
      end
      else
         Result:=nil;
      //浏览子节点
      for i:=0 to vNode.Count-1 do
      begin
        Result:=GetNodeByCode(vNode.Item[i],vCode);
        if Result<>nil then exit;
      end;
    end
    else //没有子节点
    if GetNodeCode(vNode)=vCode then     //找到节点
       Result:=tvClass.Items[i]
    else
       Result:=nil;
  end;
var
  i:Integer;
begin
  Result:=nil;
  if vCode='' then
    Result:=nil
  else
  begin
    for i:=0 to tvClass.Items.Count-1 do
    begin
      Result:=GetNodeByCode(tvClass.Items[i],vCode);
      //如果找到节点
      if Result<>nil then Break;
    end;
  end;
end;

function TframCommClass.GetNodeCode(vNode: TTreeNode): String;
begin
  Result:=GetString(vNode.text,SepStr,1);
end;

function TframCommClass.GetNodeName(vNode: TTreeNode): String;
begin
   Result:=GetString(vNode.text,SepStr,2);
end;

function TframCommClass.GetString(s, se: String; n: Integer): String;
var
  rs:String;
  i,j:Integer;
begin
  i:=0;
  rs:='';
  if n=1 then
  begin
    while s[i]<>se do
    begin
      rs:=rs+s[i];
      i:=i+1;
    end;
    result:=trim(rs);
    exit;
  end;
  j:=1;
  i:=0;
  rs:='';
  while j<>n do
  begin
    while s[i]<>se do i:=i+1;
    while s[i]=' ' do i:=i+1;
    I:=I+1;
    j:=j+1;
  end;
//  I:=I+1;
  while (s[i]<>se) and (i<=Length(s)) do
  begin
    rs:=rs+s[i];
    i:=i+1;
  end;
  result:=trim(rs);
  exit;
end;

procedure TframCommClass.mnAddClassClick(Sender: TObject);
var
  CurCode:String;
begin
  //检查选择的节点
  if tvClass.Selected=nil then CurCode:='' else CurCode:=GetNodeCode(tvClass.Selected);

  try
    //检查是否已存在窗体
    if not Assigned(frmAddCommClass) then
      frmAddCommClass:=TfrmAddCommClass.create(Application);
    //with TfrmAddCommClass.create(Application) do
    with frmAddCommClass do
    begin
      //设置父项的编码
      SetParentClassCode(CurCode);
      //显示并取返回状态
      //如果为确定
      if ShowModal=mrOK then
      begin
        AddNode(GetParentCode(),GetCode(),GetName());
      end;
    end;
  finally
    //释放窗体
    frmAddCommClass.Free;
    frmAddCommClass:=nil;
  end;
end;

procedure TframCommClass.mnDeleteClassClick(Sender: TObject);
begin
  if tvClass.Selected.HasChildren then
  begin
    MessageBox(Application.Handle,'有下级分类,不能删除!','提示信息',MB_ICONINFORMATION);
    exit;
  end
  else
  begin
     if vDBClass.DeleteClass(GetNodeCode(tvClass.Selected)) then
      tvClass.Items.Delete(tvClass.Selected);
  end;
end;

procedure TframCommClass.SetConnection(vCon:TADOConnection;vTypeName:String);
begin
  vDBClass:=TSQLCommClass.Create(vCon);
  vDBClass.TypeName:=vTypeName;
end;

procedure TframCommClass.SetConnectionString(vConnStr,vTypeName: String);
begin
  vDBClass:=TSQLCommClass.Create(vConnStr);
  vDBClass.TypeName:=vTypeName;
end;

end.

⌨️ 快捷键说明

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