* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 18, 2024, 09:22:12 am

Inserisci il nome utente, la password e la durata della sessione.

289 Visitatori, 0 Utenti

Autore Topic: [Risolto] lazReport - primi passi - 2.a parte  (Letto 2021 volte)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #15 il: Febbraio 28, 2023, 09:31:15 am »
La segnalazione di Errore, come già detto, NON si verifica sempre, quindi ieri sera ho provato a ridisegnare interamente il report nel formato A5 e sono riuscito ad arrivare fino alla fine delle impostazioni senza incappare nell'Errore. Per riuscire in ciò, ho tentato, e sembra che ci sia riuscito, ad impostare la pagina di tipo A5, subito dopo l'accesso all'area di Report Designer e prima ancora di procedere con tutte le altre impostazioni sul modello.

Posso, perciò, finalmente, cominciare ad aggiungere la codifica per riempire il report coi dati da stampare in PDF.
 :)
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #16 il: Febbraio 28, 2023, 06:59:03 pm »
Per stampare in pdf da lazreport devi usare trascinare sulla form il componente TfrTNPDFExport (ad esempio con il nome frTNPDFExport1), per farlo devi avere installato il pacchetto che trovi nella directory directory_dove_è_installato_lazarus\components\lazreport\source\addons\pdfexport\lazreportpdfexport.lpk
Detto questo poi ipotizzando che il tuo oggetto TfrReport si chiami MyReport ed hai già provveduto a disegnarlo, devi fare quanto segue
Codice: [Seleziona]
               if MyReport.PrepareReport then
               begin
                    SaveDialog1.Filter:='PDF files (*.pdf)|*.pdf';
                    SaveDialog1.FileName:='NomeDelFile_' + StringReplace(DateToStr(Now()),'/','', [rfReplaceAll]) + '_' + StringReplace(TimeToStr(Now()) ,':','.', [rfReplaceAll]);
                    if SaveDialog1.Execute then
                    begin
                         if uppercase(ExtractFileExt(SaveDialog1.FileName))='.PDF' then
                         begin
                              //non faccio niente, il nome è già corretto
                              NomePDF:=SaveDialog1.FileName;
                         end
                         else
                         begin
                              //il nome non è corretto, quindi ci aggiungo il .pdf alla fine
                              NomePDF:=SaveDialog1.FileName + '.pdf';
                         end;
                         Screen.Cursor := crHourglass;
                         MyReport.ExportTo(TFrTNPDFExportFilter, NomePDF);
                         Screen.Cursor := crDefault;
                         ShowMessage('Creazione del file PDF terminata.');
                    end;
               end;
Ho quasi superato le difficoltà per disegnare la pagina in formato A5 del report.
Ora dovrei aggiungere le istruzioni che mi hai indicato per produrre il documento pdf, ma non ho capito dove aggiungerle:
Riporto qui la procedura che avvia la preview di stampa:
Codice: [Seleziona]
procedure TForm9.BPulsStampaClick(Sender: TObject);
var
  i, k, nuRg: integer;

  cellaSel, fileReport, striMia, titolo: String;

begin
  WriteLn('procedure TForm9.BPulsStampaClick');
  nuRg:= GridChiuStmp.RowCount;
  if MGridPdf9.Active then
  begin
    MGridPdf9.Close;
  end;
  MGridPdf9.Clear(False);
  MGridPdf9.Open;
  for i:= 1 to nuRg - 1 do
  begin
    MGridpdf9.Append;
    MGridpdf9.Edit;
    MGridpdf9.FieldByName('voceSotCto').Text:= GridChiuStmp.Cells[2, i];
    MGridpdf9.FieldByName('entrate').Text:= GridChiuStmp.Cells[3, i];
    MGridpdf9.FieldByName('uscite').Text:= GridChiuStmp.Cells[4, i];
  end;
  fileReport:= percorso + '/Dati/pdfEntrUsc.lrf';
  frReport1.LoadFromFile(fileReport);
  frReport1.ShowReport;

  if frReport1.PrepareReport then    <------- Gruppo istruzioni per produrre il modulo in PDF
  begin
     SaveDialog1.Filter:='PDF files (*.pdf)|*.pdf';
     SaveDialog1.FileName:='NomeDelFile_' + StringReplace(DateToStr(Now()),'/','', [rfReplaceAll]) + '_' + StringReplace(TimeToStr(Now()) ,':','.', [rfReplaceAll]);
     . . .
  end;
