Toon posts:

[Delphi] Printje uitdraaien

Pagina: 1
Acties:
  • 178 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo,

ik heb een klein programma'tje voor iemand gemaakt.
Dat werkt nu allemaal hartstikke goed.

Alleen moeten de eindresultaten geprint worden.
Het is teveel om het onder elkaar af te drukken, dus het met in 2 kollommen.

Nu spreek in gewoon de "Printer" aan met Printer.textOut();
nu werkt het bij mij allemaal goed.
Ik gebruik een aantal standaard waarden, bijv. de bovenste en onderste streep staan op X pixels van de onder of bovenkant.

De 1e kolom staat op een vast aantal pixels van de linker kant. De 2e kolom wordt berekend op:
positie = (totale breedte - (pixels van links + midden spacer + pixels rechts (= hetzelde als links))) div 2;
Dit gaat ook redelijk goed.

Maar op de een of andere manier gaat het dus fout.
Want op andere printers gaat het niet helemaal netjes...

Heeft er iemand voor mij een goede oplossing om een netjes printje te maken, die op iedere printer GOED tot redelijk print.

Alle goede tips en handigheidjes zijn ook welkom.

Verwijderd

Iedere printer heeft andere minimum marges aan de kanten van het papier. Dat zou wel eens fout kunnen gaan.

Maar kijk eens naar Freereport. Dat is een zeer goede report generator waar je heel makkelijk mee kan printen.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Uit mijn archief:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Copyright © 1998 by Eric Harmon, all rights reserved.
// Permission is hereby granted to freely use, modify, and
// distribute this source code provided that this copyright
// notice is included without change.

procedure GetPrinterMargins32(var LeftMargin, TopMargin,
  RightMargin, BottomMargin: Integer);
var
  PhysicalPageWidth: Integer;
  PhysicalPageHeight: Integer;
begin
  // Query the left and top margins
  LeftMargin := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
  TopMargin := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);

  // Query the physical page width and height
  PhysicalPageWidth := GetDeviceCaps(Printer.Handle,
    PHYSICALWIDTH);
  PhysicalPageHeight := GetDeviceCaps(Printer.Handle,
    PHYSICALHEIGHT);

  // Right and bottom margins are calculated
  RightMargin := PhysicalPageWidth - Printer.PageWidth -
    LeftMargin;
  BottomMargin := PhysicalPageHeight - Printer.PageHeight -
    TopMargin;
end;


// Copyright © 1998 by Eric Harmon, all rights reserved.
// Permission is hereby granted to freely use, modify, and
// distribute this source code provided that this copyright
// notice is included without change.

procedure GetPrinterMargins16(var LeftMargin, TopMargin,
  RightMargin, BottomMargin: Integer);
var
  pt: TPoint;
  PhysicalPageWidth: Integer;
  PhysicalPageHeight: Integer;
begin
  // You *must* execute Printer.BeginDoc before calling
  // this procedure

  // Query the left and top margins
  Escape(Printer.Canvas.Handle, GETPRINTINGOFFSET, 0, Nil, @pt);
  LeftMargin := pt.x;
  TopMargin := pt.y;

  // Query the physical page width and height
  Escape(Printer.Canvas.Handle, GETPHYSPAGESIZE, 0, Nil, @pt);
  PhysicalPageWidth := pt.x;
  PhysicalPageHeight := pt.y;

  // Right and bottom margins are calculated
  RightMargin := PhysicalPageWidth - Printer.PageWidth -
    LeftMargin;
  BottomMargin := PhysicalPageHeight - Printer.PageHeight -
    TopMargin;
end;

Een goede grap mag vrienden kosten.


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 15:43

Klippy

Still Game

Verwijderd schreef op 12 April 2003 @ 21:33:
Iedere printer heeft andere minimum marges aan de kanten van het papier. Dat zou wel eens fout kunnen gaan.

Maar kijk eens naar Freereport. Dat is een zeer goede report generator waar je heel makkelijk mee kan printen.
2 kolommetjes printen kan je ook ff simpel met een Quickreportje doen, die zit er al in :P

2TQRbands erop slepen, 1tje Page Header maken, 1tje Detail.

