在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

在Delphi中完成數據區分模塊的動態報表

在Delphi中完成數據區分模塊的動態報表

更新時間:2019-06-21 文章作者:未知 信息來源:網絡 閱讀次數:

一、問題的提出

---- Delphi作為強大的數據庫開發工具,正被愈來愈多的編程人員所采用,"聰明的程序員用Delphi"更形象生動的道出廣大程序員的心聲,但這并不意味著所有功能的實現都非常容易,例如,筆者在開發軍隊的某個信息系統中,就在為數據分析模塊中DecisionGrid1控件的數據進行報表輸出時走了不少的彎路。廣大的Delphi的愛好者在今后的學習或工作中也有可能會遇到類似的問題,而在許多參考書中,很少有甚至沒有關于它們的解決方法,于是,我想花費一點時間把它整理出來,以供大家參考。本文中報表動態生成的公用模塊具有很大的靈活性和易操作性,其中的思路、實現的功能和通用性等方面的優缺點就由大家看了本文后自有定論。

二、建立報表的動態輸出公用模塊

---- 下面,結合公司人事管理信息系統說明其實現的方法和技術。

---- 1、基本思路:首先從DecisionGrid1中獲得報表所需數據,放到二維數組PA中,然后在C:\DataWork中動態創建一個數據表tjb.dbf,存放報表數據,最后用T able1與tjb.dbf相連接,以后工作就與一般的動態輸出報表(如查詢報表)相類似,在這里我就無須贅述了。

---- 2、建立窗體文件:放入六個用于數據分析的常用控件DecisionQuery1、DecisionSource1、DecisionCube1、DecisionGraph1、DecisionPivot1、DecisionGrid1,設置DecisionSource1的decisionCube屬性為decisionCube1,decisionCube1的Dataset屬性為decisionQuery1、decisionQuery1的DatabaseName屬性為c:\datawork;一個Table1控件,用于連接數據表tjb.dbf;一個QuickRep1控件,用于數據的報表輸出;兩個Button1和Button2控件,其Caption分別設為"報表輸出"和"返回"。分別設置decisionCube1的Dataset屬性為decisionQuery1、decisionQuery1的DatabaseName屬性為c:\datawork.。

---- 3、單元文件的主要控件代碼 Button1控件的代碼如下(定義變量部分略),主要分以下8個功能塊來加以說明:

---- ⑴刪除同名或上一次建立的數據表

if FileExists('c:\DataWork\tjb.dbf') then
deletefile('c:\ DataWork \tjb.dbf');

---- ⑵根據DecisionGrid1控件的cells屬性,獲得報表所需數據,并將其默認的'Sum'值漢化成'總計'、'合計'、'小計'以符合漢語的習慣要求,所求得的數據存放于二維數組PA中
for i:=1-DecisionGrid1.FixedCols to DecisionGrid1.
ColCount-DecisionGrid1.FixedCols-1 do
for j:=0-DecisionGrid1.FixedRows to DecisionGrid1.
RowCount-DecisionGrid1.FixedRows-1 do
begin
pa[i,j]:=DecisionGrid1.cells[i,j];
//處理DecisionGrid1控件中固定列的值為'Sum'的數據項
if ((i=1-DecisionGrid1.fixedcols) and (pa[i,j]='Sum')) then
pa[i,j]:='總 計'
else if ((i = -1) and (pa[i,j]='Sum')) then
pa[i,j]:='小 計'
else if ((i<-1) and (i>1-DecisionGrid1
.FixedCols) and (pa[i,j]='Sum')) then
pa[i,j]:='合 計';
//處理DecisionGrid1控件中固定行的值為'Sum'的數據項
if (pa[i,j]='Sum' ) and (j=-1) then
pa[i,j]:='總 計';
end;

---- ⑶用T able1動態創建數據表tjb.dbf
Table1.Active:=false;
with Table1 do
begin
DatabaseName := 'c:\DataWork';
TableName := 'tjb';
TableType := ttDBase;
with FieldDefs do
begin
Clear;
for i:=1 to 40 do
Add(IntToStr(i),ftString,30, False);
end;
CreateTable;
end;
//下面將DecisionGrid1控件中的數據放入數據表中
Table1.Active:=true;
for j:=1-DecisionGrid1.FixedRows to DecisionGrid1
.RowCount-DecisionGrid1.FixedRows-1 do
begin
K:=0;
Table1.Insert;
for i:=1-DecisionGrid1.FixedCols to DecisionGrid1
.ColCount-DecisionGrid1.FixedCols-1 do
begin
Table1.Fields[K].AsString:=pa[i,j];
K:=K+1;
end;
Table1.Post;
Table1.Next;
end;

