打印机忽略纸张颜色变化

时间:2019-05-17 17:19:55

标签: delphi vcl delphi-10.3-rio

我正在使用兄弟标签打印机,具体取决于使用的纸张设置,它可能无法或不能以彩色打印(62mm X 100mm的纸张允许您使用彩色,而29mm X 90mm的纸张只能使用单色)。

因此,为了节省时间和精力给用户,我想在运行时通过代码(纸张大小,颜色/单色)配置这些属性。

我有一个复选框,用于选择单色或彩色以及从FastReport中获取的纸张尺寸。

主要问题是,当我尝试更改这些属性时,纸张尺寸的确已被修改,但是color属性似乎被忽略了或因为它根本没有变化。

我通过在运行以下代码之前和之后显示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 :(得分:0)

要使对dmColor字段的更改生效,除了DM_COLOR位以外,还需要设置dmFields的{​​{1}}位:

DM_PAPERSIZE

documentation

  

dmFields

     

指定DEVMODE结构的某些成员是否已初始化。如果成员已初始化,则将其相应的位置1,否则将清除该位。驱动程序仅支持那些适用于打印机或显示技术的DEVMODE成员。

您的打印机驱动程序未考虑对dmFields := dmFields or DM_PAPERSIZE or DM_COLOR 字段所做的更改,因为您没有设置相应的dmColor位(dmFields)。


编辑,添加代码以检查DEVMODE结构:

您可以使用以下代码(注意!不完整,但足以用于当前讨论):

DM_COLOR