Я использую принтер этикеток, который в зависимости от используемой бумаги может печатать или не печатать в цвете (бумага 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.