---- ⑷下面代碼確定輸出報表的每列寬度
SetLength(M,DecisionGrid1.ColCount);//動態設置數組
copy(M,1-DecisionGrid1.FixedCols,DecisionGrid1
.ColCount-DecisionGrid1.FixedCols-1);
//重新設置動態數組的起始位置
for i:=1-DecisionGrid1.FixedCols to DecisionGrid1
.ColCount-DecisionGrid1.FixedCols-1 do
begin
M[i]:=0;
for j:=1-DecisionGrid1.FixedRows to DecisionGrid1
.RowCount-DecisionGrid1.FixedRows-1 do
IF M[i]< Length (Trim (PA[I,J]))*8 THEN
M[i]:= Length (Trim (PA[I,J]))*8;
end;

---- ⑸如果要求輸出報表的列寬相同(除DecisionGrid1控件的固定列,下同),可將數據項的最大列寬作為輸出報表的列度,如果不要求,可跳過下面代碼
max:=0;
for i:=0 to DecisionGrid1.ColCount
-DecisionGrid1.FixedCols-1 do
if m[i]>max then
max:=m[i];
for i:=0 to DecisionGrid1.ColCount
-DecisionGrid1.FixedCols-1 do
m[i]:=max;
ZK:=0;//報表總寬
for i:=1-DecisionGrid1.FixedCols to DecisionGrid1
.ColCount-DecisionGrid1.FixedCols-1 do
ZK:=ZK+M[i]+1;

