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

📄 dbtreeview.pas

📁 p2pdbanywhere 可以通过之udp方式远程连接数据库的组件,这个组件非常好,是Delphi7,9,2006能够使用,包含源码.
💻 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 + -