/[projects]/dao/DelphiScanner/LabelPrint.pas
ViewVC logotype

Annotation of /dao/DelphiScanner/LabelPrint.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3047 - (hide annotations) (download)
Mon Jun 13 08:54:20 2016 UTC (7 years, 11 months ago) by torben
File size: 14299 byte(s)
Bump version to 6.2.3
1 torben 2705 unit LabelPrint;
2    
3     interface
4    
5     uses
6     ParentForm,
7     PakkeshopLabels,
8     Configuration,
9 torben 3047 StBarc;
10 torben 2705
11    
12     type
13     TLabelPrint = class
14    
15     constructor Create( p : IParentForm; var Configuration : TConfiguration; PrinterNavn: String);
16    
17     procedure CheckPrintQue(tjektype : string; PrinterNavn : String);
18    
19     procedure SendTilPrinter(kontrolKoreliste, RuteNummer, Kommentar, BoghandlerNavn, Koreliste, SmsKode, DBKbane, Leveringssted : String; var PrintNyLabel : Boolean; BoghandlerNummer : string = '');
20    
21     procedure PrintPakkeshopLabel( PakkeshopLabel : TPakkeshopLabel);
22    
23     procedure PrintDaodirekteLabel( RuteNummer, Kommentar, BoghandlerNavn : String) ;
24    
25 torben 3038 procedure TestZpl();
26     procedure PrintZPL( ZplData : string);
27    
28 torben 2705 function GetPrinterCount() : Integer;
29    
30     private
31     parentForm : IParentForm;
32     Barcode : TStBarcode;
33     var Config: TConfiguration;
34    
35    
36     function SavePChar(p: PChar): PChar;
37     function GetCurrentPrinterHandle(): THandle;
38    
39     end;
40    
41     function GetPixelsPerInchX(): Integer;
42     function GetPixelsPerInchY(): Integer;
43    
44     implementation
45     uses
46     Printers,
47     WinSpool,
48     Windows,
49     SysUtils, //Format
50     Math, // DegToRad() bruges i PrintPakkeshopLabel
51     Forms
52     ;
53    
54    
55    
56    
57     function GetPixelsPerInchX(): Integer;
58     begin
59     Result := GetDeviceCaps(Printer.Handle, LOGPIXELSX)
60     end;
61    
62     function GetPixelsPerInchY(): Integer;
63     begin
64     Result := GetDeviceCaps(Printer.Handle, LOGPIXELSY)
65     end;
66    
67    
68    
69     constructor TLabelPrint.Create( p : IParentForm; var Configuration : TConfiguration; PrinterNavn: String);
70     var
71     FormObj : TForm;
72     printerInd : integer;
73     begin
74     parentForm := p;
75     Config := Configuration;
76    
77     FormObj := parentForm.GetFormObject();
78    
79    
80     Barcode := TStBarcode.Create(FormObj);//Dynamisk oprettelse af Barcode component
81    
82    
83     if PrinterNavn<> '' then
84     begin
85     printerInd := Printer.Printers.IndexOf(PrinterNavn);
86     if printerInd >= 0 then
87     begin
88     Printer.PrinterIndex := printerInd;
89     end;
90     end;
91    
92     end;
93    
94    
95    
96    
97     function TLabelPrint.GetCurrentPrinterHandle(): THandle;
98     var
99     Device, Driver, Port: array[0..255] of Char;
100     hDeviceMode: THandle;
101     begin
102     Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
103     if not OpenPrinter(@Device, Result, nil) then
104     RaiseLastWin32Error;
105     end;
106    
107    
108     procedure TLabelPrint.PrintDaodirekteLabel( RuteNummer, Kommentar, BoghandlerNavn : String) ;
109     begin
110     with Printer do
111     begin
112     BeginDoc;
113     Canvas.Font.Size := Config.FontSizeRute;
114     if (Length(RuteNummer) > 7) then
115     begin
116     Canvas.Font.Size := Config.FontSizeRuteLille;
117     end;
118     Canvas.TextOut(Config.XPosRute, Config.YPosRute, RuteNummer);
119     Canvas.Font.Size := Config.FontSizeKommentar;
120     Kommentar := StringReplace(Kommentar, #$A, ' - ', [rfReplaceAll, rfIgnoreCase]);
121     if (Kommentar = 'Ok') or (Kommentar = 'ALLEREDE SCANNET') then
122     begin
123     Kommentar := '';
124     end;
125     if (BoghandlerNavn = 'PAKKE ER SCANNET') then
126     begin
127     BoghandlerNavn := '';
128     end;
129     Canvas.TextOut(Config.XPosKommentar, Config.YPosKommentar, Kommentar); // Kan ikke lave linieskift (se tidligere kommentar om samme)
130     Canvas.Font.Size := Config.FontSizeBoghandler;
131     Canvas.TextOut(Config.XPosBoghandler, Config.YPosBoghandler, BoghandlerNavn);
132     EndDoc;
133     end;
134     end;
135    
136    
137    
138     procedure TLabelPrint.CheckPrintQue(tjektype : string; PrinterNavn : String);
139     type
140     TJobs = array [0..1000] of JOB_INFO_1;
141     PJobs = ^TJobs;
142     var
143     hPrinter: THandle;
144     bytesNeeded, numJobs, i: Cardinal;
145     pJ: PJobs;
146     printerTxt, statusTxt, dokumentTxt: String;
147     begin
148    
149     // tjektype = 'Opstart' skal vise alarmlinie, samt opdatere listbox1
150     // 'Test' skal vise alarmlinie, samt opdatere listbox1
151     // 'Timer' skal kun vise alarmlinie
152    
153     if (PrinterNavn = 'Ingen') and ( (tjektype = 'Opstart') or (tjektype = 'Test') ) then
154     begin
155    
156     parentForm.LogMessage( 'Der er fravalgt printer i dette program' );
157     end
158     else if (Printer.Printers.Count = 0) and ( (tjektype = 'Opstart') or (tjektype = 'Test') ) then
159     begin
160     parentForm.LogMessage( 'Der er ikke installeret en printer på denne PC' );
161     end
162     else
163     begin
164     hPrinter := GetCurrentPrinterHandle;
165     try
166     EnumJobs(hPrinter, 0, 1000, 1, nil, 0, bytesNeeded, numJobs);
167     pJ := AllocMem(bytesNeeded);
168     if not EnumJobs(hPrinter, 0, 1000, 1, pJ, bytesNeeded, bytesNeeded, numJobs) then
169     RaiseLastWin32Error;
170    
171     if numJobs = 0 then
172     begin
173     if (tjektype = 'Test') then
174     begin
175     parentForm.LogMessage( printerTxt + ': Ingen dokumenter i kø' );
176    
177     end;
178     parentForm.SetPrinterstatusText('', false);
179     end
180     else // så er der kø til printeren
181     begin
182     printerTxt := SavePChar(pJ^[0].pPrinterName);
183     if (tjektype = 'Opstart') or (tjektype = 'Test') then
184     begin
185    
186    
187     parentForm.LogMessage( IntToStr(numJobs) + ' dokument(er) i kø til printer: ' + printerTxt );
188    
189     end;
190     for i := 0 to Pred(numJobs) do
191     begin
192     printerTxt := SavePChar(pJ^[i].pPrinterName);
193     statusTxt := 'Ukendt';
194     if (IntToStr(pJ^[i].Status) = '0') then
195     statusTxt := 'Venter...';
196     if (IntToStr(pJ^[i].Status) = '4096') then
197     statusTxt := 'Printer...';
198     if (IntToStr(pJ^[i].Status) = '8210') then
199     statusTxt := 'Printerfejl';
200     if (IntToStr(pJ^[i].Status) = '8214') then
201     statusTxt := 'Sletter print...';
202    
203     dokumentTxt := SavePChar(pJ^[i].pDocument);
204     if (dokumentTxt = '') then
205     dokumentTxt := 'Uden navn';
206    
207     if (tjektype = 'Opstart') or (tjektype = 'Test') then
208     begin
209    
210     parentForm.LogMessage( Format('Printer %s, Dokument %d: %s, Status (%d): %s', [printerTxt, i+1, dokumentTxt, pJ^[i].Status, statusTxt]) );
211    
212     end;
213    
214     if (i = 0) then
215     begin
216     parentForm.SetPrinterstatusText(printerTxt + ': ' + IntToStr(numJobs) + ' dokument(er) in kø. Dokument status: ' + statusTxt, (numJobs > 3) );
217     end;
218    
219     end;
220     end
221     finally
222     ClosePrinter(hPrinter);
223     end;
224     end;
225     end;
226    
227    
228     procedure TLabelPrint.SendTilPrinter(kontrolKoreliste, RuteNummer, Kommentar, BoghandlerNavn, Koreliste, SmsKode, DBKbane, Leveringssted : String; var PrintNyLabel : Boolean; BoghandlerNummer : string = '');
229     begin
230     with Printer do
231     begin
232     BeginDoc;
233    
234     Canvas.Font.Size := Config.FontSizeRuteLille;
235     if (kontrolKoreliste <> '') then
236     begin
237     Canvas.TextOut(Config.XPosRute, Config.YPosRute, kontrolKoreliste);
238     end
239     else
240     begin
241     Canvas.TextOut(Config.XPosRute, Config.YPosRute, RuteNummer);
242     end;
243     Canvas.Font.Size := Config.FontSizeKorelisteLille;
244     Canvas.TextOut(Config.XPosKoreliste, Config.YPosKoreliste, Koreliste);
245     if (Config.Sted = 'DBK') or (Config.Sted = '04') then
246     begin
247     Canvas.Font.Size := Config.FontSizeSorteringsfelt1;
248     Canvas.TextOut(Config.XPosSorteringsfelt1,Config.YPosSorteringsfelt1, DBKbane); // sorteringsoplysning 1
249     Canvas.Font.Size := Config.FontSizeSorteringsfelt1;
250     Canvas.TextOut(Config.XPosSorteringsfelt2, Config.YPosSorteringsfelt2, Leveringssted); // sorteringsoplysning 2
251     end;
252     Canvas.Font.Size := Config.FontSizeKommentar;
253    
254     Kommentar := StringReplace(Kommentar, #$A, ' - ', [rfReplaceAll, rfIgnoreCase]);
255     Kommentar := StringReplace(Kommentar, 'PAKKE ER SCANNET', '', [rfReplaceAll, rfIgnoreCase]);
256    
257     Canvas.TextOut(Config.XPosKommentar, Config.YPosKommentar, Kommentar); // Kan ikke lave linieskift (se tidligere kommentar om samme)
258     if SmsKode <> '' then
259     begin
260     Canvas.Font.Size := Config.FontSizeSmskode;
261     Canvas.TextOut(Config.XPosKommentar, Config.YPosSmskode, concat('CODE: ', SmsKode));
262     end;
263     Canvas.Font.Size := Config.FontSizeBoghandler;
264     Canvas.TextOut(Config.XPosBoghandler, Config.YPosBoghandler, BoghandlerNavn);
265    
266     EndDoc;
267     end;
268     end;
269    
270    
271    
272     // ToDo: PrintPakkeshopLabel()
273     procedure TLabelPrint.PrintPakkeshopLabel( PakkeshopLabel : TPakkeshopLabel);
274     var
275     XForm, XFormOld: TXForm; //Bruges til rotate X-formation
276     Angle: integer;
277     gMode: integer;
278     Dirigering: string;
279    
280     begin
281     with Printer do
282     begin
283     BeginDoc();
284    
285    
286     Canvas.Font.Size := 16;
287     Canvas.TextOut(15,10, 'Code: ' + PakkeshopLabel.Tjekkode + ' ' + PakkeshopLabel.Overskrift);
288    
289    
290    
291     Canvas.TextOut(25, 90, PakkeshopLabel.Navn );
292     Canvas.TextOut(25, 135, PakkeshopLabel.Vejnavn );
293     Canvas.TextOut(25, 180, PakkeshopLabel.Postnr );
294    
295    
296     Canvas.Font.Size := 9;
297 torben 2790
298    
299     // Skriv ikke 'Pakkeshop' overskrift hvis det er en shop2direkte
300     if ( (PakkeshopLabel.Shop2Direkte = '') OR (PakkeshopLabel.Shop2Direkte = '0') ) then
301     begin
302     Canvas.TextOut(110, 240, 'Pakkeshop:');
303     end;
304    
305    
306 torben 2705 Canvas.TextOut(110, 270, PakkeshopLabel.PakkeshopNavn);
307     Canvas.TextOut(110, 300, PakkeshopLabel.PakkeshopAddr);
308     Canvas.TextOut(110, 330, PakkeshopLabel.PakkeshopPostnr);
309    
310     Canvas.TextOut(350, 240, 'Afsender:');
311     Canvas.TextOut(350, 270, PakkeshopLabel.AfsenderNavn);
312     Canvas.TextOut(350, 300, PakkeshopLabel.AfsenderAdresse);
313     Canvas.TextOut(350, 330, PakkeshopLabel.AfsenderPostnr);
314    
315     Dirigering := PakkeshopLabel.PakkeshopSted + ' | ' + PakkeshopLabel.PakkeshopTurid + ' | ' + PakkeshopLabel.PakkeshopNr;
316     if ( PakkeshopLabel.Koreliste <> '') then
317     begin
318     Dirigering := Dirigering + ' > ' + PakkeshopLabel.Koreliste;
319     end;
320    
321    
322     Canvas.Font.Size := 12;
323     Canvas.TextOut(15, 370, Dirigering);
324    
325    
326    
327    
328    
329     //Tegn adskillelses linier
330     Canvas.Pen.Width := 2;
331     //Øverste linie
332     Canvas.MoveTo(20,80);
333     Canvas.LineTo(600,80);
334    
335     // Midterste linie
336     Canvas.MoveTo( 20, 240);
337     Canvas.LineTo(600, 240);
338    
339     //Nederste linie
340     Canvas.MoveTo( 20, 370);
341     Canvas.LineTo(600, 370);
342    
343    
344     //Tegn skrå streger over afsender
345     Canvas.Pen.Width := 1;
346     Canvas.MoveTo(600, 250);
347     Canvas.LineTo(350, 360);
348     Canvas.MoveTo(600, 360);
349     Canvas.LineTo(350, 250);
350    
351    
352    
353    
354     // Resten af rutinen vedr genering og placering af Barcode
355    
356     BarCode.BarCodeType := bcCode128;
357     BarCode.Code128Subset := csCodeC;
358     BarCode.Code := PakkeshopLabel.Stregkode;
359     BarCode.Validate(True);
360    
361     //Start X-formation
362     //ShowMessage( Format('%d %d', [PageWidth, PageHeight]) );
363     GetWorldTransform(Canvas.Handle, XFormOld);
364    
365     Angle := 270;
366     XForm.eM11 := Cos(DegToRad(Angle));
367     XForm.eM12 := Sin(DegToRad(Angle));
368     XForm.eM21 := -Sin(DegToRad(Angle));
369     XForm.eM22 := Cos(DegToRad(Angle));
370     XForm.eDx := 0;
371     XForm.eDy := 0;
372    
373     gMode := SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
374     SetWorldTransform(Canvas.Handle, XForm);
375    
376     // PaintToCanvasSize arbejder i Inches
377     // Første pos argument bliver nu Y og skal være negativ for at rykke den ned
378     //Anden pos er X og skal være positiv for at justere ind fra venstre mod højre
379    
380     BarCode.PaintToCanvasSize(Printer.Canvas, -1.8, 3.3, 0.4);
381    
382    
383     SetWorldTransform(Canvas.Handle, XFormOld);
384     SetGraphicsMode(Canvas.Handle, gMode);
385    
386     EndDoc();
387     end;
388    
389    
390     end;
391    
392    
393     function TLabelPrint.SavePChar(p: PChar): PChar;
394     const
395     error: PChar = 'Nil';
396     begin
397     if not Assigned(p) then
398     Result := error
399     else
400     Result := p;
401     end;
402    
403 torben 3038 // Online zpl viewer
404     // http://labelary.com/viewer.html
405     procedure TLabelPrint.TestZpl();
406     var
407     zpl: string;
408     begin
409     zpl :=
410     '^XA'#13#10 +
411     '^PON'#13#10 +
412     '^FWN'#13#10 +
413 torben 2705
414 torben 3038 '^FX Top section with company logo, name and address.'#13#10 +
415     '^CF0,60'#13#10 +
416     '^FO50,50^GB100,100,100^FS'#13#10+
417     '^FO75,75^FR^GB100,100,100^FS'#13#10+
418     '^FO88,88^GB50,50,50^FS'#13#10+
419     '^FO220,50^FDInternational Shipping, Inc.^FS'#13#10+
420     '^CF0,40'#13#10+
421     '^FO220,100^FD1000 Shipping Lane^FS'#13#10+
422     '^FO220,135^FDShelbyville TN 38102^FS'#13#10+
423     '^FO220,170^FDUnited States (USA)^FS'#13#10+
424     '^FO50,250^GB700,1,3^FS'#13#10 +
425     '^XZ'#13#10
426     ;
427    
428     PrintZpl(zpl);
429     end;
430    
431     procedure TLabelPrint.PrintZPL( ZplData : string);
432     var
433     ADevice, ADeviceName, ADevicePort: array[0..255]of Char;
434     PrinterHandle: THandle;
435     DocInfo: TDocInfo1;
436     dwJob: cardinal;
437     dwBytesWritten: cardinal;
438     AUtf8: UTF8string;
439     ADeviceMode: THandle;
440    
441     begin
442    
443    
444     Printer.GetPrinter(ADevice, ADeviceName, ADevicePort, ADeviceMode);
445    
446     if not OpenPrinter(ADevice, PrinterHandle, nil) then
447     begin
448     Exit;
449     parentForm.Msg('error on openprinter');
450     end;
451    
452     //Fill in the structure with info about this "document"
453     DocInfo.pDocName := PChar('Spooler Document Name');
454     DocInfo.pOutputFile := nil;
455     DocInfo.pDatatype := 'RAW';
456    
457     //Inform the spooler the document is beginning
458     dwJob := StartDocPrinter(PrinterHandle, 1, @DocInfo);
459     if dwJob = 0 then
460     begin
461     ClosePrinter(PrinterHandle);
462     PrinterHandle := 0;
463     Exit;
464     end;
465    
466     //Start a page
467     if not StartPagePrinter(PrinterHandle) then
468     begin
469     EndDocPrinter(PrinterHandle);
470     ClosePrinter(PrinterHandle);
471     PrinterHandle := 0;
472     Exit;
473     end;
474    
475     //your zebra code...
476     AUtf8 := UTF8string(ZplData);
477     WritePrinter(PrinterHandle, @AUtf8[1], Length(AUtf8), dwBytesWritten);
478    
479     //End the page
480     if not EndPagePrinter(PrinterHandle) then
481     begin
482     EndDocPrinter(PrinterHandle);
483     ClosePrinter(PrinterHandle);
484     PrinterHandle := 0;
485     Exit;
486     end;
487    
488     //Inform the spooler that the document is ending
489     if not EndDocPrinter(PrinterHandle) then
490     begin
491     ClosePrinter(PrinterHandle);
492     PrinterHandle := 0;
493     Exit;
494     end;
495    
496     //Tidy up the printer handle
497     ClosePrinter(PrinterHandle);
498     PrinterHandle := 0;
499    
500     end;
501    
502    
503 torben 2705 function TLabelPrint.GetPrinterCount() : Integer;
504     begin
505     Result := Printer.Printers.Count;
506     end;
507    
508     end.

  ViewVC Help
Powered by ViewVC 1.1.20