* * * *

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.
Novembre 25, 2024, 03:38:10 am

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

39 Visitatori, 0 Utenti

Autore Topic: Come assicurarsi del corretto rilascio delle risorse  (Letto 15800 volte)

luigi67

  • Newbie
  • *
  • Post: 25
  • Karma: +0/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #15 il: Marzo 06, 2014, 01:03:17 pm »
si scusa era senza parametro il create.
mi manca il getnext?

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #16 il: Marzo 06, 2014, 01:18:49 pm »
Codice: [Seleziona]
function TProdotto.getNext : TProdotto;
begin
  result := FNext;
end;

Non ricordo la shortcut .. ma c'è il modo di dire a Lazarus di fare il lavoro noioso al posto mio...
Crtl+O?
Possibbole?

Stilgar :p
OT: Inizio a sentire la primavera .. mo so affari vostri :D
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

luigi67

  • Newbie
  • *
  • Post: 25
  • Karma: +0/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #17 il: Marzo 06, 2014, 01:23:37 pm »


allora questo è il codice modificato della unit oggetti


unit oggetti;

{$mode objfpc}{$H+}{$M+}

interface

uses
   Classes, SysUtils;
type

{ TPianta }

TPianta=class(TObject)
private
 procedure SetNomePianta(AValue: String);
protected
FNomePianta:string;
Fnext:TPianta;
public
  Constructor Create;
  Destructor Destroy; override;
published
  Next : TPianta;
  property NomePianta: String read FNomePianta write SetNomePianta;
   end;

{ TProdotto }

TProdotto = class(TObject)
private
   procedure SetIDProdotto(AValue: String);
   procedure SetNext(AValue: Tprodotto);
   procedure SetNomePianta(AValue: String);
   procedure SetQuantita(AValue: Single);
 protected
   FNomePianta:string;
   FIDProdotto:string;
   FQuantita:single;
   FNext:TProdotto;
public
  Constructor Create;
  Destructor Destroy; override;

published

  property NomePianta: String read FNomePianta write SetNomePianta;
  property IDProdotto: String read FIDProdotto write SetIDProdotto;
  property Quantita : Single read FQuantita write SetQuantita;
  property Next:Tprodotto read FNext write SetNext;
 end;


implementation

{ TPianta }

procedure TPianta.SetNomePianta(AValue: String);
begin
   if NomePianta=AValue then Exit;
   FNomePianta:=AValue;
end;


constructor TPianta.Create;
begin
 FNomePianta:='';
end;

destructor TPianta.Destroy;
begin
  FNomePianta:='';
  if Assigned(FNext) then FreeAndNil(FNext);
  inherited Destroy;
end;


{ TProdotto}
procedure TProdotto.SetNomePianta(AValue: String);
begin
   if FNomePianta=AValue then Exit;
   FNomePianta:=AValue;
end;

procedure TProdotto.SetIDProdotto(AValue: String);
begin
   if FIDProdotto=AValue then Exit;
   FIDProdotto:=AValue;
end;

procedure TProdotto.SetNext(AValue: Tprodotto);
begin
   if Assigned(fNext) then
   begin
   fNext.Next := AValue;
   end
    else
    begin
      FNext := AValue
    end;
end;



procedure TProdotto.SetQuantita(AValue: Single);
begin
   if FQuantita=AValue then Exit;
   FQuantita:=AValue;
end;


constructor TProdotto.Create;
Begin
   FNomePianta:='';
   IDProdotto:='';
   FQuantita:=0.0;
   FNext:=nil;
End;

destructor TProdotto.Destroy;
Begin
   FNomePianta:='';
   IDProdotto:='';
   FQuantita:=0.0;
  if Assigned(FNext) then FreeAndNil(FNext);
  inherited Destroy;
End;
end.




e questo un frammento della  funzione che la richiama, chiaramente manca la creazione di next infatti alla seconda assegnazione fatta dal ciclo for mi da errore




function TFPrincipale.CaricaProdotti(var numprod:integer):TProdotto;
var
//corrente,precedente:PProdotti;
i:integer;
mempos:string;
prod:TProdotto;
begin
try
i:=1;
Result:=Nil;
prod:=TProdotto.Create;
numprod:= THackGrid(DBGRTrattProdotti).VisibleRowCount;

