Delphi 6>quickreport>problème de coupure de bande détail
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 2012
-
20 août 2004 à 20:34
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
9 oct. 2010 à 09:14
Après m'être acharné pendant 3 jours et avoir lu et relu des messages sur delphi.fr et autre et avoir lu la FAQ de qusoft sur quickreport je demande de l'aide.
Voici mon problème :
_ J'ai créé une fiche sur laquelle j'ai posé un composant quickrep.Sur ce quickreport qui est en paysage et format A4 il y a les informations suivantes :
* bande entête de groupe (quelques labels pour des titres)
bande détail (10 QRDBText)
* bande pied de page (1 QRsysdata pour afficher le numéro de page sur chaque page)
_ J'ai mis forcenepage à true pour l'entête de groupe comme cela chaque début de groupe se fait sur une nouvelle feuille.
_ mon problème se situe sur les QRDBText de la bande détail. Les informations qui s'affichent prennent pour certain plusieurs lignes donc je les ai configurés comme suit pour l'essentiel :
* les 10 composants textes sont les uns à coté des autres
* alignement = tacenter
* aligntoband = false
* autosize = false
* autostretch = true
* wordwrap = true
Donc pour résumer la largeur des contrôles textes ne bouge pas et il n'y a que la hauteur qui change lorsque le texte est trop large.
Le problème c'est que comme cela les bandes détails ne sont pas toutes de la même hauteur et donc je me retrouve avec certaines pages ou une bande détail est coupée et à cheval sur deux lignes.
Le seul remède que j'ai trouvé pour pallier à celà est de mettre le pied de page dans le "linkband" de la bande détail.
Quand je l'affiche en préview ça marche, c'est-à-dire que je n'ai plus de coupure mais quand j'imprime c'est comme avant avec les coupures sur certaines pages.
Je tiens à préciser que j'ai testé sur trois imprimantes différentes et ça marche pas (2 laser + 1 jet d'encre).
J'ai aussi essayé de trouver par le code le height de la bande détail lors du "before print", puis de l' "after print" de la bande détail et même sur le "on print" du contrôle texte le plus long et rien à y faire cela me donne toujours les valeurs que j'ai mise par défaut avant prévisualisation.
Comment pourrais-je faire pour éviter ces coupures à l'impression ?
J'espère ne pas avoir été trop long et assez clair.
Je vous remercie par avance pour l'attention que vous porterait à ce message et pour l'aide que vous m'apporterait.
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 20121 20 août 2004 à 20:38
pardon j'ai fais une erreur, je voulais dire que les informations de la bande détail étaient à cheval sur deux pages et non pas deux lignes mais vous l'aurez compris.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 21 août 2004 à 10:26
Félicitations pour la clarté de l'exposé du problème. :approve)
La mise en page des états avec QuickReport est toujours complexe et longue. Il faut dire que le maniement de ce composant n'est pas toujours d'une grande évidence.
Ceci dit, l'aide en ligne nous indique :
Utilisez le composant TQRChildBand pour créer une bande qui se place en bas d'une autre bande. Cela est utile si vous souhaitez que des contrôles se déplacent vers le bas suite à l'extension verticale d'autres contrôles. Mettez les contrôles extensibles sur une bande et placez dans une bande enfant tous les contrôles qui devraient se déplacer vers le bas.
Si vous voulez que les deux bandes s'impriment toujours sur la même page, utilisez la propriété LinkBand pour les connecter.
La meilleure façon de créer une bande enfant consiste à définir la propriété HasChild d'une autre bande.
Ce n'est pas une solution mais une piste.
Dans tous les exemples livrés, aucun ne montre la façon de procéder pour obtenir une bande qui ne soit pas coupée sur deux pages.
Enfin, dans l'hypothèse où une bande de détail ne tiendrait pas sur une page, quel comportement devrait alors adopter QuickReport ?
Pour éviter cela, je pense que les auteurs de ce composant ont pris le parti de couper délibérément le contenu et de copier la suite sur une nouvelle page.
Mais il doit y avoir un moyen de parvenir au résultat recherché.
A suivre...
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 20121 21 août 2004 à 12:27
merci beaucoup delphiprog, je vais essayer la piste de la bande enfant et je tiendrais au courant de résultats.
Sinon est-ce qu'il y a un moyen de récupérer le height de chaque bande détail par une boucle au moment ou elles ont différentes valeurs du fait du renvoi de texte à la ligne pendant la prévisualisation ?
Je pensais à celà car en récupérant le height disponible pour la bande détail sur le quickreport et en comparant avec l'addition des divers height des bandes détails lors de la prévisualisation je pourrais aisément moi même renvoyé la bande détail sur une autre page quand elle va être coupée.
Je suis étudiant et j'ai été amené à réaliser un logiciel sur la sécurité ou je dois éditer des documents d'où les quickreport dans une entreprise qui m'a gardé jusqu'au 1 septembre pour le terminer.
J'ai aussi exposé mon problème à un analyste programmeur de l'entreprise et lui aussi ne comprend pas que je puisse avoir le report sur une autre page à l'écran grâce au linkband de la bande detail vers la bande pied de page mais que je ne puisse pas avoir le même résultat lors de l'impression.
Peut-être un bug du quickreport ?
Quelques précisions de plus, au boulot windows 98 se ave delphi 6 entreprise et quickreport 3.0.9.
Voilà, merci pour cette réponse et je m'en vais suivre cette première piste de la bande fille.
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 20121 21 août 2004 à 13:40
Voici des nouvelles sur la piste de la bande fille.
Malheureusement cela n'a pas fonctionné. J'ai donc créé une bande fille en dessous la bande détail en mettant true à "haschild" de la bande détail et j'ai mis la bande fille dans le "linkband" de la bande détail.
Puis j'ai mis pour essayer le contrôle texte le plus long dans la bande détail. J'ai lancé la prévisualisation et cela a pour effet d'ajouter pour chaque bande détail une autre bande avec les informations bien séparées.
En gros, j'ai les 9 contrôles texte d'affichés sur la bande détail et le 10éme le plus long sur une autre bande en dessous séparé des autres et malheureusement il y a aussi des coupures quand on arrive en bout.
J'avoue être un peu à court d'idées et déçu de ne pas trouvé la solution, c'est frustrant.
Si quelqu'un a une autre piste à me donner je me ferais un plaisir de l'essayer.
En attendant merci pour cette première piste même si elle n'a pas fonctionnée.
Vous n’avez pas trouvé la réponse que vous recherchez ?
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 20121 21 août 2004 à 13:43
je me suis encore tromper pourtant j'ai relu mais je voulais dire dans le troisième paragraphe que j'avais mis le contrôle texte le plus long dans la bande fille et nondans la bande détail.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 21 août 2004 à 22:47
J'ai oublié de te dire que j'avais essayé de mon côté. C'est d'ailleurs pour cela que je parlais de piste et non de solution.
J'ai également tenté de trouver une solution du côté de l'évènement BeforePrint de la bande de détail. Pour cela, j'avais espéré que la propriété Top de la bande était actualisé au cours de l'exécution mais il n'en est rien.
La plupart des valeurs contenant la position du curseur à l'impression et susceptibles de nous intéresser sont privées.
Autant dire que ce n'est pas gagné...
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 20121 23 août 2004 à 08:54
Je me suis dit c'est pas possible de lâcher le morceau aussi facilement alors j'ai été relire encore une fois la FAQ de qusoft et j'ai trouvé 2 questions réponses dont j'aimerais que vous me fassiez part de vos réflexions avant de les mettre en application, surtout la seconde.
Q. I have a childband and I set it's PrintBand to false based on certain conditions. When the band doesn't print, QuickReport doesn't check this and will generate a new page is this band would have been the last band on page.
A. QuickReport checks the space required for the next band before the BeforePrint event of that band is processed. There is a simple work around that will resolve this issue. In the BeforePrint event of the previous band (in this case, the detail band), set the height of the child band to 0. You could store the height of the child band in it's Tag property at the same time. In the BeforePrint event of the ChildBand, you would set the height back to original height when you have set PrintBand to True.
Q. How do I check the height of a band with stretching controls at runtime?
A. This cannot be done with QuickReport 2.0.
For QuickReport 3 the code below is required -
Getting the height of an expanding band before printing
=====================================================
This is an unofficial change to QR3 source code.
It will break compatibility with TChart.
This adds a procedure 'ExpandedHeight' to class TQRCustomBand.
You can use it to stop a band busting a page like this -
------------------------------------------------------------------------
procedure Trepform.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
var
th : extended;
begin
detailband1.ExpandedHeight( th );
// force a new page if required.
if th > quickrep1.availablespace then
quickrep1.NewColumn;
end;
------------------------------------------------------------------------
The Changes.
Two files are amended - qrctrls.pas and quickrpt.pas
1. quickrpt.pas
1.1 declare a new Private var in class TQRCustomBand
private
FExpandedHeight : extended;
..
..
1.2 Move the declaration of 'Function AvailableSpace' to Public.
1.3
Add this Public method to the class TQRCustomBand
procedure TQRCustomBand.ExpandedHeight( var NewHeight : extended );
var
BottomGap, I : integer;
OrgLength, ScrToPrinter : extended;
theight : extended;
begin
ScrToPrinter := parentreport.qrprinter.yfactor *254 / screen.pixelsperinch;
FExpandedheight := 0;
bottomgap := 0;
for I := 0 to ControlCount - 1 do
begin
if Controls[I] is TQRDBText then
begin
if TQRDBText(Controls[I]).Enabled and TQRDBText(Controls[I]).Autostretch then
begin
TQRDBText(Controls[I]).GetExpandedHeight( theight );
theight := theight + (TQRDBText(Controls[I]).top*ScrToPrinter);
if theight > FExpandedheight then
begin
FExpandedheight := theight;
// bottomgap is in SCREEN pixels
bottomgap := self.height -TQRDBText(Controls[I]).top -
TQRDBText(Controls[I]).height + 1;
end;
end;
end;
end;
if bottomgap < 0 then bottomgap := 0;
if (parentreport.qrprinter.Destination = qrdMetafile) then
begin
theight := bottomgap + trunc(FExpandedheight);
theight := theight / ParentReport.QRPrinter.YFactor;
end
else
begin
// FExpandedheight is in printer pixels
bottomgap := trunc(bottomgap * ScrToPrinter); // -> printer pixels
theight := bottomgap + trunc(FExpandedheight);
end;
newheight := theight;
end;
2. qrctrls.pas
2.1 Add public method 'GetExpandedHeight' to Class TQRDBText.
procedure TQRDBText.GetExpandedHeight(var newheight : extended );
var
Nlines : integer;
lineheight : extended;
begin
self.getfieldstring( FPrintCaption );
FormatLines;
if parentreport.QRPrinter.canvas <> nil then
begin
parentreport.QRPrinter.canvas.font := self.font;
LineHeight := parentreport.QRPrinter.Canvas.TextHeight('W');
end
else
LineHeight := self.Canvas.TextHeight('W');
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 25 août 2004 à 20:10
J'avais un peu mis de côté ce problème :blush)
Cela confirme ce que j'avais laissé supposer: il faudrait modifier le code du composant TQuickReport. Cela nécessitait un investissement important.
Si la solution est donnée, ça change tout :big)
Surtout la deuxième car, avec la première, on n'est pas plus avancé tant que l'on ne connait toujours pas l'espace disponible en bas de page.
La deuxième solution semble tout à fait appropriée au problème posé.