Newsgroup: it.comp.lang.delphi
Titolo: copiare parte del form su bitmap

Non sono esperto di grafica pertanto ho bisogno del ng.
Ho un tchart creato runtime e posizionato dinamicamente sul form.
Sopra il tchart ho messo un richedit con dei dati accessori.Tutto ok.
La fregatura e' che adesso devo stampare il tutto.
Siccome il richedit e' sopra il tchart, non riesco a renderizzarli 
sulla stampante uno sopra l'altro. Se stampo il tchart con il suo 
metodo interno, non vedo ovviamente il richedit.
Non fanno neanche al caso mio il metodo GetFormImage perchï¿œ prende 
tutto il form e il metodo PaintTo dei singoli componenti perchï¿œ sul il 
richedit non funziona.
Ho pensato di ricopiare solo l'area del form contenente il tchart, ma 
non so come fare la copia di un'area circoscritta nel form..
CIao
-- 
Morde

 non so come fare la copia di un'area circoscritta nel form..
Quando hai ottenuto l'immagine completa del Form, se non erro, puoi 
sempre usare i metodi dell'oggetto Canvas per copiare le parti che 
desideri all'interno di un'altra immagine (TBitmap o equivalente).
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 non so come fare la copia di un'area circoscritta nel form..
1) Recuperi il bitmap del TChart;
2) Recuperi il bitmap del Richedit con la seguente procedura
Uses Richedit; 
.. 
procedure TForm1.Button1Click(Sender: TObject); 
// commenti in inglese di P. Below
// da sistemare secondo le esigenze
// questa procedure visualizza una preview del richedit 
// in un TImage
var 
  imagecanvas: TCanvas; 
  fmt: TFormatRange; 
begin 
  imagecanvas := image1.canvas; 
  with fmt do begin 
    hdc:= imagecanvas.handle; 
    hdcTarget:= hdc; 
    // rect needs to be specified in twips (1/1440 inch) as unit 
    rc:=  Rect( 0, 0, 
                imagecanvas.cliprect.right * 1440 div pixelsperinch, 
                imagecanvas.cliprect.bottom * 1440 div pixelsperinch 
                ); 
    rcPage:= rc; 
    chrg.cpMin := 0; 
    chrg.cpMax := richedit1.GetTextLen; 
  end; 
  SetBkMode( imagecanvas.Handle, TRANSPARENT ); 
  richedit1.perform( EM_FORMATRANGE, 1, integer( @fmt )); 
  // next call frees some cached data 
  richedit1.perform( EM_FORMATRANGE, 0, 0 ); 
  image1.refresh; 
  // refresh is necessary since the control only refreshes automatically 
  // if a canvas method is used to change its content. 
end; 
3) Unisci le due Bitmap usando il metodo che preferisci (API, librerie, 
ecc...)
4) Stampi il bitmap ottenuto
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Copiato pari pari da un progetto fatto...
procedure TConsoleForm.StampaClick(Sender: TObject);
var
  FormImage: TBitmap;
begin
  screen.Cursor:=crHourGlass;
  Panel1.Visible:=False;
  Stampa.Visible:=False;
  FormImage := GetFormImage;
  Panel1.Visible:=True;
  Stampa.Visible:=True;
  QRstampaForm:=TQRstampaForm.Create(Self);
  QRstampaForm.QRImage1.Picture.Assign(FormImage);
  screen.Cursor:=crDefault;
  QRstampaForm.PreviewModal;
  QRstampaForm.Free;
  QRstampaForm:=nil;
  FormImage.Free;
end;
Ciao
C 

Ringrazio tutti per l'aiuto.
Rialimento il thread per spiegare come ho risolto: considerando che il 
richedit ha noti problemi riguardo il printing di sï¿œ stesso, ho 
abbandonato questa strada passando all'uso di un oggetto proprietario 
del tchart (TAnnotationTool) che accetta testo libero senza 
formattazione.
Questo oggetto si autorenderizza sul canvas, quindi mi sono tolto 
d'impaccio.
Di seguito ecco il codice per estrarre una bitmap dal tchart e 
inserirla in un tbitmapfield che stampero poi' sul report.
var
  TabSheet  : TTabSheet;
  Bitmap    : TBitmap;
  Stream    : TMemoryStream;
  tc        : TChart;
[..]
tc := TChart(TabSheet.Components[k-1]);
Bitmap := tc.TeeCreateBitmap(clWhite,Rect(0,0,tc.Width,tc.Height));
Stream.clear;
Bitmap.SaveToStream(Stream);
if (TabSheet.Caption = RS_TITLE_TAB_TUTTI) then
  CDS2ChartTUTTI.LoadFromStream(Stream);
[..]
-- 
Morde