end;
???
« Ultima modifica: Febbraio 28, 2023, 07:02:03 pm da petrusic »
ciao ciao

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #17 il: Marzo 01, 2023, 08:53:36 am »
Devi metterle al posto della ShowReport. O se proprio vuoi fare prima l'anteprima e alla sua chiusura il salvataggio in pdf sposta la showreport all'interno dell'if del preparereport.
Ieri è passato, domani è futuro, oggi è un dono...

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #18 il: Marzo 01, 2023, 06:47:36 pm »
Devi metterle al posto della ShowReport. O se proprio vuoi fare prima l'anteprima e alla sua chiusura il salvataggio in pdf sposta la showreport all'interno dell'if del preparereport.
Perfetto. Ha funzionato quasi magnificamente.

Io ho preferito formare il file in pdf prima di mostrare l'anteprima, ma niente toglie che possa cambiare idea, oppure, potrei riscriverlo sempre su se stesso, qualora togliessi dal nome del file la data e l'ora di creazione.

Riporto la parte di codice riguardante la creazione del file pdf, perchè avrei bisogno di capire meglio cosa succede:
Codice: [Seleziona]
DomusRatioPDF:=SaveDialog1.FileName + '.pdf';    
è l'istruzione che crea il file .pdf, ma prima di farlo apre una finestra per la conferma del nome file  (ho capito)

Se è come ho capito, vorrei capire anche se è possibile NON mostrare la finestra e proseguire, prendendo sempre buono il nome già impostato nel programma

poi:
Codice: [Seleziona]
 Screen.Cursor := crHourglass;
 frReport1.ExportTo(TFrTNPDFExportFilter, DomusRatioPDF);
 Screen.Cursor := crDefault;               
Ho provato a disinibirle ed ho visto che il file .pdf è stato già creato. Ma allora a cosa servono ?

Scusa xinyiman se chiedo magari concetti scontati, ma preferisco chiedere, piuittosto che andare avanti senza rendermi conto.


ciao ciao

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #19 il: Marzo 02, 2023, 09:52:05 am »
Riporto la parte di codice riguardante la creazione del file pdf, perchè avrei bisogno di capire meglio cosa succede:
Codice: [Seleziona]
DomusRatioPDF:=SaveDialog1.FileName + '.pdf';    
è l'istruzione che crea il file .pdf, ma prima di farlo apre una finestra per la conferma del nome file  (ho capito)

Se è come ho capito, vorrei capire anche se è possibile NON mostrare la finestra e proseguire, prendendo sempre buono il nome già impostato nel programma
No, quella riga prende solo il nome del file pdf che vuoi creare, in quanto ti permette di modificarlo manualmente dalla Save Dialog.
Per non mostrare la finestra cambi il mio codice da così

Codice: [Seleziona]
SaveDialog1.Filter:='PDF files (*.pdf)|*.pdf';
                    SaveDialog1.FileName:='NomeDelFile_' + StringReplace(DateToStr(Now()),'/','', [rfReplaceAll]) + '_' + StringReplace(TimeToStr(Now()) ,':','.', [rfReplaceAll]);
                    if SaveDialog1.Execute then
                    begin
                         if uppercase(ExtractFileExt(SaveDialog1.FileName))='.PDF' then
                         begin
                              //non faccio niente, il nome è già corretto
                              NomePDF:=SaveDialog1.FileName;
                         end
                         else
                         begin
                              //il nome non è corretto, quindi ci aggiungo il .pdf alla fine
                              NomePDF:=SaveDialog1.FileName + '.pdf';
                         end;
                         Screen.Cursor := crHourglass;
                         MyReport.ExportTo(TFrTNPDFExportFilter, NomePDF);
                         Screen.Cursor := crDefault;
                         ShowMessage('Creazione del file PDF terminata.');
                    end;

a così

Codice: [Seleziona]
                         NomePDF:='NomeDelFile_' + StringReplace(DateToStr(Now()),'/','', [rfReplaceAll]) + '_' + StringReplace(TimeToStr(Now()) ,':','.', [rfReplaceAll]);
                         Screen.Cursor := crHourglass;
                         MyReport.ExportTo(TFrTNPDFExportFilter, NomePDF);
                         Screen.Cursor := crDefault;
                         ShowMessage('Creazione del file PDF terminata.');
poi:
Codice: [Seleziona]
 Screen.Cursor := crHourglass;
 frReport1.ExportTo(TFrTNPDFExportFilter, DomusRatioPDF);
 Screen.Cursor := crDefault;               
