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

Contents of /dao/DelphiScanner/LabelPrint.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2705 - (show annotations) (download)
Fri Sep 4 12:39:33 2015 UTC (8 years, 8 months ago) by torben
File size: 11685 byte(s)
Flyt mere kode ud i selvstændige units
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 function GetPrinterCount() : Integer;
26
27 private
28 parentForm : IParentForm;
29 Barcode : TStBarcode;
30 var Config: TConfiguration;
31
32
33 function SavePChar(p: PChar): PChar;
34 function GetCurrentPrinterHandle(): THandle;
35
36 end;
37
38 function GetPixelsPerInchX(): Integer;
39 function GetPixelsPerInchY(): Integer;
40
41 implementation
42 uses
43 Printers,
44 WinSpool,
45 Windows,
46 SysUtils, //Format
47 Math, // DegToRad() bruges i PrintPakkeshopLabel
48 Forms
49 ;
50
51
52
53
54 function GetPixelsPerInchX(): Integer;
55 begin
56 Result := GetDeviceCaps(Printer.Handle, LOGPIXELSX)
57 end;
58
59 function GetPixelsPerInchY(): Integer;
60 begin
61 Result := GetDeviceCaps(Printer.Handle, LOGPIXELSY)
62 end;
63
64
65
66 constructor TLabelPrint.Create( p : IParentForm; var Configuration : TConfiguration; PrinterNavn: String);
67 var
68 FormObj : TForm;
69 printerInd : integer;
70 begin
71 parentForm := p;
72 Config := Configuration;
73
74 FormObj := parentForm.GetFormObject();
75
76
77 Barcode := TStBarcode.Create(FormObj);//Dynamisk oprettelse af Barcode component
78
79
80 if PrinterNavn<> '' then
81 begin
82 printerInd := Printer.Printers.IndexOf(PrinterNavn);
83 if printerInd >= 0 then
84 begin
85 Printer.PrinterIndex := printerInd;
86 end;
87 end;
88
89 end;
90
91
92
93
94 function TLabelPrint.GetCurrentPrinterHandle(): THandle;
95 var
96 Device, Driver, Port: array[0..255] of Char;
97 hDeviceMode: THandle;
98 begin
99 Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
100 if not OpenPrinter(@Device, Result, nil) then
101 RaiseLastWin32Error;
102 end;
103
104
105 procedure TLabelPrint.PrintDaodirekteLabel( RuteNummer, Kommentar, BoghandlerNavn : String) ;
106 begin
107 with Printer do
108 begin
109 BeginDoc;
110 Canvas.Font.Size := Config.FontSizeRute;
111 if (Length(RuteNummer) > 7) then
112 begin
113 Canvas.Font.Size := Config.FontSizeRuteLille;
114 end;
115 Canvas.TextOut(Config.XPosRute, Config.YPosRute, RuteNummer);
116 Canvas.Font.Size := Config.FontSizeKommentar;
117 Kommentar := StringReplace(Kommentar, #$A, ' - ', [rfReplaceAll, rfIgnoreCase]);
118 if (Kommentar = 'Ok') or (Kommentar = 'ALLEREDE SCANNET') then
119 begin
120 Kommentar := '';
121 end;
122 if (BoghandlerNavn = 'PAKKE ER SCANNET') then
123 begin
124 BoghandlerNavn := '';
125 end;
126 Canvas.TextOut(Config.XPosKommentar, Config.YPosKommentar, Kommentar); // Kan ikke lave linieskift (se tidligere kommentar om samme)
127 Canvas.Font.Size := Config.FontSizeBoghandler;
128 Canvas.TextOut(Config.XPosBoghandler, Config.YPosBoghandler, BoghandlerNavn);
129 EndDoc;
130 end;
131 end;
132
133
134
135 procedure TLabelPrint.CheckPrintQue(tjektype : string; PrinterNavn : String);
136 type
137 TJobs = array [0..1000] of JOB_INFO_1;
138 PJobs = ^TJobs;
139 var
140 hPrinter: THandle;
141 bytesNeeded, numJobs, i: Cardinal;
142 pJ: PJobs;
143 printerTxt, statusTxt, dokumentTxt: String;
144 begin
145
146 // tjektype = 'Opstart' skal vise alarmlinie, samt opdatere listbox1
147 // 'Test' skal vise alarmlinie, samt opdatere listbox1
148 // 'Timer' skal kun vise alarmlinie
149
150 if (PrinterNavn = 'Ingen') and ( (tjektype = 'Opstart') or (tjektype = 'Test') ) then
151 begin
152
153 parentForm.LogMessage( 'Der er fravalgt printer i dette program' );
154 end
155 else if (Printer.Printers.Count = 0) and ( (tjektype = 'Opstart') or (tjektype = 'Test') ) then
156 begin
157 parentForm.LogMessage( 'Der er ikke installeret en printer på denne PC' );
158 end
159 else
160 begin
161 hPrinter := GetCurrentPrinterHandle;
162 try
163 EnumJobs(hPrinter, 0, 1000, 1, nil, 0, bytesNeeded, numJobs);
164 pJ := AllocMem(bytesNeeded);
165 if not EnumJobs(hPrinter, 0, 1000, 1, pJ, bytesNeeded, bytesNeeded, numJobs) then
166 RaiseLastWin32Error;
167
168 if numJobs = 0 then
169 begin
170 if (tjektype = 'Test') then
171 begin
172 parentForm.LogMessage( printerTxt + ': Ingen dokumenter i kø' );
173
174 end;
175 parentForm.SetPrinterstatusText('', false);
176 end
177 else // så er der kø til printeren
178 begin
179 printerTxt := SavePChar(pJ^[0].pPrinterName);
180 if (tjektype = 'Opstart') or (tjektype = 'Test') then
181 begin
182
183
184 parentForm.LogMessage( IntToStr(numJobs) + ' dokument(er) i kø til printer: ' + printerTxt );
185
186 end;
187 for i := 0 to Pred(numJobs) do
188 begin
189 printerTxt := SavePChar(pJ^[i].pPrinterName);
190 statusTxt := 'Ukendt';
191 if (IntToStr(pJ^[i].Status) = '0') then
192 statusTxt := 'Venter...';
193 if (IntToStr(pJ^[i].Status) = '4096') then
194 statusTxt := 'Printer...';
195 if (IntToStr(pJ^[i].Status) = '8210') then
196 statusTxt := 'Printerfejl';
197 if (IntToStr(pJ^[i].Status) = '8214') then
198 statusTxt := 'Sletter print...';
199
200 dokumentTxt := SavePChar(pJ^[i].pDocument);
201 if (dokumentTxt = '') then
202 dokumentTxt := 'Uden navn';
203
204 if (tjektype = 'Opstart') or (tjektype = 'Test') then
205 begin
206
207 parentForm.LogMessage( Format('Printer %s, Dokument %d: %s, Status (%d): %s', [printerTxt, i+1, dokumentTxt, pJ^[i].Status, statusTxt]) );
208
209 end;
210
211 if (i = 0) then
212 begin
213 parentForm.SetPrinterstatusText(printerTxt + ': ' + IntToStr(numJobs) + ' dokument(er) in kø. Dokument status: ' + statusTxt, (numJobs > 3) );
214 end;
215
216 end;
217 end
218 finally
219 ClosePrinter(hPrinter);
220 end;
221 end;
222 end;
223
224
225 procedure TLabelPrint.SendTilPrinter(kontrolKoreliste, RuteNummer, Kommentar, BoghandlerNavn, Koreliste, SmsKode, DBKbane, Leveringssted : String; var PrintNyLabel : Boolean; BoghandlerNummer : string = '');
226 begin
227 with Printer do
228 begin
229 BeginDoc;
230
231 Canvas.Font.Size := Config.FontSizeRuteLille;
232 if (kontrolKoreliste <> '') then
233 begin
234 Canvas.TextOut(Config.XPosRute, Config.YPosRute, kontrolKoreliste);
235 end
236 else
237 begin
238 Canvas.TextOut(Config.XPosRute, Config.YPosRute, RuteNummer);
239 end;
240 Canvas.Font.Size := Config.FontSizeKorelisteLille;
241 Canvas.TextOut(Config.XPosKoreliste, Config.YPosKoreliste, Koreliste);
242 if (Config.Sted = 'DBK') or (Config.Sted = '04') then
243 begin
244 Canvas.Font.Size := Config.FontSizeSorteringsfelt1;
245 Canvas.TextOut(Config.XPosSorteringsfelt1,Config.YPosSorteringsfelt1, DBKbane); // sorteringsoplysning 1
246 Canvas.Font.Size := Config.FontSizeSorteringsfelt1;
247 Canvas.TextOut(Config.XPosSorteringsfelt2, Config.YPosSorteringsfelt2, Leveringssted); // sorteringsoplysning 2
248 end;
249 Canvas.Font.Size := Config.FontSizeKommentar;
250
251 Kommentar := StringReplace(Kommentar, #$A, ' - ', [rfReplaceAll, rfIgnoreCase]);
252 Kommentar := StringReplace(Kommentar, 'PAKKE ER SCANNET', '', [rfReplaceAll, rfIgnoreCase]);
253
254 Canvas.TextOut(Config.XPosKommentar, Config.YPosKommentar, Kommentar); // Kan ikke lave linieskift (se tidligere kommentar om samme)
255 if SmsKode <> '' then
256 begin
257 Canvas.Font.Size := Config.FontSizeSmskode;
258 Canvas.TextOut(Config.XPosKommentar, Config.YPosSmskode, concat('CODE: ', SmsKode));
259 end;
260 Canvas.Font.Size := Config.FontSizeBoghandler;
261 Canvas.TextOut(Config.XPosBoghandler, Config.YPosBoghandler, BoghandlerNavn);
262
263 EndDoc;
264 end;
265 end;
266
267
268
269 // ToDo: PrintPakkeshopLabel()
270 procedure TLabelPrint.PrintPakkeshopLabel( PakkeshopLabel : TPakkeshopLabel);
271 var
272 XForm, XFormOld: TXForm; //Bruges til rotate X-formation
273 Angle: integer;
274 gMode: integer;
275 Dirigering: string;
276
277 begin
278 with Printer do
279 begin
280 BeginDoc();
281
282
283 Canvas.Font.Size := 16;
284 Canvas.TextOut(15,10, 'Code: ' + PakkeshopLabel.Tjekkode + ' ' + PakkeshopLabel.Overskrift);
285
286
287
288 Canvas.TextOut(25, 90, PakkeshopLabel.Navn );
289 Canvas.TextOut(25, 135, PakkeshopLabel.Vejnavn );
290 Canvas.TextOut(25, 180, PakkeshopLabel.Postnr );
291
292
293 Canvas.Font.Size := 9;
294 Canvas.TextOut(110, 240, 'Pakkeshop:');
295 Canvas.TextOut(110, 270, PakkeshopLabel.PakkeshopNavn);
296 Canvas.TextOut(110, 300, PakkeshopLabel.PakkeshopAddr);
297 Canvas.TextOut(110, 330, PakkeshopLabel.PakkeshopPostnr);
298
299 Canvas.TextOut(350, 240, 'Afsender:');
300 Canvas.TextOut(350, 270, PakkeshopLabel.AfsenderNavn);
301 Canvas.TextOut(350, 300, PakkeshopLabel.AfsenderAdresse);
302 Canvas.TextOut(350, 330, PakkeshopLabel.AfsenderPostnr);
303
304 Dirigering := PakkeshopLabel.PakkeshopSted + ' | ' + PakkeshopLabel.PakkeshopTurid + ' | ' + PakkeshopLabel.PakkeshopNr;
305 if ( PakkeshopLabel.Koreliste <> '') then
306 begin
307 Dirigering := Dirigering + ' > ' + PakkeshopLabel.Koreliste;
308 end;
309
310
311 Canvas.Font.Size := 12;
312 Canvas.TextOut(15, 370, Dirigering);
313
314
315
316
317
318 //Tegn adskillelses linier
319 Canvas.Pen.Width := 2;
320 //Øverste linie
321 Canvas.MoveTo(20,80);
322 Canvas.LineTo(600,80);
323
324 // Midterste linie
325 Canvas.MoveTo( 20, 240);
326 Canvas.LineTo(600, 240);
327
328 //Nederste linie
329 Canvas.MoveTo( 20, 370);
330 Canvas.LineTo(600, 370);
331
332
333 //Tegn skrå streger over afsender
334 Canvas.Pen.Width := 1;
335 Canvas.MoveTo(600, 250);
336 Canvas.LineTo(350, 360);
337 Canvas.MoveTo(600, 360);
338 Canvas.LineTo(350, 250);
339
340
341
342
343 // Resten af rutinen vedr genering og placering af Barcode
344
345 BarCode.BarCodeType := bcCode128;
346 BarCode.Code128Subset := csCodeC;
347 BarCode.Code := PakkeshopLabel.Stregkode;
348 BarCode.Validate(True);
349
350 //Start X-formation
351 //ShowMessage( Format('%d %d', [PageWidth, PageHeight]) );
352 GetWorldTransform(Canvas.Handle, XFormOld);
353
354 Angle := 270;
355 XForm.eM11 := Cos(DegToRad(Angle));
356 XForm.eM12 := Sin(DegToRad(Angle));
357 XForm.eM21 := -Sin(DegToRad(Angle));
358 XForm.eM22 := Cos(DegToRad(Angle));
359 XForm.eDx := 0;
360 XForm.eDy := 0;
361
362 gMode := SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
363 SetWorldTransform(Canvas.Handle, XForm);
364
365 // PaintToCanvasSize arbejder i Inches
366 // Første pos argument bliver nu Y og skal være negativ for at rykke den ned
367 //Anden pos er X og skal være positiv for at justere ind fra venstre mod højre
368
369 BarCode.PaintToCanvasSize(Printer.Canvas, -1.8, 3.3, 0.4);
370
371
372 SetWorldTransform(Canvas.Handle, XFormOld);
373 SetGraphicsMode(Canvas.Handle, gMode);
374
375 EndDoc();
376 end;
377
378
379 end;
380
381
382 function TLabelPrint.SavePChar(p: PChar): PChar;
383 const
384 error: PChar = 'Nil';
385 begin
386 if not Assigned(p) then
387 Result := error
388 else
389 Result := p;
390 end;
391
392
393 function TLabelPrint.GetPrinterCount() : Integer;
394 begin
395 Result := Printer.Printers.Count;
396 end;
397
398 end.

  ViewVC Help
Powered by ViewVC 1.1.20