Newsgroup: it.comp.lang.delphi
Titolo: Problemi con la stampa di una form

Ho in una form una StringGrid, un DateTimePicker, una ComboBox ed altri
componenti, ora dovendo stampare il tutto ho semplicemente eseguito una
Form.Print
Funziona tutto tranne che nell'output manca il testo visualizzato
all'interno della ComboBox.
Vi è mai successo una cosa del genere? Grazie, Brunello.

Brunello ha scritto:

Mi è capitato di avere alcuni problemi con altri controlli visuali, ad 
esempio una *ListView*; credo che questo dipenda dall'effettiva capacità 
di ciascun controllo di "renderizzarsi" (brutto termine) nel contesto 
del dispositivo "stampante".
Non so se esiste una soluzione rapida ed efficace al problema in questi 
termini.
Forse sfruttando una "cattura dello schermo" agendo diversamente, si può 
riuscire ad ottenere correttamente la videata della finestra e del suo 
contenuto.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)
Inviato da X-Privat.Org - Registrazione gratuita 
http://www.x-privat.org/join.php


il problema è trasversale si presenta sia con Delphi5, 7 e 2006 e
affligge il combobox e tutti i vari componenti delle varie librerie che
ne discendono, per il momento ho ovviato utilizzando un componente
simile persente nella jvcl.
Comunque sto cercando di capire la fonte di questo problema, ciao
Brunello.


Prova con questa procedura
procedure PrintForm(Sender : TForm);
var
  FormImage: TBitmap;
  Info: PBitmapInfo;
  InfoSize: DWORD;
  Image: Pointer;
  ImageSize: DWORD;
  Bits: HBITMAP;
  DIBWidth, DIBHeight: Longint;
  PrintWidth, PrintHeight: Longint;
begin
  if Sender is TForm then begin
    Screen.Cursor:=crHourglass;
    try
      FormImage := Sender.GetFormImage;
      Sender.Canvas.Lock;
      try
        with Printer, Canvas do
        begin
          Bits := FormImage.Handle;
          GetDIBSizes(Bits, InfoSize, ImageSize);
          Info := AllocMem(InfoSize);
          try
            Image := AllocMem(ImageSize);
            try
              GetDIB(Bits, 0, Info^, Image^);
              with Info^.bmiHeader do begin
                DIBWidth := biWidth;
                DIBHeight := biHeight;
                if DIBWidth>750 then Printer.Orientation:=poLandscape;      
                Printer.BeginDoc;
              end;
              case Sender.PrintScale of
                poProportional:
                  begin
                    PrintWidth := MulDiv(DIBWidth, GetDeviceCaps(Handle,
                      LOGPIXELSX), Sender.PixelsPerInch);
                    PrintHeight := MulDiv(DIBHeight, GetDeviceCaps(Handle,
                      LOGPIXELSY), Sender.PixelsPerInch);
                  end;
                poPrintToFit:
                  begin
                    PrintWidth := MulDiv(DIBWidth, PageHeight, DIBHeight);
                    if PrintWidth < PageWidth then
                      PrintHeight := PageHeight
                    else
                    begin
                      PrintWidth := PageWidth;
                      PrintHeight := MulDiv(DIBHeight, PageWidth, DIBWidth);
                    end;
                  end;
              else
                PrintWidth := DIBWidth;
                PrintHeight := DIBHeight;
              end;
              StretchDIBits(Canvas.Handle, 0, 0, PrintWidth, PrintHeight,
0, 0,
                DIBWidth, DIBHeight, Image, Info^, DIB_RGB_COLORS, SRCCOPY);
            finally
              FreeMem(Image, ImageSize);
            end;
          finally
            FreeMem(Info, InfoSize);
          end;
        end;
      finally
        Sender.Canvas.Unlock;
        FormImage.Free;
      end;
    finally
      Printer.Title:=Sender.Caption;
      Printer.Canvas.TextOut(20, PrintHeight+40, Sender.Caption);
      Printer.EndDoc;
    end;
    Screen.Cursor:=crDefault;
  end;
end;
Ciao
--- posted by geoForum on 
http://www.delphiedintorni.it

 ha scritto nel messaggio 
news:1150279353.5...@f6g2000cwb.googlegroups.com...

Hai provato col Form1.PrintTo, osserva l'esempio che fanno
Giorgio 


Scusa Giorgio ma non ho capito, la TForm non ha un metodo PrintTo.
Mentre per il suggerimento di Michele ho provato ma senza successo,
comunque tranne per le due righe iniziali
  if Sender is TForm then begin
    Screen.Cursor:=crHourglass;
il codice è uguale a quello richiamato dal metodo Form.Print nella
unit Forms.pas, ciao Brunello.

>Scusa Giorgio ma non ho capito, la TForm non ha un metodo PrintTo.
Hai ragione, ero convinto del contrario.
Subito prima della stampa col metodo .print proverei a richiamare un 
Repaint,
Ciao Giorgio