Печать на матричном принтере
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Подскажите, пожалуйста, кто чем богат:
Почему следующий код в Делфи не печатает на матричном принтере, а только на струйном и лазерном:
with Printer do
begin
BeginDoc;
Canvas.TextRect(Rect(200,200,PageWidth-200,PageHeight-200), 200, 200, Memo1.Lines.Text);
EndDoc;
end;
И как мне заставить работать на меня матричного динозавра?
Почему следующий код в Делфи не печатает на матричном принтере, а только на струйном и лазерном:
with Printer do
begin
BeginDoc;
Canvas.TextRect(Rect(200,200,PageWidth-200,PageHeight-200), 200, 200, Memo1.Lines.Text);
EndDoc;
end;
И как мне заставить работать на меня матричного динозавра?
Кажется это только подготовка к печати, должна быть команда то ли Print то ли еще как то.
It's a long way to the top if you wanna rock'n'roll
Ну если это только подготовка, почему струйники с лазерными печатают?
Источник: DelphiWorld
Пример вывода текста на печать, используя COM порт
Var
Printer: THandle;
N : Cardinal;
C : POverlapped;
begin
//Открываем порт принтера для записи
Printer := CreateFile(PChar('LPT1'),
GENERIC_READ or GENERIC_WRITE,0,nil,
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
//Печатаем слово 'Hello World';
WriteFile(Printer,'Hello World',11,N,c);
//Закрываем порт
CloseHandle(Printer);
======================================================
Печать через спулер на матричный принтер
var
pcbNeeded: DWORD;
FDevice: PChar;
FPort: PChar;
FDriver: PChar;
FPrinterHandle: THandle;
FDeviceMode: THandle;
FJob: PADDJOBINFO1;
Stream: TFileStream;
begin
GetMem(FDevice, 128);
GetMem(FDriver, 128);
GetMem(FPort, 128);
Printer.GetPrinter(FDevice, FDriver, FPort, FDeviceMode);
if FDeviceMode = 0 then
Printer.GetPrinter(FDevice, FDriver, FPort, FDeviceMode);
if OpenPrinter(FDevice, FPrinterHandle, nil) then
begin
GetMem(FJob, 1024);
//Добавляем задание, получаем имя файла в директории windows\spoool\
AddJob(FPrinterHandle, 1, FJob, 1024, pcbNeeded);
Stream := TFileStream.Create(FJob.Path, fmCreate);
// Дальше пишем текст (+ESC команды!!!!) прямо в Stream
// и не забываем переводить в DOS - кодировку
.........
Stream.Free;
//Постановка задания в очередь - только теперь принтер начинает печатать
ScheduleJob(FPrinterHandle, FJob.JobID);
FreeMem(FJob);
ClosePrinter(FPrinterHandle);
end;
FreeMem(FDevice, 128);
FreeMem(FDriver, 128);
FreeMem(FPort, 128);
end;
Пример вывода текста на печать, используя COM порт
Var
Printer: THandle;
N : Cardinal;
C : POverlapped;
begin
//Открываем порт принтера для записи
Printer := CreateFile(PChar('LPT1'),
GENERIC_READ or GENERIC_WRITE,0,nil,
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
//Печатаем слово 'Hello World';
WriteFile(Printer,'Hello World',11,N,c);
//Закрываем порт
CloseHandle(Printer);
======================================================
Печать через спулер на матричный принтер
var
pcbNeeded: DWORD;
FDevice: PChar;
FPort: PChar;
FDriver: PChar;
FPrinterHandle: THandle;
FDeviceMode: THandle;
FJob: PADDJOBINFO1;
Stream: TFileStream;
begin
GetMem(FDevice, 128);
GetMem(FDriver, 128);
GetMem(FPort, 128);
Printer.GetPrinter(FDevice, FDriver, FPort, FDeviceMode);
if FDeviceMode = 0 then
Printer.GetPrinter(FDevice, FDriver, FPort, FDeviceMode);
if OpenPrinter(FDevice, FPrinterHandle, nil) then
begin
GetMem(FJob, 1024);
//Добавляем задание, получаем имя файла в директории windows\spoool\
AddJob(FPrinterHandle, 1, FJob, 1024, pcbNeeded);
Stream := TFileStream.Create(FJob.Path, fmCreate);
// Дальше пишем текст (+ESC команды!!!!) прямо в Stream
// и не забываем переводить в DOS - кодировку
.........
Stream.Free;
//Постановка задания в очередь - только теперь принтер начинает печатать
ScheduleJob(FPrinterHandle, FJob.JobID);
FreeMem(FJob);
ClosePrinter(FPrinterHandle);
end;
FreeMem(FDevice, 128);
FreeMem(FDriver, 128);
FreeMem(FPort, 128);
end;
печатать я его заставил
но вот другая проблема выскочила в следующем коде:
with Printer do
begin
BeginDoc;
Canvas.TextRect(Rect(SpinEditX.Value,SpinEditY.Value,PageWidth-100,PageHeight-100), SpinEditX.Value, SpinEditY.Value, Edit1.Text);
EndDoc;
end;
при изменении значения SpinEdit на сотню, он перемещает текст по листу, а при изменении на десятки или единицы, он остаётся на месте, кратном сотне
т.е. например значение SpinEditX.Value := 300;
и значение SpinEditX.Value := 351;
печатают текст на одном и том же месте, хотя он должен сместиться на 51 пункт вправо
перескок на следующую сотню просиходит на значении 380
что интересно на струйниках и лазерных этот код работает отменно, но баг такой выскакиевает именно на матричном принтере
кто-нибудь может меня просветить почему и как мне заставить его двигать строчки равномерно?
заранее благодарен
но вот другая проблема выскочила в следующем коде:
with Printer do
begin
BeginDoc;
Canvas.TextRect(Rect(SpinEditX.Value,SpinEditY.Value,PageWidth-100,PageHeight-100), SpinEditX.Value, SpinEditY.Value, Edit1.Text);
EndDoc;
end;
при изменении значения SpinEdit на сотню, он перемещает текст по листу, а при изменении на десятки или единицы, он остаётся на месте, кратном сотне
т.е. например значение SpinEditX.Value := 300;
и значение SpinEditX.Value := 351;
печатают текст на одном и том же месте, хотя он должен сместиться на 51 пункт вправо
перескок на следующую сотню просиходит на значении 380
что интересно на струйниках и лазерных этот код работает отменно, но баг такой выскакиевает именно на матричном принтере
кто-нибудь может меня просветить почему и как мне заставить его двигать строчки равномерно?
заранее благодарен
Может это проблема конкретной модели принтера?
Ни что так не ограничивает фантазию программиста, как компилятор...
...принтер Star LC-8021
И ещё вопрос, как напечатать символ пики (как пика на игральных картах) в кодовой странице 866? Я пробовал вывести на печать все символы с кодами от 0 до 255 и среди них пики не обнаружил, были только троеточия вместо первых 26 символов.
есть ссылка на коды символов кодовой страницы 866 из википедии:
file://localhost/D:/Distrib/!!!/Delphi/Заказы/364519720%20-%20Вывод%20строк%20на%20принтер/CP437%20—%20Википедия.htm
там символ пики стоит под кодом 2660, но если я вывожу на печать символ этого кода, он выводит символ "d", а если вывожу символ кода 4256 (число, которое соответствует шестнадцатеричному 2660), то не выводит ничего
есть ссылка на коды символов кодовой страницы 866 из википедии:
file://localhost/D:/Distrib/!!!/Delphi/Заказы/364519720%20-%20Вывод%20строк%20на%20принтер/CP437%20—%20Википедия.htm
там символ пики стоит под кодом 2660, но если я вывожу на печать символ этого кода, он выводит символ "d", а если вывожу символ кода 4256 (число, которое соответствует шестнадцатеричному 2660), то не выводит ничего