📄 dbtreeview.pas
字号:
unit DbTreeView;
interface
uses
SysUtils, Classes, Controls, ComCtrls,DB, DBClient, remotedataset,
ImgList,StrUtils,dialogs;
type
TDbTreeView = class(TTreeView)
private
FClassCodeFieldName:string; //级别字段
FClassStep:integer;
FClassNameFieldName:string; //级别名称字段
FClassEndFieldName:string; //末级字段(boolean)
FRemoteDataSet:TRemoteDataSet;
class_list:Tstringlist;
class_listcode:Tstringlist;
FTableName:string;
FSelectDataSet:TRemoteDataSet;
procedure setclasscode(value:string);
procedure setclassname(value:string);
procedure setclassstep(value:integer);
procedure setclassend(value:string);
procedure setdataset(Value:TRemoteDataSet);
procedure settablename(value:string);
//procedure OnChange(Sender: TObject; Node: TTreeNode);
{ Private declarations }
protected
{ Protected declarations }
public
function GetSelectedClassCode:string;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure AddClass(ClassName:string);
procedure EditClass(NewClassName:string);
procedure DeleteClass;
procedure ShowClassTree;
procedure ShowSelectDb;
{ Public declarations }
published
property ClassCodeFieldName:string read FClassCodeFieldName write setclasscode;
property ClassNameFieldName:string read FClassNameFieldName write setclassname;
property ClassEndFieldName:string read FClassEndFieldName write setclassend;
property ClassStep:integer read FClassStep write setclassstep;
property RemoteDataSet:TRemoteDataSet read FRemoteDataSet write setdataset;
property TableName:string read FTableName write settablename;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('DbAnyWhere', [TDbTreeView]);
end;
constructor TDbTreeView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
class_list:=Tstringlist.Create;
class_listcode:=Tstringlist.Create;
end;
destructor TDbTreeView.Destroy;
begin
inherited Destroy;
freeandnil(class_list);
freeandnil(class_listcode);
end;
procedure TDbTreeView.setclasscode(value:string);
begin
FClassCodeFieldName:=value;
end;
procedure TDbTreeView.setclassname(value:string);
begin
FClassNameFieldName:=value;
end;
procedure TDbTreeView.setclassstep(value:integer);
begin
FClassStep:=value;
end;
procedure TDbTreeView.setclassend(value:string);
begin
FClassEndFieldName:=value;
end;
procedure TDbTreeView.setdataset(Value:TRemoteDataSet);
begin
FRemoteDataSet:=value;
end;
procedure TDbTreeView.settablename(value:string);
begin
FTableName:=value;
end;
procedure TDbTreeView.AddClass(ClassName:string);
var
max_code:string;
new_code:string;
begin
//判断
if length(trim(classname))=0 then
begin
showmessage('名称不能够为空!');
exit;
end;
//开始没有任何栏目的时候呢?
if self.Selected.HasChildren then
begin
max_code:=rightstr(class_listcode.strings[self.Selected.GetLastChild.AbsoluteIndex],4);
new_code:=class_listcode.strings[self.Selected.AbsoluteIndex]+
stringofchar('0',4-length(inttostr(strtoint(max_code)+1)))+
inttostr(strtoint(max_code)+1);
//存在下级都可以增加
self.FRemoteDataSet.Remoteclose;
self.FRemoteDataSet.RTSQL.Text:='insert into '+FTableName+'('+FClassCodeFieldName+','+
FClassEndFieldName+','+FClassNameFieldName+') values('+
''''+new_code+''','+
'0,'+
''''+classname+''')';
self.FRemoteDataSet.RemoteExeSQL;
if length(trim(classname))>0 then
begin
self.Items[self.Selected.AbsoluteIndex].ImageIndex:=1;
self.Items[self.Selected.AbsoluteIndex].SelectedIndex:=1;
if self.FRemoteDataSet.success then self.Items.AddChild(self.Selected,classname);
self.Items[self.Selected.GetLastChild.AbsoluteIndex].ImageIndex:=2;
self.Items[self.Selected.GetLastChild.AbsoluteIndex].SelectedIndex:=3;
end;
//维护class_listcode列表
class_listcode.Add(new_code);
class_listcode.Sort;
end else
begin
new_code:=class_listcode.strings[self.Selected.AbsoluteIndex]+stringofchar('0',FClassStep-1)+'1';
//判断非末级类别的增加有无详细信息,有则不允许增加
self.FRemoteDataSet.Remoteclose;
self.FRemoteDataSet.RTSQL.Text:='select * from '+FTableName+' where left('+FClassCodeFieldName+','+
inttostr(length(class_listcode.Strings[self.Selected.AbsoluteIndex]))+
')='''+class_listcode.Strings[self.Selected.AbsoluteIndex]+''''+
' and '+FClassEndFieldName+'=1';
self.FRemoteDataSet.RemoteOpen;
if self.FRemoteDataSet.RecordCount=0 then
begin
self.FRemoteDataSet.Remoteclose;
self.FRemoteDataSet.RTSQL.Text:='insert into '+FTableName+'('+FClassCodeFieldName+','+
FClassEndFieldName+','+FClassNameFieldName+') values('+
''''+new_code+''','+
'0,'+
''''+classname+''')';
self.FRemoteDataSet.RemoteExeSQL;
if length(trim(classname))>0 then
begin
self.Items[self.Selected.AbsoluteIndex].ImageIndex:=1;
self.Items[self.Selected.AbsoluteIndex].SelectedIndex:=1;
if self.FRemoteDataSet.success then self.Items.AddChild(self.Selected,classname);
self.Items[self.Selected.AbsoluteIndex+self.Selected.Count].ImageIndex:=2;
self.Items[self.Selected.AbsoluteIndex+self.Selected.count].SelectedIndex:=3;
end;
//维护class_listcode列表
class_listcode.Add(new_code);
class_listcode.Sort;
end else
begin
showmessage('已经存在资料信息,不允许增加下级栏目!');
end;
end;
end;
procedure TDbTreeView.EditClass(NewClassName:string);
var
cur_class:string;
begin
//判断
if length(trim(newclassname))=0 then
begin
showmessage('名称不能够为空!');
exit;
end;
if self.Items.Count=0 then
begin
showmessage('没有任何栏目信息可以修改!');
exit;
end;
//不允许排序
self.SortType:=stnone;
cur_class:=class_listcode.Strings[self.Selected.AbsoluteIndex];
//修改数据库
self.FRemoteDataSet.Remoteclose;
self.FRemoteDataSet.RTSQL.Text:='update '+FTableName+' set '+FClassNameFieldName+'='''+
newclassname+''' where '+FClassCodeFieldName+'='''+
cur_class+''' and '+FClassEndFieldName+'=0';
self.FRemoteDataSet.RemoteExeSQL;
if self.FRemoteDataSet.success then
begin
//修改树
self.Items[self.Selected.AbsoluteIndex].Text:=newclassname;
end;
end;
procedure TDbTreeView.DeleteClass;
var
cur_index,i:integer;
cur_class:string;
begin
if self.Items.Count=0 then
begin
showmessage('没有任何栏目信息可以删除!');
exit;
end;
cur_index:=self.Selected.AbsoluteIndex;
cur_class:=class_listcode.Strings[self.Selected.AbsoluteIndex];
//判断有无详细信息,有则不允许删除
self.FRemoteDataSet.Remoteclose;
self.FRemoteDataSet.RTSQL.Text:='select * from '+FTableName+' where left('+FClassCodeFieldName+','+
inttostr(length(class_listcode.Strings[self.Selected.AbsoluteIndex]))+
')='''+class_listcode.Strings[self.Selected.AbsoluteIndex]+''''+
' and '+FClassEndFieldName+'=1';
self.FRemoteDataSet.RemoteOpen;
if self.FRemoteDataSet.RecordCount=0 then
begin
self.FRemoteDataSet.Remoteclose;
self.FRemoteDataSet.RTSQL.Text:='delete from '+FTableName+' where left('+FClassCodeFieldName+','+
inttostr(length(class_listcode.Strings[self.Selected.AbsoluteIndex]))+
')='''+class_listcode.Strings[self.Selected.AbsoluteIndex]+'''';
self.FRemoteDataSet.RemoteExeSQL;
if self.FRemoteDataSet.success then self.Items.Delete(self.Selected);
if self.Selected.HasChildren then
begin
self.Items[self.Selected.AbsoluteIndex].ImageIndex:=1;
self.Items[self.Selected.AbsoluteIndex].SelectedIndex:=1;
end else
begin
self.Items[self.Selected.AbsoluteIndex].ImageIndex:=2;
self.Items[self.Selected.AbsoluteIndex].SelectedIndex:=3;
end;
//维护class_listcode列表
for i:=class_listcode.Count-1 downto cur_index do
begin
if leftstr(class_listcode.Strings[i],length(cur_class))=cur_class then
class_listcode.Delete(i);
end;
class_listcode.Sort;
end else showmessage('存在资料信息,不允许删除本级栏目!');
end;
function TDbTreeView.GetSelectedClassCode:string;
begin
if self.Items.Count=0 then
begin
result:='';
end;
class_listcode.Strings[self.Selected.AbsoluteIndex];
end;
procedure TDbTreeView.ShowClassTree;
var
class_stream:tstringstream;
cur_class:integer;
first_class:integer;
tab_str:string;
i:integer ;
begin
class_list.Text:='';
class_listcode.Text:='';
self.FRemoteDataSet.Remoteclose;
self.FRemoteDataSet.RTSQL.Text:='select top 100000000 * from '+FTableName+' where '+
FClassEndFieldName+'=0 order by '+FClassCodeFieldName;
self.FRemoteDataSet.RemoteOpen;
first_class:=trunc(length(trim(self.FRemoteDataSet.FieldValues[FClassCodeFieldName]))/FClassStep);
while not self.FRemoteDataSet.Eof do
begin
cur_class:=trunc(length(trim(self.FRemoteDataSet.FieldValues[FClassCodeFieldName]))/FClassStep)-first_class+1;
tab_str:='';
for i:=1 to cur_class-1 do
begin
tab_str:=tab_str+chr(9);
end;
class_list.Add(tab_str+self.FRemoteDataSet.fieldbyname(FClassNameFieldName).AsString);
class_listcode.Add(self.FRemoteDataSet.fieldbyname(FClassCodeFieldName).AsString);
self.FRemoteDataSet.Next;
end;
class_stream:=Tstringstream.Create(class_list.Text);
self.LoadFromStream(class_stream);
for i:=0 to self.Items.Count-1 do
begin
if i=0 then
begin
self.Items[0].imageIndex:=0;
self.Items[0].SelectedIndex:=0;
self.Items[0].Expand(true);
end else
begin
if self.Items[i].HasChildren then
begin
self.Items[i].imageIndex:=1;
self.Items[i].SelectedIndex:=1;
end else
begin
self.Items[i].imageIndex:=2;
self.Items[i].SelectedIndex:=3;
end;
end;
end;
freeandnil(class_stream);
end;
procedure TDbTreeView.ShowSelectDb;
begin
//选取节点,查询相应的内容
{qq1.Remoteclose;
qq1.RTSQL.Text:='select * from db_comtest where left(class_code,'+
inttostr(length(class_listcode.Strings[node.AbsoluteIndex]))+
')='''+class_listcode.Strings[node.AbsoluteIndex]+''''+
' and class_end=1';
qq1.RemoteOpen; }
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -