📄 fframcommclass.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 + -