현재 소프트웨어 개발 도구 중 델파이는 많은 제어 기능, 강력한 객체 지향 프로그래밍 기능, 빠른 코드 실행 속도, 단순성과 사용 용이성, 시각적 개발 환경 및 가장 빠른 컴파일러가 결합되어 세계적으로 인정받는 빠른 개발 도구로 자리 잡았습니다. 점점 더 많은 프로그래머가 애플리케이션 개발 도구를 사용하고 있습니다. Delphi를 사용하면 다양한 Windows 애플리케이션, 특히 데이터베이스 정보 관리 시스템 개발에 고유한 장점이 있는 애플리케이션을 작성할 수 있습니다. 데이터베이스 정보 관리 시스템의 개발 과정에서 많은 보고서를 인쇄해야 하는 경우가 많습니다. Delphi를 사용하여 복잡한 보고서를 디자인하는 것은 Visual FoxPRO만큼 간단하지 않습니다. 그러나 컨트롤은 델파이에서 리포트를 디자인하는데도 사용되기 때문에 프로그램 실행 중에 필요한 리포트 컨트롤을 직접 생성하여 실시간으로 리포트를 생성할 수 있고, 생성된 리포트 샘플은 프로그램 컨트롤에 의해 결정될 수 있습니다. 예를 들어, 데이터베이스 정보를 쿼리할 때 결과 정보의 구조는 일반적으로 고정되어 있지 않습니다. 쿼리 결과를 인쇄하려면 가능한 모든 결과 정보에 대해 하나의 보고서 형식만 디자인하는 것만으로는 충분하지 않습니다. . 보고서 형식도 좋은 해결책이 아닙니다. 이러한 문제를 해결하기 위해 실시간 보고서 생성 기술을 사용할 수 있습니다. 본 글의 목적은 예제를 통해 실시간으로 보고서를 생성하는 방법을 자세히 소개하는 것입니다.
이 예에서는 TQickRep 컨트롤과 일부 보고서 스타일 컨트롤 컨트롤을 포함하는 인쇄 대화 상자를 디자인합니다. 다른 양식의 모양은 아래와 같습니다.
1. 제어 기능 설명
QuickRep:TQuickRep 열 헤더(HB:TQRBand), 세부정보(DB:TQRBand), 바닥글(FB:TQRBand), 요약(SB:TQRBand) 밴드를 포함하며, 세부정보, 바닥글 또는 요약에 TQRLabel을 포함하지 않습니다. 프로그램이 실행될 때 주로 생성되는 TQRExpr 또는 TDBText 컨트롤에는 보고서 제목에 대한 제목(TQRLabel)이 포함됩니다. TQRLabel은 쿼리 조건에 사용됩니다. 이 두 컨트롤의 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(바이트)의 값(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이름;
이러한 배열 변수는 양식이 생성될 때 쿼리에서 반환된 필드 결과를 기반으로 메모리를 할당합니다.
프로그램 실행 과정: 폼이 생성되어 표시될 때 이 폼에 대한 초기화 작업이 설정됩니다. OnCreate 이벤트에서 QuickRep.Page 속성의 해당 값을 표시하고, OnShow 이벤트에서 Query.Open 작업을 수행하고, 반환 결과에 따라 컨트롤 배열 변수 공간을 할당합니다. 양식이 생성된 후 "생성" 버튼을 클릭하여 보고서를 생성한 다음(메모 필드 및 사진 필드 무시) "인쇄" 및 "미리 보기"를 클릭하여 보고서를 인쇄하거나 미리 봅니다. 보고서가 생성된 후 설정이 변경되면 보고서를 다시 생성해야 합니다. Query에서 반환된 결과 집합에 필드가 너무 많으면 보고서 생성 시 용지 크기가 모든 보고서를 생성하기에 충분하지 않을 수 있습니다. 보고서 용지 크기를 조정한 후 보고서를 생성할 수 있습니다. 폼이 닫히면 생성된 컨트롤이 해제됩니다.
3. 소스 프로그램 목록 및 코멘트
단위 PrintDlg;
인터페이스
용도
Windows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤, 양식, 대화 상자,
StdCtrls, 버튼, ExtCtrls, Spin, QuickRpt,QRPrntr, 프린터, Qrctrls,
DB,DBTables,ComCtrls,SysIni;
유형
TQRLabelName=TQRLabel 배열;//열 헤더 스트립에 있는 열 제목 제어 클래스의 동적 배열
TQRDBTextName=TQRDBText 배열; //디테일 밴드의 열 제목 컨트롤의 동적 배열
TQRShapeName=TQRShape 배열; //라인 제어 부품의 동적 배열
TQRExpName=TQRExpr 배열 //통계 제어 클래스 동적 배열;
TPrintForm = 클래스(TForm)
그룹박스1: T그룹박스;
라벨5: TLabel;
BtnSet: TbitBtn;//"설정" 버튼 컨트롤
BtnCancel: TBitBtn; // "닫기" 버튼 컨트롤
패널1: T패널;
BtnPrint: TBitBtn; // "인쇄" 버튼 컨트롤
BtnPrview: TBitBtn; // "미리보기" 버튼
QuickRep: TQuickRep // 빠른 보고서 제어;
HB: TQRBand; // "열 헤더" 밴드 제어
제목: TQRLabel;//보고서 제목 제어
QRE1: TQRExpr;//열 헤더 밴드의 "페이지 번호" 컨트롤
QRE2: TQRExpr;//열 헤더 밴드의 "날짜" 컨트롤
패널2: T패널;
라벨1: TLabel;
R1: TRadioButton;//"세로 인쇄" 컨트롤
R2: TRadioButton;//"가로 인쇄" 컨트롤
그룹박스4: T그룹박스;
TT: TEdit;//제목 입력 상자 컨트롤
라벨2: TLabel;
SR: TCheckBox; // "쿼리 조건 인쇄" 컨트롤
라벨3: TLabel;
Image1: TImage;//세로 인쇄 이미지 표시
Image2: TImage;//가로 인쇄 이미지 표시
QRSQL: TQRLabel; // 열 헤더 밴드에 "쿼리 조건" 컨트롤을 표시하는 데 사용됩니다.
그룹박스2: T그룹박스;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
라벨10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
PageSpace: TEdit; // 열 간격 입력 상자 컨트롤
PageTop: TEdit; // 페이지 여백에 대한 입력 상자 제어
PageBottom: TEdit; //페이지 여백 아래 입력 상자 제어
PageLeft: TEdit; // 페이지 여백 왼쪽 입력 상자 컨트롤
PageRight: TEdit; // 페이지 여백 오른쪽 입력 상자 컨트롤
PageDlux: TCheckBox; // "양면 인쇄" 제어
PageCol: TEdit; // 열 입력 상자 컨트롤
Pages: TEdit; // 숫자 입력 상자 컨트롤 인쇄
PaperH: TEdit; // 용지 길이 입력 상자 제어
PaperW: TEdit;//용지 너비 입력 상자 컨트롤
라벨4: TLabel;
Label6: TLabel;
Ps: TComboBox;//종이 모델 목록 상자 컨트롤
쿼리: TQuery;//SQL 쿼리 제어
DB: TQRBand; // "세부사항" 대역 제어
CrtRep: TBitBtn; // "생성" 버튼 컨트롤
Label14: TLabel;
Label15: TLabel;
패널3: T패널;
Wdauto: TRadioButton; // "자동 너비" 제어
Wdall: TRadioButton; // "동일한 너비" 컨트롤
Wdmax: TRadioButton; // "너비 제한" 제어
Label16: TLabel;
ColWd: TEdit; // 열 너비 입력 상자 컨트롤
패널4: T패널;
DJAUTO: TRadioButton; // "자동 정렬" 컨트롤
DJCENTER: TRadioButton // "중앙" 컨트롤
DJLEFT: TRadioButton; // "왼쪽 정렬" 컨트롤
FB: TQRBand // 바닥글 밴드 제어
Label17: TLabel;
패널5: T패널;
TJ1: TCheckBox; // "페이지당 통계" 컨트롤
TJ2: TCheckBox // "통계 합계" 제어
SB: TQRBand; // 합 대역 제어
절차 FormCreate(보내는 사람: TObject);
절차 RadioButtonClick(Sender: TObject);
절차 PageDluxClick(Sender: TObject);
절차 PageColChange(보내는 사람: TObject);
절차 PageSpaceExit(Sender: TObject);
프로시저 PagesChange(Sender: TObject);
프로시저 PageTopExit(Sender: TObject);
프로시저 PageBottomExit(Sender: TObject);
절차 PageLeftExit(Sender: TObject);
절차 PageRightExit(Sender: TObject);
절차 TTExit(보내는 사람: TObject);
절차 DTClick(보내는 사람: TObject);
절차 BtnPrviewClick(Sender: TObject);
절차 BtnSetClick(Sender: TObject);
절차 PsChange(보내는 사람: TObject);
절차 PaperChange(보내는 사람: TObject);
절차 FormClose(Sender: TObject; var Action: TCloseAction);
절차 FormDestroy(보내는 사람: TObject);
절차 CreateReport(Sender: TObject);
절차 SRClick(보내는 사람: TObject);
절차 ClearRep();
절차 FormShow(보내는 사람: TObject);
절차 PaperSizeChg(Sender: TObject);
절차 DJChage(보내는 사람: TObject);
절차 WdChage(보내는 사람: TObject);
절차 QuickRepStartPage(발신자: TCustomQuickRep);
절차 BtnPrintClick(발신자: TObject);
사적인
{비공개 선언}
CHBName:TQRLabelName;//열 헤더 스트립 제어 이름 동적 배열 이름 정의
DBName:TQRDBTextName; //디테일 밴드 컨트롤 이름의 동적 배열 이름을 정의합니다.
CHBShape,DBShape,FBShape,SumShape:TQRShapeName //라인 컨트롤의 동적 배열 이름을 정의합니다.
FBName,SumName:TQRExpName; //바닥글(FBNAME) 및 합계 밴드(SUMNAME) 컨트롤 이름의 동적 배열 이름을 정의합니다.
DJ:TAalignment;//열 정렬(taLeftJustify, taRightJustify, taCenter)
Rd1, Rd2:Byte; //테이블 열 정렬(RD1) 및 인쇄 너비(RD2) 상태 변수 이름을 저장하는 데 사용됩니다.
공공의
{공개 선언}
CXTJ,BT:String;//CXTJ는 쿼리 조건을 저장하고 BT는 보고서 제목을 저장합니다.
//상위 폼으로 지정
끝;
const
PaperSize:array[0..26] of TQRPaperSize=(A3, A4, A4Small, A5, B4, B5, Letter,
LetterSmall, Tabloid, Ledger, Legal,Statement, Executive, Folio,
콰르토, qr10X14, qr11X17, 노트, Env9, Env10, Env11, Env12,
Env14, CSheet, DSheet, ESheet, 사용자 정의);
//QuickRep에 나열된 용지 유형
var
프린트폼: TPrintForm;
구현
{$R *.DFM}
절차 TPrintForm.FormCreate(Sender: TObject);
//QuickRep.Page 속성 및 기타 속성 값 표시
var
나:바이트;
시작하다
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.체크됨;
R2.Checked:=QuickRep.Page.Orientation=poLandscape;
Image2.Visible:=R2.체크됨;
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);
I:=0 ~ 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(Sender: TObject);
//용지 방향 변경 이벤트 처리
var
S:문자열;
시작하다
Image1.Visible:=R1.체크됨;
Image2.Visible:=R2.체크됨;
R1.Checked이면
QuickRep.Page.Orientation:=poPortrait
또 다른
QuickRep.Page.Orientation:=poLandscape;
//용지 너비와 길이 값을 바꿉니다.
S:=종이H.텍스트;
PaperH.Text:=PaperW.Text;
PaperW.Text:=S;
if (Ps.ItemIndex=26) 또는 (Ps.ItemIndex=0)이면 시작됩니다.
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
끝;
끝;
절차 TPrintForm.PageDluxClick(Sender: 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(Sender: 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(Sender: TObject);
시작하다
QuickRep.Page.TopMargin:=StrToFloat(PageTop.Text);
끝;
절차 TPrintForm.PageBottomExit(Sender: TObject);
시작하다
QuickRep.Page.BottomMargin:=StrToFloat(PageBottom.Text);
끝;
절차 TPrintForm.PageLeftExit(Sender: TObject);
시작하다
QuickRep.Page.LeftMargin:=StrToFloat(PageLeft.Text);
끝;
절차 TPrintForm.PageRightExit(Sender: TObject);
시작하다
QuickRep.Page.RightMargin:=StrToFloat(PageRight.Text);
끝;
절차 TPrintForm.TTExit(Sender: TObject);//제목 변경 이벤트 처리
시작하다
QuickRep.ReportTitle:=TT.Text;
제목.캡션:=TT.텍스트;
Bt:=TT.텍스트;
끝;
절차 TPrintForm.DTClick(Sender: TObject);//쿼리 조건 인쇄 확인란 이벤트
시작하다
QRSQL.Enabled:=SR.Checked;
끝;
절차 TPrintForm.BtnPrviewClick(Sender: TObject); //미리보기 버튼 클릭 이벤트
시작하다
QuickRep.미리보기;
끝;
절차 TPrintForm.BtnSetClick(Sender: TObject); //버튼 클릭 이벤트 설정
시작하다
QuickRep.PrinterSetup;
끝;
절차 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:=참;
BtnPrint.Enabled:=CrtRep.Enabled 아님;
BtnPrview.Enabled:=BtnPrint.Enabled;
끝;
절차 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(Sender: TObject);
시작하다
ClearRep;
인쇄양식:=nil;
끝;
절차 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 //쿼리가 반환한 필드 수를 기반으로 컨트롤을 만듭니다.
시작하다
if (Query.Fields[I].DataType<>ftBlob) And (Query.Fields[I].DataType<>ftMemo) then
시작 //메모 필드와 사진 필드를 무시합니다.
L:=Query.Fields[I].DataSize-1;//L=필드 너비(바이트)-1
case Rd1 of //선택한 정렬에 따라 컨트롤의 정렬을 설정합니다.
0: L<=10이면 Dj:=taCenter else 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:=길이(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: 시작 //최대 너비 제한: 먼저 자동 너비를 계산한 다음 너비가 최대값을 초과하는지 확인합니다.
//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;
끝;
끝;
CHBlf+ObWidth>=HB.Width인 경우 //컨트롤 생성>용지 너비?
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].Height:=17;
CHBNAME[I]:=TQRLabel.Create(HB); //열 제목 컨트롤 생성
CHBNAME[I].Parent:=HB;
CHBNAME[I].Top:=CHBtp+2;
CHBNAME[I].Left:=CHBlf+1;
CHBNAME[I].AutoSize:=거짓;
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].Height:=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:=거짓;
DBNAME[I].Width:=ObWidth-3;
DBNAME[I].높이:=13;
DBNAME[I].Alignment:=Dj;
DBNAME[I].DataSet:=쿼리;
DBNAME[I].DataField:=Query.Fields[I].FieldName;
DBNAME[I].BringToFront;
if Tj1.Checked then start //바닥글 밴드를 생성하시겠습니까?
FBShape[I]:=TQRShape.Create(FB); //바닥글 밴드 라인 컨트롤 생성
FBShape[I].Parent:=FB;
FBShape[I].Top:=0;
FBShape[I].Left:=CHBlf;
FBShape[I].Width:=ObWidth+1;
FBShape[I].Height:=17;
if (Query.Fields[I].DataType=ftFloat) 또는
(Query.Fields[I].DataType=ftCurrency) 또는 (I<2)
start //필드 유형이 숫자 유형인 경우 생성합니다.
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:=거짓;
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 start //합계 대역을 설정해야 합니까?
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)
start //필드 유형이 숫자 유형인 경우 생성합니다.
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;//현재 필드 처리가 완료되었습니다. 오른쪽으로 한 필드 너비
끝;
끝;
끝;
CrtRep.Enabled:=False;//생성 버튼 비활성화
BtnPrint.Enabled:=CrtRep.Enabled 아님;암모늄 버튼 인쇄 허용
BtnPrview.Enabled:=BtnPrint.Enabled;미리보기 허용 버튼
if Tj1.Checked then start //바닥글 밴드가 생성되면 바닥글 밴드의 처음 두 열을 변경합니다.
FBNAME[0].Expression:=''총 페이지'';
FBNAME[1].Expression:='COUNT+'행'';
끝;
if Tj1.Checked then start //합계 대역이 설정되면 합산 대역의 처음 두 열을 변경합니다.
SumNAME[0].Expression:=''합계'';
SumNAME[1].Expression:='COUNT+'row'';
끝;
//열 헤더 영역의 날짜 및 페이지 번호 인쇄 위치를 조정합니다.
QRE2.Left:=HB.Width-Qre2.Width;
QRSQL.Left:=QRE1.Width+10;
QRSQL.Width:= QRE2.Left-10-QRSQL.Left;
QuickRep.DataSet:=Query; //QuickRep에 대한 데이터 세트를 지정합니다. 이 문장이 누락되어서는 안 됩니다.
Screen.Cursor:=crDefault;
끝;
절차 TPrintForm.ClearRep();//보고서 형식 생성 시 생성된 컨트롤 지우기
바르
나:바이트;
시작하다
I:=0에서 Query.FieldCount-1까지 시작
할당된 경우(CHBShape[I]) 시작 CHBShape[I].Free;CHBShape[I]:=nil;end;
할당된 경우(CHBNAME[I]) CHBNAME[I].Free;CHBNAME[I]:=nil;end를 시작합니다.
Assigned(DBShape[I])인 경우 DBShape[I].Free;DBShape[I]:=nil;end를 시작합니다.
Assigned(DBNAME[I])인 경우 DBNAME[I].Free;DBNAME[I]:=nil;end를 시작합니다.
If Assigned(FBShape[I]) then start FBShape[I].Free;FBShape[I]:=nil;end;
할당된 경우(FBNAME[I]) 다음 시작 FBNAME[I].Free;FBNAME[I]:=nil;end;
if Assigned(SumShape[I]) then start SumShape[I].Free;SumShape[I]:=nil;end;
할당된 경우(SumNAME[I]) 다음 시작 SumNAME[I].Free;SumNAME[I]:=nil;end;
끝;
끝;
절차 TPrintForm.SRClick(Sender: TObject);
시작하다
if Sr.Checked then QrSQL.Caption:=CXTJ else QRSQL.Caption:=';
끝;
절차 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(Sender: TObject);
시작하다
CrtRep.Enabled:=참;
BtnPrint.Enabled:=CrtRep.Enabled 아님;
BtnPrview.Enabled:=BtnPrint.Enabled;
끝;
절차 TPrintForm.DJChage(Sender: TObject);//정렬 변경 이벤트 처리
var
Chg:바이트;
시작하다
Djauto.Checked이면 Chg:=0
그렇지 않으면 DjCenter.Checked이면 Chg:=1입니다.
else Chg:=2;
Chg<>Rd1인 경우 PaperSizeChg(nil);Rd1:=Chg;end를 시작합니다.
끝;
절차 TPrintForm.WdChage(Sender: TObject);//폭 변경 이벤트 처리
var
Chg:바이트;
시작하다
Wdauto.Checked이면 Chg:=0
그렇지 않으면 Wdall.Checked인 경우 시작됩니다.
변경:=1;
if ColWd.Text=' then ColWd.Text:='100';
끝
그렇지 않으면 시작하다
변경:=2;
if ColWd.Text=' then ColWd.Text:='200';
끝;
Chg<>Rd2이면 시작 PaperSizeChg(nil);Rd2:=Chg;end;
ColWd.Enabled:=Chg<>0;
끝;
절차 TPrintForm.QuickRepStartPage(발신자: TCustomQuickRep);
//보고서 인쇄는 새 페이지 이벤트 처리를 시작하고 바닥글 밴드의 통계 값이 지워집니다.
바르
나:바이트;
시작하다
Tj1.Checked이면
I:=0에서 Query.FieldCount-1까지 수행
할당된 경우(FBNAME[I]) 그러면 FBNAME[I].Reset;
끝;
절차 TPrintForm.BtnPrintClick(Sender: TObject);
시작하다
QuickRep.인쇄;
끝;
끝.
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 이벤트 프로세스와 동적 컨트롤 이름 처리입니다. 지면의 제약으로 인해 일부 내용을 설명하지 못하였으니 독자들이 스스로 이해하시기 바랍니다. 일반 보고서 생성의 경우 이 프로그램은 요구 사항을 충족할 수 있습니다.
저는 더 강력한 기능을 갖춘 최신 버전을 가지고 있습니다. 필요한 친구가 저에게 이메일을 보내면 꼭 보내드리겠습니다.