在動態報表製作中巧用DBGRID |
|
AB
高階會員 發表:166 回覆:262 積分:125 註冊:2003-08-21 發送簡訊給我 |
在動態報表製作中巧用DBGRID
http://www.powerba.com/develop/delphi/article/20010710001.htm
中國華陰兵器試驗中心資料室 羅曉雲 在Delphi中,編程人員利用Quick Report控制項可以方便地設計和實現靜態報表,但對動態報表的製作仍有不便之處。如製作一個列表式報表時,如何動態調節每一列的寬度?由於報表在預覽情況下不能修改,只能在預覽前將寬度設定好,因此,如何比較方便地預先設定寬度,就成了一個需要解決的問題。 分析問題 首先可想到一種笨辦法,就是在確定報表中需要顯示的欄位後,對每一個欄位的寬度賦予一個初始值(比如80),對於需要調整的欄位再通過編輯框進行輸入修改。這樣的確可以達到預期目的,但由於不直觀,可能需要多次調整,影響了效率和方便性。 筆者通過實踐,利用DBGRID解決了這個問題。由於是製作與資料庫相關的報表,其報表記錄肯定需要通過一個SQL語句來産生,那麽這些記錄就可以先顯示在一個DBGRID中。由於DBGRID的各列寬度可以動態調節,那麽將適當的DBGRID的各列寬度賦給報表中的各列,就一次性達到了我們預期的目的,而且操作非常方便。 設置表單 建立兩個表單mainform和repform。在mainform上放置edit1、datasource1、query1、dbgrid1、button1(caption爲“提取資料”)和button2(caption爲“預覽報表”),將datasource1.dataset設定爲query1,將dbgrid1的datasource設定爲datasource1。在repform上放置Quickrep1,並至少將Quickrep1.bands.hascolumnband和Quickrep1.bands.hasdetailband設爲true。 編程實現 運行時,在edit1中輸入正確的 SQL語句。點擊“提取資料”按鈕,將相應記錄顯示在 dbgrid1中。具體的程式碼如下: procedure Tmainform.button1click(sender:TObject); var s:string; begin s:=edit1.text; with query1 do begin close; sql.clear; sql.add(s); open; end; end; 點擊“預覽報表”按鈕,可以看到形成的報表,如果對寬度擺放還有些不滿意,可以關閉預覽窗口後重新調整。具體的程式碼如下: procedure Tmainform.button2click(sender:TObject); var leftv,i:integer; //leftv爲報表起始位置 cheader:Tqrlabel; detailtext:Tqrdbtext; …… begin leftv:=0; for i:=0 to dbgrid1.columns.Count-1 do begin cheader:=TQrlabel.Create(repform); with repform.cheader do begin parent:=repform.columnheaderband1; caption:=dbgrid1.columns[i].fieldname; width:=dbgrid1.columns[i].width; height:=repform.columnheaderband1.height; left:=leftv+2; top:=5; end; ……//在leftv 處畫表格豎線 leftv:=dbgrid1.columns[i].width+leftv; end; ……//畫表頭欄邊框。起始位爲0,總寬度爲leftv,也就是dbgrid1的各列寬度之和 leftv:=0; //顯示記錄內容 for i:=0 to dbgrid1.columns.Count-1 do begin detailtext:=TQrdbtext.create(repform); with repform.detailtext do begin parent:=repform.detailband1; dataset:=query1; datafield:=dbgrid1.columns[i].fieldname; width:=dbgrid1.columns[i].width; height:=repform.detailband1.height; left:=leftv+2; top:=5; end; ……//在leftv 處畫表格豎線 leftv:=dbgrid1.columns[i].width+leftv; end; ……// 畫明晰欄邊框。 repform.quickrep1.preview();//報表預覽 end;發表人 - ab 於 2003/11/29 13:41:13 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |