Страница 1 из 1

Печать на матричном принтере

Добавлено: 11 июл 2008, 13:59
Dim...ON
Подскажите, пожалуйста, кто чем богат:
Почему следующий код в Делфи не печатает на матричном принтере, а только на струйном и лазерном:

with Printer do
begin
BeginDoc;
Canvas.TextRect(Rect(200,200,PageWidth-200,PageHeight-200), 200, 200, Memo1.Lines.Text);
EndDoc;
end;

И как мне заставить работать на меня матричного динозавра?

Re: Печать на матричном принтере

Добавлено: 11 июл 2008, 16:01
somewhere
Кажется это только подготовка к печати, должна быть команда то ли Print то ли еще как то.

Re: Печать на матричном принтере

Добавлено: 14 июл 2008, 08:14
Dim...ON
Ну если это только подготовка, почему струйники с лазерными печатают?

Re: Печать на матричном принтере

Добавлено: 15 июл 2008, 17:51
proglamer
Источник: 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;

Re: Печать на матричном принтере

Добавлено: 30 июл 2008, 11:37
Dim...ON
печатать я его заставил
но вот другая проблема выскочила в следующем коде:

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

что интересно на струйниках и лазерных этот код работает отменно, но баг такой выскакиевает именно на матричном принтере

кто-нибудь может меня просветить почему и как мне заставить его двигать строчки равномерно?
заранее благодарен

Re: Печать на матричном принтере

Добавлено: 30 июл 2008, 15:22
MOTOCoder
Может это проблема конкретной модели принтера?

Re: Печать на матричном принтере

Добавлено: 30 июл 2008, 21:38
Dim...ON
...принтер Star LC-8021

Re: Печать на матричном принтере

Добавлено: 03 авг 2008, 12:03
Dim...ON
И ещё вопрос, как напечатать символ пики (как пика на игральных картах) в кодовой странице 866? Я пробовал вывести на печать все символы с кодами от 0 до 255 и среди них пики не обнаружил, были только троеточия вместо первых 26 символов.
есть ссылка на коды символов кодовой страницы 866 из википедии:
file://localhost/D:/Distrib/!!!/Delphi/Заказы/364519720%20-%20Вывод%20строк%20на%20принтер/CP437%20—%20Википедия.htm
там символ пики стоит под кодом 2660, но если я вывожу на печать символ этого кода, он выводит символ "d", а если вывожу символ кода 4256 (число, которое соответствует шестнадцатеричному 2660), то не выводит ничего