Ho provato a disinibirle ed ho visto che il file .pdf è stato già creato. Ma allora a cosa servono ?

Scusa xinyiman se chiedo magari concetti scontati, ma preferisco chiedere, piuittosto che andare avanti senza rendermi conto.

La prima riga cambia la grafica del puntatore del mouse in una clessidra, la seconda riga esporta in pdf il tuo report e la terza riga riporta la grafica del puntatore del mouse al tuo cursore di default.

Non scusarti, è giusto voler capire.
« Ultima modifica: Marzo 02, 2023, 09:54:06 am da xinyiman »
Ieri è passato, domani è futuro, oggi è un dono...

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #20 il: Marzo 02, 2023, 11:28:08 am »
@ xinyiman

Grazie dell'aiuto.  la modifica è  andata bene.
Ora, senza fermare l'esecuzione del programma, riesco a fare l'export in PDF e poi compare automaticamente l'anteprima stampa.

Ho purtroppo qualche difficoltà nella compilazione della griglia del modello di stampa, ma ce l'avevo anche prima di aggiungere le istruzioni di export in pdf.
« Ultima modifica: Marzo 02, 2023, 11:39:49 am da petrusic »
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #21 il: Marzo 02, 2023, 05:36:38 pm »
Va bene, ci sono quasi.
Devo ancora scoprire se è possibile impostare il font delle celle della griglia del report.

Ho anche la necessità di impostare un Font bold nella Memo di testata dei pagina e di sottolinearla.
L'unica riga che mi ritrovo col Font bold è quella di testa dei dati principali, perchè è stata impostata così automaticamente in fase di disegno del report.

Poi devo aggiungere anche che dovrei comandare l'allineamento a destra dei valori interni a due delle colonne  del report.
 ::)

« Ultima modifica: Marzo 02, 2023, 09:36:29 pm da petrusic »
ciao ciao

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #22 il: Marzo 03, 2023, 08:28:31 am »
Guarda immagine allegata, devi selezionare il campo e dal menù in alto devi usare i pulsanti di bold e sottolineatura del carattere.
Ieri è passato, domani è futuro, oggi è un dono...

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #23 il: Marzo 03, 2023, 11:13:42 am »
Guarda immagine allegata, devi selezionare il campo e dal menù in alto devi usare i pulsanti di bold e sottolineatura del carattere.
E' vero. Mi dispiace avere fatto tanto rumore per niente. Sono proprio entrato nel pallone.

Comunque ho provato ad impostare il formato bold, l'allineamento a destra e la sottolineatura.

Nell'anteprima funziona tutto, mentre nel file pdf manca la sottolineatura.
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #24 il: Marzo 03, 2023, 12:52:53 pm »
E' arrivato il momento di aggiungere l'anno nella Memo di testa nella pagina.

Ho trovato un suggerimento che sfrutta l'evento OnGetValue del report frReport1 ed ho scritto:
Codice: [Seleziona]
procedure TForm9.frReport1GetValue(const ParName: String; var ParValue: Variant
  );
begin
  Writeln('TForm9.frReport1GetValue');
  begin
    if ParName = 'TestataEntrusc' then       // TestataEntrusc è una variabile della categoria TitoloPaginaA5
    begin
      ParValue := Eanno.Text;
      Writeln('ParValue= ' + ParValue);
    end;
  end;
end;               

Ebbene, a me non ha funzionato. In Console ho trovato il seguente Errore:
Citazione
[WARNING] SetAlphaBlend called without handle for frProgressForm(TfrProgressForm)
TForm9.frReport1GetValue
ParValue= 2019

Ho trovato qualcosa che dice di copiare il file .lrf, generato automaticamente da Lazarus nella cartella /DomusRatio/bin/Dati, nella cartella /DomusRatio/bin, ma non mi sembra logico, altrimenti sarebbe stato Lazarus a crearlo direttamente nella /bin.

In definitiva, anche se l'Errore è un Warning, io non riesco ad aggiungere l'anno di riferimento nella riga di testa, nella pagina del report.

« Ultima modifica: Marzo 03, 2023, 12:55:34 pm da petrusic »
ciao ciao

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #25 il: Marzo 03, 2023, 01:09:34 pm »
E' arrivato il momento di aggiungere l'anno nella Memo di testa nella pagina.

Ho trovato un suggerimento che sfrutta l'evento OnGetValue del report frReport1 ed ho scritto:
Codice: [Seleziona]
procedure TForm9.frReport1GetValue(const ParName: String; var ParValue: Variant
  );