Op de Detail Band 2 TQRLabels zetten.
Bij het OnNeedData event geef je aan of er nieuwe data volgt. Als je bijvoorbeeld een listbox print doe je
if i < Form1.ListBox1.Items.Count() then
begin
i:=i=1;
MoreData := true;
end;

Vervolgens doe je bij het OnPrint event van de QRLabels
Value := ListBox1.Item[i].Text;

En tenslotte zet je bij het AfterPreview of AfterPrint event de i weer op 0.

Aanroepen met QuickReport1.Preview of .Print.

Dit is uit de kop he, niet letterlijk die code gaan plakken, zal niet werken denk ik :P
Geen Delphi hier.

maar 't is dus supersimpel te maken, beter dan wat je nu hebt.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Je printer heeft een canvas. Die kan voor iedere printer van verschillende grootte zijn, sterker nog: als je op 100dpi print is het canvas een stuk kleiner dan wanneer je op 300dpi print.

Met canvas.width en .height kan je de daadwerkelijke breedte en hoogte opvragen. Als je je titel op 10% van de hoogte van het papier wilt zetten is het verder een kwestie van goed rekenen.

Siditamentis astuentis pactum.


Verwijderd

Topicstarter
OK,

ik heb het nu met een QuickReport geprobeerd,
dat werkt redelijk.

Alleen kloppen de maten voor geen meter.
Met de previeuw passen er 10 stukken op,
maar als het het uit print passen er 10.5 stukken op.

Maar nu ziet ik nog met een ander probleempje waar ik zo 1 2 3 niet uit kom.
Is het mogelijk om meerdere pagina's te maken in 1 zo'n quick report ??

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 15:43

Klippy

Still Game

Verwijderd schreef op 13 April 2003 @ 16:19:
OK,

ik heb het nu met een QuickReport geprobeerd,
dat werkt redelijk.

Alleen kloppen de maten voor geen meter.
Met de previeuw passen er 10 stukken op,
maar als het het uit print passen er 10.5 stukken op.

Maar nu ziet ik nog met een ander probleempje waar ik zo 1 2 3 niet uit kom.
Is het mogelijk om meerdere pagina's te maken in 1 zo'n quick report ??
Wat bedoel je met stukken?
Je hoeft toch maar 2 kolommen?

De layout wordt gewoon bepaald door de plaats waar je het QRLabel zet...
2 pagina's kan ook, zolang er data is wordt naar de volgende pagina gegaan.
Wil je een andere Header op pagina 2 moet je ff in de Delphi help kijken of op http://www.qusoft.com/

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Verwijderd

Topicstarter
nou....
ik heb dus netjes 3 bands op mijn quickreport gesleept (header, detail en footer).

Nu wil ik dus 2 verschillende pagina's in mijn report hebben zitten.

