<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      在動態報表制作中靈活使用DBGRID

      [摘要]在Delphi中,編程人員利用Quick Report控件可以方便地設計和實現靜態報表,但對動態報表的制作仍有不便之處。如制作一個列表式報表時,如何動態調節每一列的寬度?由于報表在預覽情況下不能修改...
      在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; 


      日韩精品一区二区三区高清