亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? newdbtv.pas

?? 一個Delphi用的dbtree數據庫目錄對顯示控件
?? PAS
字號:
//該構件的功能是建立從數據庫內建立三級樹,子葉可以從另外的數據庫中顯示詳細項
//要求主數據庫的索引字段為6byte,ABC結構
unit newdBTV;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls,dbtables,db;

type
  TNewDBTV = class(TTreeView)
  private
    { Private declarations }
    FtvStr: TStringList;
    Fselectstr:TStringList;
    Fchangeimage:boolean;
    FActive:           boolean;//激活
    FDisplayRootNode:           boolean;//根節點
    FBytes:            Tstrings;//每層占用關鍵字串的字節數
    FMastDataSource:          TDataSource; //SQL
    FDetailDataSource:          TDataSource; //SQL
    FFilterString:string;
    procedure ActiveTree(InVal: boolean);
    procedure setByte(Value: TStrings);
    function  CreateTree:boolean; //建立樹
    procedure SetMastDataSource(Value: TDataSource);
    procedure SetDetailDataSource(Value: TDataSource);
  protected
    procedure Click;override;
  public
    constructor Create(AOwner: TComponent);override;
    destructor  Destroy;override;
    procedure editNode(DispStr,KeyStr:string);//修改當前節點
    procedure  delNode;//刪除當前節點
    function  GetNodeKeyStr(tn:TTreeNode):string;//得到當前節點的鍵值
    function  AddNode(tn:TTreeNode;DispStr,KeyStr:string):TTreeNode;//加子節點
    procedure ClearTree;//清除樹
  published
    property Active:boolean          read FActive
                                    write ActiveTree;
    property Bytes:Tstrings           read FBytes
                                    write SetByte;
    property MastDataSource:TDataSource        read FMastDataSource
                                    write SetMastDataSource;
    //sql語句中,規定第0個field為鍵值,第1個field為顯示字段,
    //第2個field為鍵值長度
    property DetailDataSource:TDataSource        read FDetailDataSource
                                    write setDetailDataSource;
    //sql語句中,規定第0個field為鍵值,第1個field為顯示字段,
    //第2個field為連接字段
    property changeimage:boolean read Fchangeimage write Fchangeimage;
    property DisplayRootNode:boolean read FDisplayRootNode write FDisplayRootNode;
    property FilterString:string read FFilterString write FFilterString;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('samples', [TNewDBTv]);
end;
constructor TNewdbTV.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Fchangeimage:=false;
  readonly:=true;
  self.HideSelection:=false;
  FActive:=false;
  FtvStr:=TStringList.create;
  Fselectstr:=TStringList.create;
  FBytes:=TStringList.create;
  FDisplayRootNode:=false;
  FFilterString:='';
end;

destructor  TNewdbTV.Destroy;
begin
  FtvStr.free;
  Fselectstr.free;
  FBytes.Free;
  FMastDataSource:=nil;
  FDetailDataSource:=nil;
  inherited Destroy;
end;

function TNewdbTV.GetNodeKeyStr(tn:TTreeNode):string;//得到節點的鍵值
begin
  if tn.AbsoluteIndex<>-1 then result:=FtvStr[tn.AbsoluteIndex]
  else result:='';
end;

function TNewdbTV.AddNode(tn:TTreeNode;DispStr,KeyStr:string):TTreeNode;//加節點
begin
  if tn=nil then
    Result:=Items.Add(tn,DispStr)
  else
    Result:=Items.AddChild(tn,DispStr);
  FtvStr.insert(result.AbsoluteIndex,KeyStr);//影射樹
  if Fbytes.Count=0 then
    begin
      if FDetailDataSource=nil then
        Fselectstr.insert(result.AbsoluteIndex,'1')//無子節點
      else
        Fselectstr.insert(result.AbsoluteIndex,'0');
    end
  else
    Fselectstr.insert(result.AbsoluteIndex,'0');//可能有子節點
  Result.ImageIndex:=Result.Level+1; //boot
  if Fchangeimage then Result.selectedIndex:=Result.ImageIndex;
end;

procedure TNewdbTv.editNode(DispStr,KeyStr:string);//修改當前節點
var i:integer;
    s1,s2:string;
begin
   if selected=nil then exit;
   selected.Text:=DispStr;
   s1:=FtvStr.strings[selected.AbsoluteIndex];
   FtvStr.strings[selected.AbsoluteIndex]:=keystr;
   if FBytes.Count=0 then exit;
   if FDetailDataSource<>nil then exit;
   //修改其子節點得代碼
   for i:=selected.AbsoluteIndex+1 to FtvStr.Count-1 do
     begin
       s2:=FtvStr.strings[i];
       if s1=copy(s2,1,length(s1)) then
          FtvStr.strings[i]:=keystr+copy(s2,length(s1)+1,length(s2))
       else
         break;
     end;
