Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[VB6] Probleem uitlijnen data op 1 regel, Printer.Print

Pagina: 1
Acties:

  • fluppie007
  • Registratie: April 2005
  • Laatst online: 25-10 11:21
Ik heb een kassasoftware geschreven voor een restaurant, alles werkt goed. Alleen zit ik nu met het probleem om mijn data mooi uit te lijnen op 1 regeltje. De printer ondersteund rechtstreekse commando's naar de printer ( zie code ).

De huidige layout:
code:
1
2
Aantal     Productnaam
                                 Subtotaal

De gewenste layout:
code:
1
Aantal     Productnaam           Subtotaal


Ik heb 39 karakters op een lijn beschikbaar, alles wat meer is valt af ( getest met 12345... )
Hoe kan ik dit mooi uitlijnen, de productnaam mag evt afgekapt worden om layout te bewaren. Ik heb me al suf gezocht, sample code gedownload... Niets bruikbaars gezien/gevonden.
Als iemand mij in de goede richting kan duwen, evt met een klein voorbeeldje, zou me enorm helpen.

Overigens heb ik ook DataReport gemaakt, het lastige daarbij is dat je de paper size ( in dit geval, de length ) niet kan instellen. Hij print dus altijd papiertjes van 80mm x 297mm. Verspilling, en het oogt niet mooi als op je kasticket er een witte blok van 80mmx11cm aan zit. Vandaar het rechtstreeks aansturen, dan snijdt hij het papiertje mooi op maat.


Dit is de code die ik gebruik voor het printen van mijn ticket:
Visual Basic:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
For Each prnPrinter In Printers
        If prnPrinter.DeviceName = "BIXOLON SRP-350" Then
            Set Printer = prnPrinter
            Exit For
        End If
    Next

Printer.FontName = "FontControl"
Printer.Font.Size = 9.5
Printer.Print "x" 'Tekst naar het midden uitlijnen

Printer.FontName = "Arial"
Printer.FontSize = 10
Printer.Font.Bold = True
Printer.Print "Restaurant - Brasserie" + vbCrLf

Printer.FontName = "FontControl"
Printer.Font.Size = 9.5
Printer.Print "G" 'Printen van 1e NV bit image

Printer.FontName = "Arial Black"
Printer.FontSize = 12
Printer.Font.Bold = True
Printer.Print "CHEZ FLUPPIE"

Printer.FontName = "Arial"
Printer.FontSize = 10
Printer.Font.Bold = True
Printer.Print "Straat 1"
Printer.Print "1000 Brussel"
Printer.Print "Tel: +32 2 123 45 67" + vbCrLf

Printer.FontName = "FontControl"
Printer.Font.Size = 9.5
Printer.Print "w" 'Tekst naar links uitlijnen

Printer.FontName = "Arial"
Printer.FontSize = 10
Printer.Font.Bold = True
Printer.Print "Tafelnummer: " & TafelNummerLbl.Caption + vbCrLf

Printer.FontName = "Arial"
Printer.FontSize = 9
Printer.Font.Bold = False

With TestGridRecordset
.MoveFirst
For i = 1 To .RecordCount
Printer.Print .Fields("Aantal") & vbTab & .Fields("Productnaam") + vbCrLf & vbTab & vbTab & vbTab & vbTab & vbTab & Format(.Fields("Subtotaal"), "€0.00")
.MoveNext
Next i
End With

Printer.FontName = "FontControl"
Printer.Font.Size = 9.5
Printer.Print "w" 'Tekst naar links uitlijnen

Printer.FontName = "Arial"
Printer.FontSize = 12
Printer.Font.Bold = True
Printer.Print vbCrLf + "Totaal te betalen: " & SubTotaalLbl.Caption + vbCrLf

Printer.FontName = "FontControl"
Printer.Font.Size = 9.5
Printer.Print "x" 'Tekst naar het midden uitlijnen

Printer.FontName = "Arial"
Printer.FontSize = 9
Printer.Font.Bold = False
Printer.Print "Vriendelijke groeten, Philippe"

