У кого-то работает пример SelectPrinter из Printer4Lazarus?
У меня вылетает на строке
fDC:=CreateDC(nil,PChar(Printers[PrinterIndex]),nil,@PDev.DevMode);
с ошибкой External SIGSEGV
(модуль winprinters.inc)?
Модератор: Модераторы
type
TPrinterMargins = record // непечатаемые границы принтера в сотых
// долях миллиметра
Left: longint;
Top: longint;
end;
TPrinterInfo = record
PixelsPerInch: TPoint;
PhysPageSize: TPoint;
PageRes: TPoint;
OffsetStart: TPoint;
Margins: TPrinterMargins;
end;
var
PrinterInfo: TPrinterInfo;
PageRect: TRect;
procedure PutStr(x,y: single; s: string; z: integer);
begin
Printer.Canvas.Font.Size:=z;
Printer.Canvas.TextOut(PageRect.Left+Round(x*100),PageRect.Top-Round(y*100),s);
end;
procedure LineVert(x,y,h: single);
begin
Printer.Canvas.MoveTo(PageRect.Left+Round(x*100),PageRect.Top-Round(y*100));
Printer.Canvas.LineTo(PageRect.Left+Round(x*100),PageRect.Top-Round(y*100)-Round(h*100)+1);
end;
procedure LineHorz(x,y,w: single);
begin
Printer.Canvas.MoveTo(PageRect.Left+Round(x*100),PageRect.Top-Round(y*100));
Printer.Canvas.LineTo(PageRect.Left+Round(x*100+w*100-1),PageRect.Top-Round(y*100));
end;
function InchToMm(inch: single): single;
// Конвертирует дюймы в миллиметры
begin
result:=inch*25.4
end;
procedure GetPrinterInfo(var PrinterInfo: TPrinterInfo);
begin
with PrinterInfo do begin
PixelsPerInch.x:=GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSX);
PixelsPerInch.y:=GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSY);
Escape(Printer.Canvas.Handle,GETPHYSPAGESIZE,0,nil,@PhysPageSize);
Escape(Printer.Canvas.Handle,GETPRINTINGOFFSET,0,nil,@OffsetStart);
PageRes.y:=GetDeviceCaps(Printer.Canvas.Handle,VERTRES);
PageRes.x:=GetDeviceCaps(Printer.Canvas.Handle,HORZRES);
Margins.Left:=Round(InchToMm(OffsetStart.x/PixelsPerInch.x)*100);
Margins.Top:=Round(InchToMm(OffsetStart.y/PixelsPerInch.y)*100);
end;
end;
procedure TForm1.MenuItem11Click(Sender: TObject);
// Печать платежного поручения
begin
if not PrintDialog1.Execute then Exit;
GetPrinterInfo(PrinterInfo);
PageRect:=Rect(0,0,PrinterInfo.PageRes.x-1,PrinterInfo.PageRes.y-1);
Printer.Title:='Платежное поручение';
Printer.BeginDoc;
with Printer.Canvas do begin
SetMapMode(Handle,MM_HIMETRIC);
DPtoLP(Handle,PageRect,2);
Inc(PageRect.Left,2000-PrinterInfo.Margins.Left); // передвигаем
// левую границу на 20мм от края листа
Dec(PageRect.Top,1500-PrinterInfo.Margins.Left); // передвигаем
//верхнюю границу на 15мм от края листа
Font.Name:='Courier New';
Pen.Width:=10;
LineHorz(160,-3,20);
LineHorz(160,4,20);
LineVert(160,-3,7);
LineVert(180,-3,7);
PutStr(161.5,-1.5,'0401060',48);
LineHorz(173,12,7);
LineHorz(173,19,7);
LineVert(173,12,7);
LineVert(180,12,7);
// ГОРИЗОНТАЛЬНЫЕ ЛИНИИ
LineHorz(0,0,35);
PutStr(6,1,'Поступ. в банк плат.',24);
LineHorz(40,0,35);
PutStr(46,1,'Списано со сч. плат.',24);
// Платежное поручение
Font.Style:=[fsBold];
PutStr(0,10,'ПЛАТЕЖНОЕ ПОРУЧЕНИЕ №',60);
Font.Style:=[];
LineHorz(85,15,35);
PutStr(99,16,'Дата',36);
LineHorz(125,15,35);
PutStr(132,16,'Вид платежа',36);
// Сумма прописью
PutStr(0,20,'Сумма',42);
PutStr(0,24,'прописью',42);
LineHorz(0,35,180);
// ИНН и КПП плательщика
PutStr(0,35.5,'ИНН',42);
PutStr(51,35.5,'КПП',42);
LineHorz(0,40,100);
// Сумма
PutStr(101,36,'Сумма',42);
LineHorz(100,50,80);
PutStr(101,51,'Сч. №',42);
// Плательщик
PutStr(0,61,'Плательщик',42);
LineHorz(0,65,115);
// БИК
PutStr(101,66,'БИК',42);
LineHorz(100,70,15);
PutStr(101,71,'Сч. №',42);
// Банк плательщика
PutStr(0,76,'Банк плательщика',42);
LineHorz(0,80,180);
// БИК
PutStr(101,81,'БИК',42);
LineHorz(100,85,15);
PutStr(101,86,'Сч. №',42);
// Банк получателя
PutStr(0,91,'Банк получателя',42);
LineHorz(0,95,115);
PutStr(0,95.5,'ИНН',42);
PutStr(51,95.5,'КПП',42);
PutStr(101,96,'Сч. №',42);
LineHorz(0,100,100);
// Сч. N
LineHorz(100,110,80);
PutStr(101,111,'Вид оп.',36);
PutStr(136,111,'Срок плат.',36);
// Вид оп.
LineHorz(100,115,15);
PutStr(101,116,'Наз.пл.',36);
PutStr(136,116,'Очер.плат.',36);
// Срок плат.
LineHorz(135,115,20);
// Наз. пл.
LineHorz(100,120,15);
PutStr(101,121,'Код',36);
PutStr(136,121,'Рез. поле',36);
// Очер. плат.
LineHorz(135,120,20);
// Получатель
PutStr(0,121,'Получатель',42);
LineHorz(0,125,180);
// Налоги
LineHorz(0,130,180);
// Назначение
PutStr(0,156,'Назначение',42);
LineHorz(0,160,180);
PutStr(72,161,'Подписи',42);
PutStr(135,161,'Отметки банка',42);
// Подписи
PutStr(20,181,'М.П.',42);
LineHorz(50,175,60);
LineHorz(50,190,60);
// ВЕРТИКАЛЬНЫЕ ЛИНИИ
LineVert(20,20,15);
LineVert(50,35,5);
LineVert(50,95,5);
LineVert(100,35,90);
LineVert(115,35,90);
LineVert(135,110,15);
LineVert(155,110,15);
// Налоги
LineVert(45,125,5);
LineVert(75,125,5);
LineVert(85,125,5);
LineVert(110,125,5);
LineVert(145,125,5);
LineVert(170,125,5);
end;
Printer.EndDoc;
end; // Печать платежного поручения
Сейчас этот форум просматривают: Google [Bot] и гости: 14