Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Modello di stampa immagini con Fastreport/Delphi XE3

    Buongiorno a tutti,
    sto terminando un'applicazione Delphi ed avrei bisogno di sapere come progettare un report per la stampa.

    La versione di Delphi è XE3, ho installato FASTREPORT 4 e tutti i componenti compaiono nelle palette di Delphi. Ho fatto alcune prove e riesco ovviamente a stampare del testo, delle foto, ecc.. inserite direttamente sul report (quindi contenuto statico, fisso), ma non riesco a capire come far "AGGANCIARE" ad esempio un box immagine del report con una variabile del DB o con una Timage di una form Delphi.

    Mi spiego meglio.

    Ho un DB nel quale sono inseriti i nomi di alcune immagini che ho su disco fisso e vorrei farle stampare tramite fastreport su un modello che creerò. Mi occorre assegnare al box immagine di fastreport il contenuto del campo del DB che contiene tale nome di immagine.
    Come posso fare?
    Ovviamente le foto cambieranno per questo ho bisogno di volta in volta di assegnare il valore nuovo al box immagine del report.
    Grazie in anticipo
    Gianni

  2. #2
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    E' un po' lunghetto, metto i passi principali
    codice:
    var
       frxReport1: TfrxReport;
       quanteRighe:integer;
       quantecolonne:integer;
    
       offsetXmillimetri:double;
       offsetYmillimetri:double;
    
       larghezzaPagina:double;
       altezzaPagina:double;
    
       larghezzaFoto:double;
       altezzaFoto:double;
       i,j,k:integer;
       numerofoto:integer;
    
       quantePagine:integer;
    
       myPic:array of TfrxPictureView;
       arrayMemo:array of TfrxMemoView;
       arrayPage:array of TFrxReportPage;
       arrayBand:array of TfrxBand;
    
       FlagPaginaSIngola:boolean;
       ArraymemoID:array of TfrxMemoView;
       ArrayHeader:array of TfrxMemoView;
       offsetHeader:double;
    
    
    begin
      flagPaginaSingola:=false;
    
       offsetXMillimetri:=3;
       offsetYMillimetri:=10;
       quanteRighe:=<quantenevuoi>;
       quanteColonne:=<quantenevuoi>
    
    // in lbfotodalavorare indovina cosa c'è
    
       quantePagine:=lbfotodalavorare.items.count div (quanteRighe*QuanteColonne)+1;
    
       if (lbfotodalavorare.items.count mod (quanteRighe*QuanteColonne))=0 then
       	dec(quantepagine);
    
       frxReport1:= tfrxreport.create(nil);
       frxReport1.Clear;
    
       // (+ per sicurezza)
    
       setlength(myPic,lbfotodalavorare.items.count+5);
       setlength(arraymemo,lbfotodalavorare.items.count+5);
       setlength(arrayPage,quantepagine+5);
       setlength(arrayBand,quantepagine+5);
       setlength(arrayMemoID,quantepagine+5);
       setlength(arrayHeader,quantepagine+5);
    
    
       numerofoto:=0;
    
       offsetHeader:=0;
       if edtHeader.text<>'' then
           offsetHeader:=40;
    
       for k:=1 to quantePagine do
       begin
           arrayPage[k]:=TfrxReportPage.Create(frxReport1);
           arrayPage[k].CreateUniqueName;
           arraypage[k].SetDefaults;
           arraypage[k].bottommargin:=20;
           arrayBand[k] := TfrxReportTitle.Create(arrayPage[k]);
           arrayBand[k].CreateUniqueName;
           arrayband[k].Top := 0;
           arrayband[k].Height := 20;
    
           larghezzaPagina:=arraypage[k].paperwidth;
           altezzaPagina:=arraypage[K].paperheight - (offsetHeader /2);
    
           larghezzaFoto:=(larghezzaPagina - arraypage[k].leftmargin - arraypage[k].rightmargin - ((quanteColonne-1)*offsetXMillimetri)) / quanteColonne;
           altezzaFoto:=(AltezzaPagina - arraypage[k].topmargin - arraypage[k].bottommargin - ((quanteRighe-1)*offsetYMillimetri)) / quanteRighe;
    
       for i:=1 to quanteRighe do
       begin
            for j:=1 to quanteColonne do
           begin
    	if numeroFoto<lbfotodalavorare.items.count then
               begin
       	myPic[numerofoto]:=TfrxPictureView.Create(arrayband[k]);
               	myPic[numerofoto].CreateUniqueName;
       	mypic[numerofoto].width:=fr01cm*larghezzaFoto; //millimetri
       	myPic[numerofoto].height:=fr01cm*AltezzaFoto;
       	mypic[numerofoto].top:=fr01cm*(i-1)*(altezzaFoto+offsetYMillimetri)+offsetheader;
       	mypic[numerofoto].left:=fr01cm*(j-1)*(larghezzaFoto+offsetXMillimetri);
       	mypic[numerofoto].autosize:=false;
       	mypic[numerofoto].center:=true;
       	mypic[numerofoto].filelink:=lbfotodalavorare.items[numerofoto];
                 mypic[numerofoto].frame.typ:=[ftleft]+[ftright]+[fttop]+[ftbottom];
    
                 if <mettinumerofoto>then
                  begin
                      arrayMemo[numerofoto] := TfrxMemoView.Create(arrayband[k]);
                      arrayMemo[numerofoto].CreateUniqueName;
                     arrayMemo[numerofoto].Height := 20;
               	arrayMemo[numerofoto].AutoWidth := true;
    	arrayMemo[numerofoto].top := fr01cm*((altezzaFoto+1)+(i-1)*(altezzaFoto+offsetYMillimetri))+offsetheader;//fr01cm*(i-1)*(altezzaFoto+offsetYMillimetri);;
                arrayMemo[numerofoto].left := fr01cm*(j-1)*(larghezzaFoto+offsetXMillimetri);
                arrayMemo[numerofoto].Text := 'Foto '+inttostr(numerofoto+1);
                   end;
               	INC(Numerofoto);
               end;
       	end;
    
       end;
    
        if <mettididascalia>then
           if <i_ID numeropdidascaliasolcaxxo> >0 then
           begin
           	arrayMemoID[k] := TfrxMemoView.Create(arrayband[k]);
               arrayMemoID[k].CreateUniqueName;
               arrayMemoID[k].Height := 35;
               arrayMemoID[k].AutoWidth := true;
               arrayMemoID[k].top := 0; //fr01cm*((altezzaFoto+1)+(i-1)*(altezzaFoto+offsetYMillimetri));;//fr01cm*(i-1)*(altezzaFoto+offsetYMillimetri);;
               arrayMemoID[k].Text := 'ID '+inttostr(i_id);
               arrayMemoID[k].font.size:=20;
               arrayMemoID[k].frame.typ:=[ftleft]+[ftright]+[fttop]+[ftbottom];
               arraymemoID[k].frame.dropshadow:=true;
               arrayMemoID[k].left := 600-arrayMemoID[k].width; //fr01cm*((altezzaFoto+1)+(i-1)*(altezzaFoto+offsetYMillimetri));;//fr01cm*(i-1)*(altezzaFoto+offsetYMillimetri);;
               arraymemoID[k].brushstyle:=bsclear;
           end;
    
    
        if <intestazione da mettere><>'' then
        begin
           arrayheader[k] := TfrxMemoView.Create(arrayband[k]);
           arrayheader[k].CreateUniqueName;
           arrayheader[k].Height := 35;
           arrayheader[k].align:=tfrxalign(bawidth);
           arrayheader[k].HAlign := haCenter;
           arrayheader[k].VAlign := vaCenter;
    
           arrayheader[k].top := 0; //fr01cm*((altezzaFoto+1)+(i-1)*(altezzaFoto+offsetYMillimetri));
           arrayheader[k].Text := edtHeader.Text;
           arrayheader[k].font.size:=15;
           arrayheader[k].frame.typ:=[ftleft]+[ftright]+[fttop]+[ftbottom];
           arrayheader[k].brushstyle:=bsclear;
        end;
    Non è difficile, in fondo, no?

  3. #3
    Scritto sottoforma di codice in questo caso non riesco a capire....

    Ho una variabile stringa in delphi nomefoto la quale contiene il nome della foto che ho sul disco e che voglio stampare; In fastreport ho una pagina con una picture nella quale far inserire questa immagine, cosa devo fare? qual'è il codice delphi da scrivere ad esempio nel Button stampa.

    Grazie

  4. #4
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    Originariamente inviato da gianni73na
    Scritto sottoforma di codice in questo caso non riesco a capire....

    Ho una variabile stringa in delphi nomefoto la quale contiene il nome della foto che ho sul disco e che voglio stampare; In fastreport ho una pagina con una picture nella quale far inserire questa immagine, cosa devo fare? qual'è il codice delphi da scrivere ad esempio nel Button stampa.

    Grazie
    Pensavo avessi richieste maggiori, quella è una porzione di codice che, data una lista di immagini, le impagina tutte in formato X x Y parametrico (tot righe di tot colonne) di JPG in formato multipagina, con didascalie, box di scontornamento, ridimensionamento e gestione bordi e offset x e y.
    A runtime con creazione di tutte le strutture dati necessarie.

    Bon, per la tua richiesta invece la risposta è "devi cercare il NOME del componente, sotto forma di stringa, per ottenerne l'oggetto-padre. A quel punto puoi settare la proprietà col nome dell'immagine"

    In questo esempio cerchi l'oggetto con nome "picqr" (il nome ASCII settato in fastreport
    codice:
    var
       picview:tfrxpictureview;
    
    
    begin
       picview:=nil;
       picview:=frxREPORT.FindObject('picqr') as TfrxPictureView;
       if picview<>nil then
       begin
           picview.visible:=true;
           picview.picture.loadfromfile(-nome-de-file-che-vuoi-caricare);
       end;
       // optional, dipende dai casi
       if frxreport<>nil then
               frxreport.Preparereport(FALSE);

  5. #5
    Scusa, mi sono spiegato male....

    Il primo codice era molto complesso in quanto oltre a prevedere didascalie ecc.... formattava i box in base al numero di foto in una pagina ecc...ecc...

    L'ultimo codice che mi hai fornito va bene per la visualizzazione di una foto in un componente Picture del report (fast report), infatti l'ho provato e va alla grande....

    La mia esigenza è di far comparire n immagini, in n pagine, divise in 3 immagini per pagina. Quindi se le immagini sono 3 si avrà un report composto da una pagina se sono al massimo 6 si avrà un report composto da due pagine e così via..... quindi ogni 3 immagini è un report.
    La dimesione della Picture sul report non deve variare.

    Attendo sicuramente un tuo aiuto......

  6. #6
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    è il primo codice

  7. #7
    Ok, ci provo e ti faccio sapere..
    Grazie

  8. #8
    Ciao franzauker2.0,
    grazie dell'aiuto...... sono riuscito a creare un report multipagina anche se non proprio con la procedura suggerita da te, ho capito la logica del tuo codice ma non sono riuscito ad applicarlo alle mie esigenze, ma gran parte di esso mi è servito

    Un'ultima domanda inerente il report di FastReport....

    Avendo creato un Report di 5 pagine (Page1, Page2...Page5) in che proprietà di TfrxReport posso assegnare il numero di pagine da stampare? cioè posso "dire" al Report passa in stampa solo la prima pagina? oppure passa in stampa le prime 2 pagine? (IL REPORT È COMPOSTO FISICAMENTE DA 5 PAGINE)

    Oppure deve essere assegnato ad una proprietà di TPrintDialog?

    Il numero di pagine da stampare lo conosco a priori e non vorrei lasciare il compito all'operatore che rischierebbe di stampare pagine inutilizzabili perché non complete di tutti i dati (pagine che non voglio far stampare)

    Ti ringrazio anticipatamente.....

  9. #9
    Qualcuno può aiutarmi?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.