for i := 1 to numprod do al 2° ciclo errore su
begin
prod.IDProdotto:=dati.TTempTrattProdotti.FieldByName('Prodotto').AsString; 2° ciclo errore su
prod.Quantita:=dati.TTempTrattProdotti.FieldByName('FDQuantita').AsFloat;
prod:=prod.Next;
end;


......

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #18 il: Marzo 06, 2014, 01:35:39 pm »
Se non ti avesse dato errore mi sari incazzato con il compilatore... :D
Scommetto che si incazza perchè trova il valore NEXT non valorizzato.... o meglio valorizzato a pene segugiorum.
Codice: [Seleziona]
constructor TPianta.Create;
begin
 FNomePianta:='';
   FIDProdotto:='';
   FQuantita:=0.0.;
   FNext:=NIL;
 // Non facciamo gli scansafatiche, impostiamo TUTTI i volori di default a mano. ;)
end;
//...
var TestaProdotti, ProdottoCursore : TProdotto;
//...
for i := 1 to numprod do //al 2° ciclo errore su
begin
  ProdottoCursore.IDProdotto:=dati.TTempTrattProdotti.FieldByName('Prodotto').AsString; 2° ciclo errore su
  ProdottoCursore.Quantita:=dati.TTempTrattProdotti.FieldByName('FDQuantita').AsFloat;
  ProdottoCursore := TProdotto.Create;  // <----- SE NON LI CREI NON LI USI :D SE LI USI E NON LI CREI ... Buuum
  TestaProdotti.Next := ProdottoCursore;
end;
Perdonato solo perchè stai riprendendo in mano la programmazione ;)
Stilgar

OT: Come cantava?
Maledetta primavera?
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

luigi67

  • Newbie
  • *
  • Post: 25
  • Karma: +0/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #19 il: Marzo 06, 2014, 09:14:57 pm »
Grazie Stilgar
Adesso non posso provare la modifica, domani la prima cosa lo modifico. Ti devo dire che ci ero arrivato e ti invierò una copia di quello che ho fatto senza la tua modifica. Un'ultima cosa alla fine però perdo il riferimento alla lista; in pratica arrivo in fondo e basta... ho inserito una proprietà chiamata "first" che come da nome dovrebbe  mantenere il riferimento all'inizio della lista, ma poi mi sono ricordato che l'oggetto viene ricreato ogni volta di conseguenza... mi viene in mente "static" come reminescenza...mah
« Ultima modifica: Marzo 06, 2014, 09:48:34 pm da luigi67 »

luigi67

  • Newbie
  • *
  • Post: 25
  • Karma: +0/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #20 il: Marzo 07, 2014, 09:46:10 am »
allora di seguito la unit oggetto modificata. Mi manca come dicevo un passaggio e cioè il puntatore al primo elemento. In pratica riempo la lista  e poi perdo l riferimento.
Codice: [Seleziona]

unit oggetti;

{$mode objfpc}{$H+}{$M+}

interface

uses
   Classes, SysUtils;
type

{ TPianta }

TPianta=class(TObject)
private
 procedure SetNomePianta(AValue: String);
protected
FNomePianta:string;
Fnext:TPianta;
public
  Constructor Create;
  Destructor Destroy; override;
published
  Next : TPianta;
  property NomePianta: String read FNomePianta write SetNomePianta;
   end;

{ TProdotto }
TProdotto = class(TObject)
private
   function GetFirst: TPRodotto;
   procedure SetIDProdotto(AValue: String);
   procedure SetNext(AValue: Tprodotto);
   procedure SetNomePianta(AValue: String);
   procedure SetQuantita(AValue: Single);
   function  GetNext:TProdotto;
 protected
   FNomePianta:string;
   FIDProdotto:string;
   FQuantita:single;
   FNext:TProdotto;
   FFirst:TProdotto;
public
  Constructor Create;
  Destructor Destroy; override;

published

  property NomePianta: String read FNomePianta write SetNomePianta;
  property IDProdotto: String read FIDProdotto write SetIDProdotto;
  property Quantita : Single read FQuantita write SetQuantita;
  property Next:Tprodotto read GetNext write SetNext;
  property First:TPRodotto read GetFirst;
 end;


implementation

{ TPianta }

procedure TPianta.SetNomePianta(AValue: String);
begin
   if NomePianta=AValue then Exit;
   FNomePianta:=AValue;
