Всем привет.
Есть принтеры brother HL-2300 или похожие.
Есть приложение, которое печатает талон на листке А6. Талон рисуется в графике. Когда он готов я его печатал так
Printer.PrinterIndex := pin;
printer.title := 'текст';
Printer.BeginDoc;
try
RR := Rect(.....);
Printer.Canvas.StretchDraw(RR, TA.Picture.Graphic);
finally
Printer.EndDoc;
end;
И все было хорошо. У принтера в настройках стояла бумага А4. Ставили свою бумажку А6 по центру и в RR я делал сдвиг от левого края. Принтерам было по барабану на формат страниц.
Потом нам навязали Ricoh P502. Это очень умные принтеры, они лучше меня знают чего я хочу. Они определяют, что у меня бумажка А6 вместо А4 и отказываются печатать. Да, у них в настройках есть возможность отключить media check, и они, как бы, перестают ругаться и начинают печатать. Но!!! они же умнее меня! Они в таком режиме поворачивают печатаемое содержимое на 90 градусов, и хоть убейся.
Ок, почитал, нашел как прибить к printer. формат бумаги. И перед printer.beginDoc вызываю такую процедурку:
procedure setA6portrait(prnIndex: integer);
var ADevice, ADriver, APort: array[0..255] of char;
ADeviceMode: THandle;
DevMode: PDevMode;
begin
Printer.PrinterIndex := prnIndex;
Printer.GetPrinter(ADevice, ADriver, APort, ADeviceMode);
Printer.SetPrinter(ADevice, ADriver, APort, 0);
Printer.GetPrinter(ADevice, ADriver, APort, ADeviceMode);
DevMode := GlobalLock(ADeviceMode);
if not Assigned(DevMode) then exit;
DevMode^.dmPaperSize := DMPAPER_A6;
DevMode^.dmDuplex := DMDUP_SIMPLEX;
GlobalUnlock(ADeviceMode);
Printer.SetPrinter(ADevice, ADriver, APort, ADeviceMode);
Printer.Orientation := poPortrait;
end;
И таки да, у рикохи все стало нормально. Но теперь другие принтеры, типа, HL-2300 стали оочееньь меедлеенноо крутить своими колесиками. Т.е. печать идет, и печатается все правильно, но не со скоростью 26 страниц в минуту, как заявлено и как раньше было, а, наверное, 5-8 страниц в минуту. Т.е. то, что делается в setA6portrait, включает тормоза.
Как победить?