Проблема с печатью

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблема с печатью

Сообщение tria » 12.07.2006 13:03:01

У кого-то работает пример SelectPrinter из Printer4Lazarus?
У меня вылетает на строке
fDC:=CreateDC(nil,PChar(Printers[PrinterIndex]),nil,@PDev.DevMode);
с ошибкой External SIGSEGV
(модуль winprinters.inc)?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение tria » 12.07.2006 18:58:54

Блин.
При работе из Лазаря вылетает. Если запустить скомпиленный проект отдельно - работает.
Я 2 дня убил...
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение tria » 13.07.2006 11:53:31

И еще вопрос.
Printer.PageWidth - ширина листа бумаги
Printer.XDPI - разрешение принтера.
Задача: напечатать на определенном расстоянии от левого края листа бумаги. Принтер печатает не с начала. Отступ можно было узнать с помощью функции GetDeviceCaps(Printer.Handle,PhysicalOffsetX).
А как теперь быть?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение Lazy » 13.07.2006 13:46:45

Код: Выделить всё
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; // Печать платежного поручения
Lazy
незнакомец
 
Сообщения: 8
Зарегистрирован: 11.07.2006 09:59:10

Сообщение AMD » 27.01.2008 23:22:01

А можно настроить печать без полей
Например фотографии
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Re: Проблема с печатью

Сообщение Sharfik » 18.04.2017 00:48:28

Может кому то пригодится.
Если в Windows по умолчанию стоит принтер "Foxit Reader PDF Printer" (7.3 версия), то
Lazarus 1.6 при запуске проекта вываливается в ошибку без указания места, а Typhone на 549-ую строчку winprinters.inc. Стоит переключиться на другой принтер - все нормально.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 759
Зарегистрирован: 20.07.2013 01:04:30

Re: Проблема с печатью

Сообщение ElectroGuard » 21.04.2017 00:34:39

Ошибка и строка, конечно же, секретные :)
ElectroGuard
новенький
 
Сообщения: 71
Зарегистрирован: 03.06.2016 12:10:22


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 13

Рейтинг@Mail.ru