Newsgroup: it.comp.lang.delphi
Titolo: Ottenere le dimensioni della pagina di stampa

Sto cercando di ricavare (NON di impostare) le dimensioni della pagina di
stampa, in millimetri (o pollici, o unità logiche, non cambia molto). 
In pratica vorrei che, se l'utente ha impostato il formato A4 nel driver
della stampante, potessi avere le dimensioni del foglio selezionato.
Cercando con google ho trovato due metodi, ma nessuno dei due sembra
funzionare:
var Device,
    Driver,
    Port        : array[0..128] of char;
    PrnDC       : HDC;
    hPrnMode    : THandle;
    pPrnMode    : PDevMode;
    papersizeMM  : TPoint; {holds the current papersize in mm}
begin
  Printer.GetPrinter(Device,Driver,Port,hPrnMode);
  pPrnMode:=GlobalLock(hPrnMode);
  PrnDC:=CreateDC(Driver,Device,Port,pPrnMode);
  GlobalUnlock(hPrnMode);
  with papersizeMM do begin
    x:=GetDeviceCaps(PrnDC,PHYSICALWIDTH); //HORZSIZE);
    y:=GetDeviceCaps(PrnDC,PHYSICALHEIGHT); //VERTSIZE);
  end;
  DebugOut('X: ' + IntToStr(papersizeMM.X) );
  DebugOut('Y: ' + IntToStr(papersizeMM.Y) );
  DeleteDC(PrnDC);
  Refresh;
end;
Questo mi ritorna sempre 850x1100 (e questo valore cambia da stampante a
stampante), indipendentemente dal tipo di carta selezionata.
Quest'altro metodo invece mi ritorna sempre 0x0 (dmPaperWidth e
dmPaperHeight)
var
  PrtrName : string;
  hPrinter : THandle;
  PtrPrtrInfo2 : PPrinterInfo2;
  LenPrtrInfo2, Needed : integer;
begin
  OpenPrinter(PChar(PENTA_PRINTER_NAME), hPrinter, nil);
  LenPrtrInfo2 := 0;
  WinSpool.GetPrinter(hPrinter, 2, PtrPrtrInfo2, 0, @Needed);
  PtrPrtrInfo2 := AllocMem(Needed);
  WinSpool.GetPrinter(hPrinter, 2, PtrPrtrInfo2, Needed, @Needed);
  with PtrPrtrInfo2^.pDevMode^ do begin
    DebugOut('PrinterName : ' + string(PtrPrtrInfo2^.pPrinterName));
    DebugOut('DevMode size : ' + IntToStr(dmSize));
    DebugOut('TDevMode size : ' + IntToStr(SizeOf(TDevMode)));
    DebugOut('Paper : ' + IntToStr(dmPaperLength) + ' x ' +
             IntToStr(dmPaperWidth));
  end;
  FreeMem(PtrPrtrInfo2);
  ClosePrinter(hPrinter);
end;
Magari mi sto perdendo in un bicchier d'acqua...avete qualche idea?
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
Ogni uomo mente, ma dategli una maschera e sarà sincero (Oscar Wilde)

Lis 
www.alessandroghezzi.it
	Ciao
	MassimoB
 
---------------------------------
http://www.massimobeschi.it/
---------------------------------
Se tu pagare come dici tu ...
Io lavorare come dico io ...
Se tu pagare come dico io ...
Io lavorare come dici tu ...
---------------------------------

 forse si :P
Mmm...il tuo metodo funziona, ma solo se cambio il foglio con la PrintDialog
all'interno della mia applicazione. Se cambio il foglio dal printer driver
(Pannello di controllo -> stampanti -> ..) vedo sempre il formato di
default, Letter nel mio caso. Ho provato sia con il nostro driver virtuale,
sia con due stampanti di rete (non ne ho nessuna collegata direttamente)
Il bicchiere d'acqua sembra un pò più fondo :)
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
La prima necessità dell'uomo è il superfluo (Albert Einstein)

 ha scritto nel messaggio
