настройки принтера не меняются (winapi: documentproperties) - PullRequest
0 голосов
/ 20 апреля 2020

Язык: delphi 6

Мне удалось открыть диалоговое окно с использованием свойств документа.

Однако я изменил настройки и нажал ОК, но это не изменилось.

Я хочу сменить бумагу на A3.

Скажите, пожалуйста, как это сделать .

код:

var
   FPrinterHandle:THandle;
   aDevice: array[0..255] of char;
   DevMode: PDeviceMode;
   StubDevMode: TDeviceMode;
   DeviceMode: THandle;
begin
   strpcopy(aDevice, Combobox1.Text);
   if OpenPrinter(aDevice,FPrinterHandle,nil) then begin
      DeviceMode := GlobalAlloc(GHND, DocumentProperties(self.handle, FPrinterHandle, ADevice, StubDevMode, StubDevMode, 0));

      if DeviceMode <> 0 then begin
        DevMode := GlobalLock(DeviceMode);
        DocumentProperties(0, FPrinterHandle, ADevice, DevMode^, DevMode^, DM_OUT_BUFFER);

        DevMode^.dmFields := DM_PAPERSIZE;
        DevMode^.dmPaperSize := DMPAPER_A3;
        DocumentProperties(0, FPrinterHandle, ADevice, DevMode^, DevMode^, DM_OUT_BUFFER or DM_IN_BUFFER);

        GlobalUnlock(DeviceMode);
        GlobalFree(DeviceMode);
      end;
   end;
end;

1 Ответ

0 голосов
/ 07 мая 2020

Это не код, который я написал, а откуда-то. Надеюсь, это поможет.

Передайте имя принтера и нужный размер бумаги в качестве параметров. (Я использовал процедуру GetPrinter)

Если параметр (целое число) равен 0, он равен A3, а если он равен 1, то он равен A4.

И когда я печатал файл PDF с помощью shellexecute я проверил, что он печатает в нужном размере.

※ Перед печатью лоток принтера должен быть установлен на «automati c selection».

procedure SetPrinterInfo(APrinterName: PChar; Psize: Integer);
var
  HPrinter : THandle;
  InfoSize, BytesNeeded: Cardinal;
  DevMode: PDeviceMode;
  PI2: PPrinterInfo2;
  PrinterDefaults: TPrinterDefaults;
begin
  with PrinterDefaults do
  begin
    DesiredAccess := PRINTER_ACCESS_USE;
    pDatatype := nil;
    pDevMode := nil;
  end;
  if OpenPrinter(APrinterName, HPrinter, @PrinterDefaults) then
  try
    SetLastError(0);
    //Determine the number of bytes to allocate for the PRINTER_INFO_2 construct...
    if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then
    begin
      //Allocate memory space for the PRINTER_INFO_2 pointer (PrinterInfo2)...
      PI2 := AllocMem(BytesNeeded);
      try
        InfoSize := SizeOf(TPrinterInfo2);
        if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded) then
        begin
          DevMode := PI2.pDevMode;
          DevMode.dmFields := DevMode.dmFields or DM_PAPERSIZE;
          if Psize = 0 then DevMode.dmPaperSize := DMPAPER_A3
          else if Psize = 1 then DevMode.dmPaperSize := DMPAPER_A4;
          PI2.pSecurityDescriptor := nil;

          // Apply settings to the printer
          if DocumentProperties(0, hPrinter, APrinterName, PI2.pDevMode^,
                                PI2.pDevMode^, DM_IN_BUFFER or DM_OUT_BUFFER) = IDOK then
          begin
            SetPrinter(HPrinter, 2, PI2, 0);  // Ignore the result of this call...
          end;
        end;
      finally
        FreeMem(PI2, BytesNeeded);
      end;
    end;
  finally
    ClosePrinter(HPrinter);
  end;
end;
...