![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Печать на матричном принтере из Delphi [D6, WinXP]
maddognt © (2004-11-27 14:19:00)Здравствуйте Уважаемые мастера
Я печатаю на матричном принтере (Epson LX 300) из Delphi следующим способом:
with Printer do
begin
BeginDoc;
Canvas.TextRect(Rect(20,20,PageWidth-10,PageHeight-10),
20, 20, 'Some text');
EndDoc;
end;
Проблема в том, что принтер печатает текст в два прохода каретки.
А я хочу в один. Если на принтере принудительно выставить шрифт Draft, то при посылке на печать он все равно переходит в режим Roman.
Как заставить принтер печатать текст в один проход каретки?
Пробовал способ из FAQ, но он тоже не помог.
Заранее благодарен.
KSergey (2004-11-29 06:58:00) [1]Особо чистить было лень
var
DocInfo : DOC_INFO_1;
h : Cardinal;
PrinterOpened,DocStarted,PageStarted : boolean;
// вывести строку
procedure OutStr (AStr: String);
var
BytesWritten : cardinal;
begin
AStr := AStr + #13#10;
WritePrinter (h, PChar(AStr), Length(AStr), BytesWritten);
end;
// выкинуть страницу
procedure EjectPage;
const
EJECT_PAGE_CODE: String = #12;
var
BytesWritten : cardinal;
begin
WritePrinter (h, PChar(EJECT_PAGE_CODE), Length(EJECT_PAGE_CODE), BytesWritten);
end;
procedure InitPrinter;
begin
// подготовка
PrinterOpened:=false;
DocStarted :=false;
PageStarted :=false;
if not OpenPrinter(PChar(PrName),h,nil) then
raise Exception.Create (SysErrorMessage(GetLastError ));
PrinterOpened := TRUE;
DocInfo.pDocName := PChar(Application.MainForm.Caption);
DocInfo.pOutputFile:=nil;
DocInfo.pDatatype :='RAW';
if StartDocPrinter(h,1,@DocInfo)=0 then
raise Exception.Create (SysErrorMessage(GetLastError ));
DocStarted := TRUE;
PageStarted := StartPagePrinter(h);
if not PageStarted then
raise Exception.Create (SysErrorMessage(GetLastError ));
end;
-------- собственно пример печати ----------
try
InitPrinter;
// здесь пошла печать по строкам
OutStr('Текст');
OutStr('Текст 2');
OutStr('Текст 3');
// EjectPage; // если надо выкинуть страницу
finally
// завершающие действия
if PageStarted then EndPagePrinter(h);
if DocStarted then EndDocPrinter(h);
if PrinterOpened then ClosePrinter(h);
end;
KSergey (2004-11-28 14:15:00) [2]Хоть что с нимделай - все равно будет печатать в графическом режиме. Т.е. медленно и не в один проход. Вы же, думаю, хотите в текстовом, родными шрифтами принтера.
Посмотрите PReport, там это есть. (ручками - ф-ции, увы, не помню. есть желание - шлите мыло, отпишу краткий примерчик)
maddognt (2004-11-28 11:20:00) [3]font.size я менял, это не помогло.
А как поставить черновое качество?
В драйвере для lx 300 под winxp я нашел какие то дополнительные возможности печати и добился чтобы принтер печатал в один проход, а в драйвере под win98 ничего подобного нет. Сделал минимальное качество печати, но он все равно печатает в несколько проходов.
programania (2004-11-27 23:17:00) [4]Матричный принтер таким способом
печатает в графическом режиме т.е. по точкам, очень медленно
и за 1 проход, если у него хватит иголок на высоту шрифта,
а шрифт берется из printer.canvas.font и
выставлять что-то на принтере бесполезно,
можно попробовать уменьшить font.size или
поставить черновое качество.
Но быстрее всего печать будет, если писать
символы в LPT как в DOS.
Если NT,XP то смотрите http://www.specosoft.com