Natrafiłem na problem do którego wyczerpały mi się pomysły i rozwiązania z internetu. Tworzę szablon wydruku i potrzebuję rzeczywisty rozmiar papieru wybrany dla danej drukarki, wybór przez standardowy PrinterSetupDialog. Doszedłem do takiego kodu:
var
buffer1 : array[0..250] of char;
buffer2 : array[0..250] of char;
buffer3 : array[0..250] of char;
ADevice, ADriver, APort : pchar;
hDm : THandle;
dm : DEVMODE;
Pdm : ^DEVMODE;
s : string;
i : integer;
begin
Printer.Refresh;
if PrinterSetupDialog1.Execute then
begin
Printer.Refresh;
application.ProcessMessages;
ADevice := buffer1;
ADriver := buffer2;
APort := buffer3;
Printer.GetPrinter(ADevice, ADriver, APort, hDm);
Pdm := GlobalLock (hDm);
showmessage(inttostr(pdm^.dmPaperLength) + ' x ' + inttostr(pdm^.dmPaperWidth));
GlobalUnlock(hDm);
end;
end;
Kod działa w miarę ok. Pokazuje faktyczny rozmiar papieru w mm ale dopiero za drugim razem jeśli wywołam PrinterSetupDialog. Jeśli podczas pierwszego wywołania zmienię rozmiar np. z A4 na A1 to pokażą mi się wymiary A4. Mogę wywoływać powyższy kod nieskończoną ilość razy (bez ponownego wywoływania PrinterSetupDialog) i cały czas będę miał rozmiar dla A4. Nie działa żadne ProcessMessages czy Printer.Refresh. Dopiero jeśli drugi raz odpalę PrinterSetupDialog i zaakceptuję ponownie mój wybór dostaję wymiary A1. Czy ktoś zna jakiś sposób żeby odświeżyć wybrany papier albo w inny sposób dostać się do tej danej? Nie interesuje mnie format papieru (A3, B2 itp.) tylko konkretne wymiary.