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

Annotation of /dao/DelphiScanner/LabelPrint.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3124 - (hide annotations) (download)
Wed Oct 19 06:59:57 2016 UTC (7 years, 7 months ago) by torben
File size: 20094 byte(s)
6.3.4 (Lav ikke fuld indhentning af manglende scanninger ved context skift)
1 torben 2705 unit LabelPrint;
2    
3     interface
4    
5     uses
6     ParentForm,
7 torben 3094 LabelData,
8 torben 2705 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 torben 3077 procedure PrintLabel( Stregkode : String);
20    
21 torben 2705
22 torben 3095
23 torben 3124 // PrintLabelData bliver brugt til PrinterTest
24     // og blicer derfor nødt til at være Public
25     procedure PrintLabelData( LabelData : TLabelData);
26 torben 3101
27 torben 2705
28 torben 3124 function GetPrinterCount() : Integer;
29 torben 3077
30 torben 2705
31 torben 3038
32 torben 2705 private
33     parentForm : IParentForm;
34     Barcode : TStBarcode;
35     var Config: TConfiguration;
36    
37    
38 torben 3101 procedure PrintZPL( ZplData : string);
39    
40 torben 3124
41     procedure PrintSimpelLabel( LabelData : TLabelData) ;
42    
43     procedure PrintFuldPakkeLabel( PakkeshopLabel : TLabelData);
44 torben 3101 procedure PrintFuldPakkeLabelLille( PakkeshopLabel : TLabelData);
45     procedure PrintFuldPakkeLabelStor( PakkeshopLabel : TLabelData);
46    
47 torben 3124 procedure SendTilPrinter_old(kontrolKoreliste, RuteNummer, Kommentar, BoghandlerNavn, Koreliste, SmsKode, DBKbane, Leveringssted : String; var PrintNyLabel : Boolean; BoghandlerNummer : string = '');
48     procedure PrintDaodirekteLabel_old( RuteNummer, Kommentar, BoghandlerNavn : String) ;
49 torben 3101
50 torben 3124
51    
52 torben 2705 function SavePChar(p: PChar): PChar;
53     function GetCurrentPrinterHandle(): THandle;
54    
55     end;
56    
57     function GetPixelsPerInchX(): Integer;
58     function GetPixelsPerInchY(): Integer;
59    
60     implementation
61     uses
62     Printers,
63     WinSpool,
64     Windows,
65     SysUtils, //Format
66 torben 3094 Math, // DegToRad() bruges i PrinTLabelData
67 torben 3077 Forms,
68 torben 3088 IdHTTP,
69 torben 3095 Graphics,
70     XMLDoc
71 torben 2705 ;
72    
73    
74    
75    
76     function GetPixelsPerInchX(): Integer;
77     begin
78     Result := GetDeviceCaps(Printer.Handle, LOGPIXELSX)
79     end;
80    
81     function GetPixelsPerInchY(): Integer;
82     begin
83     Result := GetDeviceCaps(Printer.Handle, LOGPIXELSY)
84     end;
85    
86    
87    
88     constructor TLabelPrint.Create( p : IParentForm; var Configuration : TConfiguration; PrinterNavn: String);
89     var
90     FormObj : TForm;
91     printerInd : integer;
92     begin
93     parentForm := p;
94     Config := Configuration;
95    
96     FormObj := parentForm.GetFormObject();
97    
98    
99     Barcode := TStBarcode.Create(FormObj);//Dynamisk oprettelse af Barcode component
100    
101    
102     if PrinterNavn<> '' then
103     begin
104     printerInd := Printer.Printers.IndexOf(PrinterNavn);
105     if printerInd >= 0 then
106     begin
107     Printer.PrinterIndex := printerInd;
108     end;
109     end;
110    
111     end;
112    
113    
114    
115    
116     function TLabelPrint.GetCurrentPrinterHandle(): THandle;
117     var
118     Device, Driver, Port: array[0..255] of Char;
119     hDeviceMode: THandle;
120     begin
121     Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
122     if not OpenPrinter(@Device, Result, nil) then
123     RaiseLastWin32Error;
124     end;
125    
126    
127 torben 3123 procedure TLabelPrint.PrintDaodirekteLabel_old( RuteNummer, Kommentar, BoghandlerNavn : String) ;
128 torben 2705 begin
129     with Printer do
130     begin
131     BeginDoc;
132 torben 3086
133 torben 2705 Canvas.Font.Size := Config.FontSizeRute;
134     if (Length(RuteNummer) > 7) then
135     begin
136     Canvas.Font.Size := Config.FontSizeRuteLille;
137     end;
138     Canvas.TextOut(Config.XPosRute, Config.YPosRute, RuteNummer);
139     Canvas.Font.Size := Config.FontSizeKommentar;
140     Kommentar := StringReplace(Kommentar, #$A, ' - ', [rfReplaceAll, rfIgnoreCase]);
141     if (Kommentar = 'Ok') or (Kommentar = 'ALLEREDE SCANNET') then
142     begin
143     Kommentar := '';
144     end;
145     if (BoghandlerNavn = 'PAKKE ER SCANNET') then
146     begin
147     BoghandlerNavn := '';
148     end;
149     Canvas.TextOut(Config.XPosKommentar, Config.YPosKommentar, Kommentar); // Kan ikke lave linieskift (se tidligere kommentar om samme)
150     Canvas.Font.Size := Config.FontSizeBoghandler;
151     Canvas.TextOut(Config.XPosBoghandler, Config.YPosBoghandler, BoghandlerNavn);
152     EndDoc;
153     end;
154 torben 3086
155    
156    
157     Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725
158    
159 torben 2705 end;
160    
161    
162    
163     procedure TLabelPrint.CheckPrintQue(tjektype : string; PrinterNavn : String);
164     type
165     TJobs = array [0..1000] of JOB_INFO_1;
166     PJobs = ^TJobs;
167     var
168     hPrinter: THandle;
169     bytesNeeded, numJobs, i: Cardinal;
170     pJ: PJobs;
171     printerTxt, statusTxt, dokumentTxt: String;
172     begin
173    
174     // tjektype = 'Opstart' skal vise alarmlinie, samt opdatere listbox1
175     // 'Test' skal vise alarmlinie, samt opdatere listbox1
176     // 'Timer' skal kun vise alarmlinie
177    
178 torben 3099 // if (PrinterNavn = 'Ingen') and ( (tjektype = 'Opstart') or (tjektype = 'Test') ) then
179     // begin
180     //
181     // parentForm.LogMessage( 'Der er fravalgt printer i dette program' );
182     // end
183     // else
184     if (Printer.Printers.Count = 0) and ( (tjektype = 'Opstart') or (tjektype = 'Test') ) then
185 torben 2705 begin
186     parentForm.LogMessage( 'Der er ikke installeret en printer på denne PC' );
187     end
188     else
189     begin
190     hPrinter := GetCurrentPrinterHandle;
191     try
192     EnumJobs(hPrinter, 0, 1000, 1, nil, 0, bytesNeeded, numJobs);
193     pJ := AllocMem(bytesNeeded);
194     if not EnumJobs(hPrinter, 0, 1000, 1, pJ, bytesNeeded, bytesNeeded, numJobs) then
195     RaiseLastWin32Error;
196    
197     if numJobs = 0 then
198     begin
199     if (tjektype = 'Test') then
200     begin
201     parentForm.LogMessage( printerTxt + ': Ingen dokumenter i kø' );
202    
203     end;
204     parentForm.SetPrinterstatusText('', false);
205     end
206     else // så er der kø til printeren
207     begin
208     printerTxt := SavePChar(pJ^[0].pPrinterName);
209     if (tjektype = 'Opstart') or (tjektype = 'Test') then
210     begin
211    
212    
213     parentForm.LogMessage( IntToStr(numJobs) + ' dokument(er) i kø til printer: ' + printerTxt );
214    
215     end;
216     for i := 0 to Pred(numJobs) do
217     begin
218     printerTxt := SavePChar(pJ^[i].pPrinterName);
219     statusTxt := 'Ukendt';
220     if (IntToStr(pJ^[i].Status) = '0') then
221     statusTxt := 'Venter...';
222     if (IntToStr(pJ^[i].Status) = '4096') then
223     statusTxt := 'Printer...';
224     if (IntToStr(pJ^[i].Status) = '8210') then
225     statusTxt := 'Printerfejl';
226     if (IntToStr(pJ^[i].Status) = '8214') then
227     statusTxt := 'Sletter print...';
228    
229     dokumentTxt := SavePChar(pJ^[i].pDocument);
230     if (dokumentTxt = '') then
231     dokumentTxt := 'Uden navn';
232    
233     if (tjektype = 'Opstart') or (tjektype = 'Test') then
234     begin
235    
236     parentForm.LogMessage( Format('Printer %s, Dokument %d: %s, Status (%d): %s', [printerTxt, i+1, dokumentTxt, pJ^[i].Status, statusTxt]) );
237    
238     end;
239    
240     if (i = 0) then
241     begin
242     parentForm.SetPrinterstatusText(printerTxt + ': ' + IntToStr(numJobs) + ' dokument(er) in kø. Dokument status: ' + statusTxt, (numJobs > 3) );
243     end;
244    
245     end;
246     end
247     finally
248     ClosePrinter(hPrinter);
249     end;
250     end;
251 torben 3086
252    
253     Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725
254    
255 torben 2705 end;
256    
257    
258 torben 3077 procedure TLabelPrint.PrintLabel( Stregkode : String);
259     var
260     url: String;
261     response: String;
262    
263     httpClient: TIdHTTP;
264    
265 torben 3095 XMLDocument1: TXMLDocument;
266 torben 3077
267 torben 3095 LabelData: TLabelData;
268 torben 3077
269 torben 3095
270 torben 3077 begin
271    
272 torben 3088 url := Format(Config.URLPrintLabel, [Stregkode] );
273    
274 torben 3077 httpClient := TIdHTTP.Create();
275     httpClient.ReadTimeout := 1000;//max 1 secound
276     httpClient.ConnectTimeout := 1000;
277    
278     response := httpClient.Get(url);
279     httpClient.Free();
280    
281    
282 torben 3095 XMLDocument1 := parentForm.GetXMLDocument();
283 torben 3077
284 torben 3095 XMLDocument1.LoadFromXML(response);
285 torben 3077
286 torben 3095 LabelData := TLabelData.Create(XMLDocument1);
287 torben 3104 PrintLabelData(LabelData);
288     LabelData.Free();
289 torben 3095
290 torben 3104
291     end;
292    
293     procedure TLabelPrint.PrintLabelData( LabelData : TLabelData);
294     begin
295 torben 3095 if LabelData.LabelType = 'zpl' then
296     begin
297     PrintZPL(LabelData.ZPL);
298     end
299     else if (LabelData.LabelType = 'simpel') then
300     begin
301     PrintSimpelLabel(LabelData);
302     end
303     else
304     begin
305     PrintFuldPakkeLabel(LabelData);
306     end;
307 torben 3104 end;
308 torben 3095
309    
310    
311 torben 3123 procedure TLabelPrint.SendTilPrinter_old(kontrolKoreliste, RuteNummer, Kommentar, BoghandlerNavn, Koreliste, SmsKode, DBKbane, Leveringssted : String; var PrintNyLabel : Boolean; BoghandlerNummer : string = '');
312 torben 2705 begin
313     with Printer do
314     begin
315     BeginDoc;
316    
317     Canvas.Font.Size := Config.FontSizeRuteLille;
318     if (kontrolKoreliste <> '') then
319     begin
320     Canvas.TextOut(Config.XPosRute, Config.YPosRute, kontrolKoreliste);
321     end
322     else
323     begin
324     Canvas.TextOut(Config.XPosRute, Config.YPosRute, RuteNummer);
325     end;
326     Canvas.Font.Size := Config.FontSizeKorelisteLille;
327     Canvas.TextOut(Config.XPosKoreliste, Config.YPosKoreliste, Koreliste);
328     if (Config.Sted = 'DBK') or (Config.Sted = '04') then
329     begin
330     Canvas.Font.Size := Config.FontSizeSorteringsfelt1;
331     Canvas.TextOut(Config.XPosSorteringsfelt1,Config.YPosSorteringsfelt1, DBKbane); // sorteringsoplysning 1
332     Canvas.Font.Size := Config.FontSizeSorteringsfelt1;
333     Canvas.TextOut(Config.XPosSorteringsfelt2, Config.YPosSorteringsfelt2, Leveringssted); // sorteringsoplysning 2
334     end;
335     Canvas.Font.Size := Config.FontSizeKommentar;
336    
337     Kommentar := StringReplace(Kommentar, #$A, ' - ', [rfReplaceAll, rfIgnoreCase]);
338     Kommentar := StringReplace(Kommentar, 'PAKKE ER SCANNET', '', [rfReplaceAll, rfIgnoreCase]);
339    
340     Canvas.TextOut(Config.XPosKommentar, Config.YPosKommentar, Kommentar); // Kan ikke lave linieskift (se tidligere kommentar om samme)
341     if SmsKode <> '' then
342     begin
343     Canvas.Font.Size := Config.FontSizeSmskode;
344     Canvas.TextOut(Config.XPosKommentar, Config.YPosSmskode, concat('CODE: ', SmsKode));
345     end;
346     Canvas.Font.Size := Config.FontSizeBoghandler;
347     Canvas.TextOut(Config.XPosBoghandler, Config.YPosBoghandler, BoghandlerNavn);
348    
349     EndDoc;
350     end;
351 torben 3086
352    
353     Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725
354    
355 torben 2705 end;
356    
357    
358 torben 3094 procedure TLabelPrint.PrintFuldPakkeLabel( PakkeshopLabel : TLabelData);
359 torben 3088 begin
360 torben 3091 if (Config.LabelStor = 1) then
361     begin
362     PrintFuldPakkeLabelStor( PakkeshopLabel );
363 torben 2705
364 torben 3091 end
365     else
366     begin
367     PrintFuldPakkeLabelLille( PakkeshopLabel );
368    
369     end;
370    
371 torben 3088 end;
372    
373     // Bruges til label der passer til 60x100
374 torben 3094 procedure TLabelPrint.PrintFuldPakkeLabelLille( PakkeshopLabel : TLabelData);
375 torben 2705 var
376     XForm, XFormOld: TXForm; //Bruges til rotate X-formation
377     Angle: integer;
378     gMode: integer;
379     Dirigering: string;
380    
381     begin
382     with Printer do
383     begin
384     BeginDoc();
385    
386    
387 torben 3103 Canvas.Font.Size := 15;
388 torben 2705 Canvas.TextOut(15,10, 'Code: ' + PakkeshopLabel.Tjekkode + ' ' + PakkeshopLabel.Overskrift);
389    
390    
391    
392     Canvas.TextOut(25, 90, PakkeshopLabel.Navn );
393 torben 3103 Canvas.TextOut(25, 140, PakkeshopLabel.Vejnavn );
394     Canvas.TextOut(25, 190, PakkeshopLabel.Postnr );
395 torben 2705
396    
397     Canvas.Font.Size := 9;
398 torben 2790
399    
400     // Skriv ikke 'Pakkeshop' overskrift hvis det er en shop2direkte
401 torben 3077 if ( PakkeshopLabel.PakkeshopNavn <> '' ) then
402 torben 2790 begin
403     Canvas.TextOut(110, 240, 'Pakkeshop:');
404 torben 3077 Canvas.TextOut(110, 270, PakkeshopLabel.PakkeshopNavn);
405     Canvas.TextOut(110, 300, PakkeshopLabel.PakkeshopAddr);
406     Canvas.TextOut(110, 330, PakkeshopLabel.PakkeshopPostnr);
407    
408 torben 2790 end;
409    
410    
411 torben 2705
412     Canvas.TextOut(350, 240, 'Afsender:');
413     Canvas.TextOut(350, 270, PakkeshopLabel.AfsenderNavn);
414     Canvas.TextOut(350, 300, PakkeshopLabel.AfsenderAdresse);
415     Canvas.TextOut(350, 330, PakkeshopLabel.AfsenderPostnr);
416    
417     Dirigering := PakkeshopLabel.PakkeshopSted + ' | ' + PakkeshopLabel.PakkeshopTurid + ' | ' + PakkeshopLabel.PakkeshopNr;
418     if ( PakkeshopLabel.Koreliste <> '') then
419     begin
420     Dirigering := Dirigering + ' > ' + PakkeshopLabel.Koreliste;
421     end;
422    
423    
424     Canvas.Font.Size := 12;
425     Canvas.TextOut(15, 370, Dirigering);
426    
427    
428    
429    
430    
431     //Tegn adskillelses linier
432     Canvas.Pen.Width := 2;
433     //Øverste linie
434     Canvas.MoveTo(20,80);
435     Canvas.LineTo(600,80);
436    
437     // Midterste linie
438     Canvas.MoveTo( 20, 240);
439     Canvas.LineTo(600, 240);
440    
441     //Nederste linie
442     Canvas.MoveTo( 20, 370);
443     Canvas.LineTo(600, 370);
444    
445    
446     //Tegn skrå streger over afsender
447     Canvas.Pen.Width := 1;
448     Canvas.MoveTo(600, 250);
449     Canvas.LineTo(350, 360);
450     Canvas.MoveTo(600, 360);
451     Canvas.LineTo(350, 250);
452    
453    
454    
455    
456     // Resten af rutinen vedr genering og placering af Barcode
457    
458     BarCode.BarCodeType := bcCode128;
459     BarCode.Code128Subset := csCodeC;
460     BarCode.Code := PakkeshopLabel.Stregkode;
461     BarCode.Validate(True);
462    
463     //Start X-formation
464     //ShowMessage( Format('%d %d', [PageWidth, PageHeight]) );
465     GetWorldTransform(Canvas.Handle, XFormOld);
466    
467     Angle := 270;
468     XForm.eM11 := Cos(DegToRad(Angle));
469     XForm.eM12 := Sin(DegToRad(Angle));
470     XForm.eM21 := -Sin(DegToRad(Angle));
471     XForm.eM22 := Cos(DegToRad(Angle));
472     XForm.eDx := 0;
473     XForm.eDy := 0;
474    
475     gMode := SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
476     SetWorldTransform(Canvas.Handle, XForm);
477    
478     // PaintToCanvasSize arbejder i Inches
479     // Første pos argument bliver nu Y og skal være negativ for at rykke den ned
480     //Anden pos er X og skal være positiv for at justere ind fra venstre mod højre
481    
482     BarCode.PaintToCanvasSize(Printer.Canvas, -1.8, 3.3, 0.4);
483    
484    
485     SetWorldTransform(Canvas.Handle, XFormOld);
486     SetGraphicsMode(Canvas.Handle, gMode);
487    
488     EndDoc();
489     end;
490    
491    
492 torben 3086 Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725
493    
494 torben 2705 end;
495    
496    
497 torben 3088 // Bruges til label der passer til 100x150
498 torben 3094 procedure TLabelPrint.PrintFuldPakkeLabelStor( PakkeshopLabel : TLabelData);
499 torben 3088 var
500     XForm, XFormOld: TXForm; //Bruges til rotate X-formation
501     Angle: integer;
502     gMode: integer;
503     Dirigering: string;
504     BarcodeRect : TRect;
505    
506     begin
507     with Printer do
508     begin
509     BeginDoc();
510    
511    
512    
513     Canvas.Font.Style := [TFontStyle.fsBold];
514     Canvas.Font.Size := 16;
515     Canvas.TextOut(25,25, 'Code: ' + PakkeshopLabel.Tjekkode + ' ' + PakkeshopLabel.Overskrift);
516    
517    
518    
519     Canvas.TextOut(80, 220, PakkeshopLabel.Navn );
520     Canvas.TextOut(80, 270, PakkeshopLabel.Vejnavn );
521     Canvas.TextOut(80, 320, PakkeshopLabel.Postnr );
522    
523    
524     Canvas.Font.Size := 9;
525    
526    
527     // Skriv ikke 'Pakkeshop' overskrift hvis det er en shop2direkte
528     if ( PakkeshopLabel.PakkeshopNavn <> '' ) then
529     begin
530     Canvas.TextOut(170, 460, 'Pakkeshop:');
531     Canvas.TextOut(170, 490, PakkeshopLabel.PakkeshopNavn);
532     Canvas.TextOut(170, 520, PakkeshopLabel.PakkeshopAddr);
533     Canvas.TextOut(170, 550, PakkeshopLabel.PakkeshopPostnr);
534    
535     end;
536    
537    
538    
539     Canvas.TextOut(550, 460, 'Afsender:');
540     Canvas.TextOut(550, 490, PakkeshopLabel.AfsenderNavn);
541     Canvas.TextOut(550, 520, PakkeshopLabel.AfsenderAdresse);
542     Canvas.TextOut(550, 550, PakkeshopLabel.AfsenderPostnr);
543    
544     Dirigering := PakkeshopLabel.PakkeshopSted + ' | ' + PakkeshopLabel.PakkeshopTurid + ' | ' + PakkeshopLabel.PakkeshopNr;
545     if ( PakkeshopLabel.Koreliste <> '') then
546     begin
547     Dirigering := Dirigering + ' > ' + PakkeshopLabel.Koreliste;
548     end;
549    
550    
551     Canvas.Font.Size := 12;
552     Canvas.TextOut(40, 680, Dirigering);
553    
554    
555    
556    
557    
558     //Tegn adskillelses linier
559     Canvas.Pen.Width := 2;
560     //Øverste linie
561     Canvas.MoveTo( 40, 180);
562     Canvas.LineTo(900, 180);
563    
564     // Midterste linie
565     Canvas.MoveTo( 40, 440);
566     Canvas.LineTo(900, 440);
567    
568     //Nederste linie
569     Canvas.MoveTo( 40, 640);
570     Canvas.LineTo(900, 640);
571    
572    
573     //Tegn skrå streger over afsender
574     Canvas.Pen.Width := 1;
575     Canvas.MoveTo(840, 450);
576     Canvas.LineTo(540, 590);
577     Canvas.MoveTo(840, 590);
578     Canvas.LineTo(540, 450);
579    
580    
581    
582     // Resten af rutinen vedr genering og placering af Barcode
583    
584     Barcode.Font.Size := 9;
585     Barcode.BarToSpaceRatio := 0.9;
586    
587    
588     BarCode.BarCodeType := bcCode128;
589     BarCode.Code128Subset := csCodeC;
590     BarCode.Code := PakkeshopLabel.Stregkode;
591     BarCode.Validate(True);
592    
593    
594     // parentForm.Msg( inttostr( Barcode.Font.Size) );//Default 8
595     // parentForm.Msg( Double.ToString( Barcode.BarNarrowToWideRatio) );//Default 2
596     // parentForm.Msg( Double.ToString( Barcode.BarToSpaceRatio) );//Default 1
597     // parentForm.Msg( Double.ToString(BarCode.Width ) );//default 200
598    
599    
600     //Start X-formation
601     //ShowMessage( Format('%d %d', [PageWidth, PageHeight]) );
602     GetWorldTransform(Canvas.Handle, XFormOld);
603    
604     Angle := 270;
605     XForm.eM11 := Cos(DegToRad(Angle));
606     XForm.eM12 := Sin(DegToRad(Angle));
607     XForm.eM21 := -Sin(DegToRad(Angle));
608     XForm.eM22 := Cos(DegToRad(Angle));
609     XForm.eDx := 0;
610     XForm.eDy := 0;
611    
612     gMode := SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
613     SetWorldTransform(Canvas.Handle, XForm);
614    
615     // PaintToCanvasSize arbejder i Inches
616     // Første pos argument bliver nu Y og skal være negativ for at rykke den ned
617     //Anden pos er X og skal være positiv for at justere ind fra venstre mod højre
618    
619     BarCode.PaintToCanvasSize(Printer.Canvas, -2.7, 4.8, 0.5);
620    
621    
622    
623    
624     SetWorldTransform(Canvas.Handle, XFormOld);
625     SetGraphicsMode(Canvas.Handle, gMode);
626    
627     EndDoc();
628     end;
629    
630    
631     Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725
632     end;
633    
634 torben 2705 function TLabelPrint.SavePChar(p: PChar): PChar;
635     const
636     error: PChar = 'Nil';
637     begin
638     if not Assigned(p) then
639     Result := error
640     else
641     Result := p;
642     end;
643    
644 torben 3038 // Online zpl viewer
645 torben 2705
646 torben 3038
647     procedure TLabelPrint.PrintZPL( ZplData : string);
648     var
649     ADevice, ADeviceName, ADevicePort: array[0..255]of Char;
650     PrinterHandle: THandle;
651     DocInfo: TDocInfo1;
652     dwJob: cardinal;
653     dwBytesWritten: cardinal;
654     AUtf8: UTF8string;
655     ADeviceMode: THandle;
656    
657     begin
658    
659    
660     Printer.GetPrinter(ADevice, ADeviceName, ADevicePort, ADeviceMode);
661    
662     if not OpenPrinter(ADevice, PrinterHandle, nil) then
663     begin
664     Exit;
665     parentForm.Msg('error on openprinter');
666     end;
667    
668     //Fill in the structure with info about this "document"
669     DocInfo.pDocName := PChar('Spooler Document Name');
670     DocInfo.pOutputFile := nil;
671     DocInfo.pDatatype := 'RAW';
672    
673     //Inform the spooler the document is beginning
674     dwJob := StartDocPrinter(PrinterHandle, 1, @DocInfo);
675     if dwJob = 0 then
676     begin
677     ClosePrinter(PrinterHandle);
678     PrinterHandle := 0;
679     Exit;
680     end;
681    
682     //Start a page
683     if not StartPagePrinter(PrinterHandle) then
684     begin
685     EndDocPrinter(PrinterHandle);
686     ClosePrinter(PrinterHandle);
687     PrinterHandle := 0;
688     Exit;
689     end;
690    
691     //your zebra code...
692     AUtf8 := UTF8string(ZplData);
693     WritePrinter(PrinterHandle, @AUtf8[1], Length(AUtf8), dwBytesWritten);
694    
695     //End the page
696     if not EndPagePrinter(PrinterHandle) then
697     begin
698     EndDocPrinter(PrinterHandle);
699     ClosePrinter(PrinterHandle);
700     PrinterHandle := 0;
701     Exit;
702     end;
703    
704     //Inform the spooler that the document is ending
705     if not EndDocPrinter(PrinterHandle) then
706     begin
707     ClosePrinter(PrinterHandle);
708     PrinterHandle := 0;
709     Exit;
710     end;
711    
712     //Tidy up the printer handle
713     ClosePrinter(PrinterHandle);
714     PrinterHandle := 0;
715    
716     end;
717    
718 torben 3095 procedure TLabelPrint.PrintSimpelLabel( LabelData : TLabelData) ;
719     begin
720     with Printer do
721     begin
722     BeginDoc;
723 torben 3038
724 torben 3104 Canvas.Font.Size := 20;
725     Canvas.TextOut(10, 20, LabelData.SimpelLinie1);
726     Canvas.TextOut(10, 120, LabelData.SimpelLinie2);
727     Canvas.TextOut(10, 220, LabelData.SimpelLinie3);
728    
729 torben 3095 EndDoc;
730     end;
731    
732    
733    
734     Printers.SetPrinter( TPrinter.Create() ).Free();//Work around for KB3177725
735    
736     end;
737    
738    
739    
740 torben 2705 function TLabelPrint.GetPrinterCount() : Integer;
741     begin
742     Result := Printer.Printers.Count;
743     end;
744    
745     end.

  ViewVC Help
Powered by ViewVC 1.1.20