Printer.FontName = "FontControl"
Printer.Font.Size = 9.5
Printer.Print "A"                   'Kassalade openen !

Printer.EndDoc

'Printer.FontName = "FontControl"
'Printer.Font.Size = 9.5
'Printer.Print "g"                   'Papier snijden

'Printer.EndDoc

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt de X en Y setten waar je wil printen met de CurrentX en CurrentY properties. Als je dan enkel de tekstblokken print met een puntkomma achter de regel (Printer.Print "Blah";) dan gaat 'ie niet automatisch naar de volgende regel en kun je met CurrentX de tabs vervangen. Met een CrLf (of zonder de ; achter de regel) wordt automatisch de CurrentX weer gereset en kom je dus op de volgende regel.

Tekst afkappen (het mooist is met ellipses, je kent wel die 3 puntjes … ) wordt wat lastiger; dan moet je met TextWidth zaken of Win32 API calls aan de slag, maar daarmee kun je wel mooi tekst op de juiste plek afkappen. Makkelijker is gewoon een non-proportioneel font als System of Courier New gebruiken; dan kun je afkappen op het aantal karakters (len(foobar) dus), want een i is dan even breed als een w bijvoorbeeld.

[ Voor 17% gewijzigd door RobIII op 24-08-2008 18:10 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Een tab printen zorgt er onder VB voor dat hij naar de volgende kolom springt bij het printen. Als je huidige positie al voorbij die kolom is, springt hij naar die kolom op de volgende regel. Het lijkt erop dat je daar last van hebt.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • roches
  • Registratie: Maart 2007
  • Laatst online: 14-11 22:53
Bekijk lijn 49 nog eens goed na het printen van de productnaam.... (vbCrLf) dan zakt de tekst naar beneden op de volgende lijn....

  • fluppie007
  • Registratie: April 2005
  • Laatst online: 25-10 11:21
Ik heb voor de gemakkelijkheid even een foto van een ticketje gemaakt.
Dan hebben jullie een goed beeld wat de huidige code op papier geeft.

Ivm regel 49, je hebt toch gezien dat er nog code is achter de 1e keer vbTab ?
want dat is net de enige regel waarvoor de horizontale scrollbar nodig is :).

Afbeeldingslocatie: http://img205.imageshack.us/img205/8685/miniimg4945copyty1.jpg

P.S.: In het geval dat je je afvraagt waarom de som van alle items hoger is dan wat er op de rekening staat, dat is omdat er korting kan gegeven worden en die automatisch op het subtotaal verrekend wordt. In dit geval is het 3 of 5% geloof ik.

[ Voor 25% gewijzigd door fluppie007 op 25-08-2008 15:01 ]


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Ik heb ooit in C# code geschreven die ervoor zorgt dat lange stukken tekst op de juiste plek afgekapt worden en dan pas weer op de volgende regel geprint worden ik denk dat je wel wat aan dat stuk hebt. Maar het is in C# dus je moet de VB6 equivalenten van sommige methods even vinden.

En: het is misschien wat ranzige code aangezien het vrij oud is.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
foreach (string currentWord in Words)
            {
                if (currentWord.Length > 0)
                {
                    if (currentLineLength + currentWord.Length + 1 < maxLength)
                    {
                        currentLine += " " + currentWord;
                        currentLineLength += (currentWord.Length + 1);
                    }
                    else
                    {
                        Lines.Add(currentLine);
                        currentLine = currentWord;
                        currentLineLength = currentWord.Length;
                    }
                }
            }

Replace een string (woord) door een teken en je bent er denk ik. Ook kun je als het te lang wordt - 2 tekens er ... achter plakken als mooi einde.

