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

Annotation of /dao/DelphiScanner/LabelPrint.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20