六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

在DELPHI中使用API完成網(wǎng)格內(nèi)組件的嵌入

[摘要]陳學(xué)軍  Delphi中向TDBGrid添加組件是一件十分麻煩的事情。筆者在這里向大家介紹一種利用WIN32 API函數(shù)在TDBGRID中嵌入CHECKBOX組件的方法。   TDBGrid部件是用于顯示和編輯數(shù)據(jù)庫表中記錄信息的重要部件,它是我們在程序設(shè)計過程中要經(jīng)常使用的一個強(qiáng)有力的工具。TD...
陳學(xué)軍

  Delphi中向TDBGrid添加組件是一件十分麻煩的事情。筆者在這里向大家介紹一種利用WIN32 API函數(shù)在TDBGRID中嵌入CHECKBOX組件的方法。

  TDBGrid部件是用于顯示和編輯數(shù)據(jù)庫表中記錄信息的重要部件,它是我們在程序設(shè)計過程中要經(jīng)常使用的一個強(qiáng)有力的工具。TDBGrid具有很多重要的屬性,我們可以在程序設(shè)計階段和程序運行過程中進(jìn)行設(shè)置。TDBGrid部件中有很多重要的屬性,我們在這里重點介紹Option屬性和DefaultDrawing屬性,其他屬性及其設(shè)置方法請參看聯(lián)機(jī)幫助文件。

  Options屬性:它是TDBGrid部件的一個擴(kuò)展屬性,在程序設(shè)計階段設(shè)置Options屬性可以控制TDBGrid部件的顯示特性和對事件的響應(yīng)特性。

  DefalultDrawing屬性:該屬性是布爾型屬性,它用于控制網(wǎng)格中各網(wǎng)格單元的繪制方式。在缺省情況下,該屬性的值為True,也就是說Delphi使用網(wǎng)格本身缺省的方法繪制網(wǎng)格中各網(wǎng)格單元,并填充各網(wǎng)格單元中的內(nèi)容,各網(wǎng)格單元中的數(shù)據(jù)根據(jù)其對應(yīng)的字段部件的DisplayFormat屬性和EidtFormat屬性進(jìn)行顯示和繪制。如果DefaulDrawing屬性被設(shè)置為False,Delphi不會自動地繪制網(wǎng)格中各網(wǎng)格單元和網(wǎng)格單元中的數(shù)據(jù),用戶必須自己為TDBGrid部件的OnDrawDataCell事件編寫相應(yīng)的程序以用于繪制各網(wǎng)格單元和其中的數(shù)據(jù)。

  需要注意的是,當(dāng)一個布爾字段得到焦點時,TDBGrid.Options中的 gdEditing屬性不能被設(shè)置成為可編輯模式。另外,TDBGrid.DefaultDrawing屬性不要設(shè)置為FALSE,否則,就不能得到網(wǎng)格中畫布屬性的句柄。

  程序設(shè)計開始時就應(yīng)考慮:需要設(shè)定一變量來存儲原始的 TDBGrid.Options的所有屬性值。這樣,當(dāng)一boolean字段所在欄得到焦點時將要關(guān)閉TDBGrid.Options中g(shù)dEditing的可編輯模式。與此相對應(yīng),若該欄失去焦點時,就要重新恢復(fù)原始的 TDBGrid.Options的所有屬性值。

  在實例中可以通過鼠標(biāo)點擊或敲打空格鍵改變布爾值,這樣就需要觸發(fā)TDBGrid.OnCellClick事件和TDBGrid.OnKeyDown事件。因為這兩個事件都是改變單元格中邏輯字段的布爾值,所以為了減少代碼的重復(fù)最好創(chuàng)建一個私有過程(SaveBoolean;)來完成邏輯值的輸入,以后,在不同的事件中調(diào)用此過程即可。

  對 TDBGrid.OnDrawColumnCell事件的處理是整個程序的關(guān)鍵。處理嵌入組件的顯示的傳統(tǒng)方法是:在表單上實際添加組件對象,然后對組件的位置屬性與網(wǎng)格中單元格的位置屬性進(jìn)行調(diào)整,以達(dá)到嵌入的視覺效果。這種方法雖然可行但代碼量大,實際運行時控制性很差。筆者采用的方法是充分利用WIN32 API函數(shù):DrawFrameControl(),由于此函數(shù)可以直接畫出Checkbox組件,所以就無須在表單中實際添加組件。如何使用API函數(shù):DrawFrameControl()是本程序技巧所在。

  在TDBGrid.OnDrawColumnCell事件中,我想大家會注意到:設(shè)定一個整型數(shù)組常數(shù),而這個返回的整數(shù)值是與布爾值相一致的,如果字段是邏輯字段,則只將其布爾值放入數(shù)組中,提供給DrawFrameControl()函數(shù)中的狀態(tài)參數(shù)進(jìn)行調(diào)用,從而實現(xiàn)了Checkbox組件在網(wǎng)格中的嵌入效果。

  源代碼如下:

  type

   TForm1 = class(TForm)

    DataSource1: TDataSource;

    Table1: TTable;

    DBGrid1: TDBGrid;

    procedure DBGrid1DrawColumnCell(Sender: TObject;

          const Rect: TRect; DataCol: Integer;

          Column: TColumn; State: TGridDrawState);

    procedure DBGrid1ColEnter(Sender: TObject);

    procedure DBGrid1ColExit(Sender: TObject);

    procedure DBGrid1CellClick(Column: TColumn);

    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;

          Shift: TShiftState);

   private

    { Private declarations }

    OriginalOptions : TDBGridOptions;

    procedure SaveBoolean;

   public

    { Public declarations }

   end;

  

  {...}

  procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;

           const Rect: TRect; DataCol: Integer;

           Column: TColumn; State: TGridDrawState);

  const

   // 這個整數(shù)值將按照布爾值返回,并送入數(shù)組

   CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK,

           DFCS_BUTTONCHECK or DFCS_CHECKED);

  begin

   //確保只有在邏輯字段才能插入組件

   if Column.Field.DataType = ftBoolean then

   begin

    DBGrid1.Canvas.FillRect(Rect);

    DrawFrameControl(DBGrid1.Canvas.Handle,

             Rect,

             DFC_BUTTON,

             CtrlState[Column.Field.AsBoolean]);

   end;

  end;

  

  procedure TForm1.DBGrid1ColEnter(Sender: TObject);

  begin

   // 確保該欄是邏輯字段

   if DBGrid1.SelectedField.DataType = ftBoolean then

   begin

    OriginalOptions := DBGrid1.Options;

    DBGrid1.Options := DBGrid1.Options - [dgEditing];

   end;

  end;

  

  procedure TForm1.DBGrid1ColExit(Sender: TObject);

  begin

   //確保該欄是邏輯字段

   if DBGrid1.SelectedField.DataType = ftBoolean then

    DBGrid1.Options := OriginalOptions;

  end;

  

  procedure TForm1.DBGrid1CellClick(Column: TColumn);

  begin

   //確保該欄是邏輯字段

   if DBGrid1.SelectedField.DataType = ftBoolean then

    SaveBoolean();

  end;

  

  procedure TForm1.DBGrid1KeyDown(Sender: TObject;

             var Key: Word; Shift: TShiftState);

  begin

   //確保該欄是邏輯字段和空格鍵在鍵盤中被敲擊

   if ( Key = VK_SPACE ) and

     ( DBGrid1.SelectedField.DataType = ftBoolean ) then

    SaveBoolean();

  end;

  

  procedure TForm1.SaveBoolean;

  begin

   DBGrid1.SelectedField.Dataset.Edit;

   DBGrid1.SelectedField.AsBoolean :=

     not DBGrid1.SelectedField.AsBoolean;

   DBGrid1.SelectedField.Dataset.Post;

  end;

  以上源程序在PWIN+DELPHI5.0環(huán)境調(diào)試通過,可以直接引用。


