Actuellement, parmi les outils de développement logiciel, Delphi est devenu un outil de développement rapide mondialement reconnu en raison de ses nombreux contrôles, de ses puissantes fonctions de programmation orientée objet, de sa vitesse d'exécution rapide du code, de sa simplicité et de sa facilité d'utilisation, combinés à un environnement de développement visuel et au compilateur le plus rapide. Les outils de développement d’applications sont utilisés par de plus en plus de programmeurs. Vous pouvez utiliser Delphi pour écrire diverses applications Windows, en particulier le développement de systèmes de gestion d'informations de bases de données, ce qui présente des avantages uniques. Dans le processus de développement d'un système de gestion de l'information de base de données, nous devons souvent imprimer de nombreux rapports. Utiliser Delphi pour concevoir des rapports complexes est un événement fastidieux. Ce n'est pas aussi simple que Visual FoxPRo. Cependant, comme les contrôles sont également utilisés pour concevoir des rapports dans Delphi, nous pouvons créer directement les contrôles de rapport requis pendant l'exécution du programme pour générer des rapports en temps réel, et l'échantillon de rapport généré peut être déterminé par le contrôle du programme. Par exemple, lorsque nous interrogeons des informations sur une base de données, la structure des informations de résultat n'est généralement pas fixe. Si nous voulons imprimer les résultats de la requête, il ne suffit pas de concevoir un seul format de rapport. Nous devons en concevoir un pour toutes les informations de résultat possibles. Le formatage du rapport n'est pas non plus une bonne solution. Afin de résoudre un tel problème, nous pouvons utiliser une technologie de génération de rapports en temps réel. Le but de cet article est de présenter en détail comment générer des rapports en temps réel à travers un exemple.
Cet exemple va concevoir une boîte de dialogue d'impression, qui inclut le contrôle TQickRep et certains contrôles de contrôle de style de rapport. L'apparence des autres formulaires est la suivante :
1. Description de la fonction de contrôle
QuickRep:TQuickRep Il comprend des bandes d'en-tête de colonne (HB:TQRBand), de détails (DB:TQRBand), de pied de page (FB:TQRBand), de résumé (SB:TQRBand) et n'inclut pas de TQRLabel dans les détails, le pied de page ou le résumé. Contrôle TQRExr ou TDBText, qui sont principalement créés lors de l'exécution du programme. La zone d'en-tête de colonne comprend Title (TQRLabel) pour le titre du rapport ; TQRLabel est utilisé pour les conditions de requête. Les propriétés Caption de ces deux contrôles peuvent être modifiées arbitrairement pendant l'exécution du programme. Afin d'empêcher l'affichage de QuickRep, placez-le derrière Panel1 (Tpanel) et développez Panel1 sur l'ensemble du formulaire ;
Requête : contrôle de l'instruction SQL TQuery, le programme générera des rapports basés sur les résultats renvoyés par Query. Par conséquent, lors de la création de ce formulaire, vous devez spécifier une instruction SQL pour la propriété Query.SQL ;
Dans le formulaire ci-dessus, les contrôles inclus dans les colonnes "Papier" et "Mise en page" contrôlent les propriétés QuickRep.Page. Les modifier lors de l'exécution du programme modifiera directement les valeurs des propriétés correspondantes du contrôle QuickRep. peut être effectué via l'événement OnChange ou OnExit complété ;
Le titre dans la colonne « Paramètres de contenu d'impression » est le titre du rapport spécifié (TT:TEdit). Sa valeur est cohérente avec QuickRep.ReportTitle et Title.Caption et peut être modifiée arbitrairement par la case à cocher « Conditions de requête d'impression » ; s'il faut imprimer les conditions de requête. Le fait que cette case soit cochée contrôle directement si QRSQL.Caption est vide ; « Alignement des colonnes du tableau » se compose d'un ensemble de boutons d'option. Il est principalement utilisé pour l'alignement du contenu détaillé lors de la génération de rapports. modifier la variable de contrôle RD1 Valeur (octet) (0 alignement automatique, 1 alignement central, 2 alignement à gauche) ; "Largeur d'impression des colonnes du tableau" se compose d'un ensemble de boutons d'option, principalement utilisés pour la largeur des valeurs de colonne lors de la génération de formats de rapport, et sa modification. variables de contrôle La valeur de RD2 (octet) (0 largeur automatique, 1 Même largeur, 2 Limiter la largeur maximale), lors de la sélection 1 Même largeur, 2 Limiter la largeur maximale, vous devez saisir la largeur en pixels ; « Méthode statistique » indique si le rapport inclut un pied de page (FB : TQRBAND) et une somme (SB ; : TQRBAND ).
2. Description du programme
Le programme définit les types suivants :
TQRLabelName=tableau de TQRLabel ;
TQRDBTextName=tableau de TQRDBText ;
TQRShapeName=tableau de TQRShape ;
TQRExName=tableau de TQRExr ;
Le type ci-dessus est un type de tableau dynamique et chaque élément des données est une classe. Lors de la création de contrôles de rapport en temps réel, le nombre de contrôles à créer est incertain et les noms des contrôles ne peuvent pas être déterminés. L'utilisation de tableaux dynamiques est une meilleure solution, c'est-à-dire que vous pouvez spécifier arbitrairement les dimensions des données sans avoir à gérer la mémoire. vous-même. Ce problème facilite également la libération et le traitement des contrôles contenus dans les rapports. Le programme déclare également les variables des types ci-dessus comme suit :
CHBName:TQRLabelName;
NomDB:TQRDBTextName;
CHBShape,DBShape,FBShape,SumShape:TQRShapeName;
Nom FB, Nom Somme : TQRExName ;
Ces variables de tableau alloueront de la mémoire en fonction des résultats de champ renvoyés par Query lors de la création du formulaire. Chaque champ correspond à un élément du tableau.
Processus d'exécution du programme : Lorsque le formulaire est créé et affiché, l'opération d'initialisation est établie pour ce formulaire. Affichez la valeur correspondante de la propriété QuickRep.Page dans l'événement OnCreate, effectuez l'opération Query.Open dans l'événement OnShow et allouez l'espace variable du tableau de contrôle en fonction du résultat renvoyé. Une fois le formulaire créé, cliquez sur le bouton « Générer » pour générer le rapport (en ignorant le champ mémo et le champ photo), puis cliquez sur « Imprimer » et « Aperçu » pour imprimer ou prévisualiser le rapport. Lorsque les paramètres sont modifiés après la génération du rapport, le rapport doit être régénéré. Si le jeu de résultats renvoyé par Query comporte trop de champs, le format du papier peut ne pas être suffisant pour générer tous les rapports lors de la génération du rapport. Vous pouvez ajuster le format du papier du rapport, puis générer le rapport. Lorsque le formulaire est fermé, les contrôles créés sont libérés.
3. Liste des programmes sources et commentaires
unité PrintDlg;
interface
utilise
Windows, messages, SysUtils, classes, graphiques, contrôles, formulaires, boîtes de dialogue,
StdCtrls, Boutons, ExtCtrls, Spin, QuickRpt, QRPrntr, imprimantes, Qrctrls,
Db, DBTables, ComCtrls, SysIni ;
taper
TQRLabelName=tableau de TQRLabel;//Tableau dynamique de classes de contrôle de titre de colonne dans la bande d'en-tête de colonne
TQRDBTextName=tableau de TQRDBText ; //Tableau dynamique de contrôles de titre de colonne dans la bande de détail
TQRShapeName=tableau de TQRShape ; //Tableau dynamique de pièces de contrôle de ligne
TQRExName=tableau de TQRExr ; //Tableau dynamique de classe de contrôle statistique
TPrintForm = classe (TForm)
GroupBox1 : TGroupBox ;
Étiquette5 : TLabel ;
BtnSet : TbitBtn ;//Contrôle du bouton "Paramètres"
BtnCancel : TBitBtn; // Contrôle bouton "Fermer"
Panneau 1 : TPanel ;
BtnPrint : TBitBtn; // Contrôle bouton "Imprimer"
BtnPrview : TBitBtn ; // bouton "Aperçu"
QuickRep : TQuickRep ; // Contrôle de rapport rapide
HB: TQRBand; // Contrôle de bande "En-tête de colonne"
Titre : TQRLabel ;//Contrôle du titre du rapport
QRE1 : TQRExr;//Contrôle "Numéro de page" dans la bande d'en-tête de colonne
QRE2 : TQRExr;//Champ "Date" dans la bande d'en-tête de colonne
Panneau 2 : TPanel ;
Étiquette1 : TLabel ;
R1 : TRadioButton ;//Contrôle "Impression portrait"
R2 : TRadioButton;//champ "impression horizontale"
GroupBox4 : TGroupBox ;
TT : TEdit ; // Contrôle de la zone de saisie du titre
Étiquette2 : TLabel ;
SR : TCheckBox; // Contrôle "Imprimer les conditions de requête"
Étiquette3 : TLabel ;
Image1 : TImage ;//Afficher l'image d'impression verticale
Image2 : TImage ;//Afficher l'image d'impression horizontale
QRSQL : TQRLabel; // Permet d'afficher le champ "Query Condition" dans la bande d'en-tête de colonne
GroupBox2 : TGroupBox ;
Étiquette7 : TLabel ;
Étiquette8 : TLabel ;
Étiquette9 : TLabel ;
Étiquette10 : TLabel ;
Étiquette11 : TLabel ;
Étiquette12 : TLabel ;
Étiquette13 : TLabel ;
PageSpace : TEdit ; // Contrôle de la zone de saisie de l'espacement des colonnes
PageTop: TEdit; // Contrôle de la zone de saisie sur la marge de la page
PageBottom : TEdit ; //Contrôle de la zone de saisie sous la marge de la page
PageLeft : TEdit ; // Contrôle de la zone de saisie de la marge de la page à gauche
PageRight : TEdit ; // Contrôle de la zone de saisie de la marge droite de la page
PageDlux : TCheckBox; // Champ "Impression recto verso"
PageCol : TEdit ; // Contrôle de la zone de saisie de la colonne
Pages : TEdit ; // Contrôle de la zone de saisie du numéro d'impression
PaperH : TEdit ; // Contrôle de la zone de saisie de la longueur du papier
PaperW : TEdit ; // Contrôle de la zone de saisie de la largeur du papier
Étiquette4 : TLabel ;
Étiquette6 : TLabel ;
Ps : TComboBox ;//Contrôle de la zone de liste du modèle papier
Requête : TQuery ;//Contrôle des requêtes SQL
DB: TQRBand; // Contrôle de bande "Détails"
CrtRep : TBitBtn ; // Contrôle bouton "Générer"
Étiquette14 : TLabel ;
Étiquette15 : TLabel ;
Panneau 3 : TPanel ;
Wdauto : TRadioButton ; // Contrôle "Largeur automatique"
Wdall : TRadioButton ; // Contrôle "Même largeur"
Wdmax : TRadioButton ; // Contrôle "Limiter à la largeur"
Étiquette16 : TLabel ;
ColWd : TEdit ; // Contrôle de la zone de saisie de la largeur de la colonne
Panneau 4 : TPanel ;
DJAUTO : TRadioButton ; // Contrôle "Auto-align"
DJCENTER : TRadioButton ; // Contrôle "Centre"
DJLEFT : TRadioButton ; // Contrôle "Aligner à gauche"
FB : TQRBand ; // Contrôle de la bande de pied de page
Étiquette17 : TLabel ;
Panneau 5 : TPanel ;
TJ1 : TCheckBox; // Champ "Statistiques par page"
TJ2 : TCheckBox; // Champ "Somme statistique"
SB : TQRBand ; // Contrôle de la bande de somme
procédure FormCreate(Expéditeur : TObject);
procédure RadioButtonClick(Expéditeur : TObject);
procédure PageDluxClick(Expéditeur : TObject);
procédure PageColChange(Expéditeur : TObject);
procédure PageSpaceExit (Expéditeur : TObject);
procédure PagesChange(Expéditeur : TObject);
procédure PageTopExit(Expéditeur : TObject);
procédure PageBottomExit (Expéditeur : TObject);
procédure PageLeftExit (Expéditeur : TObject);
procédure PageRightExit (Expéditeur : TObject);
procédure TTExit(Expéditeur : TObject);
procédure DTClick(Expéditeur : TObject);
procédure BtnPrviewClick(Expéditeur : TObject);
procédure BtnSetClick(Expéditeur : TObject);
procédure PsChange(Expéditeur : TObject);
procédure PaperChange(Expéditeur : TObject);
procédure FormClose (Expéditeur : TObject ; var Action : TCloseAction);
procédure FormDestroy (Expéditeur : TObject);
procédure CreateReport(Expéditeur : TObject);
procédure SRClick(Expéditeur : TObject);
procédure ClearRep();
procédure FormShow(Expéditeur : TObject);
procédure PaperSizeChg(Expéditeur : TObject);
procédure DJChage(Expéditeur : TObject);
procédure WdChage(Expéditeur : TObject);
procédure QuickRepStartPage(Expéditeur : TCustomQuickRep);
procédure BtnPrintClick(Expéditeur : TObject);
privé
{Déclarations privées}
CHBName:TQRLabelName;//Définir le nom du contrôle de bande d'en-tête de colonne, le nom du tableau dynamique
DBName:TQRDBTextName; //Définit le nom du tableau dynamique du nom du contrôle de bande de détail
CHBShape,DBShape,FBShape,SumShape:TQRShapeName; //Définit le nom du tableau dynamique du contrôle de ligne
FBName,SumName:TQRExpName; //Définit le nom du tableau dynamique des noms de contrôle de pied de page (FBNAME) et de bande de somme (SUMNAME).
DJ:TAlignment;//Alignement des colonnes (taLeftJustify, taRightJustify, taCenter)
Rd1, Rd2:Byte ; //Utilisé pour enregistrer les noms de variables d'état d'alignement des colonnes du tableau (RD1) et de largeur d'impression (RD2).
publique
{Déclarations publiques}
CXTJ,BT:String;//CXTJ stocke les conditions de requête, BT stocke les titres des rapports
//Spécifié par le formulaire de niveau supérieur
fin;
const
PaperSize:array[0..26] de 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, Personnalisé );
//Types de papier répertoriés par QuickRep
var
Formulaire d'impression : TPrintForm ;
mise en œuvre
{$R *.DFM}
procédure TPrintForm.FormCreate(Expéditeur : TObject);
//Affiche la propriété QuickRep.Page et d'autres valeurs de propriété
var
I : octet ;
commencer
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);
Pour I:=0 à 26, la zone de liste do //PS affiche le type de papier
si QuickRep.Page.PaperSize=PaperSize[I] alors commencez
PS.ItemIndex:=I;
Casser;
fin;
//Déterminez si la largeur du papier peut être modifiée. Elle ne peut être modifiée que si le type de papier est personnalisé (Ps.ItemIndex=26)
PaperH.Enabled:=Ps.ItemIndex=26;
PaperW.Enabled:=Ps.ItemIndex=26;
fin;
procédure TPrintForm.RadioButtonClick(Expéditeur : TObject);
//Gestion des événements de changement d'orientation du papier
var
S : chaîne ;
commencer
Image1.Visible :=R1.Checked ;
Image2.Visible:=R2.Checked;
si R1.Vérifié alors
QuickRep.Page.Orientation:=poPortrait
autre
QuickRep.Page.Orientation:=poLandscape;
//Échangez les valeurs de largeur et de longueur du papier
S:=PapierH.Texte;
PapierH.Text:=PapierW.Text;
PapierW.Text:=S;
si (Ps.ItemIndex=26) ou (Ps.ItemIndex=0) alors commencez
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
fin;
fin;
procédure TPrintForm.PageDluxClick(Expéditeur : TObject);
commencer
QuickRep.PrinterSettings.Duplex:=PageDlux.Checked;
fin;
procédure TPrintForm.PageColChange(Expéditeur : TObject);
commencer
si StrToInt(PageCol.Text)<1 alors PageCol.Text:='1';
QuickRep.Page.Columns:=StrToInt(PageCol.Text);
fin;
procédure TPrintForm.PageSpaceExit(Expéditeur : TObject);
commencer
QuickRep.Page.ColumnSpace:=StrToFloat(PageSpace.Text);
fin;
procédure TPrintForm.PagesChange(Expéditeur : TObject);
commencer
si StrToInt(Pages.Text)<1 alors Pages.Text:='1';
QuickRep.PrinterSettings.Copies:=StrToInt(Pages.Text);
fin;
procédure TPrintForm.PageTopExit(Expéditeur : TObject);
commencer
QuickRep.Page.TopMargin:=StrToFloat(PageTop.Text);
fin;
procédure TPrintForm.PageBottomExit(Expéditeur : TObject);
commencer
QuickRep.Page.BottomMargin:=StrToFloat(PageBottom.Text);
fin;
procédure TPrintForm.PageLeftExit(Expéditeur : TObject);
commencer
QuickRep.Page.LeftMargin:=StrToFloat(PageLeft.Text);
fin;
procédure TPrintForm.PageRightExit(Expéditeur : TObject);
commencer
QuickRep.Page.RightMargin:=StrToFloat(PageRight.Text);
fin;
procédure TPrintForm.TTExit(Sender: TObject);//Gestion des événements de changement de titre
commencer
QuickRep.ReportTitle:=TT.Text;
Titre.Caption:=TT.Text;
Bt:=TT.Texte;
fin;
procédure TPrintForm.DTClick(Sender: TObject);//Événement de case à cocher de condition de requête d'impression
commencer
QRSQL.Enabled:=SR.Checked;
fin;
procédure TPrintForm.BtnPrviewClick(Sender: TObject); //Aperçu de l'événement de clic sur le bouton
commencer
QuickRep.Preview ;
fin;
procédure TPrintForm.BtnSetClick(Sender: TObject); //Définir l'événement de clic sur le bouton
commencer
QuickRep.PrinterSetup ;
fin;
procédure TPrintForm.PsChange(Sender: TObject);//Événement de changement de type de papier
commencer
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:=pas CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
fin;
procédure TPrintForm.PaperChange(Sender: TObject);//Événements de changement de largeur et de longueur du papier
commencer
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
fin;
procédure TPrintForm.FormClose (Expéditeur : TObject ; var Action : TCloseAction) ;
commencer
Action :=caFree ;
fin;
procédure TPrintForm.FormDestroy(Expéditeur : TObject);
commencer
EffacerRep ;
PrintForm :=néant ;
fin;
procédure TPrintForm.CreateReport(Sender: TObject);//Générer un événement de clic sur le bouton
Var
I, L : octet ;
CHBtp,CHBlf,Cd,ObWidth:Word ;
commencer
Screen.Cursor:=crHourGlass;
Title.Caption:=Bt;//Définir le titre
ClearRep(); //Effacer l'objet créé ;
si Sr.Checked alors QrSQL.Caption:=CXTJ sinon QRSQL.Caption:=';//Est-ce qu'il faut imprimer les conditions de requête ?
CHBtp:=HB.Height-17;//La position haute du contrôle créé dans la bande
CHBlf:=0; //Le contrôle créé est à la position gauche dans la bande
ObWidth:=0; //La largeur du contrôle créé
for I := 0 to Query.FieldCount-1 do //Créer un contrôle basé sur le nombre de champs renvoyés par Query
commencer
si (Query.Fields[I].DataType<>ftBlob) Et (Query.Fields[I].DataType<>ftMemo) alors
commencer //Ignorer le champ de note et le champ photo
L:=Query.Fields[I].DataSize-1;//L=largeur du champ (octets)-1
cas Rd1 de //Définir l'alignement du champ en fonction de l'alignement sélectionné
0 : si L<=10 alors Dj:=taCenter sinon DJ:=taLeftJustify;
//Alignement automatique : Les champs inférieurs ou égaux à 10 sont alignés au centre, sinon alignés à gauche
1 : Dj:=taCenter;//alignement central
2 : DJ:=taLeftJustify;//Alignement à gauche
fin;
cas Rd2 de //Définir la largeur de la colonne du rapport en fonction de la largeur de la liste sélectionnée
0 : début
//Largeur automatique : si L>14 alors largeur ObWidth=14+(L-14)/2 si ObWidth ;
//La largeur ne peut pas afficher les titres des colonnes, alors ObWidth=largeur du titre de la colonne si le type de champ ;
//Pour le type de date, le type de devise et le type de nombre à virgule flottante, ObWidth=65
si L>14 alors L:=14+(L-14) div 2 ;
Largeur Ob :=L*6 ;
L:=Longueur(Query.Fields[I].DisplayName);
si ObWidth<L*6 alors ObWidth:=L*6;
ObWidth:=ObWidth+2;
si (Query.Fields[I].DataType=ftDateTime) ou
(Query.Fields[I].DataType=ftFloat) ou
(Query.Fields[I].DataType=ftCurrency) puis ObWidth:=65;
fin;
1 : si ColWd.Text<>' alors ObWidth:=StrToInt(ColWd.Text)
sinon ObWidth:=100;//Même largeur:ObWidth=valeur de largeur d'entrée
2 : commencer // Limiter la largeur maximale : calculez d'abord la largeur automatique, puis déterminez si la largeur dépasse la valeur maximale.
//S'il dépasse ObWidth=valeur d'entrée de largeur maximale
si ColWd.Text<>' alors Cd:=StrToInt(ColWd.Text)
sinon Cd:=200 ;
Largeur Ob :=L*6 ;
si ObWidth>Cd alors ObWidth:=Cd;
ObWidth:=ObWidth+2;
si (Query.Fields[I].DataType=ftDateTime) ou
(Query.Fields[I].DataType=ftFloat) ou
(Query.Fields[I].DataType=ftCurrency) puis ObWidth:=65;
fin;
fin;
si CHBlf+ObWidth>=HB.Width alors commencez //Créer un contrôle>largeur du papier ?
DlgMes:='La largeur du papier n'est pas suffisante, veuillez modifier le format du papier. ';
MessageBox(Poignée,DlgMes,Cap_Inf,Ico_Inf);
casser;
fin
sinon commencer
CHBShape[I]:=TQRShape.Create(HB);//Créer un contrôle de ligne de bande d'en-tête de colonne
CHBShape[I].Parent:=HB;
CHBShape[I].Top:=CHBtp;
CHBShape[I].Left:=CHBlf;
CHBShape[I].Width:=ObWidth+1;
CHBShape[I].Hauteur :=17 ;
CHBNAME[I]:=TQRLabel.Create(HB); //Créer un contrôle de titre de colonne
CHBNAME[I].Parent:=HB;
CHBNAME[I].Top:=CHBtp+2;
CHBNAME[I].Gauche:=CHBlf+1;
CHBNAME[I].AutoSize:=False;
CHBNAME[I].Width:=ObWidth-1;
CHBNAME[I].Alignment:=taCenter;
CHBNAME[I].Caption:=Query.Fields[I].DisplayName;//Obtenir le champ comme nom de colonne
CHBNAME[I].BringToFront;
DBShape[I]:=TQRShape.Create(DB); //Créer un contrôle de ligne de bande de détail
DBShape[I].Parent:=DB;
DBShape[I].Top:=-1;
DBShape[I].Left:=CHBlf;
DBShape[I].Width:=ObWidth+1;
DBShape[I].Hauteur :=17 ;
DBNAME[I]:=TQRDBText.Create(DB); //Créer un contrôle de bande détaillé
NOMDB[I].Parent:=DB;
DBNAME[I].ParentReport:=QuickRep;
NOMDB[I].Top:=2;
DBNAME[I].Left:=CHBlf+2;
DBNAME[I].AutoSize:=False;
DBNAME[I].Width:=ObWidth-3;
NOMDB[I].Hauteur :=13 ;
DBNAME[I].Alignment:=Dj;
DBNAME[I].DataSet:=Requête ;
DBNAME[I].DataField:=Query.Fields[I].FieldName;
DBNAME[I].BringToFront;
si Tj1.Checked alors commencez //Voulez-vous créer une bande de pied de page ?
FBShape[I]:=TQRShape.Create(FB); //Créer un contrôle de ligne de bande de pied de page
FBShape[I].Parent:=FB;
FBShape[I].Top:=0;
FBShape[I].Left:=CHBlf;
FBShape[I].Width:=ObWidth+1;
FBShape[I].Hauteur :=17 ;
si (Query.Fields[I].DataType=ftFloat) ou
(Query.Fields[I].DataType=ftCurrency) ou (I<2) alors
commencer //Si le type de champ est un type numérique, créez-le
FBNAME[I]:=TQRExr.Create(FB); //Créer un contrôle de bande de pied de page
NOM FB[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].Hauteur :=13 ;
FBNAME[I].Alignment:=taCenter;
FBNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
FBNAME[I].BringToFront;
fin;
fin;
si Tj2.Checked alors commencer //Devrions-nous établir la bande de somme ?
SumShape[I]:=TQRShape.Create(SB); //Créer un contrôle de ligne de somme
SommeForme[I].Parent:=SB;
SommeForme[I].Top:=0;
SumShape[I].Left:=CHBlf;
SumShape[I].Width:=ObWidth+1;
SommeForme[I].Hauteur :=17 ;
si (Query.Fields[I].DataType=ftFloat) ou
(Query.Fields[I].DataType=ftCurrency) ou (I<2) alors
commencer //Si le type de champ est un type numérique, créez-le
SumNAME[I]:=TQRExr.Create(SB); //Créer un contrôle de bande de somme
SommeNOM[I].Parent:=SB;
SumNAME[I].ParentReport:=QuickRep;
SommeNOM[I].Top:=3;
SommeNOM[I].Left:=CHBlf+2;
SumNAME[I].AutoSize:=False;
SommeNOM[I].Width:=ObWidth-3;
SommeNOM[I].Hauteur :=13 ;
SumNAME[I].Alignment:=taCenter;
SumNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
SumNAME[I].BringToFront;
fin;
fin;
CHBlf:=CHBlf+ObWidth;//Le traitement du champ en cours est terminé, une largeur de champ vers la droite
fin;
fin;
fin;
CrtRep.Enabled:=False;//Désactiver le bouton de génération
BtnPrint.Enabled:=pas CrtRep.Enabled;Autoriser l'impression des boutons d'ammonium
BtnPrview.Enabled:=BtnPrint.Enabled;Autoriser le bouton d'aperçu
si Tj1.Checked alors commencez //Si une bande de pied de page est créée, modifiez les deux premières colonnes de la bande de pied de page
FBNAME[0].Expression:=''Total des pages'';
FBNAME[1].Expression :='COUNT+'row'';
fin;
si Tj1.Checked alors commencez //Si la bande de somme est établie, modifiez les deux premières colonnes de la bande de somme
SommeNOM[0].Expression:=''Total'';
SumNAME[1].Expression :='COUNT+'row'';
fin;
//Ajuster la position d'impression de la date et du numéro de page dans la zone d'en-tête de colonne
QRE2.Gauche :=HB.Width-Qre2.Width ;
QRSQL.Gauche:=QRE1.Width+10;
QRSQL.Width:= QRE2.Left-10-QRSQL.Left;
QuickRep.DataSet:=Query; //Spécifiez l'ensemble de données pour QuickRep, cette phrase ne doit pas manquer
Screen.Cursor:=crDefault;
fin;
procédure TPrintForm.ClearRep();//Effacer le champ créé lors de la génération du format état
Var
I : octet ;
commencer
Pour I:=0 à Query.FieldCount-1, commencez
si assigné (CHBShape[I]) alors commencez CHBShape[I].Free;CHBShape[I]:=nil;end;
si attribué (CHBNAME[I]) alors commencez CHBNAME[I].Free;CHBNAME[I]:=nil;end;
si assigné (DBShape[I]) alors commencez DBShape[I].Free;DBShape[I]:=nil;end;
si assigné (DBNAME[I]) alors commencez DBNAME[I].Free;DBNAME[I]:=nil;end;
si assigné (FBShape[I]) alors commencez FBShape[I].Free;FBShape[I]:=nil;end;
si assigné (FBNAME[I]) alors commencez FBNAME[I].Free;FBNAME[I]:=nil;end;
si assigné (SumShape[I]) alors commencez SumShape[I].Free;SumShape[I]:=nil;end;
si assigné (SumNAME[I]) alors commencez SumNAME[I].Free;SumNAME[I]:=nil;end;
fin;
fin;
procédure TPrintForm.SRClick(Expéditeur : TObject);
commencer
si Sr.Checked alors QrSQL.Caption:=CXTJ sinon QRSQL.Caption:=';
fin;
procédure TPrintForm.FormShow(Sender: TObject); //Événement d'affichage du formulaire
commencer
Query.Active:=True;//Imprimer SQL
TT.Texte :=Bt ;
QuickRep.ReportTitle:=Bt;//Définir le titre
//Le tableau de noms de contrôle alloue de l'espace
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);
fin;
procédure TPrintForm.PaperSizeChg(Expéditeur : TObject);
commencer
CrtRep.Enabled:=True ;
BtnPrint.Enabled:=pas CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
fin;
procédure TPrintForm.DJChage(Sender: TObject);//Gestion des événements de changement d'alignement
var
Chg : octet ;
commencer
si Djauto.Checked alors Chg:=0
sinon si DjCenter.Checked alors Chg:=1
sinon Chg:=2;
si Chg<>Rd1 alors commencez PaperSizeChg(nil);Rd1:=Chg;end;
fin;
procédure TPrintForm.WdChage(Sender: TObject);//Gestion des événements de changement de largeur
var
Chg : octet ;
commencer
si Wdauto.Checked alors Chg:=0
sinon si Wdall.Checked alors commencez
Chg :=1 ;
si ColWd.Text=' alors ColWd.Text:='100';
fin
sinon commencer
Chg :=2 ;
si ColWd.Text=' alors ColWd.Text:='200';
fin;
si Chg<>Rd2 alors commencez PaperSizeChg(nil);Rd2:=Chg;end;
ColWd.Enabled:=Chg<>0;
fin;
procédure TPrintForm.QuickRepStartPage(Expéditeur : TCustomQuickRep);
// L'impression du rapport démarre le traitement des nouveaux événements de page et les valeurs statistiquesdans la bande de pied de page sont effacées.
Var
I : octet ;
commencer
si Tj1.Checked alors
Pour I:=0 à Query.FieldCount-1, faites
si attribué (FBNAME[I]) alors FBNAME[I].Reset ;
fin;
procédure TPrintForm.BtnPrintClick(Expéditeur : TObject);
commencer
QuickRep.Print;
fin;
fin.
4. Exemple de boîte de dialogue d'appel :
Tout d’abord, incluez l’unité PrintDlg dans l’instruction USES sous la forme à appeler, puis appelez-la avec le code suivant :
s'il n'est pas attribué (PrintForm) alors PrintForm:=TPrintForm.Create(application);
PrintForm.Query.SQL.Assign(Query.SQL);
//Si le formulaire appelant ne contient pas de contrôle Query, vous pouvez directement définir la valeur de l'instruction SQL
PrintForm.Bt:=Titre du rapport ;
PrintForm.Caption:=Titre du formulaire ;
PrintForm.CXTJ:=conditions de requête ;
PrintForm.ShowModal;
5. Conclusion
La clé de ce programme est le processus événementiel CreateReport et le traitement des noms de contrôles dynamiques. En raison de l'espace limité, certains contenus ne sont pas expliqués et j'espère que les lecteurs pourront les comprendre par eux-mêmes. Pour la génération générale de rapports, ce programme peut répondre aux exigences.
J'ai la dernière version, qui a des fonctions plus puissantes. Les amis qui en ont besoin peuvent m'envoyer un e-mail et je l'enverrai certainement.