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

Annotation of /dao/DelphiScanner/LabelPrint.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3038 - (hide annotations) (download)
Tue May 31 11:50:42 2016 UTC (8 years ago) by torben
File size: 14310 byte(s)
Add code for printing ZPL
1 torben 2705 unit LabelPrint;
2    
3     interface
4    
5     uses
6     ParentForm,
7     PakkeshopLabels,
8     Configuration,
9 torben 3038 StBarc,
10     PrtRaw;
11 torben 2705
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 torben 3038 procedure TestZpl();
27     procedure PrintZPL( ZplData : string);
28    
29 torben 2705 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 torben 2790
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 torben 2705 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 torben 3038 // 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 torben 2705
415 torben 3038 '^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 torben 2705 function TLabelPrint.GetPrinterCount() : Integer;
505     begin
506     Result := Printer.Printers.Count;
507     end;
508    
509     end.

  ViewVC Help
Powered by ViewVC 1.1.20