主站蜘蛛池模板: 青青青激情视频在线最新 | 亚洲一区免费在线 | 四虎影院大全 | 四虎中文| 日韩三级小视频 | 日日噜噜夜夜狠狠扒开双腿 | 日韩城人视频 | 亚洲图片欧美 | 手机看片91 | 色域综合 | 欧美综合在线视频 | 青草国产精品久久久久久久久 | 日本三级成人中文字幕乱码 | 深夜福利成人 | 日本亚洲视频 | 又爽又黄无遮挡高清免费视频 | 亚洲欧洲国产精品你懂的 | 四虎成人影院网址 | 亚洲 欧美 国产 日韩 制服 bt | 青青娱乐 | 四虎看片| 日韩特黄特色大片免费视频 | 人人搞人人爱 | 日韩免费无砖专区2020狼 | 天天色天天操天天 | 日本欧美人xxxxx在线观看 | 深爱五月综合网 | 一二三四社区在线高清3 | 欧美一区二三区 | 青草视频在线免费观看 | 亚洲国产精品久久久久 | 日韩亚洲综合精品国产 | 深夜福利影院在线观看 | 亚洲第一区二区快射影院 | 一区二区三区欧美日韩 | 手机三级在线 | 四虎影院在线免费观看视频 | 伊人网影院 | 日韩一区二区三区不卡视频 | 香蕉视频一级片 | 青春草久久 |