Als eerste moet de groepen met de items worden afgedrukt (2 pagina's),
daarna worden de gestelde vragen afgedrukt met de antwoorden erbij (ook 2 pagina's).

Nu heb ik op de detail band 2 labels staan (een links de ander rechts),
die vul ik dus moet (veel) tekst (met enters erin).
Alleen als er meer regels zijn dan dat de label hoog is, wordt de tekst niet afdrukt.
Als de label hoger is als de band, dan wordt de tekst de er buiten valt niet afdrukt en er wordt geen 2e pagina gemaakt.

Wat voor "code" heb ik:
Ik heb een quickreport form (file -> new -> quickreport),
als ik wil printen maken in een instantie van dat form,
vul ik de labels op het form
en "preview" de quickreport op het form.
en "free" uiteindelijk het form.

Ik las in het begin van mijn topic iets van de onNeedData event,
die gebruik ik helemaal niet.

Kan iemand mij nog een beetje verder helpen?

De opmaak van de printjes is ALTIJD hetzelfde,
er worden 11 groepen met elk 10 items afgedrukt en 110 vragen.
De posities blijven dus altijd hetzelfde.
Ik wil niet voor iedere regel een nieuwe label erop zetten, ik zet gewoon een nieuwe regel in het label.

Ik hoop dat iemand mij een stukje verder opweg kan helpen.

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 15:43

Klippy

Still Game

Ik toch toch eens naar doe OnNeedData kijken dan, die doet dus je detail band zeg mmaar vermenigvuldigen, dus een nieuwe regel zolang er data is.

Heb geen voorbeeld hier, maar in Delphi dir onder Demo's staat ook nog wel wat.

[ Voor 23% gewijzigd door Klippy op 14-04-2003 12:20 ]

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Verwijderd

Topicstarter
OK,

ik dan denk ik wel met een ander probleem.
Ik het mijn data NIET in de database/source zitten.

Die kant ik alleen uit mijn zelfgemaakte klasses halen en die staat al, voordat je print, in een stringgrid.

Het punt is dus dat ik mijn data in een ander form heb zitten.

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 15:43

Klippy

Still Game

Verwijderd schreef op 14 April 2003 @ 12:29:
OK,

ik dan denk ik wel met een ander probleem.
Ik het mijn data NIET in de database/source zitten.

Die kant ik alleen uit mijn zelfgemaakte klasses halen en die staat al, voordat je print, in een stringgrid.

Het punt is dus dat ik mijn data in een ander form heb zitten.
Maakt toch niet uit.

Maak een teller i. Zolang i < Form1.StringGrid1.RowCount dan MoreData := true;
En bij de OnPrint van de Labels doe je 'Value := form1.StringGrid1.Cols[i,1] en Cols[i,2]'. Zoiets...

niet echt lastig....

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Verwijderd

Topicstarter
Ok, zoiets doe ik nu ook
alleen vanuit Form1 zet ik de waardes (fmPrint.qrPrint.qrlKol1.caption := 'tekst';)
De caption van het label wordt maximaal 71 regels lang.

Maar komen op de 2e pagina dezelfde controls te staan, zoals ik ze erop gesleept heb?

Want ik heb bij het afdrukken van de vragen (die als 2e moeten) net ff een andere plaatsing en aantal labels nodig.

Verwijderd

Topicstarter
Ok op de onNeedData event kun je extra pagina's toe voegen.

dat werkt, ik heb nu 4 pagina's.

Alleen nu het probleem,
als ik dit doe gebeurt er NIKS:
code:
1
2
3
4
5
6
  case pagina of
  2: qrlAnt2.caption := '1';
  3: qrlAnt2.caption := '2';
  4: qrlAnt2.caption := '3';
  5: qrlAnt2.caption := '4';
  end;


terwijl ik moet debuggen erdoor heen loop hij de captions wel zet.
De pagina's zijn ook niet, als pagina 1 wordt aangemaakt, wordt meteen de teller op gehoogd.... dus 2t/m5 is goed.

wat kan het probleem zijn ?

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 15:43

Klippy

Still Game

Verwijderd schreef op 17 april 2003 @ 21:47:
Ok op de onNeedData event kun je extra pagina's toe voegen.

dat werkt, ik heb nu 4 pagina's.

Alleen nu het probleem,
als ik dit doe gebeurt er NIKS:
code:
1
2
3
4
5
6
  case pagina of
  2: qrlAnt2.caption := '1';
  3: qrlAnt2.caption := '2';
  4: qrlAnt2.caption := '3';
  5: qrlAnt2.caption := '4';
  end;


terwijl ik moet debuggen erdoor heen loop hij de captions wel zet.
De pagina's zijn ook niet, als pagina 1 wordt aangemaakt, wordt meteen de teller op gehoogd.... dus 2t/m5 is goed.

wat kan het probleem zijn ?
Je hebt maar data voor 1 pagina?
Maar wat doe je trouwens moeilijk 8)7
De code van dit stukje zal wel niet de oorzaak van je probleem zijn, maar wel vreselijik omslachtig, waarom niet gewoon
Delphi:
1
qrlAnt2.caption := IntToStr(pagina-1);
:?

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Verwijderd

Topicstarter
emn....
die code die er staat is alleen om te testen.

Er moeten straks titels boven de pagina's komen te staan (boven 1-2 en 3-4).

En andere labels hebben een andere caption nodig...
Pagina: 1