線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2185
推到 Plurk!
推到 Facebook!

如何在資料網格(DBGRID)中插入其他的可視控制項

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-26 13:28:47 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 如何在資料網格(DBGRID)中插入其他的可視控制項 大連管理幹部學院 林桂花 摘要:本文討論在Delphi的網格(dbgrid)中增加控制項的方法。用此方法可以在網格中加入諸如檢查筐、下拉筐等。 關鍵字:DELPHI 網格 控制項 在DELPHI的資料庫應用程式設計中,DBGRID是一個非常實用的控制項。它不僅可以以網格的形式輸入顯示一組資料,對於每一個單格還提供了不同的屬性,使單格具有了更豐富的能力(例如下拉查詢框、單擊按鈕等),但是,對於一個比較複雜的應用而言,我們希望而DBGRID還能具備更多的功能,比如在單格中是否可以顯示圖形、單選形、檢查框等,從而使DBGRID的功能更強大,在?其他可視控制項的包容器。 事實上,在DELPHI中的DBGRID中並不具備以上功能。我們可以通過以下的方法使DBGRID具有這些功能。 (1) 使用DELPHI的控制項開發技術; (2) 把其他控制項疊加在DBGRID上; 我們先來討論第一種方法。DELPHI作?可視開發工具(RAD)中的佼佼者,它的最大的過人之處就在於其完備的面向物件技術,其中控制項的開發功能更是吸引大批的程式開發人員。 事實上DBGRID控制項,就是從GRID繼承而來在GRID中加入一個TDBEDIT的物件,使GRID具備了資料感知能力。具體實現可參閱DELPHI中的VCL庫中DBGRID.PAS文件。 同樣的道理,我們可以從DBGRID中繼承下來,再生成一個新的控制項,使它個備顯示圖形、檢查框等能力,但這需要對DELPHI有比較深刻的理解,有比較強的編程能力才能實現。 下面討論第二種實現方法。這種方法實現起來比較容易,也比較直觀。本文所給出的程式實例也就是用這種方法實現的。下面介紹該方法的實現原理。 前面我們已經說到,DBGRID實際就 是GRID和DBEDIT的一個組合,在DBGRID內部是一個可以在網格中移動的DBEDIT,可以在這個活動的DBEDIT中鍵入資料,未獲得該點的部分僅僅是些圖形。同時DBGRID提供了畫布CANVAS屬性,這樣就使我們有可能把其他控制項畫到DBGRID上,從效果上看,DBGRID就包含了其他的可視控制項。 同樣,可以用其他控制項覆蓋DBGRID的輸入部分,只要從其他可視控制項上的輸入能夠被DBGRID感知,這樣就可以同步完成對DBGRID的輸入更新。這裏有兩種方法實現兩個控制項輸入的同步更新。 第一、 可視控制項採用資料感知控制項。這樣,在對資料庫存更新的同時,也完成對DBGRID的更新(本例採用這一方法)。 第二、 利用各控制項的消息迴圈機制,在某一控制項得到輸入時,同DBGRID中發送一個消息,達到資料的更新。 下面是該方法的程式實現實例(在WINDOWS 95 DELPHI3。0-下實現。) //主程序單元文件 unit main; interface uses sysUtile, wintypes,winprocs,messages,classes,graphics,controls, forms,dialogs,stdctrls,db,dbtables,dblookup,mask,dbctrls, extctrls,grids,dbgrids,buttons,calendar; type tforml=class(tform) tablegriddata:ttable; datasourcegriddata:tdatasource; dbnavigator1:tdbnavigator; dbgrid1:tdbgrid; tablegriddataorderno:tfloatfield; tablegriddatacustno:tfloatfield; tablegriddatashipVIA:tstringfield; tablegridatacheckbox:tbooleanfield; dbcheckbox1:tdbcheckbox; imagetrue:timage imagefalse:timage; database1:tdatabase; bitbtn1:tbitbtn; procedure formcreate(sender:tobject); procedure dbgrid 1 drawdatacell(sender:tobject;const rect:trect;) field:tfield;state;tgriddrawstate); procedure dbgrid 1 keypress (sender:tobject; var key:char); procedure dbcheckbox 1 click (sender:tobject); procedure dbgrid 1 colexit (sender:tobject); private {private declarations} public {public declarations} end; var form 1:tform1; implementation {$r*.dfm} procedure tform1.formcreate9sender:tobject); begin database1.params.add('Path= extractfiledir(Application.exename));{資料庫存指向應用程式路徑} database1.openk;{打開資料庫} tablegriddata.open{打開表} dbcheckbox1.visible:=false;{將各控制項設?不可視} imagetrue.visible:=false; imagefalse.visible:=false; end; procedure tforma1.dbgrid 1 drawdatacell(sender:tobject;const rect:trect; field:tfield:state:tcriddrawstate); begin if(gdfocused in state)then{當資料網格處於編輯狀態時} begin if (field.fieldname=dbcheckbox1.datafield)then {當資料焦點處於checkbox欄位時,在dbgirddbcheckbox上畫} begin dbcheckbox1.left:=rect.left dbgrid1.left 1;{設置dbcheckbox的位置} dbcheckbox1.top:=rect.top dbgrid1.top 1 dbcheckbox1.width:=rect.right-rect.left{-1} dbcheckbox1.height:=rect.botton-rect.top{-1} dbcheckbox1.visible:=true{將dbcheckbox變?可視的} end end else(在dbgrid處於其他狀態時,畫圖) begin if(field.fieldname=dbcheckbox1.datafield)then begin if tablegridatacheckbox.asboolenan then{根據資料不同,畫不同的圖} dbgrid1.canvas.draw(rect.left.rect.top,imagetrue.picture.bitmap) else dbgrid1.canvas.draw(rect.left,rect.top,imagefalse.picture.bitmap) end end; end; procedure tform1.dbgrid 1 colexit(sender:tobject); begin if dbgrid.selectedfield.fieldname=dbcheckbox1.datafiele then{網格離開時,更改dbcheckbox的可視屬性} dbcheckbox1.visible:=falese; end procedure tform1.dbgrid1 keypress(sender:tobject;var key:char) begin if(key<>chr(9))then begin if(dbgrid1.selectedfield.field name=dbcheckbox1.datafield)then{如果是checkbox欄位得到焦點,將按鍵消息發給dbcheckbox控制項} begin dbcheckbox1.setf9ocus; sendmessage(dbcheckbox1.handle,wm_char,word(cey),0); end end; end; proc4edure tform1.dbcheckbox1 click(sender:tobject); begin if sendmessage(Dbcheckbox1.handle,bm_getcheck,0,0)=0 then[根據消息結果判斷dbcheckbox標題] dbcheckbox1.caption:= 未選 else dbcheckbox1.caption:= 選中 end; end; //表單定義文件(略) 作者簡介: 姓名:林桂花 性別:女 出生日期:1961年1月 學歷:大學本科 所學專業:應用數學 現從事專業:電腦 工作單位:大連管理幹部學院電腦與資訊管理系 業務介紹 本從于1983年畢業于東北工學院應用數學專業,多年來一直從事電腦學科的教學與科研開發,積累了豐富的經驗。曾先後開發過各種軟體系統,其中有通過國家電子工業部、機電工業部部級鑒定的專案;有獲得省級開發專案獎的,有通過大連市電腦應用開發辦公室組織的專案鑒定。近幾年來先後對WIN95/97、INTERNET、DELPHI、VB等進行了學習、探討、研究,並取得了顯著的效果。 發表人 - jackkcg 於 2002/10/26 13:29:44
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-26 7:47:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!