国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

能夠處理任何數(shù)據(jù)庫(kù)字段的Panel

2019-11-18 18:49:48
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

unit DBPanel;

interface

uses
  windows, messages, sysutils, classes,graphics, controls, forms, dialogs,
  extctrls, dbctrls, stdctrls, db;

type
  TDBPanel = class(tpanel)
  PRivate
    { private declarations }
    fleft: integer;
    ftop: integer;
    maxtextlen: integer;
    maxlabellen: integer;
    fscrollbox: tscrollbox;        {滾動(dòng)控件}
    flineheight: integer;
    fclick: tnotifyevent;
    editors: array of tdbcombobox;
file://- >具體進(jìn)行編輯所用的數(shù)據(jù)控件數(shù)組,動(dòng)態(tài)生成
    labels: array of tlabel;
file://- >各字段的標(biāo)題,動(dòng)態(tài)生成
    okbutton: tbutton;
file://- >最后增加的確定按鈕,用于實(shí)現(xiàn)提交動(dòng)作。
    { 數(shù)據(jù)源}
    fdatasource: tdatasource;
    fcolumns: integer;
file://- >輸入表格的列數(shù)
    protected
    { protected declarations }
    procedure freeeditors;
file://- >釋放數(shù)據(jù)輸入控件的內(nèi)存
    public
    procedure createeditors(ds: tdatasource; colcount: integer);
file://- >創(chuàng)建各字段的數(shù)據(jù)輸入控件
    constructor create(aowner:
    tcomponent); override;
    destructor destroy; override;
    procedure akeypress(sender:
    tobject; var key: char);
    procedure akeydown(sender:
    tobject; var key: Word; shift:
    tshiftstate);
    procedure clearhits(itemindex: integer);
    procedure addhits(itemindex:
    integer; hits: array of string);
    function editor(index: integer):
    tdbcombobox;
    { public declarations }
    published
    property leftlimit: integer read
    fleft write fleft default 10;
    property toplimit: integer read
    ftop write ftop default 10;
    property editorlen: integer read
    maxtextlen write maxtextlen;
    property labellen: integer read
    maxlabellen write maxlabellen    default 100;
    property lineheight: integer read
    flineheight write flineheight    default 15;
    property onokclick: tnotifyevent
    read fclick write fclick;
    property datasource: tdatasource
    read fdatasource write    fdatasource;
 file://數(shù)據(jù)源
    property columns: integer read
    fcolumns write fcolumns;//- >表列數(shù)
    { published declarations }
  end;
procedure Register;

implementation


{ 為第i字段增加提示信息的方法}
procedure tdbpanel.addhits(itemindex:
integer; hits: array of string);
var
  m,n,i: integer;
begin
  n := length(editors);
  m := length(hits);
  if itemindex< n then begin
    for i:=0 to m-1 do editors[itemindex].items.add(hits[i]);
  end;
end;

procedure tdbpanel.akeydown
(sender: tobject; var key: word;
  shift: tshiftstate);
begin
  if (sender is tdbcombobox) then begin
    case key of
      vk_next: (sender as tdbcombobox)
      .datasource.dataset.next;
      vk_prior: (sender as tdbcombobox)
      .datasource.dataset.prior;
    end;
  end;
end;

procedure tdbpanel.akeypress(sender: tobject; var key: char);
begin
  if (sender is tdbcombobox) then begin
if key=#13 then (owner as tform).perform(wm_nextdlgctl, 0, 0);
  end;
end;

procedure tdbpanel.clearhits(itemindex: integer);
var
  n: integer;
begin
  n := length(editors);
  if itemindex< n then editors[itemindex].items.clear;
end;

constructor tdbpanel.create(aowner: tcomponent);
begin
  inherited create(aowner);
  fleft :=10;
  ftop := 10;
  maxtextlen := 100;
  maxlabellen := 100;
  flineheight := 15;
end;

{ 創(chuàng)建各字段的數(shù)據(jù)輸入控件的方法}
procedure tdbpanel.createeditors(ds: tdatasource; colcount: integer);
var
  i, n, rowcount: integer;
  textheight: integer;
