日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > Delphi > 正文

通用Delphi數據庫輸入控件DBPanel的實現

2019-11-18 19:00:35
字體:
來源:轉載
供稿:網友
李曉平/河北固安華北石油職工大學

---- 無論是開發什么樣的程序,數據輸入是不可缺少的。快速地生成一個美觀的輸入界面無疑會大大提高程序開發的效率。系統原有的控件,往往不盡人意。在delphi中,如果針對某字段,可選的控件有DBLabel, DBEdit等;如果針對全表的輸入,有DBGrid。使用Dbedit等控件時,用戶必須全面安排各字段的位置,雖然能夠達到美觀的效果,但是,如果字段數多,無疑是很麻煩的。如果采用DBGrid,無論多少個字段,只用一個控件就夠了,簡單倒是簡單,但是各字段是一字排列的,使用起來有點不方便。對于一般的用戶來說,采用表格形式的錄入,既方便,又美觀。這就是本文所要解決的問題。

---- 技術關鍵

---- 本控件的主要功能是實現對數據庫字段的編輯。按照一般的規律,控件中應包含TdataLink對象,還應該實現與TdataLink相關得一系列方法;但是,那樣會耗費大量的代碼。代碼量越大,系統就越復雜,出錯的可能性就越大。本控件的開發思路是以最少的代碼實現最多的功能。所以,對數據字段的編輯直接使用TDBComboBox控件。

---- 為了實現通用性,在控件內部維護了一個字段編輯控件數組和字段標題數組。如下:

Editors: array of TDBComboBox;    
- >具體進行編輯所用的數據控件數組,動態生成
Labels: array of TLabel;        
- >各字段的標題,動態生成

---- 采用TDBComboBox優點是它不僅能具有一般的編輯功能,還能為各字段添加相應的提示信息。代碼如下:
{ 為第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;

---- 具體的應用是千差萬別的,所以,控件還需要給程序員留有足夠的事件處理接口,以實現具體應用時的特殊功能。這就需要在控件中定義一定的事件處理方法供用戶實現。這里提供的是一個OnOkClick事件,即當所有字段編輯完成后所執行的處理。代碼如下:
   
OkButton: TButton;                
- >最后增加的確定按鈕,用于實現提交動作。
property OnOkClick: TNotifyEvent read FClick write FClick;

---- 通過實現OnOKClick方法,用戶可以完成提交、數據合理性檢驗等各種處理工作。另外一個需要特殊處理的是控制在各個字段間的轉換。缺省的情況是用鼠標點擊。但是,用戶的習慣往往是用鍵盤中的"上、下、左、右"四個箭頭鍵。要實現這一功能需定義以下兩個方法:
   
procedure AKeyPress(Sender: TObject; var Key: Char);
procedure AKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);

---- 將以上兩個方法賦值給動態生成的Editors,從而實現對箭頭鍵的響應。
---- 不同的表字段數不同,有可能出現顯示不下的情況,這就需要有滾動的功能。所以,在控件中插入了一個TscrollBox控件。最后一個需要注意的是動態控件的撤消及內存的釋放??丶到M的撤消及內存的釋放是有順序的--與創建完全相反的順序。否則會出錯。

----控件的使用

---- 先將DBPanel控件放在窗體上,然后設置數據源屬性、數據輸入表格的列數等屬性。在程序中,打開數據源后,調用創建數據編輯控件的方法即可。即:

Query1.Open;- >打開數據源
DBPanel1.CreateEditors; - >創建各字段的編輯控件
DBPanel1.AddHits(0,['1111','11222','eeee']);    
- >為某字段設置提示信息
DBPanel1.AddHits(1,['1111','11222','eeee']); 
- >為某字段設置提示信息
該控件及示例程序在Win98+Delphi 5.0環境下調試通過。


---- 附件:TDBPanel的源代碼

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;        {滾動控件}
    FLineHeight: Integer;
    FClick: TNotifyEvent;
    Editors: array of TDBComboBox;    
- >具體進行編輯所用的數據控件數組,動態生成
    Labels: array of TLabel;        
- >各字段的標題,動態生成
    OkButton: TButton;                
- >最后增加的確定按鈕,用于實現提交動作。
    { 數據源}
    FDataSource: TDataSource;
    FColumns: Integer;                
- >輸入表格的列數
    protected
    { Protected declarations }
    procedure FreeEditors;            
- >釋放數據輸入控件的內存
    public
    procedure CreateEditors;//
    (DS: TDataSource; ColCount: Integer);
- >創建各字段的數據輸入控件
    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;