end;


constructor TPianta.Create;
begin
 FNomePianta:='';
end;

destructor TPianta.Destroy;
begin
  FNomePianta:='';
  if Assigned(FNext) then FreeAndNil(FNext);
  inherited Destroy;
end;


{ TProdotto}
procedure TProdotto.SetNomePianta(AValue: String);
begin
   if FNomePianta=AValue then Exit;
   FNomePianta:=AValue;
end;

function TProdotto.GetFirst: TPRodotto;
begin
metodo vuoto dato che non riueco a capire come restituire il primo elemento della lista
end;

procedure TProdotto.SetIDProdotto(AValue: String);
begin
   if FIDProdotto=AValue then Exit;
   FIDProdotto:=AValue;
end;

procedure TProdotto.SetNext(AValue: Tprodotto);
begin
 if FNext=AValue then Exit;
 FNext:=AValue;
end;




procedure TProdotto.SetQuantita(AValue: Single);
begin
   if FQuantita=AValue then Exit;
   FQuantita:=AValue;
end;

function TProdotto.GetNext: TProdotto;
begin
FNext:=TProdotto.Create;
result := FNext;
end;


constructor TProdotto.Create;
Begin
   FNomePianta:='';
   IDProdotto:='';
   FQuantita:=0.0;
     FNext:=nil;
End;

destructor TProdotto.Destroy;
Begin
   FNomePianta:='';
   IDProdotto:='';
   FQuantita:=0.0;
  if Assigned(FNext) then FreeAndNil(FNext);
  inherited Destroy;
End;

end.

qui invece come viene richiamato l'oggetto


Codice: [Seleziona]
ProdottoCursore:=TProdotto.Create;
numprod:= THackGrid(DBGRTrattProdotti).VisibleRowCount;
//Getmem(prod,numprod*SizeOf(TProdotto) );
//inc(prod);
for i := 1 to numprod do
begin
ProdottoCursore.IDProdotto:=dati.TTempTrattProdotti.FieldByName('Prodotto').AsString;
ProdottoCursore.Quantita:=dati.TTempTrattProdotti.FieldByName('FDQuantita').AsFloat;
dati.TTempTrattProdotti.Next;
ProdottoCursore := TProdotto.Create;
TestaProdotti.Next := ProdottoCursore;


Sicuramente la soluzione è lì ma io per poca conoscenza di questi meccanismi non la vedo
« Ultima modifica: Marzo 07, 2014, 09:49:34 am da luigi67 »

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #21 il: Marzo 07, 2014, 09:59:56 am »
Per vitare la perdita della lista, piccolo trucchetto.
Fai una funzione al posto di una procedura.
Quando la richiami, crea e popola la lista.
L'utilizzatore poi ha in mano la testa della lista e ne farà quello che deve :D

Codice: [Seleziona]
Function TContenitore.carica: TProdotto;
var
  ProdottoCursore : TProdotto;
  numprod: integer;
begin
  ProdottoCursore := TProdotto.Create;
  Result :=  ProdottoCursore;
  ProdottoCursore:=TProdotto.Create;
  numprod:= THackGrid(DBGRTrattProdotti).VisibleRowCount;
  for i := 1 to numprod do
  begin
    ProdottoCursore.IDProdotto:=dati.TTempTrattProdotti.FieldByName('Prodotto').AsString;
    ProdottoCursore.Quantita:=dati.TTempTrattProdotti.FieldByName('FDQuantita').AsFloat;
    dati.TTempTrattProdotti.Next;
    ProdottoCursore := TProdotto.Create;
    Result.Next := ProdottoCursore;
  End;
End;


Altra considerazione.
Semplifichi la lettura, ma da designer ho sempre qualche dubbio ;)
Questo oggetto è un oggetto di business, quindi potresti anche caricarlo della lettura e scrittuta sul dataset, a livello di competenze.

Quindi potresti mettere in piedi 2 metodilli carini.
Uno di lettura e uno di scrittura.
Codice: [Seleziona]
procedure TProdotto.LoadFromDataSet(const ds : TDataSet);
begin
  FIDProdotto := ds.FieldByName('Prodotto').asString;
  FQuantita:= ds.FieldByName('FDQuantita').asFloat;
end;


