1. 程式人生 > >用Delphi製作中國式報表

用Delphi製作中國式報表

    

     在資料庫應用程式開發中,系統設計員、程式設計員需要考慮的一個重要問題是如何設計和輸出報表,在Delphi中我們可以採用多種方案來解決這一問題。如運用OLE自動化技術將資料輸出到MS-Word、MS-Excel中等,但其中最直接、最本地化的還是使用Delphi3.0/40中的QuickReport報表元件。它是挪威QuSoft公司專門為Delphi 編寫的,使用QuickReport可以迅速設計出符合西方人習慣用的報表。

  然而,在設計中國式報表時,筆者發現在QuickReport中設計列與列之間的豎線和斜線比較困難;雖然QuickReport提供了TQShape控制元件,使用該控制元件可以畫出列與列之間的豎線,但如果使用者不能正確地調整TQShape例項的高度,輸出報表中的豎線不是不連續就是超長,另外如果我們調整了某個Band的高度,我們將不得不調整該Band下的所有TQShape例項的高度;至於斜線,QuickReport報表元件根本就沒有提供這一功能。

  筆者認真查找了有關的資料,成功地解決了以上問題,希望能對大家有所幫助。

  解決思路

  以TQShape為父類,建立新的控制元件,新控制元件可以畫豎線、斜線和反斜線。

  過載TQShape 類的Paint方法,這樣在設計階段可以非常直觀地畫堅線、斜線和反斜線。使用者可以在設計階段選擇線的型別,如果選擇直線,控制元件自動將其高度調整為所屬Band的高度,使用者可以調整其橫向位置但不能調整其高度;如果選擇斜線,使用者可以根據需要調整斜線的長度和傾角。過載TQShape 類的Print方法,這樣可以在執行階段輸出直線和斜線。

  說明:該控制元件只能畫直線和斜線,如果讀者需要畫矩形和圓,可以使用TQShape控制元件來實現。

  控制元件設計步驟

  步驟1.使用Delphi提供的控制元件嚮導,選擇TQShape為父類,建立新類TMyQRShape,並選擇適當的包(Package),最後生成單元檔案。

  步驟2.在生成的單元檔案中,增加列舉型別。

  TLines = ( None,TopBottom,BottomTop ) None、TopBottom、BottomTop三種取值,分別代表直線、斜線 / 和反斜線 /。

  步驟3.在新類TMyQRShape 中增加private 成員 FLineType:TLines ,增加published屬性 LineType:TLines Read

FLineType Write SetFLineType。

  步驟4.建立過程SetFLineType。


 procedure

TMyQRShape.SetFLineType(value:TLines);

begin

if value<>FLineType then
 

 begin

FLineType:=value

Invalidate

end

end
 

步驟5.過載Paint方法。


 procedure TMyQRShape.Paint

begin

case LineType of

BottomTop:

begin

Canvas.MoveTo(0,Height)

Canvas.LineTo(width,0 )

end

TopBottom:

begin

Canvas.MoveTo(0,0)

Canvas.LineTo(width,Height )

end

None:

begin

Height := Parent.Height

Top:=0

Width:=4
 

 Shape:=qrsVertLine

Inherited Paint

end

end

end
 

步驟6.過載Print方法。


 procedure TMyQRShape.Print(OfsX,OfsY : Integer);

begin

with QRPrinter do

begin

case LineType of

BottomTop:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top)+Height)

Canvas.LineTo(XPos(OfsX + Size.Left)+width,YPos(OfsY + Size.Top) )

end

TopBottom:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top))

Canvas.LineTo(XPos(OfsX + Size.Left)+Width,YPos(OfsY + Size.Top)+Height )

end

None:

Inherited Print(OfsX,OfsY )

end


end

end;
 

步驟7.儲存並安裝TMyQRShape控制元件。

本控制元件在Delphi40下除錯、安裝,併成功地應用於某資料庫管理系統的開發中。該控制元件的完整程式碼如下:

源程式:


 unit MyQRShape;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs,

QuickRpt, Qrctrls;

type

TLines = ( None,TopBottom,BottomTop )

TMyQRShape = class(TQRShape)

private

FLineType:TLines

procedure SetFLineType(value:TLines)

protected

procedure Print(OfsX, OfsY : integer); override;

procedure Paint Override

public

published

property LineType:TLines Read FLineType Write SetFLineType

end;
 

 procedure Register;

implementation

procedure

TMyQRShape.SetFLineType(value:TLines);

begin

if value<>FLineType then

begin

FLineType:=value

Invalidate

end

end

procedure TMyQRShape.Paint

begin

case LineType of

BottomTop:

begin

Canvas.MoveTo(0,Height)

Canvas.LineTo(width,0 )

end

TopBottom:

begin

Canvas.MoveTo(0,0)

Canvas.LineTo(width,Height )

end
 

 None:

begin

Height := Parent.Height

Top:=0

Width:=4

Shape:=qrsVertLine

Inherited Paint

end

end

end

procedure TMyQRShape.Print(OfsX,OfsY : Integer);

begin

with QRPrinter do

begin

case LineType of

BottomTop:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top)+Height)

Canvas.LineTo(XPos(OfsX + Size.Left)+width,YPos(OfsY + Size.Top) )

end

TopBottom:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top))

Canvas.LineTo(XPos(OfsX + Size.Left)+Width,YPos(OfsY + Size.Top)+Height )

end

None:

Inherited Print(OfsX,OfsY )

end

end

end;

procedure Register;

begin

RegisterComponents(‘QReport', [TMyQRShape]);

end;

end.