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

Contents of /dao/DelphiScanner/LabelPrint.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20