Текущий архив: 2004.11.28;
Скачать: CL | DM;
Внизпечать на сетевой принтер Найти похожие ветки
← →
Velzevul © (2004-10-08 23:41) [0]Нашёл в форуме такой код для отправки на принтер управляющих кодов принтера:
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? у меня есть утилиты для этого, но все весьма корявые и хотелось бы самому решить эту проблему - своими силами. Заранее благодарен.
← →
Velzevul © (2004-10-09 20:57) [1]Ну мож всетаки кто подскажет, как средствами Delphi передать текст на сетевой принтер?
← →
Velzevul © (2004-10-09 20:57) [2]Ну мож всетаки кто подскажет, как средствами Delphi передать текст на сетевой принтер?
← →
tesseract (2004-10-11 09:37) [3]Никак. На Какой х они тебе вообще нужны?
Текст ты отправишь не в принтер, а в принт сервер. И он уже будет решать, как там чего тебе позволить/ не позволить.
Можешь попробовать писать напрямую в драйвер ус-ва.
Тогда пройдёт язык поддерживаемый принтером (для HP-
PCL для других другое). Он сам за тебя всё куда надо пошлёт.
← →
KSergey © (2004-10-11 09:57) [4]> [3] tesseract (11.10.04 09:37)
> Никак. На Какой х они тебе вообще нужны?
Э, зачэм такой гавариш, а?
> Velzevul © (08.10.04 23:41)
Плюнь на эти AssignFile
Используй StartDocPrinter и т.п.
Сейчас примерчик выложу, если интересно
← →
KSergey © (2004-10-11 09:59) [5]К стати, а еще есть PReport, в нем есть визуальный редактор и печать на DOS-принтеры (ну в смысле в режиме использования принтеревского знакогенератора и т.п.). Может есть смысл воспользоваться?
← →
KSergey © (2004-10-11 10:16) [6]Идея построения кода потырина из 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;
← →
Velzevul © (2004-10-11 21:53) [7]Спасибо KSergey. Пример возьму на заметку - думаю пригодится :). Я ещё нашёл один пример, на котором сделал уже задел, но не проверил - ещё на работе не был ;) Если заработает - сообщу код. Мож кому пригодится.
← →
Velzevul © (2004-10-14 23:45) [8]Вот он:
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) [9]Вот он:
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.
← →
Slym (2004-10-15 05:30) [10]Загрузка русских шрифтов на сетевой принтер с собственным принт сервером:
Ресурс "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.
Страницы: 1 вся ветка
Текущий архив: 2004.11.28;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.035 c