我正在使用兄弟标签打印机,具体取决于使用的纸张设置,它可能无法或不能以彩色打印(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。
答案 0 :(得分:0)
要使对dmColor
字段的更改生效,除了DM_COLOR
位以外,还需要设置dmFields
的{{1}}位:
DM_PAPERSIZE
dmFields
指定DEVMODE结构的某些成员是否已初始化。如果成员已初始化,则将其相应的位置1,否则将清除该位。驱动程序仅支持那些适用于打印机或显示技术的DEVMODE成员。
您的打印机驱动程序未考虑对dmFields := dmFields or DM_PAPERSIZE or DM_COLOR
字段所做的更改,因为您没有设置相应的dmColor
位(dmFields
)。
编辑,添加代码以检查DEVMODE结构:
您可以使用以下代码(注意!不完整,但足以用于当前讨论):
DM_COLOR