Delphi-Projects
180 строк · 4.0 Кб
1program UWPrint;
2{version of:
32010-10-05 +no stop on errors - just loging
42010-09-28 +specified Printers, not default only
5}
6
7{$APPTYPE CONSOLE}
8
9uses
10Printers,
11Classes,
12SysUtils,
13StrUtils,
14Russian,
15BankUtils;
16
17{$R *.RES}
18
19const
20Ej = '- - - - - - - - ';
21
22var
23FileName: AnsiString;
24F: TextFile;
25S: AnsiString;
26
27i: Integer;
28
29TopMargin: Integer = 0;
30LeftMargin: Integer = 0; //8
31FontSize: Integer = 8; //10
32
33function PrintersInfo: AnsiString;
34var
35i: Integer;
36begin
37Result := 'Программа видит следующие принтеры (* - по умолчанию):'#13#10#13#10;
38for i := 0 to Printer.Printers.Count - 1 do
39begin
40if (i = Printer.PrinterIndex) then
41Result := Result + Format('%3u* "%s"', [i, Printer.Printers[i]]) + #13#10
42else
43Result := Result + Format('%3u "%s"', [i, Printer.Printers[i]]) + #13#10;
44end;
45RWinToDos(Result);
46end;
47
48procedure ExitInfo(s: AnsiString = '');
49begin
50Writeln(RDos('Unix-Windows Print - программа графической печати текстов из Банкира'));
51Writeln(RDos('В качестве параметра требует имя файла для печати'));
52Writeln(RDos('Вторым параметром может быть указан принтер (номер или имя в 866!)'));
53Writeln;
54if Length(s) > 0 then
55begin
56Writeln(RDos('ОШИБКА:'));
57Writeln(RDos(s));
58Writeln;
59end;
60Writeln(PrintersInfo);
61Writeln;
62//Writeln(RDos('Нажмите Enter для выхода'));
63//Readln;
64Halt(0);
65end;
66
67procedure LinePrint(s: AnsiString = '');
68var
69x, y, y1, i: Integer;
70begin
71with Printer do
72begin
73x := LeftMargin * Canvas.TextWidth('W');
74y := Canvas.PenPos.Y;
75y1 := Canvas.TextHeight('W');
76i := Pos(#12, s);
77
78if (y + y1) > PageHeight then
79begin
80NewPage;
81y := TopMargin * y1;
82end;
83
84if i = 0 then
85Canvas.TextOut(x, y, TrimRight(s))
86else
87begin
88if i > 1 then
89Canvas.TextOut(x, y, TrimRight(AnsiLeftStr(s, i-1)));
90NewPage;
91y := TopMargin * y1;
92if i < Length(s) then
93Canvas.TextOut(x, y, TrimRight(AnsiMidStr(s, i+1, Length(s))));
94end;
95
96Canvas.PenPos := Point(0, y + y1);
97end;
98end;
99
100begin
101if (ParamCount < 1) or
102FindCmdLineSwitch('?') or
103FindCmdLineSwitch('h') then
104ExitInfo();
105
106if Printer.Printers.Count = 0 then
107begin
108AppendLogMessage('Нет установленных принтеров!');
109Halt(1);
110end;
111
112FileName := ParamStr(1);
113if not FileExists(FileName) then
114begin
115AppendLogMessage('Нет такого файла %s', [FileName]);
116Halt(2);
117end;
118
119if (ParamCount = 2) then
120begin
121//Printer.SetPrinter(ParamStr(2));
122S := ParamStr(2);
123if TryStrToInt(S, i) then
124begin
125if (i > -1) and (i < Printer.Printers.Count) then
126Printer.PrinterIndex := i
127else
128begin
129AppendLogMessage('Нет принтера с номером %s', [S]);
130Halt(3);
131end;
132end
133else
134begin
135i := Printer.Printers.IndexOf(S);
136if i = -1 then
137begin
138AppendLogMessage('Нет принтера с именем (в 866) "%s"', [S]);
139Halt(4);
140end;
141Printer.PrinterIndex := i;
142end;
143end;
144
145AssignFile(F, FileName);
146//SetLineBreakStyle(F, tlbsLF);
147Reset(F);
148//Readln(F, S);
149{if AnsiEndsStr(#13, S) then
150begin
151CloseFile(F);
152SetLineBreakStyle(F, tlbsCRLF);
153Reset(F);
154end;}
155
156with Printer do
157begin
158//Orientation := poLandscape;
159Orientation := poPortrait;
160Title := 'UWPrint - ' + FileName;
161BeginDoc;
162
163Canvas.Font.Name := 'Courier New';
164Canvas.Font.Charset := 204; //RUSSIAN_CHARSET;
165Canvas.Font.Size := FontSize;
166
167while not EOF(F) do
168begin
169Readln(F, S);
170S := AnsiReplaceStr(S, '$$', #12);
171if AnsiStartsStr(Ej, s) then
172S := #12
173else if AnsiStartsStr(#27'M', S) then
174S := AnsiMidStr(S, 2, Length(S));
175LinePrint(RWin(S));
176end;
177EndDoc;
178end;
179CloseFile(F);
180end.
181
182