procedure TProdotto.SaveToDataSet(const ds : TDataSet);
begin
  try
  ds.edit;
  ds.FieldByName('Prodotto').asString := FIDProdotto ;
  ds.FieldByName('FDQuantita').asFloat := FQuantita;
  ds.post;
  except
  on E : Exception do
     raise EProdottoPersistenceServiceException .Create("Errore in salvataggio dei dati", e);
  end;
end;


Type
  EProdottoPersistenceServiceException = class(Exception)
   protected
     FCause : Exception;
   public
      constructor Create(messageValue: String; causeValue : Exception=null);
      property Cause : Exception read FCause;
  end;


      constructor EProdottoPersistenceServiceException .Create(messageValue: String; causeValue : Exception);
      begin
         inherited Create(messageValue);
         FCause := causeValue;
      end;

Il getFirst nei nodi...a cosa ti serve?
Se ti serve a puntare alla testa della lista ...
Consumi ram per nulla.
Se vuole essere il nodo precedente, bene.
Non è una lista "semplice" ma "doppia" e mi torna ;)

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #22 il: Marzo 07, 2014, 10:00:36 am »
PS:
Tutto il codice lo scrivo di getto.
Non lo passo al compilatore ;)


Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

luigi67

  • Newbie
  • *
  • Post: 25
  • Karma: +0/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #23 il: Marzo 07, 2014, 11:06:01 am »
Nente la lista si perde comunque. Se per maggiore precisione in ptatica richiamo la funzikone da un pulsante questo è il codice

Codice: [Seleziona]
procedure TFPrincipale.SpeedButton1Click(Sender: TObject);
var
recprod:TProdotto;
s:string;
begin
recprod:=CaricaProdotti;
s:=recprod.Next.IDProdotto;

la variabile s  vuota

Ti allego nuovamente tutto il codice
 :'(
Codice: [Seleziona]
(*-----------------UNIT OGGETTI -----------*)

unit oggetti;

{$mode objfpc}{$H+}{$M+}

interface

uses
   Classes, SysUtils;
type

{ TPianta }

TPianta=class(TObject)
private
 procedure SetNomePianta(AValue: String);
protected
FNomePianta:string;
Fnext:TPianta;
public
  Constructor Create;
  Destructor Destroy; override;
published
  Next : TPianta;
  property NomePianta: String read FNomePianta write SetNomePianta;
   end;

{ TProdotto }
TProdotto = class(TObject)
private
   function GetFirst: TPRodotto;
   procedure SetIDProdotto(AValue: String);
   procedure SetNext(AValue: Tprodotto);
   procedure SetNomePianta(AValue: String);
   procedure SetQuantita(AValue: Single);
   function  GetNext:TProdotto;
 protected
   FNomePianta:string;
   FIDProdotto:string;
   FQuantita:single;
   FNext:TProdotto;
   FFirst:TProdotto;
public
  Constructor Create;
  Destructor Destroy; override;

published

  property NomePianta: String read FNomePianta write SetNomePianta;
  property IDProdotto: String read FIDProdotto write SetIDProdotto;
  property Quantita : Single read FQuantita write SetQuantita;
  property Next:Tprodotto read GetNext write SetNext;
  property First:TPRodotto read GetFirst;
 end;


implementation

{ TPianta }

procedure TPianta.SetNomePianta(AValue: String);
begin
   if NomePianta=AValue then Exit;
   FNomePianta:=AValue;
end;


constructor TPianta.Create;
begin
 FNomePianta:='';
end;

destructor TPianta.Destroy;
begin
  FNomePianta:='';
  if Assigned(FNext) then FreeAndNil(FNext);
  inherited Destroy;
end;


{ TProdotto}
procedure TProdotto.SetNomePianta(AValue: String);
begin
   if FNomePianta=AValue then Exit;
   FNomePianta:=AValue;
end;

function TProdotto.GetFirst: TPRodotto;
begin

end;

procedure TProdotto.SetIDProdotto(AValue: String);
begin
   if FIDProdotto=AValue then Exit;
   FIDProdotto:=AValue;
end;

procedure TProdotto.SetNext(AValue: Tprodotto);
begin
 if FNext=AValue then Exit;
 FNext:=AValue;
end;




procedure TProdotto.SetQuantita(AValue: Single);
begin
   if FQuantita=AValue then Exit;
   FQuantita:=AValue;
