Newsgroup: it.comp.lang.delphi
Titolo: Rave e liberare memoria dopo ExecuteReport

Utilizzando  Rave  ho visto che a seguito del metodo executeReport 
non viene liberata la memoria .
Qualcuno sa come fare ?
Di seguito una procedura di test ovviamente incompleta ma che mi serve per
verificare l'allocazione e deallocazione della memoria del programma . 
La riga che mi fa occupare memoria che non viene liberata è 
  RvPrj.ExecuteReport(reportname);
Grazie
procedure Telenco_Clienti.Print(ravename:string;reportname:string);
var   
 RvPrj:TRvProject;
 RvSys:TRvSystem;
begin
  RvPrj:=TRvProject.Create(nil);
  RvSys:=TRvSystem.Create(nil);
  RvPrj.Engine:=RvSys;
  RvPrj.ProjectFile:=ravename;
  RvPrj.Open;
 
  //Qui viene allocata della memoria che non viene deallocata
  RvPrj.ExecuteReport(reportname);
 
  RvPrj.Close
  FreeAndNil(RvSys);
  FreeAndNil(RvPrj);
end;
Giuseppe Consoli
--- posted by geoForum on 
http://www.delphiedintorni.it

metti una try..finally e ascicurati che sia attivo "stop on exception"
nelle opz IDE.
A.


Ciao, 
Ho fatto come dici ma la situazione non cambia  rimane un memory leak 
dovuto all'esecuzione di executeReport. 
Immagino che tale metodo allochi la memoria per visualizzare il report, 
ma poi non viene liberata come dovrebbe dal metodo close. 
Se è cosi' è grave visto che rave viene dato ufficialmente con delphi ed
esiste un aggiornamento solo alla versione 5.08.
Saluti g.c.


 
entro nella discussione perchè anche io attualmente utilizzo il rave e 
in particolare mi capita che si scateni l'eccezione sul metodo execute 
(che dovrebbe essere analogo all'executeReport). Il problema è che a run 
time oltre a segnalare l'eccezione non blocca l'esecuzione del restante 
codice, che viene eseguito correttamente, ma i report non si stampano 
più e alla chiusura del programma mi vien fuori un access violation.
Potrebbe essere attinente ?
Daniele


Il punto e che nell'utilizzare i rave report ho individuato dei memory leak. 
Per capire a cosa fosse dovuto ho semplificato la procedura di stampa al
massimo aggiungendo man mano pezzi di codice e verificando con il task
manager l'occupazione di memoria della applicazione alla pressione
ripetuta di un pulsante di stampa. Ovviamente non continuo l'esecuzione
del report ma annullo la form modale che mi propone preview, printer ,
saveas, altrimenti mi solleverebbe delle eccezioni perche la procedura di
stampa è incompleta .
La procedura che utilizzo per testare il memory leak è cosi ridotta ai
minimi termini e serve solo per verificare l'occupazione di memoria dei
singoli metodi:
 Ricapitolando 
 0:  try
 1:   RvPrj:=TRvProject.Create(nil);
 2:   RvSys:=TRvSystem.Create(nil);
 3:   RvPrj.Engine:=RvSys;
 4:   RvPrj.ProjectFile:=ravename;
 5:   RvPrj.Open;
 6:   RvPrj.ExecuteReport(reportname);
 7: Finally
 8:  RvPrj.Close
 9:  FreeAndNil(RvSys);
10:  FreeAndNil(RvPrj);
11  End;
Le righe 1, 2 allocano ovviamente memoria per la creazione dei rispettivi
oggetti distrutti dalle righe 9 e 10.
le righe 3,4 ovviamente non influenzano la memoria occupata;
Se non inserisco la riga 6 tutta la memoria allocata viene deallocata .
la riga 8: dalla documentazione ufficiale il metodo close chiude il report
e libera la memoria, ma evidentemente non funziona bene.
Per tornare a quello che hai scritto il blocco try finally mi assicura 
che le righe 8, 9, 10 preposte a liberare la memoria vengano in ogni caso
eseguite, 
inoltre come ti dicevo io evito comunque che un eccezione venga sollevata 
premendo cancel nella finestra modale di scelta della modalità di stampa,  
preview etc..
Sono giunto alla conclusione, è una supposizione ovviamente perche' non ho
i sorgenti dei rave, che la procedura executeReport, tra le  operazione
che fa, allochi la memoria di tutti gli oggetti che vengono utilizzati nel
report specificato, cioe' travetext, travememo, ... . E' evidente che
questi oggetti dopo essere stati caricati in memoria debbano da qualcuno
essere scaricati a conclusione dell'esecuzione del report.
Questa operazione dovrebbe secondo me essere eseguita dal metodo close,
ma qualcosa rimane .
Tra l'altro, infine, non mi risulta che esiste qualche altra patch oltre
la 5.08 rilasciata ufficialmente da borland, e non sono disposto ad
acquistare degli aggiornamenti per la versione estesa fornita da nevrona.


 Giuseppe Consoli
Purtroppo se così è l'unica soluzione è abbandonare il RAVE per qualche 
altro sistema di reportistica, leggi fuzzy report...?