Newsgroup: it.comp.lang.delphi
Titolo: [D5] Stampa controllo ListView

Salve a tutti!
Qualcuno è al corrente dell'esistenza di un metodo per stampare agevolmente
il contenuto di un controllo ListView senza dover ricorrere
all'impaginazione via codice della stampa tramite il metodo Canvas.Printer?
Grazie in anticipo per ogni eventuale risposta.
--
/\/\arco Breveglieri (
ma...@abls.it
)
· SINTESI S.r.l. (
www.sintesi.com
)
· ABLS Team (
www.abls.it
)

 all'impaginazione via codice della stampa tramite il metodo
Canvas.Printer?
Vuoi stampare il controllo o semplicemente le stringhe contenute?
Nel primo caso allego il codice che avevo postato tempo fa, e che e'
mutuato da qual che fa Delphi quando si chiama TForm.Print +/-
Nel secondo caso metterei le stringhe in un TStringList e poi userei uno
dei metodi gia' illustrati
Saluti
Paolo Arosio
ps:
MSX, puoi metterlo nelle FAQ, se credi
// ------------------ codice -------------------------
procedure TForm1.GetControlImage(const WhichCtrl: TWinControl; var
DestBmp: TBitmap);
begin
  if not Assigned(DestBmp) then Exit;
  DestBmp.Width := WhichCtrl.ClientWidth;
  DestBmp.Height := WhichCtrl.ClientHeight;
  DestBmp.Canvas.Brush := Brush;
  DestBmp.Canvas.FillRect(WhichCtrl.ClientRect);
  DestBmp.Canvas.Lock;
  try
    PaintTo(DestBmp.Canvas.Handle, -WhichCtrl.Left-3, -WhichCtrl.Top-3);
  finally
    DestBmp.Canvas.Unlock;
  end;
end;
procedure TForm1.PrintControlToPrinter(const whichctrl: TWinControl;
FullPage: boolean = True);
var
  SourceImage: TBitmap;
  Info: PBitmapInfo;
  InfoSize: DWORD;
  Image: Pointer;
  ImageSize: DWORD;
  Bits: HBITMAP;
  DIBWidth, DIBHeight: Longint;
  PrintWidth, PrintHeight: Longint;
  OrigX, OrigY: Longint;
begin
  Printer.BeginDoc;
  try
    // a) ricavare immagine del controllo su un bitmap in memoria
    SourceImage := TBitmap.Create;
    try
      GetControlImage(whichctrl, SourceImage);
      Image1.Picture.Assign(SourceImage);   // "anteprima"
      Canvas.Lock;
      try
        // b) ricavane un DIB
          // b1) dimensioni strutture info/img
        Bits := SourceImage.Handle;
        GetDIBSizes(Bits, InfoSize, ImageSize);
          // b2) allocazione strutture
        Info := AllocMem(InfoSize);
        try
          Image := AllocMem(ImageSize);
          try
            // b3) ecco qua il DIB
            GetDIB(Bits, 0, Info^, Image^);
            with Info^.bmiHeader do
            begin
              DIBWidth := biWidth;
              DIBHeight := biHeight;
            end;
            // prepara dimensioni per stampa
            OrigX := MulDiv(200, GetDeviceCaps(Printer.Handle,
LOGPIXELSX), 254);
            OrigY := MulDiv(200, GetDeviceCaps(Printer.Handle,
LOGPIXELSY), 254);
            if FullPage then begin
              PrintWidth := Printer.PageWidth - 2 * OrigX;
              PrintHeight := MulDiv(DIBHeight, PrintWidth, DIBWidth);
              if PrintHeight > Printer.PageHeight then
                PrintHeight := Printer.PageHeight - 2 * OrigY;
            end
            else begin
              PrintWidth := MulDiv(DIBWidth, GetDeviceCaps(Printer.Handle,
LOGPIXELSX),
                GetDeviceCaps(Canvas.Handle, LOGPIXELSX));
              PrintHeight := MulDiv(DIBHeight,
GetDeviceCaps(Printer.Handle, LOGPIXELSY),
                GetDeviceCaps(Canvas.Handle, LOGPIXELSY));
            end;
            // Stampa!
            StretchDIBits(Printer.Canvas.Handle, OrigX, OrigY,
              PrintWidth, PrintHeight, 0, 0,
              DIBWidth, DIBHeight,
              Image, Info^, DIB_RGB_COLORS, SRCCOPY);
          finally
            FreeMem(Image, ImageSize);
          end;
        finally
          FreeMem(Info, InfoSize);
        end
      finally
        Canvas.Unlock;
      end;
    finally
      SourceImage.Free;
    end;
  finally
    Printer.EndDoc;
  end;
end;


Solo una curiosità: stampando il controllo come illustrato nel primo metodo
(quello analogo alla stampa di una form), cosa avviene se il numero di
elementi TListItem all'interno del controllo eccedono l'area di
visualizzazione? Vengono stampati tutti gli elementi senza le scrollbar
oppure viene inviato semplicemente alla stampante un "dump" grafico del
controllo così come è rappresentato sullo schermo?


>Vengono stampati tutti gli elementi senza le scrollbar oppure viene
inviato semplicemente alla stampante un "dump" grafico del controllo cosě
come č rappresentato sullo schermo?<<
'La seconda che hai detto' :-)
Saluti
Paolo Arosio


Un metodo simile lo avevo implementato per fare la stampa di un discendente
di TFrame, che al contrario di un TForm non supporta nativamente un metodo
Print. Ora vedo se ciò che devo stampare è visibile nel controllo senza
scorrerlo; in caso affermativo, implemento un metodo Print personalizzato,
altrimenti provo ad utilizzare una TStringList o un procedimento alternativo
per mandare alla stampante gli elementi della ListView.
Grazie comunque per l'aiuto. Ciao!


"Marco Breveglieri"
[...snip all...]
Sul repository di Cantu' avevo postato una procedura per stampare una
StringGrid. Se non hai grosse esigenze di grafica penso possa essere
facilmente adattata ad un LV (soprattutto se in modalita' Report).
Saluti
Paolo Arosio