1

我正在使用兄弟标签打印机,这取决于要使用的纸张设置它可能会也可能不会打印彩色(62 毫米 X 100 毫米的纸张让您使用彩色,但 29 毫米 X 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,颜色:红色/黑色)在这种情况下,我希望颜色更改为单色但事实并非如此。

我不知道如何通过代码更改打印机的属性,如果您有任何建议,我将不胜感激。

我使用德尔福 Rio VCL。

4

1 回答 1

0

为了使您对dmColor字段的更改生效,您需要设置除了DM_COLORdmFields之外的DM_PAPERSIZE位:

dmFields := dmFields or DM_PAPERSIZE or DM_COLOR

文档

dm字段

指定是否已初始化 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));
于 2019-05-18T04:16:00.757 回答