現在、ソフトウェア開発ツールの中でも、Delphi は、その多くのコントロール、強力なオブジェクト指向プログラミング機能、高速なコード実行速度、シンプルさと使いやすさ、そしてビジュアルな開発環境と最速のコンパイラの組み合わせにより、高速開発ツールとして世界的に認められています。アプリケーション開発ツールを使用するプログラマーはますます増えています。 Delphi を使用すると、さまざまな Windows アプリケーション、特にデータベース情報管理システムの開発に独自の利点を作成できます。データベース情報管理システムの開発プロセスでは、多くのレポートを印刷する必要があることがよくありますが、Delphi を使用して複雑なレポートを設計するのは、Visual FoxPRo ほど簡単ではありません。ただし、コントロールは Delphi でレポートを設計するためにも使用されるため、プログラムの実行中に必要なレポート コントロールを直接確立してリアルタイムでレポートを生成でき、生成されるレポート サンプルはプログラム コントロールによって決定できます。たとえば、データベース情報をクエリする場合、結果情報の構造は一般に固定されていません。クエリ結果を印刷する場合、考えられるすべての結果情報に対して 1 つのレポート形式を設計するだけでは十分ではありません。レポートの書式設定も良い解決策ではありません。このような問題を解決するには、リアルタイムレポート生成技術を利用できます。この記事の目的は、例を通してリアルタイムにレポートを生成する方法を詳しく紹介することです。
この例では、TQickRep コントロールといくつかのレポート スタイル コントロール コントロールを含む印刷ダイアログ ボックスをデザインします。他のフォームの外観は次のとおりです。
1. 制御機能の説明
QuickRep:TQuickRep 列ヘッダー (HB:TQRBand)、詳細 (DB:TQRBand)、フッター (FB:TQRBand)、要約 (SB:TQRBand) バンドが含まれます。詳細、フッター、要約には TQRLabel 、 TQRExpr は含まれません。または TDBText コントロール。主にプログラムの実行時に作成されます。列ヘッダー ゾーンには、QRSQL のタイトル (TQRLabel) が含まれます。 TQRLabel はクエリ条件に使用され、これら 2 つのコントロールの Caption プロパティはプログラムの実行中に任意に変更できます。 QuickRep が表示されないようにするには、Panel1 (Tpanel) の後ろに配置し、Panel1 をフォーム全体に展開します。
クエリ: TQuery SQL ステートメント制御。プログラムは、クエリによって返された結果に基づいてレポートを生成します。したがって、このフォームを作成するときは、Query.SQL プロパティに SQL ステートメントを指定する必要があります。
上記のフォームでは、「Paper」列と「Page Setup」列に含まれるコントロールは、QuickRep.Page プロパティのコントロールです。プログラムの実行時にこれらを変更すると、QuickRep コントロールの対応するプロパティ値が直接変更されます。 OnChange または OnExit コードの完了によって実行されます。
「印刷コンテンツ設定」列のタイトルは、指定されたレポートのタイトル (TT:TEdit) であり、その値は QuickRep.ReportTitle および Title.Caption と一致しており、「印刷クエリ条件」チェック ボックスを指定して任意に変更できます。このチェック ボックスをオンにするかどうかは、QRSQL.Caption が空であるかどうかを直接制御します。これは、主にレポートを生成するときに詳細なコンテンツを配置するために使用されます。制御変数RD1を変更します(バイト) 値 (0 自動配置、1 中央配置、2 左配置); 「表列の印刷幅」は、主にレポート形式を生成する際の列値の幅とその変更に使用されるオプション ボタンのセットで構成されます。制御変数 RD2 の値 (Byte) (0 自動幅、 [1 同じ幅、2 最大幅を制限])、[1 同じ幅、2 最大幅を制限] を選択すると、幅をピクセル単位で入力する必要があります。「統計方法」は、レポートにフッター (FB: TQRBAND) と合計 ( SB: TQRBAND ) ゾーン。
2. プログラムの説明
プログラムは次のタイプを定義します。
TQRLabelName=TQRLabel の配列;
TQRDBTextName=TQRDBText の配列;
TQRShapeName=TQRShape の配列;
TQRExpName=TQRExpr の配列;
上記の型は動的配列型であり、データの各要素はクラスです。レポート コントロールをリアルタイムで作成する場合、作成するコントロールの数が不確実であり、コントロール名を決定できない場合は、動的配列を使用する方が良い解決策です。つまり、メモリを管理せずにデータのサイズを任意に指定できます。この問題により、レポートに含まれるコントロールのリリースと処理も容易になります。プログラムは、上記の型の変数も次のように宣言します。
CHB名:TQRラベル名;
DB名:TQRDBテキスト名;
CHBShape、DBShape、FBShape、SumShape:TQRShapeName;
FB 名、合計名:TQRExp 名;
これらの配列変数は、フォームの作成時に Query によって返されたフィールドの結果に基づいてメモリを割り当てます。各フィールドは配列の要素に対応します。
プログラム実行プロセス: フォームが作成および表示されると、このフォームの初期化操作が確立されます。 OnCreate イベントで QuickRep.Page プロパティの対応する値を表示し、OnShow イベントで Query.Open 操作を実行し、返された結果に従ってコントロール配列変数スペースを割り当てます。フォームの作成後、「生成」ボタンをクリックしてレポートを生成し(メモフィールドと写真フィールドは無視します)、「印刷」および「プレビュー」をクリックしてレポートを印刷またはプレビューします。レポート生成後に設定を変更した場合は、レポートを再生成する必要があります。クエリによって返される結果セット フィールドが多すぎる場合、レポートの生成時に用紙サイズがすべてのレポートを生成できない可能性があります。レポートの用紙サイズを調整してからレポートを生成できます。フォームを閉じると、作成されたコントロールが解放されます。
3. ソースプログラム一覧とコメント
ユニットPrintDlg;
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、クラス、グラフィックス、コントロール、フォーム、ダイアログ、
StdCtrls、ボタン、ExtCtrls、Spin、QuickRpt、QRPrntr、プリンター、Qrctrls、
DB、DBTables、ComCtrls、SysIni;
タイプ
TQRLabelName=TQRLabel の配列;//列ヘッダー ストリップ内の列タイトル コントロール部分の動的配列
TQRDBTextName=TQRDBText の配列; //詳細バンド内の列タイトル コントロールの動的配列
TQRShapeName=TQRShape の配列; //ライン コントロール パーツの動的配列
TQRExpName=TQRExpr の配列 //統計制御クラスの動的配列;
TPrintForm = クラス(TForm)
グループ ボックス 1: TG グループ ボックス;
ラベル5: Tラベル;
BtnSet: TbitBtn;//「設定」ボタン コントロール
BtnCancel: TBitBtn; // 「閉じる」ボタン コントロール
パネル1: Tパネル;
BtnPrint: TBitBtn; // 「印刷」ボタン コントロール
BtnPrview: TBitBtn; // 「プレビュー」ボタン
QuickRep: TQuickRep // クイック レポート コントロール;
HB: TQRBand // 「列ヘッダー」バンド コントロール;
Title: TQRLabel;//レポート タイトル コントロール
QRE1: TQRExpr;//列ヘッダーバンドの「ページ番号」コントロール
QRE2: TQRExpr;//列ヘッダーバンドの「日付」コントロール
パネル2: Tパネル;
ラベル 1: T ラベル;
R1: TRadioButton;//「縦向き印刷」コントロール
R2: TRadioButton;//「水平印刷」コントロール
グループボックス4: TGroupBox;
TT: TEdit // タイトル入力ボックス コントロール;
ラベル 2: T ラベル;
SR: TCheckBox // 「クエリ条件の印刷」コントロール
ラベル 3: T ラベル;
Image1: TImage;//縦方向の印刷イメージを表示します
Image2: TImage;// 水平方向の印刷イメージを表示します
QRSQL: TQRLabel; // 列ヘッダー バンドに「クエリ条件」コントロールを表示するために使用されます。
グループボックス 2: TGroupBox;
ラベル 7: T ラベル;
ラベル 8: T ラベル;
ラベル9: Tラベル;
ラベル10: Tラベル;
ラベル11: Tラベル;
ラベル12: Tラベル;
ラベル 13: T ラベル;
PageSpace: TEdit; // 列間隔入力ボックス コントロール;
PageTop: TEdit // ページ余白の入力ボックス コントロール;
PageBottom: TEdit; ページ余白の下の入力ボックス コントロール;
PageLeft: TEdit; // ページ余白左入力ボックス コントロール;
PageRight: TEdit; // ページマージン右入力ボックスコントロール;
PageDlux: TCheckBox // 「両面印刷」コントロール;
PageCol: TEdit; // 列入力ボックス コントロール
Pages: TEdit // 番号入力ボックス コントロールを印刷します。
PaperH: TEdit // 用紙長入力ボックス コントロール;
PaperW: TEdit;//用紙幅入力ボックス コントロール
ラベル 4: T ラベル;
ラベル6: Tラベル;
Ps: TComboBox;//紙モデルのリスト ボックス コントロール
クエリ: TQuery;//SQL クエリ制御
DB: TQRBand // 「詳細」バンド制御;
CrtRep: TBitBtn; // 「生成」ボタン コントロール
ラベル 14: T ラベル;
ラベル 15: T ラベル;
パネル3: Tパネル;
Wdauto: TRadioButton // 「自動幅」コントロール;
Wdall: TRadioButton // 「同じ幅」コントロール;
Wdmax: TRadioButton // 「幅を制限」コントロール;
ラベル16: Tラベル;
ColWd: TEdit; // 列幅入力ボックス コントロール;
パネル 4: T パネル;
DJAUTO: TRadioButton // 「自動調整」コントロール;
DJCENTER: TRadioButton // 「センター」コントロール;
DJLEFT: TRadioButton // 「左揃え」コントロール;
FB: TQRBand // フッターバンドコントロール;
ラベル17: Tラベル;
パネル5: Tパネル;
TJ1: TCheckBox // 「ページごとの統計」コントロール;
TJ2: TCheckBox // 「統計合計」コントロール;
SB: TQRBand // 合計バンド制御;
プロシージャ FormCreate(Sender: TObject);
プロシージャ RadioButtonClick(送信者: TObject);
プロシージャ PageDluxClick(送信者: TObject);
プロシージャ PageColChange(Sender: TObject);
プロシージャ PageSpaceExit(Sender: TObject);
プロシージャ PagesChange(Sender: TObject);
プロシージャ PageTopExit(Sender: TObject);
プロシージャ PageBottomExit(Sender: TObject);
プロシージャ PageLeftExit(Sender: TObject);
プロシージャ PageRightExit(Sender: TObject);
プロシージャ TTExit(送信者: TObject);
プロシージャ DTClick(送信者: TObject);
プロシージャ BtnPrviewClick(送信者: TObject);
プロシージャ BtnSetClick(送信者: TObject);
プロシージャ PsChange(送信者: TObject);
プロシージャ PaperChange(送信者: TObject);
プロシージャ FormClose(Sender: TObject; var Action: TCloseAction);
プロシージャ FormDestroy(Sender: TObject);
プロシージャ CreateReport(Sender: TObject);
プロシージャ SRClick(送信者: TObject);
プロシージャ ClearRep();
プロシージャ FormShow(Sender: TObject);
プロシージャ PaperSizeChg(送信者: TObject);
プロシージャ DJChage(送信者: TObject);
プロシージャ WdChage(送信者: TObject);
プロシージャ QuickRepStartPage(送信者: TCustomQuickRep);
プロシージャ BtnPrintClick(送信者: TObject);
プライベート
{プライベート宣言}
CHBName:TQRLabelName;//列ヘッダー ストリップ コントロール名動的配列名を定義します
DBName:TQRDBTextName //詳細バンド コントロール名の動的配列名を定義します。
CHBShape,DBShape,FBShape,SumShape:TQRShapeName //ライン コントロールの動的配列名を定義します。
FBName,SumName:TQRExpName; // フッター (FBNAME) および合計バンド (SUMNAME) コントロール名の動的配列名を定義します。
DJ:TAlignment;//列の配置 (taLeftJustify, taRightJustify, taCenter)
Rd1, Rd2:Byte; //テーブル列の配置 (RD1) と印刷幅 (RD2) のステータス変数名を保存するために使用されます。
公共
{公的宣言}
CXTJ,BT:String;//CXTJ はクエリ条件を格納し、BT はレポート タイトルを格納します
//上位フォームで指定
終わり;
定数
PaperSize:array[0..26] of TQRPaperSize=(A3、A4、A4Small、A5、B4、B5、Letter、
LetterSmall、タブロイド紙、元帳、法務、ステートメント、エグゼクティブ、フォリオ、
クアルト、qr10X14、qr11X17、ノート、Env9、Env10、Env11、Env12、
Env14、CSheet、DSheet、ESheet、カスタム);
//QuickRep によってリストされる用紙の種類
変数
プリントフォーム: TPrintForm;
実装
{$R *.DFM}
プロシージャ TPrintForm.FormCreate(送信者: TObject);
//QuickRep.Page プロパティとその他のプロパティ値を表示します
変数
私:バイト;
始める
PageCol.Text:=IntToStr(QuickRep.Page.Columns);
PageSpace.Text:=FormatFloat('0.00',QuickRep.Page.ColumnSpace);
PageTop.Text:=FormatFloat('0.00',QuickRep.Page.TopMargin);
PageBottom.Text:=FormatFloat('0.00',QuickRep.Page.BottomMargin);
PageLeft.Text:=FormatFloat('0.00',QuickRep.Page.LeftMargin);
PageRight.Text:=FormatFloat('0.00',QuickRep.Page.RightMargin);
PageSpace.Text:=FormatFloat('0.00',QuickRep.page.ColumnSpace);
R1.Checked:=QuickRep.Page.Orientation=poPortrait;
Image1.Visible:=R1.Checked;
R2.Checked:=QuickRep.Page.Orientation=poLandscape;
Image2.Visible:=R2.Checked;
PageDlux.Checked:=QuickRep.PrinterSettings.Duplex;
Pages.Text:=IntToStr(QuickRep.PrinterSettings.Copies);
PaperH.Text:=FormatFloat('0.00',QuickRep.Page.Length);
PaperW.Text:=FormatFloat('0.00',QuickRep.Page.Width);
For I:=0 to 26 do //PS リストボックスには用紙の種類が表示されます
QuickRep.Page.PaperSize=PaperSize[I] の場合、開始します
PS.ItemIndex:=I;
壊す;
終わり;
//用紙幅を変更できるかどうかを決定します。用紙タイプがカスタマイズされている場合にのみ変更できます (Ps.ItemIndex=26)。
PaperH.Enabled:=Ps.ItemIndex=26;
PaperW.Enabled:=Ps.ItemIndex=26;
終わり;
プロシージャ TPrintForm.RadioButtonClick(送信者: TObject);
//用紙方向変更イベント処理
変数
S:文字列;
始める
Image1.Visible:=R1.Checked;
Image2.Visible:=R2.Checked;
R1.チェックが入っている場合
QuickRep.Page.Orientation:=poPortrait
それ以外
QuickRep.Page.Orientation:=poLandscape;
//用紙の幅と長さの値を入れ替えます
S:=PaperH.Text;
PaperH.Text:=PaperW.Text;
PaperW.Text:=S;
(Ps.ItemIndex=26) または (Ps.ItemIndex=0) の場合、開始します
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
終わり;
終わり;
プロシージャ TPrintForm.PageDluxClick(送信者: TObject);
始める
QuickRep.PrinterSettings.Duplex:=PageDlux.Checked;
終わり;
プロシージャ TPrintForm.PageColChange(Sender: TObject);
始める
if StrToInt(PageCol.Text)<1 then PageCol.Text:='1';
QuickRep.Page.Columns:=StrToInt(PageCol.Text);
終わり;
プロシージャ TPrintForm.PageSpaceExit(送信者: TObject);
始める
QuickRep.Page.ColumnSpace:=StrToFloat(PageSpace.Text);
終わり;
プロシージャ TPrintForm.PagesChange(Sender: TObject);
始める
if StrToInt(Pages.Text)<1 then Pages.Text:='1';
QuickRep.PrinterSettings.Copies:=StrToInt(Pages.Text);
終わり;
プロシージャ TPrintForm.PageTopExit(送信者: TObject);
始める
QuickRep.Page.TopMargin:=StrToFloat(PageTop.Text);
終わり;
プロシージャ TPrintForm.PageBottomExit(送信者: TObject);
始める
QuickRep.Page.BottomMargin:=StrToFloat(PageBottom.Text);
終わり;
プロシージャ TPrintForm.PageLeftExit(送信者: TObject);
始める
QuickRep.Page.LeftMargin:=StrToFloat(PageLeft.Text);
終わり;
プロシージャ TPrintForm.PageRightExit(送信者: TObject);
始める
QuickRep.Page.RightMargin:=StrToFloat(PageRight.Text);
終わり;
procedure TPrintForm.TTExit(Sender: TObject);//タイトル変更イベント処理
始める
QuickRep.ReportTitle:=TT.Text;
タイトル.キャプション:=TT.テキスト;
Bt:=TT.テキスト;
終わり;
procedure TPrintForm.DTClick(Sender: TObject);//クエリ条件の印刷チェック ボックス イベント
始める
QRSQL.Enabled:=SR.Checked;
終わり;
プロシージャ TPrintForm.BtnPrviewClick(Sender: TObject); //プレビュー ボタンのクリック イベント
始める
クイックリププレビュー;
終わり;
process TPrintForm.BtnSetClick(Sender: TObject); // ボタンのクリック イベントを設定します。
始める
QuickRep.PrinterSetup;
終わり;
procedure TPrintForm.PsChange(Sender: TObject);//用紙種類変更イベント
始める
QuickREp.Page.PaperSize:=PaperSize[Ps.ItemIndex];
PaperH.Text:=FormatFloat('0.00',QuickRep.Page.Length);
PaperW.Text:=FormatFloat('0.00',QuickRep.Page.Width);
PaperH.Enabled:=Ps.ItemIndex=26;
PaperW.Enabled:=Ps.ItemIndex=26;
CrtRep.Enabled:=True;
BtnPrint.Enabled:=CrtRep.Enabled ではありません;
BtnPrview.Enabled:=BtnPrint.Enabled;
終わり;
procedure TPrintForm.PaperChange(Sender: TObject);//用紙の幅と長さの変更イベント
始める
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
終わり;
プロシージャ TPrintForm.FormClose(Sender: TObject; var Action: TCloseAction);
始める
アクション:=caFree;
終わり;
プロシージャ TPrintForm.FormDestroy(送信者: TObject);
始める
クリアリプ;
PrintForm:=nil;
終わり;
procedure TPrintForm.CreateReport(Sender: TObject);//ボタンクリックイベントを生成する
ヴァール
I、L:バイト;
CHBtp、CHBlf、Cd、ObWidth:ワード;
始める
Screen.Cursor:=crHourGlass;
Title.Caption:=Bt;//タイトルを設定します
ClearRep(); // 作成されたオブジェクトをクリアします。
if Sr.Checked then QrSQL.Caption:=CXTJ else QRSQL.Caption:=';//クエリ条件を出力するかどうか?
CHBtp:=HB.Height-17;//バンド内で作成されたコントロールの上部の位置
CHBlf:=0; //作成されたコントロールはバンドの左側の位置にあります
ObWidth:=0; // 作成されたコントロールの幅
for I := 0 to Query.FieldCount-1 do //Query によって返されたフィールドの数に基づいてコントロールを作成します
始める
if (Query.Fields[I].DataType<>ftBlob) And (Query.Fields[I].DataType<>ftMemo) then
begin //メモフィールドと写真フィールドを無視します
L:=Query.Fields[I].DataSize-1;//L=フィールド幅(バイト)-1
case Rd1 of //選択した配置に従ってコントロールの配置を設定します
0: L<=10 の場合 Dj:=taCenter それ以外の場合 DJ:=taLeftJustify;
//自動配置: 10 以下のフィールドは中央に配置され、それ以外の場合は左に配置されます。
1: Dj:=taCenter;//中央揃え
2: DJ:=taLeftJustify;//左揃え
終わり;
case Rd2 of //選択したリストの幅に応じてレポートの列幅を設定します
0: 開始
//自動幅: L>14 の場合、幅 ObWidth=14+(L-14)/2;
// 幅は列タイトルを表示できません。フィールド タイプの場合は、ObWidth=列タイトル幅です。
//日付型、通貨型、浮動小数点数型の場合、ObWidth=65
L>14 の場合、L:=14+(L-14) div 2;
ObWidth:=L*6;
L:=Length(Query.Fields[I].DisplayName);
ObWidth<L*6 の場合、ObWidth:=L*6;
ObWidth:=ObWidth+2;
if (Query.Fields[I].DataType=ftDateTime) または
(Query.Fields[I].DataType=ftFloat) または
(Query.Fields[I].DataType=ftCurrency) then ObWidth:=65;
終わり;
1: ColWd.Text<>' の場合、ObWidth:=StrToInt(ColWd.Text)
else ObWidth:=100;//同じ幅:ObWidth=入力幅値
2: begin //最大幅を制限する: まず自動幅を計算し、次に幅が最大値を超えるかどうかを判断します。
//ObWidth=最大幅入力値を超える場合
if ColWd.Text<>' then Cd:=StrToInt(ColWd.Text)
それ以外の場合は Cd:=200;
ObWidth:=L*6;
ObWidth>Cd の場合、ObWidth:=Cd;
ObWidth:=ObWidth+2;
if (Query.Fields[I].DataType=ftDateTime) または
(Query.Fields[I].DataType=ftFloat) または
(Query.Fields[I].DataType=ftCurrency) then ObWidth:=65;
終わり;
終わり;
if CHBlf+ObWidth>=HB.Width then begin //コントロール>用紙幅を作成しますか?
DlgMes:='用紙幅が不足しています。用紙サイズを変更してください。 ';
MessageBox(ハンドル,DlgMes,Cap_Inf,Ico_Inf);
壊す;
終わり
そうでなければ始まる
CHBShape[I]:=TQRShape.Create(HB);//列ヘッダー ストリップ ライン コントロールを作成
CHBShape[I].Parent:=HB;
CHBShape[I].Top:=CHBtp;
CHBShape[I].Left:=CHBlf;
CHBShape[I].Width:=ObWidth+1;
CHBShape[I].高さ:=17;
CHBNAME[I]:=TQRLabel.Create(HB); //列タイトルコントロールを作成します。
CHBNAME[I].Parent:=HB;
CHBNAME[I].Top:=CHBtp+2;
CHBNAME[I].Left:=CHBlf+1;
CHBNAME[I].AutoSize:=False;
CHBNAME[I].Width:=ObWidth-1;
CHBNAME[I].Alignment:=taCenter;
CHBNAME[I].Caption:=Query.Fields[I].DisplayName;//フィールドを列名として取得します
CHBNAME[I].BringToFront;
DBShape[I]:=TQRShape.Create(DB); //詳細ストリップ ライン コントロールを作成します。
DBShape[I].Parent:=DB;
DBShape[I].Top:=-1;
DBShape[I].Left:=CHBlf;
DBShape[I].Width:=ObWidth+1;
DBShape[I].高さ:=17;
DBNAME[I]:=TQRDBText.Create(DB); // 詳細バンド コントロールを作成します。
DBNAME[I].Parent:=DB;
DBNAME[I].ParentReport:=QuickRep;
DBNAME[I].Top:=2;
DBNAME[I].Left:=CHBlf+2;
DBNAME[I].AutoSize:=False;
DBNAME[I].Width:=ObWidth-3;
DBNAME[I].高さ:=13;
DBNAME[I].Alignment:=Dj;
DBNAME[I].DataSet:=Query;
DBNAME[I].DataField:=Query.Fields[I].FieldName;
DBNAME[I].BringToFront;
if Tj1.Checked then begin //フッターバンドを作成しますか?
FBShape[I]:=TQRShape.Create(FB) //フッターバンドラインコントロールを作成
FBShape[I].Parent:=FB;
FBShape[I].Top:=0;
FBShape[I].Left:=CHBlf;
FBShape[I].Width:=ObWidth+1;
FBShape[I].高さ:=17;
if (Query.Fields[I].DataType=ftFloat) または
(Query.Fields[I].DataType=ftCurrency) または (I<2) の場合
begin //フィールドの型が数値型の場合、それを作成します
FBNAME[I]:=TQRExpr.Create(FB); // フッターバンドコントロールを作成します。
FBNAME[I].Parent:=FB;
FBNAME[I].ParentReport:=QuickRep;
FBNAME[I].Top:=3;
FBNAME[I].Left:=CHBlf+2;
FBNAME[I].AutoSize:=False;
FBNAME[I].Width:=ObWidth-3;
FBNAME[I].高さ:=13;
FBNAME[I].Alignment:=taCenter;
FBNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
FBNAME[I].BringToFront;
終わり;
終わり;
if Tj2.Checked then begin //和帯域を確立する必要がありますか?
SumShape[I]:=TQRShape.Create(SB); //サムストリップラインコントロールを作成します。
SumShape[I].Parent:=SB;
SumShape[I].Top:=0;
SumShape[I].Left:=CHBlf;
SumShape[I].Width:=ObWidth+1;
SumShape[I].Height:=17;
if (Query.Fields[I].DataType=ftFloat) または
(Query.Fields[I].DataType=ftCurrency) または (I<2) の場合
begin //フィールドの型が数値型の場合は作成します
SumNAME[I]:=TQRExpr.Create(SB); //サムバンドコントロールを作成します。
SumNAME[I].Parent:=SB;
SumNAME[I].ParentReport:=QuickRep;
SumNAME[I].Top:=3;
SumNAME[I].Left:=CHBlf+2;
SumNAME[I].AutoSize:=False;
SumNAME[I].Width:=ObWidth-3;
SumNAME[I].Height:=13;
SumNAME[I].Alignment:=taCenter;
SumNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
SumNAME[I].BringToFront;
終わり;
終わり;
CHBlf:=CHBlf+ObWidth;//現在のフィールドの処理が完了し、1 フィールド幅分右へ
終わり;
終わり;
終わり;
CrtRep.Enabled:=False;//生成ボタンを無効にする
BtnPrint.Enabled:=not CrtRep.Enabled;アンモニウム ボタンの印刷を許可する
BtnPrview.Enabled:=BtnPrint.Enabled;プレビューを許可ボタン
if Tj1.Checked then begin // フッター バンドが作成された場合は、フッター バンドの最初の 2 列を変更します
FBNAME[0].Expression:=''総ページ数'';
FBNAME[1].Expression:='COUNT+'row'';
終わり;
if Tj1.Checked then begin //合計バンドが確立されている場合、合計バンドの最初の 2 列を変更します
SumNAME[0].Expression:=''合計'';
SumNAME[1].Expression:='COUNT+'row'';
終わり;
//列ヘッダーゾーンの日付とページ番号の印刷位置を調整します
QRE2.左:=HB.幅-Qre2.幅;
QRSQL.左:=QRE1.幅+10;
QRSQL.Width:= QRE2.Left-10-QRSQL.Left;
QuickRep.DataSet:=Query; //QuickRep のデータセットを指定します。この文は省略できません。
Screen.Cursor:=crDefault;
終わり;
procedure TPrintForm.ClearRep();//レポート形式の生成時に作成されたコントロールをクリアします
ヴァール
私:バイト;
始める
I:=0 から Query.FieldCount-1 までが開始されます
if Assigned(CHBShape[I]) then begin CHBShape[I].Free;CHBShape[I]:=nil;end;
if Assigned(CHBNAME[I]) then begin CHBNAME[I].Free;CHBNAME[I]:=nil;end;
if Assigned(DBShape[I]) then begin DBShape[I].Free;DBShape[I]:=nil;end;
if Assigned(DBNAME[I]) then begin DBNAME[I].Free;DBNAME[I]:=nil;end;
if Assigned(FBShape[I]) then begin FBShape[I].Free;FBShape[I]:=nil;end;
if Assigned(FBNAME[I]) then begin FBNAME[I].Free;FBNAME[I]:=nil;end;
if Assigned(SumShape[I]) then begin SumShape[I].Free;SumShape[I]:=nil;end;
if Assigned(SumNAME[I]) then begin SumNAME[I].Free;SumNAME[I]:=nil;end;
終わり;
終わり;
プロシージャ TPrintForm.SRClick(送信者: TObject);
始める
if Sr.Checked then QrSQL.Caption:=CXTJ else QRSQL.Caption:=';
終わり;
procedure TPrintForm.FormShow(Sender: TObject); //フォーム表示イベント
始める
Query.Active:=True;//SQL を出力
TT.テキスト:=Bt;
QuickRep.ReportTitle:=Bt;//タイトルを設定します
//コントロール名の配列がスペースを割り当てます
SetLength(CHBNAME,Query.FieldCount);
SetLength(CHBShape,Query.FieldCount);
SetLength(DBNAME,Query.FieldCount);
SetLength(DBShape,Query.FieldCount);
SetLength(FBNAME,Query.FieldCount);
SetLength(FBShape,Query.FieldCount);
SetLength(SumNAME,Query.FieldCount);
SetLength(SumShape,Query.FieldCount);
終わり;
プロシージャ TPrintForm.PaperSizeChg(送信者: TObject);
始める
CrtRep.Enabled:=True;
BtnPrint.Enabled:=CrtRep.Enabled ではありません;
BtnPrview.Enabled:=BtnPrint.Enabled;
終わり;
procedure TPrintForm.DJChage(Sender: TObject);//配置変更イベント処理
変数
変更:バイト;
始める
Djauto.Checked の場合、Chg:=0
それ以外の場合、DjCenter.Checked の場合、Chg:=1
それ以外の場合は Chg:=2;
if Chg<>Rd1 then begin PaperSizeChg(nil);Rd1:=Chg;end;
終わり;
procedure TPrintForm.WdChage(Sender: TObject);//幅変更イベント処理
変数
変更:バイト;
始める
Wdauto.Checked の場合、Chg:=0
それ以外の場合、Wdall.Checked の場合は開始します
変更:=1;
if ColWd.Text=' then ColWd.Text:='100';
終わり
そうでなければ始まる
変更:=2;
if ColWd.Text=' then ColWd.Text:='200';
終わり;
if Chg<>Rd2 then begin PaperSizeChg(nil);Rd2:=Chg;end;
ColWd.Enabled:=Chg<>0;
終わり;
プロシージャ TPrintForm.QuickRepStartPage(送信者: TCustomQuickRep);
//レポート印刷により新規ページイベント処理が開始され、フッターバンド内の統計値がクリアされます。
ヴァール
私:バイト;
始める
Tj1.Checked の場合
I:=0 から Query.FieldCount-1 の場合は次のようにします。
if Assigned(FBNAME[I]) then FBNAME[I].Reset;
終わり;
プロシージャ TPrintForm.BtnPrintClick(送信者: TObject);
始める
QuickRep.Print;
終わり;
終わり。
4. ダイアログボックスの呼び出し例:
まず、呼び出されるフォームの USES ステートメントに PrintDlg ユニットを含めて、次のコードで呼び出します。
割り当てられていない場合(PrintForm)、PrintForm:=TPrintForm.Create(application);
PrintForm.Query.SQL.Assign(Query.SQL);
//呼び出し元のフォームにクエリ コントロールが含まれていない場合は、SQL ステートメントの値を直接設定できます
PrintForm.Bt:=レポートのタイトル;
PrintForm.Caption:=フォームのタイトル;
PrintForm.CXTJ:=クエリ条件;
PrintForm.ShowModal;
5. 結論
このプログラムの鍵となるのは、CreateReport イベント プロセスと動的コントロール名の処理です。紙面の都合上、説明を省略している内容もございますので、読者の皆様ご自身でご理解いただければ幸いです。一般的なレポート生成の場合、このプログラムは要件を満たすことができます。
私はより強力な機能を備えた最新バージョンを持っています。それを必要とする友人は私にメールを送ってくれるので、必ず送ります。