begin
  Writeln('TForm9.frReport1GetValue');
  begin
    if ParName = 'TestataEntrusc' then       // TestataEntrusc è una variabile della categoria TitoloPaginaA5
    begin
      ParValue := Eanno.Text;
      Writeln('ParValue= ' + ParValue);
    end;
  end;
end;               

Ebbene, a me non ha funzionato. In Console ho trovato il seguente Errore:
Citazione
[WARNING] SetAlphaBlend called without handle for frProgressForm(TfrProgressForm)
TForm9.frReport1GetValue
ParValue= 2019

Ho trovato qualcosa che dice di copiare il file .lrf, generato automaticamente da Lazarus nella cartella /DomusRatio/bin/Dati, nella cartella /DomusRatio/bin, ma non mi sembra logico, altrimenti sarebbe stato Lazarus a crearlo direttamente nella /bin.

In definitiva, anche se l'Errore è un Warning, io non riesco ad aggiungere l'anno di riferimento nella riga di testa, nella pagina del report.

Commenta le righe del writeln
Ieri è passato, domani è futuro, oggi è un dono...

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #26 il: Marzo 03, 2023, 03:01:11 pm »
Commenta le righe del writeln

Non capisco, comunque, ci provo:
- la prima riga (Writeln('TForm9.frReport1GetValue');  ) è una riga che uso abitualmente come prima istruzione di una procedure o di una function per creare una sorta di trace  a mio uso e consumo: mi serve per capire se la procedura viene avviata e se un'eventuale errore si verfica quindi prima che si avvii la procedure cronologicamente successiva.
- la prima riga (Writeln('ParValue= ' + ParValue);   ) mi è servita per capire se il campo ParValue (parametro della procedure TForm9.frReport1GetValue(const ParName: String; var ParValue: Variant );), viene valorizzato bene.  Ho visto che è stato valorizzato bene.

Non so se era quello che volevi sapere.

« Ultima modifica: Marzo 03, 2023, 03:02:54 pm da petrusic »
ciao ciao

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #27 il: Marzo 03, 2023, 03:40:57 pm »
Commenta le righe del writeln

Non capisco, comunque, ci provo:
- la prima riga (Writeln('TForm9.frReport1GetValue');  ) è una riga che uso abitualmente come prima istruzione di una procedure o di una function per creare una sorta di trace  a mio uso e consumo: mi serve per capire se la procedura viene avviata e se un'eventuale errore si verfica quindi prima che si avvii la procedure cronologicamente successiva.
- la prima riga (Writeln('ParValue= ' + ParValue);   ) mi è servita per capire se il campo ParValue (parametro della procedure TForm9.frReport1GetValue(const ParName: String; var ParValue: Variant );), viene valorizzato bene.  Ho visto che è stato valorizzato bene.

Non so se era quello che volevi sapere.

No intendo dire di commentare/togliere le righe del writeln (secondo me danno fastidio)

Codice: [Seleziona]
procedure TForm9.frReport1GetValue(const ParName: String; var ParValue: Variant
  );
begin
  //Writeln('TForm9.frReport1GetValue');
  begin
    if ParName = 'TestataEntrusc' then       // TestataEntrusc è una variabile della categoria TitoloPaginaA5
    begin
      ParValue := Eanno.Text;
      //Writeln('ParValue= ' + ParValue);
    end;
  end;
end;     
Ieri è passato, domani è futuro, oggi è un dono...

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #28 il: Marzo 03, 2023, 04:57:35 pm »
No intendo dire di commentare/togliere le righe del writeln (secondo me danno fastidio)

Va bene. Le ho eliminate, ma non è cambiato niente. C'è sempre l'Errore
Citazione
[WARNING] SetAlphaBlend called without handle for frProgressForm(TfrProgressForm)
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:lazReport - primi passi - 2.a parte
« Risposta #29 il: Marzo 03, 2023, 06:15:02 pm »
@ xinyiman

L'Errore c'è sempre, ma c'è anche la memo. Io non la vedevo perchè dovevo allungare la dimensione della Memo.
Ho aggiunto anche una riga di pseudo-sottolineatura sotto la stringa di testata di pagina, dichiarando un'altra Memo specifica, sfruttando sempre l'evento OnGetValue.

Funziona tutto.   Grazie!
ciao ciao

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18769
  • Topic in totale: 2232
  • Online Today: 303
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 289
Total: 289

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.