Pobranie rozmiaru papieru z drukarki

0

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.

0

Spróbuj za pomocą GetDeviceCaps, tak jak tutaj – http://www.scalabium.com/faq/dct0017.htm

0

Sprawdzałem to już wcześniej ale nie szło mi konwertowanie na mm. Rano jeszcze sprawdzę bo teraz głupoty mi wychodzą.

0

Dzięki @furious programming. Z rana od razu lepiej się myśli. GetDeviceCaps działa dobrze. Podaje rozmiar od razu po zmianie drukarki albo papieru. Musiałem tylko użyć innych parametrów (HORZSIZE, VERTSIZE) żeby otrzymać wynik w mm a nie punktach, calach czy pixelach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1