begin
  if datasource.dataset.active then begin
    n := datasource.dataset.fieldcount;
    { 計(jì)算最大的標(biāo)題長(zhǎng)度及顯示長(zhǎng)度}
    datasource.dataset.first;
    { 計(jì)算高度}
    textheight := canvas.textheight(datasource
    .dataset.fields[0].displaylabel) + flineheight; file://10;
    { 計(jì)算行列數(shù)}
    rowcount := n div columns;
    if n mod columns <> 0 then inc(rowcount);
    { 分配內(nèi)存}
    freeeditors;
    setlength(editors, n);
    setlength(labels, n);
    { 創(chuàng)建滾動(dòng)盒}
    fscrollbox := tscrollbox.create(owner);
    fscrollbox.parent := self;
    fscrollbox.align := alclient;
    { 創(chuàng)建編輯}
    for i:=0 to n-1 do begin
      { 創(chuàng)建標(biāo)題}
      labels[i] := tlabel.create(owner);
      labels[i].parent := fscrollbox; file://self;
      labels[i].caption := datasource.dataset.fields[i].displaylabel;
      labels[i].left := fleft + (maxlabellen +
      maxtextlen + 10) * (i div rowcount);
      labels[i].width := maxlabellen;
      labels[i].top := ftop + (i mod rowcount) * textheight + 5;
      { 創(chuàng)建編輯對(duì)象}
      editors[i] := tdbcombobox.create(owner);
      editors[i].parent := fscrollbox; file://self;
      editors[i].left := labels[i].left + labels[i].width;
      editors[i].width := maxtextlen;
      editors[i].top := ftop + (i mod rowcount) * textheight;
      editors[i].datasource := datasource;
      editors[i].datafield := datasource.dataset.fields[i].fieldname;
      editors[i].onkeypress := akeypress;
      editors[i].onkeydown := akeydown;
    end;
    { 創(chuàng)建ok按鈕}
    okbutton := tbutton.create(owner);
    okbutton.parent := fscrollbox;
    okbutton.left := editors[n-1].left;
    okbutton.top := editors[n-1].top + textheight;
    okbutton.caption := '確定';
    okbutton.onclick := fclick;
  end;
end;

destructor tdbpanel.destroy;
begin
  freeeditors;
  inherited destroy;
end;

function tdbpanel.editor(index: integer): tdbcombobox;
begin
  if index< length(editors) then result := editors[index]
  else result := nil;
end;

procedure tdbpanel.freeeditors;
var
  i,n: integer;
begin
  { 內(nèi)存的釋放是要有順序的!必須以創(chuàng)建的相反的順序進(jìn)行!
  尤其是當(dāng)組件之間有父子關(guān)系時(shí)}
  if okbutton<>nil then okbutton.free;
  if editors<>nil then begin
    n := length(editors);
    for i:=0 to n-1 do editors[i].free;
    editors := nil;
    n := length(labels);
    for i:=0 to n-1 do labels[i].free;
    labels := nil;
  end;
  if fscrollbox<>nil then begin
    fscrollbox.free;
    fscrollbox := nil;
  end;
end;

procedure Register;
begin
  RegisterComponents('OK', [TDBPanel]);
end;

end.


上一篇:關(guān)于動(dòng)態(tài)增加、修改、刪除樹(shù)形結(jié)構(gòu)的程序

下一篇:使用COM+參數(shù)化對(duì)象結(jié)構(gòu)編程技術(shù)

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門(mén)圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 会东县| 云浮市| 伽师县| 白玉县| 德钦县| 瑞丽市| 宁河县| 百色市| 河间市| 静海县| 青铜峡市| 桃园县| 紫云| 荣成市| 商都县| 萨迦县| 鹿泉市| 万年县| 化隆| 勃利县| 谢通门县| 南宁市| 永昌县| 乐清市| 上思县| 湛江市| 当阳市| 团风县| 和田县| 常宁市| 岳池县| 南乐县| 如皋市| 丰宁| 余姚市| 长沙县| 随州市| 全南县| 颍上县| 长兴县| 于田县|