Je moet alleen even controleren hoe breed een teken maximaal kan zijn (zoek het breedste teken dat kan voorkomen afhankelijk van je lettertype is dat mogenlijk 'W' en zet die zo vaak mogenlijk achter elkaar en kijk waneer hij wordt afgebroken 12345 heb je niet zo veel aan immers W is breder dan 1 (behalve als je een soort van Console lettertype gebruikt).\

Edit btw in regel 56 en 65 zet je 2x de uitlijning op links tenzij het voor een fontchange telkens moet kun je die 2 blokken zover ik zie weglaten.

[ Voor 4% gewijzigd door roy-t op 25-08-2008 15:34 ]

~ Mijn prog blog!


  • Jewest
  • Registratie: Juni 2007
  • Laatst online: 13-11 14:43
Wat ik zou doen is een functie maken met 3 argumenten die een string terug geeft van max 39 chars.
Dit stop alles in 1 mooie regel en scheelt later een hoop programmeren als je klant het anders wilt.

Het probleem van je print zit in
de volgende regel:
.Fields("Aantal") & vbTab & .Fields("Productnaam") + vbCrLf & vbTab & vbTab & vbTab & vbTab & vbTab & Format(.Fields("Subtotaal"), "€0.00")

De vbCrLF is return + line feed. wat je waarschijnlijk wil voor je uitlijnen is een vbCr zonder de line feed. Het kan zijn dat je printertje dit niet aan kan.

Stuur anders een PM en ik help je graag verder.

[ Voor 4% gewijzigd door Jewest op 27-08-2008 15:19 . Reden: typ o ]

Flickr
Canon 7D + Glas + Licht
Komt het rot over dan bedoel ik het anders en taalfouten zijn inbegrepen.


  • fluppie007
  • Registratie: April 2005
  • Laatst online: 25-10 11:21
Jewest schreef op woensdag 27 augustus 2008 @ 15:18:
Wat ik zou doen is een functie maken met 3 argumenten die een string terug geeft van max 39 chars.
Dit stop alles in 1 mooie regel en scheelt later een hoop programmeren als je klant het anders wilt.

Het probleem van je print zit in
de volgende regel:
.Fields("Aantal") & vbTab & .Fields("Productnaam") + vbCrLf & vbTab & vbTab & vbTab & vbTab & vbTab & Format(.Fields("Subtotaal"), "€0.00")

De vbCrLF is return + line feed. wat je waarschijnlijk wil voor je uitlijnen is een vbCr zonder de line feed. Het kan zijn dat je printertje dit niet aan kan.

Stuur anders een PM en ik help je graag verder.
1x vbTab of 2x vbTab werkt niet, daar productnamen een verschillende lengte hebben, gaat uiteindelijk het hele ticket "messed up" staan.
Ik zat nog te denken, ik zou eigenlijk mijn datareport moeten kunnen "plakken" in een picturebox, en dan Printer PaintPicture gebruiken. Een datareport kan je enkel maar naar txt en html exporteren.
En anders zoals RobIII voorstelde, bv. courier new, en met karakters te tellen.
Het liefst paste ik de papersize van mijn report aan, maar dat is helaas niet mogelijk...

Verwijderd

Ik heb geen ervaring met die Bixolon/Samsung bonprinter, maar als 'ie een standaard Epson of IBM protocol ondersteunt kun je de positie van de printkop tot op 1/216e inch regelen als je 'm rechtstreeks aanspreekt (dus niet via een Windows printerdriver).
Nadeel is dan dat je alleen (gemakkelijk) gebruik kunt maken van de fonts in de printer zelf, maar voor een kassabonnetje lijkt me dat geen probleem. Voordeel is dat je volledige controle hebt over de positie waar iets geprint wordt.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
De Tab(n) functie lijnt uit op absolute kolom, misschien dat je daarmee wat kunt

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • fluppie007
  • Registratie: April 2005
  • Laatst online: 25-10 11:21
farlane schreef op donderdag 28 augustus 2008 @ 22:44:
De Tab(n) functie lijnt uit op absolute kolom, misschien dat je daarmee wat kunt
Dat is inderdaad interessant voor mijn toepassing !
Dat is wat je bedoeld ? http://www.vb6.us/tutorials/printing-tab-function ?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
fluppie007 schreef op donderdag 28 augustus 2008 @ 22:54:
Dat is inderdaad interessant voor mijn toepassing !
Dat is wat je bedoeld ? http://www.vb6.us/tutorials/printing-tab-function ?
Yup, werkt alleen met print commando's btw.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1