Принтер игнорирует изменение цвета бумаги - PullRequest
0 голосов
/ 17 мая 2019

Я использую принтер этикеток, который в зависимости от используемой бумаги может печатать или не печатать в цвете (бумага 62 мм х 100 мм позволяет использовать цвет, но 29 мм х 90 мм допускает только монохромный).

Итак, чтобы сэкономить время и усилия пользователя, я хочу настроить эти свойства во время выполнения по коду (Размер бумаги, Цвет / монохромный).

У меня есть флажок для выбора монохромного или цветного и формата бумаги, который я получаю из FastReport.

Основная проблема заключается в том, что когда я пытаюсь изменить эти свойства, размер бумаги действительно изменяется, но свойство цвета, похоже, просто игнорируется или что-то в этом роде, потому что оно вообще не меняется.

Я проверяю это, показывая PrinterSetupDialog до и после запуска следующего кода:

 procedure TEtiquetas.pruebas2Click(Sender: TObject);
var
Device, Driver, Port: array[0..80] of Char;
DevMode: THandle;
pDevmode: PDeviceMode;
begin
  ReportePrueba.PrintOptions.Clear;
 {Get printer device name etc.}
  Printer.GetPrinter(Device, Driver, Port, DevMode);
  {force reload of DEVMODE}
  Printer.SetPrinter(Device, Driver, Port, 0);
  {get DEVMODE handle}
  Printer.GetPrinter(Device, Driver, Port, DevMode);
  if Devmode <> 0 then
  begin
    {lock it to get pointer to DEVMODE record}
    pDevMode := GlobalLock(Devmode);
    if pDevmode <> nil then
    try
      with pDevmode^ do
      begin
      ShowMessage('Color: '+dmColor.ToString);// to check the color configured
        if monocromo.Checked then
        begin
          dmColor:= DMCOLOR_MONOCHROME;
          dmFields := dmFields or DM_PAPERSIZE or DM_COLOR;
        end
        else
        begin
          dmColor:= DMCOLOR_COLOR;
          dmFields := dmFields or DM_PAPERSIZE or DM_COLOR;
        end;
        {tell printer driver that dmPapersize field contains data it needs to inspect}
        dmFields := dmFields or DM_PAPERSIZE or DM_COLOR;
        {modify paper size}
        dmPapersize := TfrxReportPage(ReportePrueba.FindObject('Page1')).PaperSize; //FastReport
        ShowMessage('Color: '+dmColor.ToString);//checking the color again and it does change
      end;

      Printer.SetPrinter(Device, Driver, Port, DevMode);
    finally
     PrinterSetup.Execute;
    {unlock DEVMODE handle}
    GlobalUnlock(Devmode);
    ReportePrueba.PrintOptions.Printer:= Printer.Printers[Printer.PrinterIndex];// setting the report's printer
    end;
  end;

end; 

когда я показываю PrinterSetupDialog перед выполнением описанной выше процедуры, мне не нужны ни размер, ни цвет бумаги (скажем, бумага: 62 X 100, цвет: красный / черный)

и после запуска процедуры я получаю правильную бумагу, поэтому она изменяет принтер, но цвет полностью игнорируется (скажем, бумага: 29 X 90, цвет: красный / черный), в этом случае я хотел, чтобы цвет изменить на монохромный, но это не так.

Я понятия не имею, как изменить свойства принтера по коду, если у вас есть какие-либо советы, я буду очень признателен.

Я использую Delphi Rio VCL.

1 Ответ

0 голосов
/ 18 мая 2019

Чтобы изменения в поле dmColor вступили в силу, вам необходимо установить DM_COLOR бит dmFields в дополнение к DM_PAPERSIZE биту:

dmFields := dmFields or DM_PAPERSIZE or DM_COLOR

Из документации

dmFields

Указывает, были ли инициализированы определенные члены структуры DEVMODE. Если элемент инициализирован, устанавливается соответствующий ему бит, в противном случае этот бит сбрасывается. Драйвер поддерживает только те элементы DEVMODE, которые соответствуют технологии принтера или дисплея.

Ваш драйвер принтера не учел ваши изменения в поле dmColor, поскольку вы не установили соответствующий бит dmFields (DM_COLOR).


Редактирование, добавление кода для проверки структуры DEVMODE:

Вы можете использовать следующий код ( ПРИМЕЧАНИЕ! Неполный , но достаточный для текущего обсуждения):

// insert into your code into the `try` block after `if pDevmode <> nil then`
....
    if pDevmode <> nil then
    try
      Memo1.Lines.Add('Devmode read');
      Memo1.Lines.Add('');

      Memo1.Lines.Add('dmSpecVersion:          '+IntToStr(pDevMode.dmSpecVersion));
      Memo1.Lines.Add('dmDriverVersion:        '+IntToStr(pDevMode.dmDriverVersion));
      Memo1.Lines.Add('dmSize, public:         '+IntToStr(pDevMode.dmSize));
      Memo1.Lines.Add('dmDriverExtra, private: '+IntToStr(pDevMode.dmDriverExtra));
      Memo1.Lines.Add('dmOrientation:          '+IntToStr(pDevMode.dmOrientation));
      ...
      Memo1.Lines.Add('dmColor:                '+IntToStr(pDevMode.dmColor));
...