📄 remotedbtreeview.pas
字号:
unit RemoteDbTreeView;
interface
uses
SysUtils, Classes, Controls, ComCtrls,DB, DBClient, remotedataset,
ImgList,StrUtils,dialogs,classedit;
type
TRemoteDbTreeView = class(TTreeView)
private
FClassCodeFieldName:string; //级别字段
FClassStep:integer;
FClassNameFieldName:string; //级别名称字段
FClassEndFieldName:string; //末级字段(boolean)
FRemoteDataSet:TRemoteDataSet;
class_list:Tstringlist;
class_listcode:Tstringlist;
FTableName:string;
FSelectedDataSet:TRemoteDataSet;
FClassEndFieldValue:string; //末级字段值(boolean)
FSynDataBase:boolean;
Fclasseditform:TClassEdit_form;
FOtherMarkValue:string;
FOtherMarkField:string;
FOtherMarkSign:string;
FSelectFields:Tstrings;
procedure setclasscode(value:string);
procedure setclassname(value:string);
procedure setclassstep(value:integer);
procedure setclassend(value:string);
procedure setclassendv(value:string);
procedure setdataset(Value:TRemoteDataSet);
procedure setselecteddataset(Value:TRemoteDataSet);
procedure settablename(value:string);
procedure setsyn(value:boolean);
procedure setothermarkvalue(value:string);
procedure setothermarkField(value:string);
procedure setothermarkSign(value:string);
procedure setselectfields(value:Tstrings);
//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;
procedure EditClass;
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 ClassEndFieldValue:string read FClassEndFieldValue write setclassendv;
property ClassStep:integer read FClassStep write setclassstep;
property RemoteDataSet:TRemoteDataSet read FRemoteDataSet write setdataset;
property SelectedDataSet:TRemoteDataSet read FSelectedDataSet write setselecteddataset;
property TableName:string read FTableName write settablename;
property SynDatabase:boolean read FSynDataBase write setsyn;
property OtherMarkValue:string read FOtherMarkValue write setothermarkvalue;
property OtherMarkField:string read FOtherMarkField write setothermarkfield;
property OtherMarkSign:string read FOtherMarkSign write setothermarksign;
property SelectFields:Tstrings read FSelectFields write setselectfields;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('DbAnyWhere', [TRemoteDbTreeView]);
end;
constructor TRemoteDbTreeView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
class_list:=Tstringlist.Create;
class_listcode:=Tstringlist.Create;
self.HideSelection:=false;
self.ReadOnly:=true;
self.FClassStep:=4;
self.FClassEndFieldValue:='1';
FSynDataBase:=false;
Fclasseditform:=TClassEdit_form.Create(nil);
FOtherMarkValue:='';
FOtherMarkField:='';
FOtherMarkSign:='=';
FSelectFields:=Tstringlist.Create;
end;
destructor TRemoteDbTreeView.Destroy;
begin
inherited Destroy;
freeandnil(class_list);
freeandnil(class_listcode);
freeandnil(Fclasseditform);
freeandnil(Fselectfields);
end;
procedure TRemoteDbTreeView.setclasscode(value:string);
begin
FClassCodeFieldName:=value;
end;
procedure TRemoteDbTreeView.setclassname(value:string);
begin
FClassNameFieldName:=value;
end;
procedure TRemoteDbTreeView.setclassstep(value:integer);
begin
FClassStep:=value;
end;
procedure TRemoteDbTreeView.setselectfields(value:Tstrings);
begin
FSelectFields.Assign(value);
end;
procedure TRemoteDbTreeView.setclassend(value:string);
begin
FClassEndFieldName:=value;
end;
procedure TRemoteDbTreeView.setclassendv(value:string);
begin
FClassEndFieldValue:=value;
end;
procedure TRemoteDbTreeView.setsyn(value:boolean);
begin
FSynDataBase:=value;
end;
procedure TRemoteDbTreeView.setdataset(Value:TRemoteDataSet);
begin
FRemoteDataSet:=value;
end;
procedure TRemoteDbTreeView.setselecteddataset(Value:TRemoteDataSet);
begin
FSelectedDataSet:=value;
end;
procedure TRemoteDbTreeView.settablename(value:string);
begin
FTableName:=value;
end;
//其他区分标志,比如目录树所属部门等
procedure TRemoteDbTreeView.setothermarkvalue(value:string);
begin
FOtherMarkValue:=value;
end;
procedure TRemoteDbTreeView.setothermarkfield(value:string);
begin
FOtherMarkField:=value;
end;
procedure TRemoteDbTreeView.setothermarksign(value:string);
begin
FOtherMarkSign:=value;
end;
procedure TRemoteDbTreeView.AddClass;
var
max_code:string;
new_code:string;
temp_str:string;
classname:string;
begin
if length(trim(FothermarkField))<>0 then
begin
if length(trim(FOtherMarkValue))=0 then
begin
Showmessage('OtherMarkValue属性不能够为空!');
exit;
end;
end;
fclasseditform.Label1.Caption:='所属栏目名称';
fclasseditform.Label2.Caption:='新建栏目名称';
if self.Items.Count>0 then
fclasseditform.Edit1.Text:=self.Selected.Text
else
fclasseditform.Edit1.Text:='增加栏目头';
fclasseditform.Edit2.Text:='';
fclasseditform.ShowModal;
if fclasseditform.IfEdit then
begin
classname:=fclasseditform.Edit2.Text;
end else exit;
//判断
if length(trim(classname))=0 then
begin
showmessage('名称不能够为空!');
exit;
end;
//开始没有任何栏目的时候呢?
if FClassEndFieldValue='1' then temp_str:='0';
if FClassEndFieldValue='true' then temp_str:='false';
//判断有无被选中的
if self.Items.Count=0 then
begin
new_code:=stringofchar('0',self.FClassStep-1)+'1';
self.FRemoteDataSet.Remoteclose;
self.FRemoteDataSet.RTSQL.Text:='';
self.FRemoteDataSet.RTSQL.Add('insert into '+FTableName+'('+FClassCodeFieldName+','+
FClassEndFieldName+','+FClassNameFieldName+') values('+
''''+new_code+''','+
temp_str+','+
''''+classname+''')');
if length(trim(self.FOtherMarkField))>0 then
begin
self.FRemoteDataSet.RTSQL.Text:='';
self.FRemoteDataSet.RTSQL.Add('insert into '+FTableName+'('+FClassCodeFieldName+','+
FClassEndFieldName+','+FClassNameFieldName+
','+FOtherMarkField
+') values('+
''''+new_code+''','+
temp_str+','+
''''+classname+''','''+
FOtherMarkValue+''')');
end;
if self.FSynDataBase then
begin
if length(trim(self.FOtherMarkField))=0 then
self.FRemoteDataSet.RTSQL.Add('update '+FTableName+' set change_mark='+
'(select max(change_mark) from '+FTableName
+')+1 where '+FClassCodeFieldName+'='''+new_code+
''' and '+FClassEndFieldName+'='+temp_str+
' and delete_mark='+temp_str)
else
self.FRemoteDataSet.RTSQL.Add('update '+FTableName+' set change_mark='+
'(select max(change_mark) from '+FTableName
+')+1 where '+FClassCodeFieldName+'='''+new_code+
''' and '+FClassEndFieldName+'='+temp_str+
' and '+self.FOtherMarkField+self.FOtherMarkSign+''''+
self.FOtherMarkValue+''' and delete_mark='+temp_str);
end;
//showmessage(self.FRemoteDataSet.RTSQL.Text);
self.FRemoteDataSet.RemoteExeSQL;
if length(trim(classname))>0 then
begin
if self.FRemoteDataSet.success then self.Items.AddChild(nil,classname);
self.Items[0].ImageIndex:=0;
self.Items[0].SelectedIndex:=0;
self.Focused;
self.Repaint;
//self.SetFocus;
end;
//维护class_listcode列表
class_listcode.Add(new_code);
class_listcode.Sort;
exit;
end;
if self.Selected.HasChildren then
begin
max_code:=rightstr(class_listcode.strings[self.Selected.GetLastChild.AbsoluteIndex],self.FClassStep);
new_code:=class_listcode.strings[self.Selected.AbsoluteIndex]+
stringofchar('0',self.FClassStep-length(inttostr(strtoint(max_code)+1)))+
inttostr(strtoint(max_code)+1);
//存在下级都可以增加
self.FRemoteDataSet.Remoteclose;
self.FRemoteDataSet.RTSQL.Text:='';
self.FRemoteDataSet.RTSQL.Add('insert into '+FTableName+'('+FClassCodeFieldName+','+
FClassEndFieldName+','+FClassNameFieldName+') values('+
''''+new_code+''','+
temp_str+','+
''''+classname+''')');
if length(trim(self.FOtherMarkField))>0 then
begin
self.FRemoteDataSet.RTSQL.Text:='';
self.FRemoteDataSet.RTSQL.Add('insert into '+FTableName+'('+FClassCodeFieldName+','+
FClassEndFieldName+','+FClassNameFieldName+
','+FOtherMarkField+
') values('+
''''+new_code+''','+
temp_str+','+
''''+classname+''','''+
FOtherMarkValue+''')');
end;
if self.FSynDataBase then
begin
if length(trim(self.FOtherMarkField))>0 then
self.FRemoteDataSet.RTSQL.Add('update '+FTableName+' set change_mark='+
'(select max(change_mark) from '+FTableName
+')+1 where '+FClassCodeFieldName+'='''+new_code+
''' and '+FClassEndFieldName+'='+temp_str+
' and '+self.FOtherMarkField+self.FOtherMarkSign+''''+
self.FOtherMarkValue+''' and delete_mark='+temp_str)
else
self.FRemoteDataSet.RTSQL.Add('update '+FTableName+' set change_mark='+
'(select max(change_mark) from '+FTableName
+')+1 where '+FClassCodeFieldName+'='''+new_code+
''' and '+FClassEndFieldName+'='+temp_str+
' and delete_mark='+temp_str);
end;
//showmessage(self.FRemoteDataSet.RTSQL.Text);
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;
if length(trim(self.FOtherMarkField))>0 then
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+'='+FClassEndFieldvalue +
' and '+self.FOtherMarkField+self.FOtherMarkSign+''''+self.FOtherMarkValue+''''
else
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+'='+FClassEndFieldvalue;
self.FRemoteDataSet.RemoteOpen;
if self.FRemoteDataSet.RecordCount=0 then
begin
if length(trim(self.FOtherMarkField))>0 then
begin
self.FRemoteDataSet.RTSQL.Add('insert into '+FTableName+'('+FClassCodeFieldName+','+
FClassEndFieldName+','+FClassNameFieldName+
','+FOtherMarkField
+') values('+
''''+new_code+''','+
temp_str+','+
''''+classname+''','''+
FOtherMarkValue+''')');
end else
self.FRemoteDataSet.RTSQL.Add('insert into '+FTableName+'('+FClassCodeFieldName+','+
FClassEndFieldName+','+FClassNameFieldName+') values('+
''''+new_code+''','+
temp_str+','+
''''+classname+''')');
if self.FSynDataBase then
begin
if FClassEndFieldValue='1' then temp_str:='0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -