Unter den Softwareentwicklungstools hat sich Delphi aufgrund seiner zahlreichen Steuerelemente, starken objektorientierten Programmierfunktionen, schnellen Codeausführungsgeschwindigkeit sowie Einfachheit und Benutzerfreundlichkeit in Kombination mit einer visuellen Entwicklungsumgebung und dem schnellsten Compiler derzeit zu einem weltweit anerkannten Schnellentwicklungstool entwickelt Anwendungsentwicklungstools werden von immer mehr Programmierern verwendet. Sie können Delphi zum Schreiben verschiedener Windows-Anwendungen verwenden, insbesondere für die Entwicklung von Datenbank-Informationsverwaltungssystemen, was seine einzigartigen Vorteile bietet. Im Entwicklungsprozess eines Datenbankinformationsmanagementsystems müssen wir häufig viele Berichte ausdrucken. Die Verwendung von Delphi zum Entwerfen komplexer Berichte ist nicht so einfach wie Visual FoxPRo. Da in Delphi jedoch auch Steuerelemente zum Entwerfen von Berichten verwendet werden, können wir die erforderlichen Berichtssteuerelemente während der Programmausführung direkt festlegen, um Berichte in Echtzeit zu erstellen, und das generierte Berichtsmuster kann durch die Programmsteuerung bestimmt werden. Wenn wir beispielsweise Datenbankinformationen abfragen, ist die Struktur der Ergebnisinformationen im Allgemeinen nicht festgelegt. Wenn wir die Abfrageergebnisse drucken möchten, reicht es nicht aus, nur ein Berichtsformat zu entwerfen. Wir müssen eines für alle möglichen Ergebnisinformationen entwerfen. Auch die Formatierung von Berichten ist keine gute Lösung. Um ein solches Problem zu lösen, können wir die Technologie zur Echtzeit-Berichterstellung nutzen. Der Zweck dieses Artikels besteht darin, anhand eines Beispiels detailliert vorzustellen, wie Berichte in Echtzeit erstellt werden.
In diesem Beispiel wird ein Druckdialogfeld entworfen, das das TQickRep-Steuerelement und einige Steuerelemente für den Berichtsstil enthält. Das Erscheinungsbild anderer Formulare ist wie folgt:
1. Beschreibung der Steuerfunktion
QuickRep:TQuickRep Es enthält Spaltenköpfe (HB:TQRBand), Details (DB:TQRBand), Fußzeilen (FB:TQRBand) und Zusammenfassungsbänder (SB:TQRBand). Die Details, die Fußzeile und die Zusammenfassung enthalten kein TQRLabel, TQRExpr oder TDBText-Steuerelement, die hauptsächlich erstellt werden, wenn das Programm ausgeführt wird. Die Spaltenkopfzone enthält Titel (TQRLabel) für den Berichtstitel. TQRLabel wird für Abfragebedingungen verwendet. Die Caption-Eigenschaften dieser beiden Steuerelemente können während der Programmausführung beliebig geändert werden. Um zu verhindern, dass QuickRep angezeigt wird, platzieren Sie es hinter Panel1 (Tpanel) und erweitern Sie Panel1 auf das gesamte Formular.
Abfrage: TQuery SQL-Anweisungssteuerung. Das Programm generiert Berichte basierend auf den von der Abfrage zurückgegebenen Ergebnissen. Daher müssen Sie beim Erstellen dieses Formulars eine SQL-Anweisung für die Eigenschaft Query.SQL angeben;
Im obigen Formular sind die in den Spalten „Papier“ und „Seite einrichten“ enthaltenen Steuerelemente Steuerelemente für die QuickRep.Page-Eigenschaft. Wenn Sie sie bei der Ausführung des Programms ändern, wird der entsprechende Eigenschaftswert des QuickRep-Steuerelements direkt geändert erfolgt über das OnChange- oder OnExit-Ereignis.
Der Titel in der Spalte „Inhaltseinstellungen drucken“ ist der Titel des angegebenen Berichts (TT:TEdit). Sein Wert stimmt mit QuickRep.ReportTitle und Title.Caption überein und kann beliebig geändert werden Ob die Abfragebedingungen gedruckt werden sollen, steuert direkt, ob QRSQL.Caption leer ist. Es wird hauptsächlich für die Ausrichtung detaillierter Inhalte beim Generieren von Berichten verwendet Steuervariable RD1 ändern (Byte-)Wert (0 automatische Ausrichtung, 1 zentrierte Ausrichtung, 2 linke Ausrichtung); „Druckbreite der Tabellenspalte“ besteht aus einer Reihe von Optionsschaltflächen, die hauptsächlich für die Breite der Spaltenwerte beim Generieren von Berichtsformaten und deren Änderung verwendet werden Steuervariablen Der Wert von RD2 (Byte) (0 automatische Breite, 1 Gleiche Breite, 2 Maximale Breite begrenzen) Wenn Sie 1 Gleiche Breite, 2 Maximale Breite begrenzen, müssen Sie die Breite in Pixel eingeben. „Statistische Methode“ gibt an, ob der Bericht eine Fußzeile (FB: TQRBAND) und eine Summe ( SB: TQRBAND ) Zone.
2. Programmbeschreibung
Das Programm definiert die folgenden Typen:
TQRLabelName=Array von TQRLabel;
TQRDBTextName=Array von TQRDBText;
TQRShapeName=Array von TQRShape;
TQRExpName=Array von TQRExpr;
Der obige Typ ist ein dynamischer Array-Typ und jedes Datenelement ist eine Klasse. Beim Erstellen von Berichtssteuerelementen in Echtzeit ist die Anzahl der zu erstellenden Steuerelemente ungewiss und die Steuerelementnamen können nicht bestimmt werden. Die Verwendung dynamischer Arrays ist eine bessere Lösung, d. h. Sie können die Dimensionen der Daten beliebig angeben, ohne den Speicher verwalten zu müssen Dieses Problem erleichtert auch die Freigabe und Bearbeitung der in Berichten enthaltenen Kontrollen. Das Programm deklariert außerdem Variablen der oben genannten Typen wie folgt:
CHBName:TQRLabelName;
DBName:TQRDBTextName;
CHBShape,DBShape,FBShape,SumShape:TQRShapeName;
FBName,SumName:TQRExpName;
Diese Array-Variablen weisen Speicher basierend auf den von Query zurückgegebenen Feldergebnissen zu, wenn das Formular erstellt wird. Jedes Feld entspricht einem Element des Arrays.
Programmausführungsprozess: Wenn das Formular erstellt und angezeigt wird, wird der Initialisierungsvorgang für dieses Formular eingerichtet. Zeigen Sie den entsprechenden Wert der QuickRep.Page-Eigenschaft im OnCreate-Ereignis an, führen Sie die Query.Open-Operation im OnShow-Ereignis aus und weisen Sie den Variablenbereich des Steuerarrays entsprechend dem zurückgegebenen Ergebnis zu. Nachdem das Formular erstellt wurde, klicken Sie auf die Schaltfläche „Generieren“, um den Bericht zu erstellen (ohne Berücksichtigung des Notizfelds und des Fotofelds), und klicken Sie dann auf „Drucken“ und „Vorschau“, um den Bericht zu drucken oder in der Vorschau anzuzeigen. Wenn die Einstellungen nach der Erstellung des Berichts geändert werden, muss der Bericht neu generiert werden. Wenn von der Abfrage zu viele Ergebnissatzfelder zurückgegeben werden, reicht die Papiergröße möglicherweise nicht aus, um beim Erstellen des Berichts alle Berichte zu erstellen. Sie können die Papiergröße des Berichts anpassen und dann den Bericht erstellen. Beim Schließen des Formulars werden die erstellten Steuerelemente freigegeben.
3. Quellprogrammliste und Kommentare
Einheit PrintDlg;
Schnittstelle
verwendet
Windows, Nachrichten, SysUtils, Klassen, Grafiken, Steuerelemente, Formulare, Dialoge,
StdCtrls, Buttons, ExtCtrls, Spin, QuickRpt,QRPrntr,printers, Qrctrls,
Db,DBTables,ComCtrls,SysIni;
Typ
TQRLabelName=array of TQRLabel;//Dynamisches Array von Spaltentitel-Steuerelementen im Spaltenkopfstreifen
TQRDBTextName=array of TQRDBText; //Dynamisches Array von Spaltentitel-Steuerelementen im Detailband
TQRShapeName=array of TQRShape; //Dynamisches Array von Liniensteuerteilen
TQRExpName=Array von TQRExpr; //Dynamisches Array der statistischen Kontrollklasse
TPrintForm = class(TForm)
GroupBox1: TGroupBox;
Label5: TLabel;
BtnSet: TbitBtn;//Schaltflächensteuerung „Einstellungen“.
BtnCancel: TBitBtn; // Schaltflächensteuerung „Schließen“.
Panel1: TPanel;
BtnPrint: TBitBtn; // Schaltflächensteuerung „Drucken“.
BtnPrview: TBitBtn; // Schaltfläche „Vorschau“.
QuickRep: TQuickRep; // Schnelle Berichtssteuerung
HB: TQRBand; // Bandsteuerung „Spaltenkopf“.
Titel: TQRLabel;//Titelkontrolle melden
QRE1: TQRExpr;//Steuerelement „Seitennummer“ im Spaltenkopfband
QRE2: TQRExpr;//Steuerelement „Datum“ im Spaltenkopfband
Panel2: TPanel;
Label1: TLabel;
R1: TRadioButton;//Steuerelement „Hochformatdruck“.
R2: TRadioButton;//Steuerelement „horizontales Drucken“.
GroupBox4: TGroupBox;
TT: TEdit; // Titeleingabefeld-Steuerung
Label2: TLabel;
SR: TCheckBox; // Steuerelement „Abfragebedingungen drucken“.
Label3: TLabel;
Image1: TImage; // Vertikales Druckbild anzeigen
Image2: TImage;//Horizontales Druckbild anzeigen
QRSQL: TQRLabel; // Wird verwendet, um das „Query Condition“-Steuerelement im Spaltenkopfband anzuzeigen
GroupBox2: TGroupBox;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
PageSpace: TEdit; // Eingabefeldsteuerung für den Spaltenabstand
PageTop: TEdit; // Eingabefeldsteuerung am Seitenrand
PageBottom: TEdit; //Eingabefeldsteuerung unter dem Seitenrand
PageLeft: TEdit; // Eingabefeldsteuerung für den linken Seitenrand
PageRight: TEdit; // Steuerelement für den rechten Seitenrand
PageDlux: TCheckBox; // Steuerung „Doppelseitiger Druck“.
PageCol: TEdit; // Spalteneingabefeld-Steuerung
Pages: TEdit; // Zahleneingabefeld-Steuerelement drucken
PaperH: TEdit; // Steuerung des Eingabefelds für die Papierlänge
PaperW: TEdit;//Steuerelement für das Eingabefeld für die Papierbreite
Label4: TLabel;
Label6: TLabel;
Ps: TComboBox;//Steuerelement für das Listenfeld „Papiermodell“.
Abfrage: TQuery;//SQL-Abfragesteuerung
DB: TQRBand; // Bandsteuerung „Details“.
CrtRep: TBitBtn; // Schaltflächensteuerung „Generieren“.
Label14: TLabel;
Label15: TLabel;
Panel3: TPanel;
Wdauto: TRadioButton; // „Autowidth“-Steuerelement
Wdall: TRadioButton; // Steuerelement „Gleiche Breite“.
Wdmax: TRadioButton; // „Auf Breite beschränken“-Steuerelement
Label16: TLabel;
ColWd: TEdit; // Eingabefeldsteuerung für die Spaltenbreite
Panel4: TPanel;
DJAUTO: TRadioButton; // „Auto-align“-Steuerung
DJCENTER: TRadioButton; // „Center“-Steuerung
DJLEFT: TRadioButton; // Steuerelement „Links ausrichten“.
FB: TQRBand; // Fußzeilenbandsteuerung
Label17: TLabel;
Panel5: TPanel;
TJ1: TCheckBox; // Steuerelement „Statistiken pro Seite“.
TJ2: TCheckBox; // Steuerelement „Statistische Summe“.
SB: TQRBand; // Summenbandsteuerung
procedure FormCreate(Sender: TObject);
procedure RadioButtonClick(Sender: TObject);
procedure PageDluxClick(Sender: TObject);
procedure PageColChange(Sender: TObject);
procedure PageSpaceExit(Sender: TObject);
procedure PagesChange(Sender: TObject);
procedure PageTopExit(Sender: TObject);
procedure PageBottomExit(Sender: TObject);
procedure PageLeftExit(Sender: TObject);
procedure PageRightExit(Sender: TObject);
procedure TExit(Sender: TObject);
procedure DTClick(Sender: TObject);
procedure BtnPrviewClick(Sender: TObject);
procedure BtnSetClick(Sender: TObject);
procedure PsChange(Sender: TObject);
procedure PaperChange(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure CreateReport(Sender: TObject);
procedure SRClick(Sender: TObject);
Prozedur ClearRep();
procedure FormShow(Sender: TObject);
procedure PaperSizeChg(Sender: TObject);
procedure DJChage(Sender: TObject);
procedure WdChage(Sender: TObject);
procedure QuickRepStartPage(Sender: TCustomQuickRep);
procedure BtnPrintClick(Sender: TObject);
Privat
{Private Erklärungen}
CHBName:TQRLabelName;// Definieren Sie den Namen des dynamischen Array-Steuerelements für den Spaltenkopfstreifen
DBName:TQRDBTextName; //Definieren Sie den dynamischen Array-Namen des Detailband-Steuerelementnamens
CHBShape,DBShape,FBShape,SumShape:TQRShapeName; //Definieren Sie den dynamischen Array-Namen des Zeilensteuerelements
FBName,SumName:TQRExpName; //Definieren Sie den dynamischen Array-Namen der Fußzeilen- (FBNAME) und Summenband-Steuernamen (SUMNAME).
DJ:TAlignment;//Spaltenausrichtung (taLeftJustify, taRightJustify, taCenter)
Rd1, Rd2:Byte; //Wird zum Speichern der Statusvariablennamen für die Tabellenspaltenausrichtung (RD1) und die Druckbreite (RD2) verwendet
öffentlich
{Öffentliche Erklärungen}
CXTJ,BT:String;//CXTJ speichert Abfragebedingungen, BT speichert Berichtstitel
//Angegeben durch das Formular der oberen Ebene
Ende;
const
PaperSize:array[0..26] of TQRPaperSize=(A3, A4, A4Small, A5, B4, B5, Letter,
LetterSmall, Tabloid, Ledger, Legal, Statement, Executive, Folio,
Quarto, qr10X14, qr11X17, Note, Env9, Env10, Env11, Env12,
Env14, CSheet, DSheet, ESheet, Benutzerdefiniert);
//Von QuickRep aufgelistete Papiertypen
var
PrintForm: TPrintForm;
Durchführung
{$R *.DFM}
procedure TPrintForm.FormCreate(Sender: TObject);
//Zeigen Sie die QuickRep.Page-Eigenschaft und andere Eigenschaftswerte an
var
I:Byte;
beginnen
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);
Für I:=0 bis 26 zeigt das Listenfeld //PS den Papiertyp an
Wenn QuickRep.Page.PaperSize=PaperSize[I], dann beginnen
PS.ItemIndex:=I;
Brechen;
Ende;
//Bestimmen Sie, ob die Papierbreite geändert werden kann. Sie kann nur geändert werden, wenn der Papiertyp angepasst ist (Ps.ItemIndex=26).
PaperH.Enabled:=Ps.ItemIndex=26;
PaperW.Enabled:=Ps.ItemIndex=26;
Ende;
procedure TPrintForm.RadioButtonClick(Sender: TObject);
//Ereignisbehandlung zur Änderung der Papierausrichtung
var
S:String;
beginnen
Image1.Visible:=R1.Checked;
Image2.Visible:=R2.Checked;
wenn R1.Überprüft dann
QuickRep.Page.Orientation:=poPortrait
anders
QuickRep.Page.Orientation:=poLandscape;
//Vertauschen Sie die Werte für Papierbreite und -länge
S:=PaperH.Text;
PaperH.Text:=PaperW.Text;
PaperW.Text:=S;
Wenn (Ps.ItemIndex=26) oder (Ps.ItemIndex=0), dann beginnen
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
Ende;
Ende;
procedure TPrintForm.PageDluxClick(Sender: TObject);
beginnen
QuickRep.PrinterSettings.Duplex:=PageDlux.Checked;
Ende;
procedure TPrintForm.PageColChange(Sender: TObject);
beginnen
if StrToInt(PageCol.Text)<1 then PageCol.Text:='1';
QuickRep.Page.Columns:=StrToInt(PageCol.Text);
Ende;
procedure TPrintForm.PageSpaceExit(Sender: TObject);
beginnen
QuickRep.Page.ColumnSpace:=StrToFloat(PageSpace.Text);
Ende;
procedure TPrintForm.PagesChange(Sender: TObject);
beginnen
if StrToInt(Pages.Text)<1 then Pages.Text:='1';
QuickRep.PrinterSettings.Copies:=StrToInt(Pages.Text);
Ende;
procedure TPrintForm.PageTopExit(Sender: TObject);
beginnen
QuickRep.Page.TopMargin:=StrToFloat(PageTop.Text);
Ende;
procedure TPrintForm.PageBottomExit(Sender: TObject);
beginnen
QuickRep.Page.BottomMargin:=StrToFloat(PageBottom.Text);
Ende;
procedure TPrintForm.PageLeftExit(Sender: TObject);
beginnen
QuickRep.Page.LeftMargin:=StrToFloat(PageLeft.Text);
Ende;
procedure TPrintForm.PageRightExit(Sender: TObject);
beginnen
QuickRep.Page.RightMargin:=StrToFloat(PageRight.Text);
Ende;
procedure TPrintForm.TTExit(Sender: TObject);//Titeländerungsereignisbehandlung
beginnen
QuickRep.ReportTitle:=TT.Text;
Title.Caption:=TT.Text;
Bt:=TT.Text;
Ende;
procedure TPrintForm.DTClick(Sender: TObject);//Abfragebedingung-Kontrollkästchen-Ereignis drucken
beginnen
QRSQL.Enabled:=SR.Checked;
Ende;
procedure TPrintForm.BtnPrviewClick(Sender: TObject); //Vorschau-Schaltflächenklickereignis
beginnen
QuickRep.Preview;
Ende;
procedure TPrintForm.BtnSetClick(Sender: TObject); //Schaltflächenklickereignis festlegen
beginnen
QuickRep.PrinterSetup;
Ende;
procedure TPrintForm.PsChange(Sender: TObject);//Papiertyp-Änderungsereignis
beginnen
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:=nicht CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
Ende;
procedure TPrintForm.PaperChange(Sender: TObject);//Ereignisse zur Änderung der Papierbreite und -länge
beginnen
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
Ende;
procedure TPrintForm.FormClose(Sender: TObject; var Action: TCloseAction);
beginnen
Aktion:=caFree;
Ende;
procedure TPrintForm.FormDestroy(Sender: TObject);
beginnen
ClearRep;
PrintForm:=nil;
Ende;
procedure TPrintForm.CreateReport(Sender: TObject);//Schaltflächenklickereignis generieren
Var
I,L:Byte;
CHBtp,CHBlf,Cd,ObWidth:Word;
beginnen
Screen.Cursor:=crHourGlass;
Title.Caption:=Bt;//Legen Sie den Titel fest
ClearRep(); //Das erstellte Objekt löschen;
if Sr.Checked then QrSQL.Caption:=CXTJ else QRSQL.Caption:=';//Ob die Abfragebedingungen gedruckt werden sollen?
CHBtp:=HB.Height-17;//Die oberste Position des erstellten Steuerelements im Band
CHBlf:=0; //Das erstellte Steuerelement befindet sich an der linken Position im Band
ObWidth:=0; //Die Breite des erstellten Steuerelements
for I := 0 to Query.FieldCount-1 do //Erstelle ein Steuerelement basierend auf der Anzahl der von Query zurückgegebenen Felder
beginnen
if (Query.Fields[I].DataType<>ftBlob) And (Query.Fields[I].DataType<>ftMemo) then
begin //Das Notizfeld und das Fotofeld ignorieren
L:=Query.Fields[I].DataSize-1;//L=Feldbreite (Bytes)-1
case Rd1 of //Legen Sie die Ausrichtung des Steuerelements entsprechend der ausgewählten Ausrichtung fest
0: wenn L<=10 dann Dj:=taCenter sonst DJ:=taLeftJustify;
//Automatische Ausrichtung: Felder kleiner oder gleich 10 werden in der Mitte ausgerichtet, ansonsten linksbündig
1: Dj:=taCenter;//zentrierte Ausrichtung
2: DJ:=taLeftJustify;//Linksausrichtung
Ende;
case Rd2 of //Legen Sie die Spaltenbreite des Berichts entsprechend der ausgewählten Listenbreite fest
0: beginnen
//Automatische Breite: wenn L>14, dann Breite ObWidth=14+(L-14)/2;
//Die Breite kann keine Spaltentitel anzeigen, dann ObWidth=Spaltentitelbreite; wenn der Feldtyp
//Für Datumstyp, Währungstyp und Gleitkommazahlentyp ObWidth=65
wenn L>14 dann L:=14+(L-14) div 2;
ObWidth:=L*6;
L:=Length(Query.Fields[I].DisplayName);
wenn ObWidth<L*6 dann ObWidth:=L*6;
ObWidth:=ObWidth+2;
if (Query.Fields[I].DataType=ftDateTime) oder
(Query.Fields[I].DataType=ftFloat) oder
(Query.Fields[I].DataType=ftCurrency) then ObWidth:=65;
Ende;
1: if ColWd.Text<>' then ObWidth:=StrToInt(ColWd.Text)
else ObWidth:=100;//Same width:ObWidth=input width value
2: begin // Maximale Breite begrenzen: Berechnen Sie zuerst die automatische Breite und bestimmen Sie dann, ob die Breite den Maximalwert überschreitet.
//Wenn es den Eingabewert ObWidth=maximale Breite überschreitet
if ColWd.Text<>' then Cd:=StrToInt(ColWd.Text)
sonst Cd:=200;
ObWidth:=L*6;
if ObWidth>Cd then ObWidth:=Cd;
ObWidth:=ObWidth+2;
if (Query.Fields[I].DataType=ftDateTime) oder
(Query.Fields[I].DataType=ftFloat) oder
(Query.Fields[I].DataType=ftCurrency) then ObWidth:=65;
Ende;
Ende;
if CHBlf+ObWidth>=HB.Width then begin //Steuerelement erstellen>Papierbreite?
DlgMes:='Die Papierbreite reicht nicht aus, bitte ändern Sie das Papierformat. ';
MessageBox(Handle,DlgMes,Cap_Inf,Ico_Inf);
brechen;
Ende
sonst beginnen
CHBShape[I]:=TQRShape.Create(HB);//Spaltenkopfzeilensteuerung erstellen
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); //Spaltentitelsteuerung erstellen
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;//Erhalten Sie das Feld als Spaltennamen
CHBNAME[I].BringToFront;
DBShape[I]:=TQRShape.Create(DB); //Detailstreifenliniensteuerung erstellen
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); //Detailbandsteuerung erstellen
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].Height:=13;
DBNAME[I].Alignment:=Dj;
DBNAME[I].DataSet:=Abfrage;
DBNAME[I].DataField:=Query.Fields[I].FieldName;
DBNAME[I].BringToFront;
if Tj1.Checked then begin //Möchten Sie ein Fußzeilenband erstellen?
FBShape[I]:=TQRShape.Create(FB); //Fußzeilen-Bandliniensteuerung erstellen
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) oder
(Query.Fields[I].DataType=ftCurrency) oder (I<2) dann
begin //Wenn der Feldtyp ein numerischer Typ ist, erstellen Sie ihn
FBNAME[I]:=TQRExpr.Create(FB); //Fußzeilen-Bandsteuerung erstellen
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].Height:=13;
FBNAME[I].Alignment:=taCenter;
FBNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
FBNAME[I].BringToFront;
Ende;
Ende;
if Tj2.Checked then begin //Sollten wir das Summenband festlegen?
SumShape[I]:=TQRShape.Create(SB); //Eine Summenstreifenliniensteuerung erstellen
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) oder
(Query.Fields[I].DataType=ftCurrency) oder (I<2) dann
begin //Wenn der Feldtyp ein numerischer Typ ist, erstellen Sie ihn
SumNAME[I]:=TQRExpr.Create(SB); //Summenbandsteuerung erstellen
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;
Ende;
Ende;
CHBlf:=CHBlf+ObWidth;//Die aktuelle Feldverarbeitung ist abgeschlossen, eine Feldbreite nach rechts
Ende;
Ende;
Ende;
CrtRep.Enabled:=False;//Generierungsschaltfläche deaktivieren
BtnPrint.Enabled:=nicht CrtRep.Enabled;Drucken von Ammonium-Schaltflächen zulassen
BtnPrview.Enabled:=BtnPrint.Enabled;Schaltfläche „Vorschau zulassen“.
if Tj1.Checked then begin //Wenn ein Fußzeilenband erstellt wird, ändern Sie die ersten beiden Spalten im Fußzeilenband
FBNAME[0].Expression:=''Gesamtseiten'';
FBNAME[1].Expression:='COUNT+'row';
Ende;
if Tj1.Checked then begin //Wenn das Summenband eingerichtet ist, ändern Sie die ersten beiden Spalten im Summenband
SumNAME[0].Expression:=''Total'';
SumNAME[1].Expression:='COUNT+'row';
Ende;
//Passen Sie die Druckposition für Datum und Seitenzahl im Spaltenkopfbereich an
QRE2.Left:=HB.Width-Qre2.Width;
QRSQL.Left:=QRE1.Width+10;
QRSQL.Width:= QRE2.Left-10-QRSQL.Left;
QuickRep.DataSet:=Query; //Geben Sie den Datensatz für QuickRep an, dieser Satz darf nicht fehlen
Screen.Cursor:=crDefault;
Ende;
procedure TPrintForm.ClearRep();//Löscht das beim Generieren des Berichtsformats erstellte Steuerelement
Var
I:Byte;
beginnen
Für I:=0 bis Query.FieldCount-1 beginnen
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;
Ende;
Ende;
procedure TPrintForm.SRClick(Sender: TObject);
beginnen
if Sr.Checked then QrSQL.Caption:=CXTJ else QRSQL.Caption:=';
Ende;
procedure TPrintForm.FormShow(Sender: TObject); //Formularanzeigeereignis
beginnen
Query.Active:=True;//SQL drucken
TT.Text:=Bt;
QuickRep.ReportTitle:=Bt;//Legen Sie den Titel fest
//Steuerelementnamen-Array reserviert Speicherplatz
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);
Ende;
procedure TPrintForm.PaperSizeChg(Sender: TObject);
beginnen
CrtRep.Enabled:=True;
BtnPrint.Enabled:=nicht CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
Ende;
procedure TPrintForm.DJChage(Sender: TObject);//Ausrichtungsänderungsereignisbehandlung
var
Ändern:Byte;
beginnen
wenn Djauto.Checked dann Chg:=0
sonst wenn DjCenter.Checked dann Chg:=1
sonst Chg:=2;
if Chg<>Rd1 then begin PaperSizeChg(nil);Rd1:=Chg;end;
Ende;
procedure TPrintForm.WdChage(Sender: TObject);//Breitenänderungsereignisbehandlung
var
Ändern:Byte;
beginnen
Wenn Wdauto.Checked, dann Chg:=0
sonst wenn Wdall.Checked dann beginnen
Änderung:=1;
if ColWd.Text=' then ColWd.Text:='100';
Ende
sonst beginnen
Änderung:=2;
if ColWd.Text=' then ColWd.Text:='200';
Ende;
if Chg<>Rd2 then begin PaperSizeChg(nil);Rd2:=Chg;end;
ColWd.Enabled:=Chg<>0;
Ende;
procedure TPrintForm.QuickRepStartPage(Sender: TCustomQuickRep);
// Beim Drucken des Berichts wird die Ereignisverarbeitung einer neuen Seite gestartet und die statistischen Werte im Fußzeilenbereich werden gelöscht.
Var
I:Byte;
beginnen
wenn Tj1.Überprüft dann
Für I:=0 bis Query.FieldCount-1 tun
if Assigned(FBNAME[I]) then FBNAME[I].Reset;
Ende;
procedure TPrintForm.BtnPrintClick(Sender: TObject);
beginnen
QuickRep.Print;
Ende;
Ende.
4. Beispiel für einen Aufrufdialog:
Fügen Sie zunächst die PrintDlg-Einheit in die USES-Anweisung im aufzurufenden Formular ein und rufen Sie sie dann mit dem folgenden Code auf:
wenn nicht zugewiesen (PrintForm), dann PrintForm:=TPrintForm.Create(application);
PrintForm.Query.SQL.Assign(Query.SQL);
//Wenn das aufrufende Formular kein Abfragesteuerelement enthält, können Sie den Wert der SQL-Anweisung direkt festlegen
PrintForm.Bt:=Berichtstitel;
PrintForm.Caption:=Formulartitel;
PrintForm.CXTJ:=Abfragebedingungen;
PrintForm.ShowModal;
5. Fazit
Der Schlüssel zu diesem Programm ist der CreateReport-Ereignisprozess und die Verarbeitung dynamischer Steuerelementnamen. Aufgrund des begrenzten Platzes werden einige Inhalte nicht erklärt und ich hoffe, dass die Leser sie selbst verstehen können. Für die Erstellung allgemeiner Berichte kann dieses Programm die Anforderungen erfüllen.
Ich habe die neueste Version, die über stärkere Funktionen verfügt. Freunde, die sie benötigen, können mir eine E-Mail senden, und ich werde sie auf jeden Fall senden.