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

在動態報表製作中巧用DBGRID

 
AB
高階會員


發表:166
回覆:262
積分:125
註冊:2003-08-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-29 13:25:48 IP:61.221.xxx.xxx 未訂閱
在動態報表製作中巧用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
系統時間:2024-04-30 3:21:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!