亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

datatree和數據庫綁定的最少代碼

2019-11-18 17:57:30
字體:
來源:轉載
供稿:網友

unit mmslibrarypage;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, VirtualTrees, ComCtrls, ToolWin, mpToolBar,basicModal,DataModal,
  database,myScroll,insertdemon,MySQL,newmmsForlibrary;

type
  TMMSLibraryForm = class(TPageForm)
    mainToolBar: TmpToolBar;
    btnNewMMS: TToolButton;
    btnDelete: TToolButton;
    DataTree: TVirtualStringTree;
    ilImages: TImageList;
    btnImport: TToolButton;
    btn2: TToolButton;
    btn3: TToolButton;
    btn4: TToolButton;
    btn5: TToolButton;
    btnExport: TToolButton;
    btnRefresh: TToolButton;
    PRocedure FormCreate(Sender: TObject);
    procedure btnNewMMSClick(Sender: TObject);
    procedure btnDeleteClick(Sender: TObject);
    procedure btnImportClick(Sender: TObject);
    procedure btnExportClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure DataTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure DataTreeInitNode(Sender: TBaseVirtualTree; ParentNode,
      Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
  
  private
    { Private declarations }
    stringlist:TStringList;
  public
    procedure  refreshtree();
  end;

  procedure GetMMSFromLibrary(dparam: TStringList; mysql_rows: PMYSQL_ROW);

type
 PMMSTreeNode=^TMMStreeNode;

//自定義的datatree的結構
 TMMStreeNode=record
   mmsid:string;
   mmstype:string;
   mmssmil:string;
   mmssize:Integer;
   mmssubject:string;
 end;

var
  MMSLibraryForm: TMMSLibraryForm;

implementation

{$R *.dfm}

procedure TMMSLibraryForm.FormCreate(Sender: TObject);
begin
  Self.Font:=application.MainForm.Font;                                        //保持程序中字體一致
  stringlist:=TStringList.Create;                                                       //保存要顯示的數據
  DataTree.NodeDataSize:=SizeOf(TMMStreeNode);                 //初始化datatree的節點大小
end;

procedure TMMSLibraryForm.FormShow(Sender: TObject);
var
  pdbinfo: PDatabaseInfo;
  column : TVirtualTreeColumn;
  Header : TStrings;
  i      : Integer;
  node   : PVirtualNode;
  data   : PINT;

  sql    : string;
  pnode1 : PMMSTreeNode;
begin
  Header:=TStringList.Create;

//添加顯示的列名
  if trim(Header.Text)='' then
  begin
    Header.Add('ID');
    Header.Add('Type');
    Header.Add('Smil 1.0/2.0');
    Header.Add('Size(B)');
    Header.Add('Subject');
  end;

//設置列的顯示

  for i:=0 to Header.Count-1 do
  begin
    column:= DataTree.Header.Columns.Add;
    column.Text:= Header[I];
    column.Width:=dataTree.ClientWidth div 6;
    if i=4 then
       column.Width:= dataTree.ClientWidth div 3-10;
  end;

//    連接數據庫,獲取指定的數據庫(是不是忒簡單

pdbinfo:=currentdatabase.databases.GetByIndex(0);

    Refreshtree;

end;

procedure  TMMSLibraryForm.refreshtree();
var
  sql : string;
begin
  DataTree.Clear;
  stringlist.Clear;

  sql:='select MMS_ID,MMS_Type,MMS_Smil,MMS_Size,MMS_Subject from mmslibrary';

//回調函數:讓被調用者調用調用者自身的函數。執行ExeuteSQlQurey時調用了GetMMSFromLibrary

(***********************************************************************************************************

procedure TDatabase.ExeuteSQlQurey(dparam: Pointer; sql: string; callback: TDbDataCallBack);
var
  aHandle, db: pmysql;
  qresult: PMYSQL_RES;
  mysql_rows: PMYSQL_ROW;
  iRtn, fcount, i: Integer;
begin

  try
    aHandle := mysql_init(nil);
   //mysql_real_connect(aHandle, nil, nil, nil, nil, 0, nil, 0);
    if commonconfig.remotemode = 0 then
      db := mysql_real_connect(aHandle, nil, nil, nil, PAnsichar(FCurrentDataBase), 0, nil, 0)
    else
      db := mysql_real_connect(aHandle, PAnsichar(RHost), PAnsichar(RUser), PAnsichar(RPassWord), PAnsichar(FCurrentDataBase), 0, nil, 0);

    if db <> nil then
    begin
      iRtn := mysql.mysql_query(db, Pchar(sql));
      if iRtn = 0 then
      begin
        qresult := mysql.mysql_store_result(db);
        if qresult <> nil then
        begin
          fcount := mysql.mysql_num_rows(qresult);
          for i := 0 to fcount - 1 do
          begin
            mysql_rows := mysql.mysql_fetch_row(qresult);
            callback(dparam, mysql_rows);
          end;
        end;
        mysql.mysql_free_result(qresult);
      end;
    end;
  finally
    mysql_Close(db);
  end;

end;

*************************************************************************************************************)


  currentdatabase.ExeuteSQlQurey(stringlist,sql,@GetMMSFromLibrary);

  DataTree.RootNodeCount:=stringlist.Count div 5 ; //小技巧啦
  DataTree.Refresh;
end;

//daparam即是currentdatabase.ExeuteSQlQurey(stringlist,sql,@GetMMSFromLibrary);中的stringlist,

//即用被調用者的值(mysql_rows )初始化調用者的參數

//這個觀點很重要,使用也很廣泛和特殊
procedure GetMMSFromLibrary(dparam:  TStringList; mysql_rows: PMYSQL_ROW);
begin
    dparam.Add(mysql_rows[0]);
    dparam.Add(mysql_rows[1]);
    dparam.Add(mysql_rows[2]);
    dparam.Add(mysql_rows[3]);
    dparam.Add(mysql_rows[4]);
end;

procedure TMMSLibraryForm.btnNewMMSClick(Sender: TObject);
begin
  NewMMS:=TNewMMS.Create(MMSLibraryForm);
  if NewMMS.ShowModal= mrok then
     refreshtree;
end;

procedure TMMSLibraryForm.btnDeleteClick(Sender: TObject);
var
  node:PVirtualNode;

  sql:string;
begin
  if DataTree.FocusedNode=nil then  Exit;

  node:=DataTree.FocusedNode;

  sql:='delete from mmslibrary where MMS_ID="'+ stringlist[node.index * 5]+'"';
  currentdatabase.ExecuteSqlNoQurey(sql);
  RefreshTree;

end;
procedure TMMSLibraryForm.btnImportClick(Sender: TObject);
var
  dl:TOpenDialog;
begin
  dl.Filter:='eml files|*.eml';

end;

procedure TMMSLibraryForm.btnExportClick(Sender: TObject);
begin
//
end;

procedure TMMSLibraryForm.btnRefreshClick(Sender: TObject);
begin
  RefreshTree;
end;

procedure TMMSLibraryForm.FormDestroy(Sender: TObject);
begin
  stringlist.Free;
  inherited;
end;

procedure TMMSLibraryForm.DataTreeGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  i:Integer;
begin

//這是關鍵的步驟:將stringlist和datatree綁定。這個函數的解釋如下:

(**********************************************************************************************************

property OnGetText: TVSTGetTextEvent;
Description

This is one of the fundamental string tree events which must always be handled. The string tree will fire this event every time when it needs to know about the text of a specific node and column. This is mainly the case when the node appears in the visible area of the tree view (in other words it is not scrolled out of view) but also on some other occasions, including streaming, drag and drop and calculating the width of the node.  

The node text is distinguished between two text types:  

  • Normal text: If TextType is ttNormal return the main node caption for the specified column.
  • Static text: All text that you return when TextType is ttStatic will be displayed right beside the normal text (or left to it if the column's BidiMode is not bdLeftToRight, i.e. the column has right-to-left layout). Static text is used only for informational purposes; it cannot be selected or dragged and if the column is not wide enough to show all text it will not be shortened with an ellipsis (...) as normal text. The string tree will only query for static text if the StringOptions (see TreeOptions) include toShowStaticText. This is off by default.  

When this event is fired the text parameter will always be initialized with the value of property DefaultText. To handle the event get your node data and then extract the string for the appropriate column and TextType.

Notes
Be sure that your event handler only contains absolutely necessary code. This event will be fired very often - easily a 

few hundred times for medium sized trees with some columns defined when the tree is repainted completely. 

For example it is far too slow to use Locate() on some Dataset, a database query result or table, and then get the text 

from some TField. This may only work with in-memory tables or a client dataset. When you initialize your node data do 

some caching and use these cached values to display the data.

************************************************************************************************************)

    for i:=0 to stringlist.Count div 5 -1 do
    begin
      case Column of
        0:CellText:=stringlist[node.index * 5];
        1:CellText:=stringlist[node.index * 5+1];
        2:CellText:=stringlist[node.index * 5+2];
        3:CellText:=stringlist[node.index * 5+3];
        4:CellText:=stringlist[node.index * 5+4];
      end;
    end;

end;

//這個函數居然可以不用也可以連數據庫,奇怪?

procedure TMMSLibraryForm.DataTreeInitNode(Sender: TBaseVirtualTree;
  ParentNode, Node: PVirtualNode;
  var InitialStates: TVirtualNodeInitStates);
var
  Data: ^Int64;
begin
//  Data := Sender.GetNodeData(Node);
//  Data^ := Node.Index;
end;

end.



上一篇:怎么讓TreeView前面顯示CheckBox

下一篇:ADO方式下判斷數據表是否存在

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲激情在线| 国产精品专区一| 中文字幕在线看视频国产欧美在线看完整| 中文字幕在线精品| 在线成人免费网站| 成人国产亚洲精品a区天堂华泰| 亚洲成**性毛茸茸| 欧美一级免费看| 国产精品一区二区在线| 成人欧美一区二区三区在线湿哒哒| 欧美一级大片在线观看| 亚洲一区二区三区香蕉| 成人国产在线激情| 色与欲影视天天看综合网| 欧美精品久久一区二区| 国产精品美乳一区二区免费| 精品女同一区二区三区在线播放| 亚洲成人性视频| 精品五月天久久| 日韩电影免费在线观看| 一区三区二区视频| 国产日韩精品在线| 福利一区福利二区微拍刺激| 亚洲老司机av| 日韩电影中文 亚洲精品乱码| 91精品视频专区| 九九热r在线视频精品| 色综合久久天天综线观看| 97视频在线免费观看| 自拍亚洲一区欧美另类| 中文字幕精品av| 亚洲精品福利在线观看| 成人免费午夜电影| 亚洲激情成人网| 91九色在线视频| 国产成人精彩在线视频九色| 久久夜精品va视频免费观看| 欧美激情视频一区二区| 欧美日本国产在线| 久热爱精品视频线路一| 久久精品国产亚洲精品2020| 国产自产女人91一区在线观看| 亚洲一区二区三区在线免费观看| 亚洲影院高清在线| 欧美一级淫片播放口| 一区二区三区国产在线观看| 国模视频一区二区三区| 亚洲精品永久免费| 亚洲曰本av电影| 精品久久久精品| 欧美黑人国产人伦爽爽爽| 中文字幕欧美日韩va免费视频| 精品无人国产偷自产在线| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲新中文字幕| 俺去啦;欧美日韩| 精品性高朝久久久久久久| 久久中国妇女中文字幕| 亚洲成人激情小说| 91在线观看免费观看| xxxx性欧美| 欧美精品久久久久久久久久| 欧美夜福利tv在线| 亚洲网站在线播放| 国产精品视频区| 国产精品久久久久久久久粉嫩av| 日韩精品电影网| 日韩电影大片中文字幕| 成人精品久久一区二区三区| 日本久久亚洲电影| 视频在线一区二区| 俺去亚洲欧洲欧美日韩| 国产精品久久精品| 久久香蕉国产线看观看网| 色综合天天综合网国产成人网| 久久久成人av| 日韩欧美中文字幕在线播放| 日韩av电影在线播放| 最好看的2019年中文视频| 国产男女猛烈无遮挡91| 日韩的一区二区| 欧美激情亚洲另类| 日本高清视频精品| 91日本在线视频| 亚洲男人天堂视频| 欧美一级电影免费在线观看| 欧美激情啊啊啊| 亚洲第一页自拍| 九九热在线精品视频| 欧美性猛交xxxxx水多| 91精品成人久久| 久久精品人人做人人爽| 久久久99免费视频| 91在线国产电影| 国产成人精品日本亚洲| 国产精品日韩一区| 日韩视频永久免费观看| 亚洲图片欧洲图片av| 夜夜嗨av色综合久久久综合网| 欧美激情一区二区三区久久久| 欧美精品久久久久久久免费观看| 成人网在线观看| 97视频在线看| 欧美高清视频在线播放| 精品久久久一区| 97超级碰碰人国产在线观看| 91成人精品网站| 日韩av在线影视| 亚洲黄色在线看| 久久91超碰青草是什么| 韩剧1988免费观看全集| 国产91免费看片| 51ⅴ精品国产91久久久久久| 亚洲一区二区三区毛片| 国产一区二区视频在线观看| 亚洲va欧美va国产综合剧情| 欧美激情视频给我| 91亚洲精品久久久| 国产91热爆ts人妖在线| 国产精品一区久久久| 欧美性生交xxxxxdddd| 欧美第一黄网免费网站| 国产精品亚洲精品| 26uuu亚洲国产精品| 国产精品美腿一区在线看| 国产亚洲精品久久久| 日韩电影免费观看中文字幕| 亚洲xxxx做受欧美| 国产精品第8页| 国产精品白丝jk喷水视频一区| 欧美猛男性生活免费| 久久综合色88| 欧美综合第一页| 亚洲人成在线播放| 日韩精品在线私人| 亚洲精品视频免费| 久久91亚洲人成电影网站| 一区二区三区视频免费在线观看| 亚洲精品免费网站| 欧美日韩裸体免费视频| 欧美成人第一页| 国产精品99久久久久久久久久久久| 亚洲欧美综合区自拍另类| 久久精品国产成人| 91色视频在线导航| 国产精品丝袜视频| 日韩成人性视频| 精品亚洲男同gayvideo网站| 日韩欧美在线视频观看| 45www国产精品网站| 成人性生交大片免费看小说| 成人在线播放av| 亚洲国产精品久久91精品| 成人欧美在线视频| 精品中文字幕在线| 亚洲成色www8888| 欧美性猛交xxxx黑人| 欧美成人免费视频| 国产情人节一区| 国产不卡av在线| 久久综合久中文字幕青草| 伊人伊成久久人综合网站| 精品国产电影一区| 国产精品久久99久久|