Отправка специальных команд принтера

У меня есть проблема, которая заключается в том, что я пытаюсь закодировать данные магнитной полосы на принтер Fargo DTC400, в спецификациях которого указано, что мне нужно отправить следующие строковые команды из примера блокнота, WordPad и т. Д. И т. Д .:

~1%TRACK NUMBER ONE?
~2;123456789?
~3;123456789?

В этом примере кодируется строка на первой дорожке, а номера 123456789 на дорожках 2 и 3 .. это работает из Notepad.exe.

РЕДАКТИРОВАТЬ: Текущий код Delphi, который я использую, работает на другом принтере:

procedure SendQuote(MyCommand : AnsiString);
var
  PTBlock       : TPassThrough;

begin
  PTBlock.nLen := Length(MyCommand);
  StrPCopy(@PTBlock.SData, MyCommand);
  Escape(printer.handle, PASSTHROUGH, 0, @PTBlock, nil);
end;

когда я пытаюсь закодировать эту строку из моего собственного приложения, у меня возникают проблемы, кажется, что принтер полностью игнорирует мои команды, когда я выбираю печать в файл, я могу прочитать двоичные данные и увидеть свою строку в напечатанном файле, когда я попробуйте распечатать в файл из примера notepad.exe Я получаю только бинарные двоичные данные и не могу найти мои строки вообще ...

так что мне интересно, что делает блокнот для отправки этой строковой команды, которую я не делаю?

надеюсь, что кто-то сможет пролить свет на это, потому что я стремился реализовать поддержку фарго в своем приложении в течение более длительного периода времени.

Спасибо

Обновить. следующий код является древним, но он выполняет свою работу, однако есть ли другой способ, которым я могу использовать это с кодом Passthrough выше?

var
  POutput: TextFile;
  k: Integer;
begin
  with TPrintDialog.Create(self) do
  try
    if Execute then
    begin
      AssignPrn(POutput);
      Rewrite(POutput);

      Writeln(POutput,'~1%TESTENCODER?');
      Writeln(POutput,'~2;123456789?');
      Writeln(POutput,'~2;987654321?');
      CloseFile(POutput);
    end;
  finally
    free;
  end
end;
 Plastkort21 мар. 2012 г., 23:28
@LU RD, я бы использовал текстовые файлы, если бы не одна вещь. Я также буду требовать отправки растрового изображения на принтер, и объединение этого не будет работать так хорошо, я думаю, у моего приложения есть две опции: только кодирование и кодирование вместе с растровым изображением. единичное кодирование - без проблем использовать текстовый файл, но вместе с растровым изображением мне приходится совмещать его с begindoc и enddoc
 Warren P21 мар. 2012 г., 22:21
Что делает реализация TPassthrough, в конце концов. Вы показываете что-то на высоком уровне, о котором никто здесь не может вам ничего рассказать. У вас есть исходный код. Выполняйте его (один шаг), пока не найдете либо вызов API Win32, либо что-то достаточно низкое, чтобы люди могли помочь вам лучше понять его. Прямо сейчас показ одного из ваших классов, который вызывает другой из ваших классов (TPassthrough-что это?), Не несет ответственности.
 Warren P21 мар. 2012 г., 21:27
Это сайт по вопросам программирования. Пожалуйста, расскажите мне, что вы делаете в своем коде Delphi. Как ты печатаешь? Не заставляйте нас догадываться, что вы делаете неправильно. Покажите нам, как вы печатаете. Я бы проверил запись в порт принтера как этот. Смотрите эту ссылку для сырой печати информации.efg2.com/Lab/Library/Delphi/Printing/index.html
 Plastkort21 мар. 2012 г., 22:07
да, я забыл вставить код, который я использую, извините :) Я обновил его сейчас
 LU RD21 мар. 2012 г., 22:21
Что не так с использованиемTextFile выход ? Похоже, ясное и простое решение.

Ответы на вопрос(1)

Решение Вопроса

TPassThrough должен быть объявлен так:

type 
  TPassThrough = packed record 
    nLen  : SmallInt; 
    SData : Array[0..255] of AnsiChar; 
  end; 

Возможно, вы используете современный Delphi (2009 или новее) или забыли упакованную директиву.

Смотрите также этот вопрос дляправильный путь-к-посыла команд-непосредственно к принтеру.

ВТорри-х Вот пример фрагмента (написанный Фатихом Олчером): Примечание: модифицирован для использования также с версиями Unicode Delphi.

{
  By using the Windows API Escape() function,
  your application can pass data directly to the printer.
  If the printer driver supports the PASSTHROUGH printer escape,
  you can use the Escape() function and the PASSTHROUGH printer escape
  to send native printer language codes to the printer driver.
  If the printer driver does not support the PASSTHROUGH printer escape,
  you must use the DeviceCapabilities() and ExtDevMode() functions instead.


  Mit der Windows API Funktion Escape() kann man Daten direkt zum Drucker schicken.
  Wenn der Drucker Treiber dies nicht unterstützt, müssen die DeviceCapabilities()
  und ExtDevMode() Funktionen verwendet werden.
}

//  DOS like printing using Passthrough command
// you should use "printer.begindoc" and "printer.enddoc"

type
  TPrnBuffRec = packed record
  bufflength: Word;
  Buff_1: array[0..255] of AnsiChar;
end;

function DirectToPrinter(S: AnsiString; NextLine: Boolean): Boolean;
var 
  Buff: TPrnBuffRec;
  TestInt: Integer;
begin
  TestInt := PassThrough;
  if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TESTINT), @testint, nil) > 0 then
  begin
    if NextLine then  S := S + #13 + #10;
    StrPCopy(Buff.Buff_1, S);
    Buff.bufflength := StrLen(Buff.Buff_1);
    Escape(Printer.Canvas.Handle, Passthrough, 0, @buff, nil);
    Result := True;
  end
  else
    Result := False;
end;

// this code works if the printer supports escape commands
// you can get special esc codes from printer's manual

//  example:
printer.BeginDoc;
try
  DirectToPrinter('This text ');
finally
  printer.EndDoc;
end;
 Plastkort21 мар. 2012 г., 23:27
Завтра я посмотрю на стековую страницу :) Сейчас уже слишком поздно, спасибо за все, продолжу тестирование
 Plastkort22 мар. 2012 г., 20:04
да здесь тоже самое. это очень странно, я не знаю, с чего начать искать прямо сейчас :( вышеупомянутая процедура не сработала, я отправляю это после begindoc и перед enddoc
 Plastkort21 мар. 2012 г., 23:26
да, я пытаюсь сделать все, чтобы Unicode, но Unicode на самом деле не нужен для этой части, так как магнитные полосы ограничены ascii-символами ... хотя я попробовал это объявление, но ничего не изменилось ... кажется, строки отправляются в другом путь
 LU RD22 мар. 2012 г., 19:41
Согласно таблице ASCII символ ~ 126. Остальные находятся между # 32 и # 95. Я не могу понять, почему это может быть проблемой кодирования.
 Plastkort22 мар. 2012 г., 18:24
Сегодня я больше тестировал alittlebit, в другой программе, notepad ++, он также может кодировать мой принтер, и из поддержки Fargo я делаю правильные вещи, но может ли это быть проблемой кодировки символов?

Ваш ответ на вопрос