news:1we8ozey...@lis.lis.lis...
: On Tue, 5 Jul 2005 12:55:11 +0200, MassimoB wrote:
: Mmm...il tuo metodo funziona, ma solo se cambio il foglio con la
PrintDialog
: all'interno della mia applicazione. Se cambio il foglio dal printer driver
: (Pannello di controllo -> stampanti -> ..) vedo sempre il formato di
: default, Letter nel mio caso. Ho provato sia con il nostro driver
virtuale,
: sia con due stampanti di rete (non ne ho nessuna collegata direttamente)
Rinfresca (bella traduzione, eh ?) l'oggetto Printer
Io ho derivato 'na classe direttamente da TPrinter e gli ho aggiunto il
metodo ReLoadPrinters
[CODE]
procedure TMyPrinter.ReLoadPrinters;
 begin
  FPrinters.Free;
  FPrinters := nil;
  GetPrinters;
  end;
[/CODE]
Può andare ?
Andrea

 metodo ReLoadPrinters
Giusto, ho dimenticato di precisare meglio: non ho provato a rinfrescare
l'oggetto printer, ma prima di cambiare il formato del foglio uscivo dal
programma e lo riavviavo dopo averlo cambiato...penso sia sufficiente, no?
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
Se un po' di sincerità è pericolosa, molta sincerità è addirittura fatale
(Oscar Wilde)

 ha scritto nel messaggio
news:t5571u7afa1w$.dlg@lis.lis.lis...
: On Tue, 05 Jul 2005 13:27:28 GMT, phora wrote:
:
:
: Giusto, ho dimenticato di precisare meglio: non ho provato a rinfrescare
: l'oggetto printer, ma prima di cambiare il formato del foglio uscivo dal
: programma e lo riavviavo dopo averlo cambiato...penso sia sufficiente, no?
:
Mmmmmm, sì direi di sì.
Non è che Printer è impostato sulla stampante "predefinita" e tu, invece,
lavori con un'altra stampante ?
Se usi PrintDialogSetup o simili, modifichi anche la stampante cui "punta"
printer ...
Se usi Printer "nudo e crudo", allora lavori con al stampante "predefinita"
Andrea

Vedi se questa ti puo' essere di aiuto
Ciao,
David
Procedure Calcola_Dimenzioni(Stampante : TPrinter; Var XPixel_x_cm, 
YPixel_x_cm : Integer);
Var
   H, W : Real;
Begin
   // ---------------------------------------------------
   // Dimensione area stampabile
   // (tiene conto dei margini non stampabili impostati)
   // ---------------------------------------------------
   H := GetDeviceCaps(Stampante.Handle, VERTSIZE);
   W := GetDeviceCaps(Stampante.Handle, HORZSIZE);
   // -------------------------------------------------------
   // E' Necessario dividere x 10 per ottenere i centimentri
   // -------------------------------------------------------
   H := H / 10.0;
   W := W / 10.0;
   // ---------------------------------------------------
   // In caso di errore il default e' il formato A4
   // con dimensione aree non stampabili uguali a zero
   // ---------------------------------------------------
   If H = 0 Then H := 29.7;
   If W = 0 Then W := 21.0;
   // ---------------------------------------------------
   // Pixel per centimetro (In base alla programmazione)
   // ---------------------------------------------------
   YPixel_x_cm := Round(Stampante.Pageheight/H);
   XPixel_x_cm := Round(Stampante.PageWidth/W);
End;

 Se usi Printer "nudo e crudo", allora lavori con al stampante "predefinita"
Esatto, quindi cambiavo anche la stampante di default
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
Gli Dei hanno dato agli uomini due orecchie e una bocca per poter ascoltare
il doppio e parlare la metà (Talète)

    W := GetDeviceCaps(Stampante.Handle, HORZSIZE);
Grazie, questo non č molto diverso dal mio primo metodo:
    x:=GetDeviceCaps(PrnDC,PHYSICALWIDTH); //HORZSIZE);
    y:=GetDeviceCaps(PrnDC,PHYSICALHEIGHT); //VERTSIZE);
Come si vede dal commento, prima di provare con PHYSICALWIDTH) avevo provato
anche con HORZSIZE
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
Wellington č un pessimo generale. Prevedo la vittoria entro l'ora di pranzo
(Napoleone Bonaparte)