---- ⑹判斷報表的寬度,超寬?橫向報表?還是縱向報表?
if ZK>1123 then
begin
Application.MessageBox('報表超寬,
請調整再輸出!','警告', 1);//輸出對話框
exit;
end
else if ZK>794 then
QuickRep.Page.Orientation:=poLandscape //橫向
else
QuickRep.Page.Orientation:=poPortrait;//縱向

---- ⑺以下代碼完成了動態數據報表,與一般的動態輸出報表功能相類似,
for i:=1 to QuickRep.Bands.TitleBand.
ControlCount DO//取消系統對控件的控制,下同
QuickRep.Bands.TitleBand.RemoveControl
(QuickRep.Bands.TitleBand.Controls[0]);
for i:=1 to QuickRep.Bands.DetailBand.ControlCount DO
QuickRep.Bands.DetailBand.RemoveControl
(QuickRep.Bands.DetailBand.Controls[0]);
SetLength(QRShape,DecisionGrid1.ColCount)
; //動態設置數組
SetLength(QRDBText, DecisionGrid1.ColCount)
; //動態設置數組
K:=0;//動態生成對象的數,
Lx:=(QuickRep.Width-ZK)DIV 2;//生成對象的左坐標
//報表的動態生成
For j:=1-DecisionGrid1.FixedCols to DecisionGrid1
.ColCount-DecisionGrid1.FixedCols-1 do
begin
QRShape[K]:=TQRSHAPE.Create(tj1);//自定義對象的創建(下同)
QRShape[K].Parent:=QuickRep.Bands
.DetailBand;// 自定義對象的父類對象(下同)
QRDBText[K]:=TQRDBText.Create(tj1);
QRDBText[K].parent :=QuickRep.Bands.DetailBand;
QRShape[K].LEFT:=Lx;//生成對象的左坐標
QRShape[K].WIDTH:=M[J]+2; //生成對象的寬度
QRShape[K].HEIGHT:=QuickRep.Bands
.DetailBand.Height+1; //生成對象的高度
QRShape[K].TOP:=-1; //生成對象的縱坐標
QRDBText[K].WIDTH:=QRShape[K].WIDTH-10;
QRDBText[K].Left :=QRShape[K].LEFT+1;
QRDBText[K].HEIGHT:=QRShape[K].Height div 2;
QRDBText[K].Top :=QRDBText[K]
.Height div 2+QRShape[K].Top;
QRDBText[K].AutoSize:=false;
QRDBText[K].Alignment:=taCenter; //生成對象居中
QRDBText[K].DataSet:=Table1;
QRDBText[K].DataField:=IntToStr(k+1);
Lx:=Lx+M[J]+1;
Inc(k);
end;
//動態生成報表的標題
Caption := TQRLabel.Create(tj1);
Caption.Parent := QuickRep.Bands.TitleBand;
Caption.Alignment:=taCenter;//標題居中
Caption.Width:= Length (Trim (ptitle))*8; //標題的寬度
Caption.Left:=(QuickRep.Width-
Length (Trim (ptitle))*8)div 2; //標題的左坐標
Caption.Height:=QuickRep.Bands
.TitleBand.Height-1; //標題的高度
Caption.Top:= 0;
Caption.Caption:=ptitle; //標題的名稱
,ptitle為調用該公用模塊時的輸入參數
QuickRep.DataSet:=Table1;
QuickRep.Preview;
⑻動態生成對象的內存釋放
k:=0;
for j:=1-DecisionGrid1.FixedCols to DecisionGrid1
.ColCount-DecisionGrid1.FixedCols-1 do
begin
QRShape[K].Free;
QRDBText[K].Free;
inc(k);
end;
Caption.Free;
Table1.Active:=false;//關閉數據表
end;

---- 以上程序是在Delphi 4.0中調試通過,其數據文件應放在C:\DataWork,類型為DB或DBF。
三、應注意以下幾個問題

---- 1、QuickRep1的Bands中的HasColumnHeader、HasDetail、HasTitle三個屬性必須設置為true;

---- 2、不能忘記公用模塊中QuickRep對象的DataSet屬性設置,即源代碼中的QuickRep.DataSet:=Table1語句;

---- 3、動態生成組件的寬度計算必須放在定義其字體屬性完成后進行;

---- 4、另外,動態數組給定的內存(即數組容量)以及指定動態數組的起始位置(不一定為0,根據DecisionGrid1控件的固定列確定)很重要,因為一方面當數據庫很大時它會大大減少內存的消耗,另一方面便于操作該數組,大大增強了程序的靈活性和通用性。

---- 5、如果讓QRDBText控件的數據居中,必須先設置其AutoSize屬性為false,然后才能設置其Alignment屬性為taCenter。這一點往往容易忽略,直接設置Alignment屬性為taCenter,往往達不到數據居中的目的。

四、結束語

---- 當然,由于客戶對數據報表的可能特殊要求,此公用模塊或許不能完全解決。但是,作為公用模塊,能實現實現代碼的重復利用,提高我們開發程序的效率,當然可以在此模塊的基礎上進行一些修改或補充,以滿足大多數用戶的要求,用以下兩點加以說明。

---- 1、如果要對數據表的字段進行動態選擇輸出,則可以將動態產生的數據表字段傳遞到另一個窗體進行輸出選擇,然后根據你所選擇的字段進行報表輸出,源程序幾乎無須修改即可實現。

---- 2、若要改變數據分析的內容(即直方圖的維)時,只須修改SQL語句即可,動態、靜態均可,具體的操作也就無須我多言了。各位Delphi編程愛好者不妨一試。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 国产69精品久久久久999小说| 国产在线拍揄自揄拍无码| 女女百合国产免费网站| av在线免费看片| 在线观看免费黄网站| 国产又猛又黄的视频| 欧美视频免费播放| 色综合av综合无码综合网站| 国产午夜大地久久| 69堂免费视频| 国产情侣av自拍| 少妇一级淫免费播放| 欧美成人黄色网址| 性久久久久久久久久久久久久| 欧美女同在线观看| 善良的小姨在线| 国产手机免费视频| 欧美 国产 日本| 亚洲色图 在线视频| 一区二区三区日韩视频| 波多野结衣与黑人| 日本www在线播放| 视频在线观看免费高清| 成人手机在线播放| 无码精品a∨在线观看中文| 亚洲国产精品三区| www.成年人视频| 国产a级片免费观看| 伊人免费视频二| 国产免费黄视频| 天堂v在线视频| 国产性xxxx18免费观看视频| 最新免费av网址| 国产九九九九九| 免费成年人高清视频| 国产玉足脚交久久欧美| 香蕉视频网站入口| 日韩精品视频在线观看视频| 在线观看免费成人av| 人人妻人人澡人人爽欧美一区双| 日本三级免费观看| 女女百合国产免费网站| 少妇一级淫免费放| 777777av| 免费看日b视频| 最近中文字幕一区二区| www.av毛片| 男人的天堂成人| 亚洲成人福利在线| 两根大肉大捧一进一出好爽视频| 色偷偷中文字幕| 超碰在线97免费| 久久精品.com| 美女av免费在线观看| 国产精品久久..4399| 国产精品一二三在线观看| 午夜激情av在线| 丰满少妇在线观看| 99福利在线观看| 欧美一级片中文字幕| 久久久久久久久久久视频| 国产一线二线三线女| 精品视频在线观看一区二区| 992kp免费看片| 手机成人av在线| 色撸撸在线观看| 4444在线观看| 黄色激情在线视频| av免费观看网| 人妻少妇被粗大爽9797pw| 99热在线这里只有精品| 欧美亚洲一二三区| 国产精品视频一区二区三区四区五区| 国产原创中文在线观看 | 欧美日韩dvd| 中国一级黄色录像| 狠狠精品干练久久久无码中文字幕| 一区二区三区四区毛片| 手机在线观看日韩av| 精品一区二区成人免费视频| 亚洲欧美一二三| 水蜜桃色314在线观看| 欧美日韩在线中文| 三级av免费观看| 日本一区二区三区四区五区六区| 免费的av在线| 精品国产免费av| 国产一二三四在线视频| 日本三级福利片| 欧美成人一区二区在线观看| 国产性生交xxxxx免费| 色网站在线视频| 97国产在线播放| 国产欧美激情视频| 成熟丰满熟妇高潮xxxxx视频| 老熟妇仑乱视频一区二区| 亚洲xxx在线观看| 精品国产一区二区三区无码| 国产一区二区三区精彩视频 | 国产一二三区在线播放| 亚洲人成色77777| 天天综合中文字幕| 久久国产乱子伦免费精品| 超碰人人草人人| 亚洲午夜无码av毛片久久| 中文字幕国产高清| 免费无码av片在线观看| 久久精品国产精品亚洲精品色| 无码粉嫩虎白一线天在线观看| 中文字幕永久有效| 久久久999视频| 国产911在线观看| www.xxx亚洲| 99热亚洲精品| 91在线第一页| 欧美精品性生活| 久久精品99国产| 久久久久久久久久伊人| 17c国产在线| www.xxx亚洲| 日本三级免费观看| 免费 成 人 黄 色| 国产 日韩 亚洲 欧美| 日韩a一级欧美一级| 爱情岛论坛成人| 日韩中文字幕二区| 草草久久久无码国产专区| 日本欧美视频在线观看| 免费在线看黄色片| 国产性生活免费视频| 2021狠狠干| 日本a级片在线播放| 亚洲高潮无码久久| 人人妻人人澡人人爽欧美一区| 亚洲第一成肉网| 永久免费黄色片| 手机看片日韩国产| av动漫免费观看| 国产91视频一区| 被灌满精子的波多野结衣| 青青草精品视频在线| 毛片在线视频播放| 国产97色在线 | 日韩| 国产美女三级视频| 无码少妇一区二区三区芒果| 欧美在线观看视频网站| 中文字幕av不卡在线| 色婷婷综合在线观看| 国产免费内射又粗又爽密桃视频| 久久精品无码中文字幕| 黄色片久久久久| 91女神在线观看| 久久久天堂国产精品| 人人干视频在线| 黄色片在线免费| 7777在线视频| 无码播放一区二区三区| 日本三级黄色网址| 成人一区二区av| 无码日韩人妻精品久久蜜桃| 中文字幕一区久久| 老太脱裤子让老头玩xxxxx| 五月婷婷之综合激情| 天天想你在线观看完整版电影免费| 三上悠亚久久精品| 天堂在线一区二区三区| 国产深夜男女无套内射| 99re6在线观看| 欧美日韩国产精品激情在线播放| 亚洲精品视频三区| jizzjizzxxxx| 9色视频在线观看| 亚洲精品久久久中文字幕| 国产情侣第一页| www.色就是色.com| 女人另类性混交zo| 97超碰国产精品| 特级黄色录像片| 超碰在线97免费| 成熟了的熟妇毛茸茸| 四虎4hu永久免费入口| 777一区二区| avav在线看| 极品美女扒开粉嫩小泬| 三上悠亚免费在线观看| 亚洲精品综合在线观看| 日本熟妇人妻xxxxx| 人体内射精一区二区三区 | 国产freexxxx性播放麻豆| 香蕉视频999| www.日日操| 能看的毛片网站| 日本中文字幕片| 免费看一级大黄情大片| 免费在线黄网站| 国产亚洲精品久久久久久久| 色哺乳xxxxhd奶水米仓惠香| 日本一二三四区视频| 91社在线播放| 国产成人三级视频|