Newsgroup: it.comp.lang.delphi
Titolo: misteri della stampa...

Allora, sto implementando un printpreview, ma non ci sto capendo granchč.
Posto due unit: una main e usa preview di servizio che dovrebbe stampare le 
immagini, scalate...
il bottone 1 carica le bmp, il bottone 3 le visualizza e le stampa 
normalmente.
Se invece carico un immagine non bmp, la stampa non avviene.(foglio bianco);
Stessa cosa se alla'immagine1, assegno i dati di una stringgrid.
Perchč non stampa tutto?
Perchč l'anteprima č giusta e la stampa no?
Ecco le unit!
unit mainprovapreview;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons, Grids;
type
  TForm1 = class(TForm)
    Image1: TImage;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    OpenDialog1: TOpenDialog;
    StringGrid1: TStringGrid;
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
uses PREVIEW;
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if opendialog1.execute  then 
image1.picture.loadfromfile(opendialog1.filename);
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
stringgrid1.PaintTo(image1.canvas,10,10);
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
    previewform.immagine:=image1;
    PreviewForm.Scale := 2;
    PreviewForm.SetPage;
    PreviewForm.DrawPreview;
    PreviewForm.ShowModal;
end;
end.
______________
unit per preview:
-------------------
unit Preview;
interface
uses
  SysUtils, Windows, Messages, Classes,
  Graphics, Controls, Forms, Dialogs, ExtCtrls,
  Buttons, Printers, StdCtrls;
type
  TPreviewForm = class(TForm)
    Panel1: TPanel;
    ScalePlusButton: TSpeedButton;
    ScaleMinusButton: TSpeedButton;
    PrintButton: TSpeedButton;
    ScrollBox1: TScrollBox;
    Image1: TImage;
    CancelButton: TSpeedButton;
    Label1: TLabel;
    Immagine: TImage;
    procedure ScalePlusButtonClick(Sender: TObject);
    procedure ScaleMinusButtonClick(Sender: TObject);
    procedure CancelButtonClick(Sender: TObject);
    procedure PrintButtonClick(Sender: TObject);
  public
    Scale: Integer;
    procedure DrawPreview;
    procedure SetPage;
  end;
var
  PreviewForm: TPreviewForm;
implementation
{$R *.DFM}
procedure TPreviewForm.SetPage;
begin
  {set the image size to be proportional with the page size}
  Image1.Width := Printer.PageWidth div 5;
  Image1.Height := Printer.PageHeight div 5;
  {output the scale to the toolbar}
  Label1.Caption := IntToStr (Scale);
end;
procedure TPreviewForm.ScalePlusButtonClick(Sender: TObject);
begin
  {increse the size of the bitmap}
  Scale := Scale * 2;
  Label1.Caption := IntToStr (Scale);
  DrawPreview;
end;
procedure TPreviewForm.DrawPreview;
var
  Rect: TRect;
begin
  {compute the rectangle for the bitmap preview}
  Rect.Top := 10;
  Rect.Left := 10;
  Rect.Right := 10 +
    (immagine.Picture.Graphic.Width * Scale) div 5;
  Rect.Bottom := 10 +
    (immagine.Picture.Graphic.Height * Scale) div 5;
  {remove the current image}
  Image1.Canvas.Pen.Mode := pmWhite;
  Image1.Canvas.Rectangle (0, 0, Image1.Width, Image1.Height);
  {stretch the bitmap into the rectangle}
  Image1.Canvas.StretchDraw (Rect,
    immagine.Picture.Graphic);
end;
procedure TPreviewForm.ScaleMinusButtonClick(Sender: TObject);
begin
  {decrease the size of the image}
  if Scale > 1 then
  begin
    Scale := Scale div 2;
    Label1.Caption := IntToStr (Scale);
    DrawPreview;
  end;
end;
procedure TPreviewForm.CancelButtonClick(Sender: TObject);
begin
  {close (hide) the preview dialog}
  Close;
end;
procedure TPreviewForm.PrintButtonClick(Sender: TObject);
var
  Rect: TRect;
begin
  {compute the rectangle for the printer}
  Rect.Top := 10;
  Rect.Left := 10;
  Rect.Right := 10 +
    (immagine.Picture.Graphic.Width * Scale);
  Rect.Bottom := 10 +
    (immagine.Picture.Graphic.Height * Scale);
  {print the bitmap}
  Printer.BeginDoc;
  try
    Printer.Canvas.StretchDraw (Rect,
      immagine.Picture.Graphic);
    Printer.EndDoc;
  except
    Printer.Abort;
    raise;
  end;
end;
end.

 end;
Il codice che hai copiato usa il metodo StretchDraw, che non e' l'ideale
per stampare immagini.
Hai due alternative:
1) usi un generatore di report, che già trattano queste problematiche;
2) modifichi il tuo codice per usare l'API StretchDIBits. 
Di seguito trovi alcuni link riguardo il tuo problema.
http://www.efg2.com/Lab/Library/Delphi/Printing/index.html#PrintBitmap
http://msdn2.microsoft.com/en-us/library/ms532289.aspx
http://www.efg2.com/Lab/OtherProjects/PrinterDemo1.htm
http://www.howtodothings.com/computers/a1102-stretchdraw-an-image-to-a-printer-canvas.html
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 end;
Il codice che hai copiato usa il metodo StretchDraw, che non e' l'ideale
