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

Contents of /dao/DelphiScanner/LabelPrint.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3047 - (show 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 unit LabelPrint;
2
3 interface
4
5 uses
6 ParentForm,
7 PakkeshopLabels,
8 Configuration,
9 StBarc;
10
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 procedure TestZpl();
26 procedure PrintZPL( ZplData : string);
27
28 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
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 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 // 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
414 '^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 function TLabelPrint.GetPrinterCount() : Integer;
504 begin
505 Result := Printer.Printers.Count;
506 end;
507
508 end.

  ViewVC Help
Powered by ViewVC 1.1.20