end;
procedure  TNewdbTv.delNode;//刪除當前節點
var s,s1:string;
    i:integer;
begin
   if selected=nil then exit;
   i:=selected.AbsoluteIndex;
   s:=FtvStr.strings[selected.AbsoluteIndex];
   selected.Delete;
   if (FBytes.Count=0)or(FdetailDatasource<>nil) then
     begin
       FtvStr.delete(i);
       FselectStr.delete(i);
       exit;
     end;
   //刪除其子節點得代碼
   while true do
     begin
       FtvStr.delete(i);
       FselectStr.delete(i);
       if i=FtvStr.count then break;
       s1:=copy(FtvStr.strings[i],1,length(s));
       if s1<>s then break;
       if FtvStr.strings[i]='' then break;
     end;
end;

procedure TNewdbTV.ClearTree;//清除樹
begin
  items.Clear;
  FselectStr.clear;
  FtvStr.Clear;
end;

procedure TNewDBTv.ActiveTree(InVal: boolean);
begin
    FActive:=Inval;
    ClearTree;
    if Inval then
      begin //建立樹
        if FMastDatasource=nil then
          begin
            FActive:=false;
            exit;
          end;
        if not CreateTree then
          begin //建立樹
            ClearTree;
            FActive:=false;
            exit;
          end;
      end;
end;
procedure TNewDBTv.setmastDatasource(Value: TDatasource);
begin
   if FmastDatasource<>Value then
     begin
       FmastDatasource:=Value;
       ClearTree;
       FActive:=false;
     end;
end;
procedure TNewDBTv.setdetailDatasource(Value: TDatasource);
begin
   if FDetailDatasource<>Value then
     begin
       FDetailDatasource:=Value;
       ClearTree;
       FActive:=false;
     end;
end;
procedure TNewDBTv.setByte(Value: TStrings);
begin //設置樹的分層方法,即每層所占關鍵串的字節數,隱含為2
  ClearTree;//清除樹
  FActive:=false;
  if FBytes.Text <> Value.Text then
     begin
       FBytes.BeginUpdate;
       try
         FBytes.Assign(value);
       finally
         FBytes.EndUpdate;
       end;
     end;
end;

function TNewDBTv.CreateTree:boolean; //建立樹
var root,node:ttreenode;
begin
   result:=false;
   if FMastDatasource.dataset=nil then
       begin
         messagebox(application.handle,pchar('主表數據集不存在!'),'警告',0);
         exit;
       end;
   if FMastDatasource.dataset.active=false then
   try
     FMastDatasource.dataset.Open;
   except
     on e:exception do
       begin
         messagebox(application.handle,pchar('主表打開失敗!'+e.message),'警告',0);
         exit;
       end;
   end;
   FmastDatasource.dataset.first;
   if Fmastdatasource.dataset.FieldCount<3 then
     begin
        messagebox(application.handle,'主表字段數不能小于3!','警告',0);
        exit;
     end;
   if FdetailDatasource<>nil then
     begin
       if FdetailDatasource.dataset=nil then
         begin
           messagebox(application.handle,pchar('子表數據集不存在!'),'警告',0);
           exit;
         end;
       if FDetailDataSource.dataset.active=false then
       try
         FdetailDataSource.dataset.Open;
       except
         on e:exception do
           begin
             messagebox(application.handle,pchar('子表打開失敗!'+e.message),'警告',0);
             exit;
           end;
       end;
       if FDetailDatasource.dataset.FieldCount<3 then
         begin
           messagebox(application.handle,'子表字段數不能小于3!','警告',0);
           exit;
         end;
       FDetailDatasource.dataset.first;
     end;
   if FDisplayRootNode then
     begin
       root:=AddNode(nil,'','');
       node:=root;
     end
   else
     node:=nil;
   if FmastDatasource.dataset.isempty then
     begin
       result:=true;
       exit;
     end;
   FmastDatasource.dataset.filter:=FmastDatasource.dataset.fields[2].fieldname+'='+trim(FmastDatasource.dataset.fields[2].asstring);
   if FFilterString<>'' then
     FmastDatasource.dataset.filter:=FmastDatasource.dataset.filter+' and '+FFilterString;
   if Fbytes.Count<>0 then FmastDatasource.dataset.filtered:=true;//第1層節點
   items.BeginUpdate;
   root:=AddNode(node,trim(FmastDatasource.dataset.fields[1].asString),trim(FmastDatasource.dataset.fields[0].asString));
   FmastDatasource.dataset.Next;
   while not(FmastDatasource.dataset.eof) do
     begin
       AddNode(node,trim(FmastDatasource.dataset.fields[1].asString),trim(FmastDatasource.dataset.fields[0].asString));
       FmastDatasource.dataset.Next;
     end;
   selected:=root;
   click;
   if not root.Expanded then root.Expand(false);
   items.EndUpdate;
   Result:=true;
   FmastDatasource.dataset.filtered:=false;
