Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

печать на сетевой принтер [D5, Win95/98, WinME, NT4, Win2k, WinXP]


Velzevul ©   (2004-10-08 23:41:00) 

Нашёл в форуме такой код для отправки на принтер управляющих кодов принтера:

Var FileOut : TextFile;
   filename : String [128];
   str1 : string;
begin
 filename:='PRN';
 AssignFile(Fileout,Filename);
 Rewrite(fileout);
 Write(FileOut,Chr(27)+'@');
 Str1:=AnToAs(chr(27)+'код'+'параметр');
 Writeln(FileOut,Str1);
 CloseFile(fileout);
end;

{преобразование Ansi to Ascii}

function AnToAs(s: String) : String;
Var i,kod : Integer;
begin
Result:=s;
for i:=1 to length(s) do
begin
 kod:=Ord(s[i]);
 if  kod < 13 then Result[i]:=' ';
 if ( kod>=192) and ( kod<=239) then
    Result[i]:=Chr(kod-64);
 if ( kod>=240) and ( kod<=255) then
    Result[i]:=Chr(kod-16);
 if kod=168 then  Result[i]:=Chr(240);
 if kod=184 then  Result[i]:=Chr(241);
end;
end;


все работает. А как можно отправить управляющие коды на сетевой принтер? Если в данном коде заменить PRN на '\\194.45.85.115\hp',
где hp это расшаренный принтер на компе 194.45.85.115, то эта конструкция срабатывает. Но на тот-же принтер HP, если он работает через свой принт-сервер конструкция не работает. В настройках принтера видно, что он использует Standart TCP/IP port с номером порта 9100. Да и вообще как можно отправить управляющие коды на сетевой принтер средствами Delphi? у меня есть утилиты для этого, но все весьма корявые и хотелось бы самому решить эту проблему - своими силами. Заранее благодарен.


Slym   (2004-10-15 05:30:00) [1]

Загрузка русских шрифтов на сетевой принтер с собственным принт сервером:

Ресурс 'files.res':
FNT FONTS "CRR00CPO.SFS"
CP FONTS "DEFAULT.PJL"

program RuFonts;

{$R 'files.res' 'files.rc'}

uses
 Classes,
 Sockets;

var
 s:TResourceStream;
 TCP:TTcpClient;
begin
 TCP:=TTcpClient.Create(nil);
 try
   TCP.RemoteHost:='192.168.1.10';
   TCP.RemotePort:='9100';
   s:=TResourceStream.Create(0,'FNT','FONTS');
   try
     TCP.Connect;
     TCP.SendStream(s);
     TCP.Disconnect;
   finally
     s.Free;
   end;
   s:=TResourceStream.Create(0,'CP','FONTS');
   try
     TCP.Connect;
     TCP.SendStream(s);
     TCP.Disconnect;
   finally
     s.Free;
   end;
 finally
   TCP.Free;
 end;
end.


Velzevul   (2004-10-14 23:45:00) [2]

Вот он:

unit Passthru;

interface

uses printers, WinProcs, WinTypes, SysUtils;

procedure PrintPC;

implementation

type
 TPassThroughData = record
   nLen: Integer;
   Data: array[0..255] of byte;
 end;

procedure DirectPrint(s: string);
var
 PTBlock: TPassThroughData;
begin
 PTBlock.nLen := Length(s);
 StrPCopy(@PTBlock.Data, s);
 Escape(printer.handle, PASSTHROUGH, 0, @PTBlock, nil);
end;

procedure PrintPC;
begin
 Printer.BeginDoc;
 DirectPrint('...........................');
 Printer.EndDoc;
end;

end.


Velzevul   (2004-10-14 23:45:00) [3]

Вот он:

unit Passthru;

interface

uses printers, WinProcs, WinTypes, SysUtils;

procedure PrintPC;

implementation

type
 TPassThroughData = record
   nLen: Integer;
   Data: array[0..255] of byte;
 end;

procedure DirectPrint(s: string);
var
 PTBlock: TPassThroughData;
begin
 PTBlock.nLen := Length(s);
 StrPCopy(@PTBlock.Data, s);
 Escape(printer.handle, PASSTHROUGH, 0, @PTBlock, nil);
end;

procedure PrintPC;
begin
 Printer.BeginDoc;
 DirectPrint('...........................');
 Printer.EndDoc;
end;

end.


Velzevul   (2004-10-11 21:53:00) [4]

Спасибо KSergey. Пример возьму на заметку - думаю пригодится :). Я ещё нашёл один пример, на котором сделал уже задел, но не проверил - ещё на работе не был ;) Если заработает - сообщу код. Мож кому пригодится.


KSergey   (2004-10-11 10:16:00) [5]

Идея построения кода потырина из PReport

PrName- имя принтера в системе

procedure ....PrintDOS();

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;

begin
 // пример печати
 try
   InitPrinter;
   OutStr('Строка1 в OEM-кодировке');
   OutStr('Строка2 в OEM-кодировке');
   EjectPage;  // если надо выкинуть страницу из принтера
 finally
   // завершающие действия
   if PageStarted then EndPagePrinter(h);
   if DocStarted then EndDocPrinter(h);
   if PrinterOpened then ClosePrinter(h);
 end;
end;


KSergey   (2004-10-11 09:59:00) [6]

К стати, а еще есть PReport, в нем есть визуальный редактор и печать на DOS-принтеры (ну в смысле в режиме использования принтеревского знакогенератора и т.п.). Может есть смысл воспользоваться?


KSergey   (2004-10-11 09:57:00) [7]

> [3] tesseract   (11.10.04 09:37)
> Никак. На Какой х они тебе вообще нужны?

Э, зачэм такой гавариш, а?

> Velzevul ©   (08.10.04 23:41)

Плюнь на эти AssignFile
Используй StartDocPrinter и т.п.

Сейчас примерчик выложу, если интересно


tesseract   (2004-10-11 09:37:00) [8]

Никак. На Какой х они тебе вообще нужны?

Текст ты отправишь не в принтер, а в принт сервер. И он уже будет решать, как там чего тебе позволить/ не позволить.

Можешь попробовать писать напрямую в драйвер ус-ва.
Тогда пройдёт язык поддерживаемый принтером (для HP-
PCL для других другое). Он сам за тебя всё куда надо пошлёт.


Velzevul   (2004-10-09 20:57:00) [9]

Ну мож всетаки кто подскажет, как средствами Delphi передать текст на сетевой принтер?


Velzevul   (2004-10-09 20:57:00) [10]

Ну мож всетаки кто подскажет, как средствами Delphi передать текст на сетевой принтер?


Наверх

Титульная страница Поиск, карта сайта Написать письмо