Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2013, 20:24   #1
bobinventor
Новичок
Джуниор
 
Регистрация: 30.04.2010
Сообщений: 2
По умолчанию Печать на принтере USB MPRINT R58 с помощью ESC/POS в Delphi.

Доброго времени суток.
Подскажите пожалуйста, есть принтер MPRINT R58 в системе определяется как обычный принтер, подключен по USB. Печать с помощью объекта Canvas в TPRINTER идет на ура.
Но так как я новичок, не могу понять как мне печатать с помощью ESC последовательностей. Элементарно если необходимо напечатать штрих код, то с помощью канвы этого не сделать. Есть тестовая программа для кассиров, так она печатает на этом принтере если в настройках указано ESC/POS CP866RU. Причем заметно что печать выполняется ESC/POS командами (чек вылазит быстрее чем это было бы через TPRINTER, либо напрямую через WORD).
Помогите в каком направлении копать.
Буду благодарен любым примерам.
bobinventor вне форума Ответить с цитированием
Старый 16.12.2013, 22:29   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Код:
unit Unit1;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  ComObj,SysUtils, DirectPrintLib_TLB, StdVcl;

type
  TDirectPrint = class(TAutoObject, IDirectPrint)
  protected
    procedure PrintStr(const Str: WideString); safecall;
  end;

implementation

uses Windows,WinSpool,ComServ,Consts;

function GetDefaultPrinterName:string;
  function FetchStr(var Str: PChar): PChar;
  var P: PChar;
  begin
    Result := Str;
    if Str = nil then Exit;
    P := Str;
    while P^ = ' ' do Inc(P);
    Result := P;
    while (P^ <> #0) and (P^ <> ',') do Inc(P);
    if P^ = ',' then
    begin
      P^ := #0;
      Inc(P);
    end;
    Str := P;
  end;
var
  ByteCnt, StructCnt: DWORD;
  DefaultPrinter: array[0..1023] of Char;
  Cur: PChar;
  PrinterInfo: PPrinterInfo5;
begin
  result:='';
  ByteCnt:=0;
  StructCnt:=0;
  if not EnumPrinters(PRINTER_ENUM_DEFAULT,nil,5,nil,0,ByteCnt,StructCnt) and (GetLastError<>ERROR_INSUFFICIENT_BUFFER) then
  begin
    if GetLastError = ERROR_INVALID_NAME then
      raise Exception.Create(SNoDefaultPrinter)
    else
      RaiseLastOSError;
  end;
  PrinterInfo:=AllocMem(ByteCnt);
  try
    if not EnumPrinters(PRINTER_ENUM_DEFAULT,nil,5,PrinterInfo,ByteCnt,ByteCnt,StructCnt) then
      RaiseLastOSError;
    if StructCnt>0 then
      result:=PrinterInfo.pPrinterName
    else begin
      GetProfileString('windows','device','',DefaultPrinter,SizeOf(DefaultPrinter)-1);
      Cur:=DefaultPrinter;
      result:=FetchStr(Cur);
    end;
  finally
    FreeMem(PrinterInfo);
  end;
  if result='' then
    raise Exception.Create(SNoDefaultPrinter);
end;

procedure TDirectPrint.PrintStr(const Str: WideString);
var
  s,PrinterName:string;
  hPrinter:THandle;
  DocInfo:TDocInfo1;
  Len,Writed:DWORD;
begin
  s:=Str;
  Len:=Length(s);
  if Len=0 then exit;
  if s[Len]<>#12 then
  begin
    s:=s+#12;
    inc(Len);
  end;
  PrinterName:=GetDefaultPrinterName;
  if not OpenPrinter(PChar(PrinterName),hPrinter, nil) then RaiseLastOSError;
  try
    DocInfo.pDocName:='DirectPrint';
    DocInfo.pOutputFile:=nil;
    //DocInfo.pDatatype:='RAW';
    DocInfo.pDatatype:='TEXT';

    if StartDocPrinter(hPrinter,1,@DocInfo)=0 then RaiseLastOSError;
    //if not StartPagePrinter(hPrinter) then RaiseLastOSError;
    if not WritePrinter(hPrinter,PChar(s),Len,writed) then RaiseLastOSError;
    if writed<>Len then RaiseLastOSError;
    //if not EndPagePrinter(hPrinter) then RaiseLastOSError;
    if not EndDocPrinter(hPrinter) then RaiseLastOSError;
  finally
    ClosePrinter(hPrinter);
  end;
end;

initialization
  TAutoObjectFactory.Create(ComServer, TDirectPrint, Class_DirectPrint,
    ciMultiInstance, tmApartment);
end.
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 17.12.2013, 17:29   #3
bobinventor
Новичок
Джуниор
 
Регистрация: 30.04.2010
Сообщений: 2
По умолчанию

Спасибо большое, Slym! Только вот пока ума не приложу как этот код использовать.
Создал новое приложение, новый Unit2, в него вставил этот код, но Delphi говорит что не может найти DirectPrintLib_TLB.dcu. В нете таких dcu нет. Соответственно она написана самостоятельно, или я что-то не понимаю?!
Подскажите пожалуйста!
bobinventor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печать текста на принтере Terazoid Общие вопросы Delphi 11 10.10.2010 15:23
Epson Esc/pos Проблема с шрифтами Gigabit Общие вопросы Delphi 0 22.03.2010 11:37
Печать на usb Night_owl Общие вопросы Delphi 10 10.08.2009 15:47
печать на PDF принтере Frost.sapr Мультимедиа в Delphi 1 12.10.2008 23:17
Печать на матричном принтере Dimon Общие вопросы Delphi 1 11.07.2008 13:20