end;
//加當前節點得下級節點
procedure TNewdbtv.Click;
var node:ttreenode;
    i:integer;
    s:string;
label lb;
begin
  inherited;
  if FActive=false then exit;
  if selected=nil then exit;
  if fselectstr[selected.AbsoluteIndex]='1' then exit;
  if selected.HasChildren then exit;
  fselectstr[selected.AbsoluteIndex]:='1';
  if (Fdetaildatasource<>nil)and(ftvstr[selected.AbsoluteIndex]<>'') then
  if length(ftvstr[selected.AbsoluteIndex])=length(trim(FdetailDatasource.dataset.Fields[2].AsString)) then
    begin
      FdetailDatasource.dataset.filtered:=false;
      FdetailDatasource.dataset.Filter:=FdetailDatasource.dataset.fields[2].fieldname+'='''+ftvstr[selected.AbsoluteIndex]+'''';
      FdetailDatasource.dataset.Filtered:=true;
      while not FdetailDatasource.dataset.eof do
        begin
          node:=AddNode(selected,trim(FdetailDatasource.dataset.fields[1].asString),trim(FdetailDatasource.dataset.fields[0].asString));
          fselectstr[node.AbsoluteIndex]:='1';
          FdetailDatasource.dataset.Next;
        end;
      FdetailDatasource.dataset.filtered:=false;
    end;
  if Fbytes.Count-1<= self.Selected.Level then exit;
  FmastDatasource.dataset.filtered:=false;
  FmastDatasource.dataset.filter:=
      FmastDatasource.dataset.fields[2].fieldname+'='+inttostr(length(ftvstr[selected.AbsoluteIndex])+strtoint(Fbytes[self.Selected.Level+1]));
  if FFilterString<>'' then
     FmastDatasource.dataset.filter:=FmastDatasource.dataset.filter+' and '+FFilterString;
  i:=length(ftvstr[selected.AbsoluteIndex]);
  s:=ftvstr[selected.AbsoluteIndex];
  FmastDatasource.dataset.filtered:=true;
  while not FmastDatasource.dataset.eof do
    begin
      if copy(FmastDatasource.dataset.fields[0].asString,1,i)=s then
        AddNode(selected,trim(FmastDatasource.dataset.fields[1].asString),trim(FmastDatasource.dataset.fields[0].asString));
      FmastDatasource.dataset.Next;
    end;
  FmastDatasource.dataset.filtered:=false;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产综合久久精品图片| 久久婷婷久久一区二区三区| 17c精品麻豆一区二区免费| 国内精品久久久久影院薰衣草| 欧美精品色综合| 午夜av一区二区三区| 欧美日韩一区二区三区在线| 亚洲一区二区视频在线观看| 色欧美片视频在线观看在线视频| 中文字幕综合网| thepron国产精品| 中文字幕一区二区三区乱码在线| 成人av电影在线观看| 亚洲欧洲国产日韩| 91视频你懂的| 亚洲主播在线播放| 欧美色国产精品| 欧美日韩精品专区| 性感美女久久精品| 欧美一区二区三区四区五区| 久久精品久久久精品美女| 欧美大胆一级视频| 国产精品系列在线观看| 欧美国产欧美亚州国产日韩mv天天看完整 | 精品美女被调教视频大全网站| 久久精品国产免费| 国产日产欧美一区| 99v久久综合狠狠综合久久| 亚洲人成影院在线观看| 在线观看国产一区二区| 午夜日韩在线电影| 日韩欧美国产午夜精品| 国产精品456露脸| 亚洲视频在线一区观看| 欧美性受xxxx黑人xyx性爽| 午夜精品福利视频网站| 欧美大片一区二区三区| 懂色中文一区二区在线播放| 亚洲男人天堂一区| 欧美二区在线观看| 精品综合久久久久久8888| 国产无人区一区二区三区| 9人人澡人人爽人人精品| 亚洲综合一区在线| 欧美一级理论片| 国产99久久久国产精品| 一区二区在线看| 日韩欧美亚洲国产另类| 国产精品 日产精品 欧美精品| 亚洲人午夜精品天堂一二香蕉| 欧美肥妇free| 高清国产一区二区| 亚洲国产精品久久一线不卡| 欧美成人一区二区三区片免费| av电影天堂一区二区在线观看| 午夜国产精品一区| 久久精品男人天堂av| 色综合久久久网| 国产主播一区二区三区| 亚洲人午夜精品天堂一二香蕉| 日韩小视频在线观看专区| 成人精品一区二区三区中文字幕| 午夜欧美2019年伦理 | 欧美日韩国产成人在线免费| 国产在线视频一区二区三区| 亚洲天堂精品视频| 日韩一区二区三| av在线播放成人| 日本不卡一区二区三区| 国产精品视频一二三区 | 日韩欧美一区二区免费| 成人午夜av在线| 免费观看一级欧美片| 国产精品成人在线观看| 日韩免费视频一区二区| 91免费国产在线| 国产在线精品一区二区夜色 | 丝瓜av网站精品一区二区 | 国产精品福利一区| 91精品国产综合久久婷婷香蕉| 成人美女视频在线观看18| 日韩av中文在线观看| 亚洲欧美日韩国产手机在线 | 欧美男女性生活在线直播观看| 丁香五精品蜜臀久久久久99网站 | 成人污污视频在线观看| 日韩制服丝袜av| 亚洲欧美国产高清| 2023国产一二三区日本精品2022| 欧美午夜电影在线播放| 国产成人av电影| 美国十次了思思久久精品导航| 一区二区三区四区不卡在线| 国产欧美一区二区三区网站| 日韩一级片网站| 欧美区视频在线观看| 色综合久久久网| 波波电影院一区二区三区| 国内精品伊人久久久久av影院| 丝袜美腿亚洲一区| 亚洲综合一区在线| 亚洲视频一区二区免费在线观看| 久久久天堂av| 精品欧美一区二区三区精品久久| 欧美日韩在线播放一区| 色噜噜狠狠色综合中国| 成人精品小蝌蚪| 国内一区二区视频| 精品在线免费观看| 男女男精品视频| 偷拍亚洲欧洲综合| 亚洲一二三专区| 亚洲自拍偷拍九九九| 亚洲另类春色国产| 亚洲欧洲av色图| 国产精品久久二区二区| 久久色视频免费观看| 欧美大片日本大片免费观看| 欧美一区二区视频免费观看| 欧美日韩精品一区二区天天拍小说 | 麻豆精品精品国产自在97香蕉 | 蜜桃av一区二区三区电影| 日韩二区在线观看| 日韩专区在线视频| 日本不卡在线视频| 蜜臀精品一区二区三区在线观看| 午夜精品久久久久久久99樱桃| 亚洲综合久久av| 亚洲资源在线观看| 午夜电影网一区| 免费观看在线综合色| 免费的成人av| 六月丁香综合在线视频| 精品在线观看视频| 国产自产2019最新不卡| 国产精品性做久久久久久| 国产a精品视频| 成人18精品视频| 波波电影院一区二区三区| av在线综合网| 在线观看三级视频欧美| 欧美日韩另类国产亚洲欧美一级| 欧美日韩国产影片| 欧美一区二区三区的| 精品国产亚洲在线| 国产日韩欧美不卡在线| 亚洲国产精品国自产拍av| 日韩一区在线看| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲一区二区三区中文字幕| 香蕉成人啪国产精品视频综合网| 欧美a一区二区| 国产黄色成人av| 91丨九色丨蝌蚪丨老版| 欧美性色黄大片手机版| 欧美一区在线视频| 久久精品综合网| 18欧美亚洲精品| 午夜精品爽啪视频| 日韩av中文字幕一区二区| 国产一区二区成人久久免费影院| 成人免费高清在线观看| 91国偷自产一区二区三区成为亚洲经典| 欧美另类videos死尸| 精品成人一区二区三区四区| 欧美国产一区在线| 一区二区三区欧美日韩| 日本va欧美va瓶| 国产suv精品一区二区三区| 91黄色免费观看| 欧美大肚乱孕交hd孕妇| 中文字幕一区二区三区色视频| 亚洲福利视频三区| 激情欧美一区二区| av亚洲精华国产精华| 欧美亚洲自拍偷拍| 精品99一区二区三区| 亚洲男人的天堂在线观看| 天涯成人国产亚洲精品一区av| 激情久久五月天| 91国模大尺度私拍在线视频| 精品嫩草影院久久| 亚洲欧美日韩国产综合| 精品中文字幕一区二区| 91麻豆国产自产在线观看| 日韩写真欧美这视频| 国产精品美女久久久久aⅴ| 亚洲国产精品欧美一二99| 国产米奇在线777精品观看| 在线观看一区日韩| 337p粉嫩大胆色噜噜噜噜亚洲 | 亚洲bt欧美bt精品777| 国产91精品入口| 欧美日韩aaa| 国产精品天天看| 久久成人久久鬼色| 色婷婷久久久亚洲一区二区三区| 欧美不卡一二三| 亚洲午夜在线观看视频在线| 国产成人精品综合在线观看 |