end;

function TProdotto.GetNext: TProdotto;
begin
FNext:=TProdotto.Create;
result := FNext;
end;


constructor TProdotto.Create;
Begin
   FNomePianta:='';
   IDProdotto:='';
   FQuantita:=0.0;
   FNext:=nil;
End;

destructor TProdotto.Destroy;
Begin
   FNomePianta:='';
   IDProdotto:='';
   FQuantita:=0.0;
  if Assigned(FNext) then FreeAndNil(FNext);
  inherited Destroy;
End;

end.



(*--------------------------Funzione Carica Prodotti------------------------*)



function TFPrincipale.CaricaProdotti:TProdotto;
var
mempos,s:string;
ProdottoCursore : TProdotto;
begin
   try
   ProdottoCursore := TProdotto.Create;
   Result :=  ProdottoCursore;
   dati.TTempTrattProdotti.DisableControls;
   dati.TTempTrattProdotti.Filtered:=true;
   dati.TTempTrattProdotti.First;
  while not dati.TTempTrattProdotti.eof do
       begin
        ProdottoCursore.IDProdotto:=dati.TTempTrattProdotti.FieldByName('Prodotto').AsString;
        ProdottoCursore.Quantita:=dati.TTempTrattProdotti.FieldByName('FDQuantita').AsFloat;
        dati.TTempTrattProdotti.Next;
        ProdottoCursore := TProdotto.Create;
        Result.Next := ProdottoCursore;
       end;
finally
dati.TTempTrattProdotti.Filtered:=False;
dati.TTempTrattProdotti.Locate('Prodotto',mempos,[]);
dati.TTempTrattProdotti.EnableControls;
end;
end;

luigi67

  • Newbie
  • *
  • Post: 25
  • Karma: +0/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #24 il: Marzo 07, 2014, 12:21:37 pm »
Ho fatto questa piccola modifica e funziona

Codice: [Seleziona]
while not dati.TTempTrattProdotti.eof do
       begin
       ProdottoCursore.IDProdotto:=dati.TTempTrattProdotti.FieldByName('Prodotto').AsString;
        ProdottoCursore.Quantita:=dati.TTempTrattProdotti.FieldByName('FDQuantita').AsFloat;
        dati.TTempTrattProdotti.Next;
     
    ProdottoCursore.Next := TProdotto.Create;
        ProdottoCursore:=ProdottoCursore.Next;

       end;
finally   

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #25 il: Marzo 07, 2014, 12:57:19 pm »
Bene
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

luigi67

  • Newbie
  • *
  • Post: 25
  • Karma: +0/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #26 il: Marzo 11, 2014, 11:04:36 am »
Allora dopo prove e riprove l'errore persiste. La cosa pazzesca è che gli oggetti creati sono creati o dentro procedure con variabili locali o sono essi stessi result di funzioni. Eppure continua a darmi errore. Ho provato pure con backtrace ed è un'ulteriore conferma, la memoria non rilasciata cresce al maggior utilizzo di tali oggetti. es. se ho più di un record. Se ho un solo record backtrace mi dice

7 unfreed memory blocks : 126 

mentre se è di due record

12 unfreed memory blocks : 248

Vorrei allegare il progetto, ma per usarlo dovreste crearvi pure un database firebird, potrei allegare lo script sql per la creazione di un database vuoto

Il dubbio che mi viene è che sia un problema del compilatore o di Lazarus, dato che per usare alcuni package che mi servono li ho presi dalle versioni non stabili

e sono le seguenti

Lazarus 1.3 r43375
FPC 2.7.1 i386-linux-gtk 2

Vi ringrazio ancora per l'aiuto
Luigi

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Come assicurarsi del corretto rilascio delle risorse
« Risposta #27 il: Luglio 05, 2014, 12:20:09 am »
Prova a passare le istanze "locali" come parametri "var".
In questo modo non li hai creati nell'heap della funzione chimata, ma in quella chiamante.
Così il lifetime degli oggetti lo dovresti riuscire a controllare meglio .. spero.

Se poi il problema è nei pacchetti beta ... o li ricontrolli o cerchi una versione stabile per essere sicuro :D

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19189
  • Topic in totale: 2289
  • Online Today: 50
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 39
Total: 39

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.