- >數據源
    property Columns: Integer read
    FColumns write FColumns;- >表列數
    { Published declarations }
  end;

procedure Register;

implementation

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

{ 為第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;

{ 創建各字段的數據輸入控件的方法}
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;
    { 計算最大的標題長度及顯示長度}
    DataSource.DataSet.First;
    { 計算高度}
    TextHeight := Canvas.TextHeight(DataSource
    .DataSet.Fields[0].DisplayLabel) + FLineHeight; //10;
    { 計算行列數}
    RowCount := n div Columns;
    if n mod Columns <  > 0 then inc(RowCount);
    { 分配內存}
    FreeEditors;
    SetLength(Editors, n);
    SetLength(Labels, n);
    { 創建滾動盒}
    FScrollBox := TScrollBox.Create(Owner);
    FScrollBox.Parent := Self;
    FScrollBox.Align := alClient;
    { 創建編輯}
    for i:=0 to n-1 do begin
      { 創建標題}
      Labels[i] := TLabel.Create(Owner);
      Labels[i].Parent := FScrollBox; //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;
      { 創建編輯對象}
      Editors[i] := TDBComboBox.Create(Owner);
      Editors[i].Parent := FScrollBox; //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;
    { 創建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
  { 內存的釋放是要有順序的!必須以創建的相反的順序進行!
  尤其是當組件之間有父子關系時}
  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;

end.

上一篇:用Delphi開發屏幕保護預覽程序

下一篇:Delphi編程實現Ping操作

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

新聞熱點

疑難解答

圖片精選

網友關注

亚洲高清免费一级二级三级| 亚洲综合在线小说| 亚洲热线99精品视频| 欧美一卡2卡3卡4卡| 日韩你懂的电影在线观看| 国产在线欧美日韩| 91精品免费观看| 精品日韩在线| 亚洲日产av中文字幕| 国产在线黄色| 日本国产在线视频| 久久香蕉一区| 刘玥91精选国产在线观看| 91精品久久久久久久久久| 日韩中文字幕在线一区| 日韩三区免费| 亚洲欧洲一区二区天堂久久| 亚洲视频 中文字幕| 天天摸日日摸狠狠添| 在线视频日韩欧美| 免费精品国产自产拍观看| 国产第一页在线播放| 99视频在线看| 韩日中文字幕第一页| www.91香蕉视频| 中文字幕日韩亚洲| 91精品国产色综合久久久蜜香臀 | 黄污视频在线看| 粉嫩喷白浆久久| 日韩精品免费视频一区二区三区| 国产一区三区三区| 国产性一级片| 亚洲成在线观看| av中文资源在线| 你懂的亚洲视频 | 欧美日韩中文字幕在线| 99精品在线播放| 91精品电影| 日韩在线视频观看正片免费网站| 最近免费中文字幕在线第一页| 欧美日韩一二三四| 精品日韩欧美| 国产v日产∨综合v精品视频| 中文字幕在线播放一区| 日韩专区视频网站| 亚洲成a人片在线www| 一区二区高清在线| 国产日产一区二区三区| 欧美日韩精品欧美日韩精品一| 欧美日韩性视频一区二区三区| 99视频精品全国免费| 国产日韩精品视频| 韩国av一区二区| 日韩在线高清| 蜜臀91精品国产高清在线观看| 日韩www在线| 日韩免费看网站| 免费视频久久| 日韩欧美中文字幕在线播放| 日本不卡视频一区| www.xxxx精品| 日韩在线视频免费观看| 欧美日韩三级在线| 欧美日韩国产首页在线观看| 中文字幕日韩高清| 精品视频123区在线观看| 日韩你懂的电影在线观看| 搞黄在线观看| 日韩1区在线| 国产99精品| 免费国产h视频在线观看86| 国产对白在线| 日韩午夜高潮| 国产午夜精品久久| 欧美日韩精品在线观看| 日韩精品视频中文在线观看| 日韩精品在线视频观看| 日韩中文字幕在线一区| 亚洲九九精品| 中文字幕久久精品| 精品视频123区在线观看| 欧美日韩91| 日韩欧美在线综合网| 日韩va亚洲va欧洲va国产| 国产丝袜欧美中文另类| 99在线精品视频免费观看20| 精品一二三四| 久久91精品久久久久久秒播| 久久久水蜜桃| a天堂在线资源| 国产丝袜欧美中文另类| 日韩三级一区二区| 久久 天天综合| a天堂中文在线官网在线| 日韩av一区二区在线| 欧美日韩在线国产| 99综合视频| 7799精品视频天天看| 中文字幕欧美日韩va免费视频 | wwwwww国产| 92久久精品| 国产日韩在线视频| 国产 欧美在线| 国产专区中文字幕| 日韩中文字幕亚洲| 国产 欧美在线| 精品国产99| 日韩中文字幕| 91九色在线看| 国产天堂素人系列在线视频| 午夜一区二区三区视频| 97久久精品| av亚洲免费| 99热最新网址| 国产xxx在线| 国产在线第一页| 伊人国产视频| 国产一卡2卡3卡免费网站| 欧美日韩国产在线| 91精品网站| 国产欧美综合视频| 中文字幕亚洲乱码| 影音先锋一区二区资源站| 亚洲一区中文字幕在线| 欧美一卡2卡3卡4卡| 国产欧美综合在线观看第十页| 日韩精品在线网站| 亚洲福利视频在线| 一区二区三区中文字幕在线观看| 精品国产91乱高清在线观看| 日韩欧美中文第一页| 国产成人精品网址| 欧美一级搡bbbb搡bbbb| 欧美日韩精品久久久| 亚洲一区在线观看网站| 日韩亚洲欧美中文三级| 欧洲精品在线一区| 久久精品日韩无码| 中文字幕在线官网| 国产在线日韩欧美| 久久精品日韩无码| 韩日中文字幕第一页| 激情五月综合| 91九色精品视频| 黄污视频在线看| 欧美日韩在线播放一区| 欧美日韩高清在线| www中文字幕在线观看| 亚洲 欧美 精品| 深夜福利亚洲| 日韩欧美亚洲日产国| 中文字幕第一页在线| 一区三区视频| www日韩欧美| 日韩欧美国产不卡| 中文字幕在线观看视频www| 日韩三级一区| 国产三级免费观看| 精品视频资源站| 日韩国产欧美三级| www.狠狠| 欧美在线日韩精品| 日韩欧美在线中文字幕| 一区二区视频在线观看免费的| 91蜜桃婷婷狠狠久久综合9色| 国产一级久久久| 一二三区精品视频| 日韩精品视频在线免费观看| 91亚洲欧美| 国产午夜在线观看| 国产在线二区| 二区三区中文字幕| 国产一二三视频| 91精品视频免费在线观看| 亚洲一区在线观看免费| 中文字幕日韩视频| 尤物av一区二区| 色欧美日韩亚洲| 国产久卡久卡久卡久卡视频精品 | 国产高清一级片| 免费精品国产自产拍观看| 91日韩中文字幕| 国产 欧美 在线| 日韩一级视频在线观看| 欧美日韩三级在线观看| 国产在线中文字幕| 亚洲羞羞网站| 欧美日韩一二三| 欧美日韩久久不卡| 日韩在线观看视频一区| 最近免费中文字幕在线第一页| 国产日韩av高清| 黄色片免费在线| 亚洲午夜久久| 欧美日韩精品久久久| 久久精品99久久久久久久久| 欧美人妻一区二区三区| av影视在线看| 国产高清视频一区二区| 一区二区欧美国产| 二区中文字幕| 欧美精选午夜久久久乱码6080| 日韩一级二级三级| 国产黄色高清在线| 亚洲第一视频网站| 欧美日韩在线国产| 亚洲黄色www| 日韩中文字幕视频在线观看| 久久网站免费观看| 欧美三级在线看| 亚洲а∨精品天堂在线| 亚洲欧美中文字幕| 精品综合久久久久| 色综合天天综合网天天狠天天| 久久精品国产91精品亚洲| 国产h片在线观看| 亚洲欧洲综合另类| 精品999视频| 久草亚洲一区| 日韩在线观看a| 精品国产999| 亚洲成年人在线播放| 中文字幕在线视频精品| 欧美三级中文字幕在线观看| 深夜日韩欧美| 99视频一区| av一区在线| 亚洲最新永久观看在线| 日韩字幕在线观看| 国产一区二中文字幕在线看| 精品视频在线视频| 在线精品日韩| 欧美日韩国产页| 欧美日韩亚洲天堂| 91精品国产入口| 日韩一级二级三级精品视频| 亚洲欧美999| 欧美日韩人人澡狠狠躁视频| 午夜影院在线观看欧美| 国产成人综合av| 日韩视频精品在线| 国产主播中文字幕| 国自产拍在线网站网址视频| 97最新国自产拍视频在线完整在线看 | 精品国产乱码久久久久久蜜臀| 亚洲免费播放| 日韩精品在线视频| 国产乱国产乱300精品| 中文在线一区二区| 日本熟女一区二区| 国产一卡2卡3卡4卡网站免费| 国产日产一区二区三区| 在线国产一级| 久久久99精品久久| 国产婷婷在线观看| 成年人黄国产| 欧美日韩人人澡狠狠躁视频| 一区二区三区在线播| 黄色在线播放网站| 麻豆精品99| 欧美一级免费看| 久久精品最新免费国产成人| 999精品在线| 亚洲欧洲精品在线| 日韩三区免费| 狠狠色综合色区| 欧美日韩在线不卡| 国产欧美高清在线| 精品视频久久| 国产成免费视频| 白嫩少妇丰满一区二区| 亚洲成av人片一区二区密柚| 99精品免费观看| 一区精品在线播放| 欧美国产小视频| 日韩视频精品在线| 中文在线一区二区| www 日韩| 欧美日韩乱国产| 欧美日韩国产在线| 日韩精品乱码av一区二区| 国产区日韩欧美| 午夜伦欧美伦电影理论片| 日本精品在线中文字幕| 黄色一级大片在线免费看国产一| 国产欧美日韩不卡| 亚洲免费专区| 日韩不卡一二三区| 久久视频一区| 国产视频二区| 顶级网黄在线播放| 国产三级视频在线| 欧美一级免费在线观看| 亚洲v中文字幕| 欧美日韩视频免费播放| 欧美不卡123| 国产在线精品国自产拍免费| 亚洲成年人影院在线 | 日韩欧美资源站| 欧美亚洲综合视频| 日韩欧美国产综合| 国产在线日韩欧美| 日韩va亚洲va欧洲va国产| 欧美日韩视频不卡| 亚洲人线精品午夜| 91精品国产91久久久久久不卡 | 在线视频不卡国产V| 日韩中文字幕网| 午夜黄色小视频| 999精品在线| 国产婷婷色一区二区三区在线| 中文字幕精品视频| 国产日韩精品视频| 一区免费视频| 欧美日韩精品免费| av免费网站在线| 在线日韩精品视频| 欧美成人精品在线| 欧美一级久久久久久久久大| 97视频在线| 一二三区精品视频| 国产成免费视频| 日韩精品资源二区在线| 精品视频资源站| 国产在线第一页| 一本久久a久久精品亚洲| 日韩不卡在线播放| 亚洲第一网中文字幕| 日韩在线中文视频| 日本va欧美va精品发布| 欧美日韩精品综合| 久久婷婷国产| 亚洲 欧美 精品| 色综合天天综合网国产成人综合天| 欧美一级欧美三级在线观看| 在线一区二区三区精品| 精品婷婷伊人一区三区三| 99久久婷婷| a在线观看免费视频| 国产偷国产偷亚洲清高网站| 久久视频www| 日韩欧美不卡在线| 精品视频在线导航| 92久久精品| 搞黄在线观看| 欧美日韩精品免费看| 精品在线网站观看| 在线观看中文字幕一区| 91精品视频国产| 亚洲成av人片| 日韩欧美国产一二三区| 国产69精品久久久久孕妇国产69久久| 欧美日韩国产综合视频在线观看中文 | 免费高清在线一区| 日韩亚洲一区在线| 一级免费a一片| a天堂在线资源| 天堂中文在线视频| 天堂精品高清1区2区3区| 99久热re在线精彩视频| 顶级网黄在线播放| 日韩av二区| 99亚洲视频| 精品网站999| 久久久99久久| 视频一区三区| 国产乱国产乱老熟300部视频| 99精品一级欧美片免费播放| 日韩一二三四区| 精品999在线| 精品999视频| 国产 欧美在线| 欧美日韩免费高清| 国产95在线|亚洲| 国产成人精品三级| 亚洲欧美99| 大香一本蕉伊线亚洲网| 婷婷综合福利| 91精品国产欧美日韩| 又黄又www的网站| 亚洲第一网中文字幕| 日韩av综合在线观看| 精品三级久久| 91麻豆精品国产91久久久使用方法 | 中文字幕中文字幕精品| 亚洲精品中文字幕乱码三区| 中文字幕在线视频精品| 三级精品视频| 一区二区视频国产| 婷婷中文字幕一区| 日本精品二区| 日韩精品在线观| 国产小视频在线观看| 国产高清视频一区二区| www..com日韩| 91国内在线| 欧美亚洲天堂网| 精品国产91乱高清在线观看| 最近中文字幕第一页| 91精品国产综合久久香蕉最新版|