Newsgroup: it.comp.lang.delphi
Titolo: Una classe semplicissima

Una classe, al momento in cui si istanzia, deve acquisire dei dati da un 
file ini e restituirli in una lista, che il chiamante può aggiornare, e in 
questo caso la classe deve prevedere un metodo per verificare se la lista 
ritornata è diversa da quella originale e, nel caso aggiornare il file INI.
E' quindi una classe molto semplice (ma sto imparando l'object orientation). 
Però mi ha già posto un problema. Il create della classe, al quale viene 
passato un parametro per discernere la sezione del file ini da accedere, può 
direttamente accedere al file ini e creare la lista (e a questo punto posso 
anche fare il free dell'ini). Ma come passo la lista al chiamante ? 
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
http://www.avast.com
 
 

"Stark"  ha scritto nel messaggio news:mk28ae$kf1$1...@speranza.aioe.org...
 
Una classe, al momento in cui si istanzia, deve acquisire dei dati da un
file ini e restituirli in una lista, che il chiamante può aggiornare, e in
questo caso la classe deve prevedere un metodo per verificare se la lista
ritornata è diversa da quella originale e, nel caso aggiornare il file INI.
E' quindi una classe molto semplice (ma sto imparando l'object orientation).
Però mi ha già posto un problema. Il create della classe, al quale viene
passato un parametro per discernere la sezione del file ini da accedere, può
direttamente accedere al file ini e creare la lista (e a questo punto posso
anche fare il free dell'ini). Ma come passo la lista al chiamante ?
---
Mi rispondo da solo. Ho creato una funzione GetList che eseguo nel create... 
Sono benvenute critiche e consigli.
Ma questa lista immagino venga distrutta quando distruggo l'oggetto, vero? 


 Ma questa lista immagino venga distrutta quando distruggo l'oggetto, vero? 
 
Senza codice, non si può mai dire tanto... :)
 
-- 
MARCO BREVEGLIERI (Software and Web Developer)
 #Home: 
http://www.marco.breveglieri.name
 
 #Blog: 
http://www.compilaquindiva.com
 
 #DelphiPodcast: 
http://www.delphipodcast.com
 

"Marco Breveglieri"  ha scritto nel messaggio 
news:b866bb72-f1f8-4550...@googlegroups.com...
Senza codice, non si può mai dire tanto... :)
--
Vero. Ecco il codice:
 
unit QuotesTitoloCls;
interface
uses Classes, IniFiles;
Type
  TQuotes = Class
    private
      FQuotesList: TStringList;
    published
      constructor Create(NomeTitolo: string);
      function GetList: TStringList;
  End;
implementation
 
constructor TQuotes.Create(NomeTitolo: string);
var
  FileQuotazioni: TIniFile;
begin
  FileQuotazioni := 
TIniFile.Create(extractFilePath(paramStr(0))+'Quotes.qts') ;
  FQuotesList := TStringList.Create;
  try
    FileQuotazioni.ReadSectionValues(NomeTitolo, FQuotesList);
    GetList;
  finally
    FileQuotazioni.Free;
  end;
end;
 
function TQuotes.GetList;
begin
  result:= FQuotesList;
end;
end.


1) xche hai messo il metodo nella published e non in public?
2) fai tutto nel costruttore. Salvo casi particolari non è una buona idea
3) cmq, facendo tutto nel costruttore, tanto vale avere una classe con un unico metodo statico, che ti permette di usare la classe senza doverne creare una istanza
 
 
Type
  TQuotes = Class
    private
    public
      class procedure PeekIniSection(
         const AFileName, ASectionName: string; 
         AList: TStringList);
 
  End;
 
implementation
 
 
class procedure PeekIniSection(const AFileName, ASectionName: string; AList: TStringList);
var
  FileQuotazioni: TIniFile;
begin
  Assert( Trim(AFileName) <> '');
  Assert( Trim(AsectionName) <> '');
  Assert( Assigned(AList));
  Assert( FileExists(AFileName));
 
  FileQuotazioni := TIniFile.Create(AFileName) ;
  try
    FileQuotazioni.ReadSectionValues(ASectionName, AList);
  finally
    FileQuotazioni.Free;
  end;
end;
 
end. 
 
 
 
 

 end;
 
Occhio che l'istanza di *TStringList* che restituisci da questa funzione non viene mai distrutta.
 
Se crei metodi che restituiscono oggetti come valore di ritorno, in genere deleghi al chiamante l'onere di rilasciare la memoria di quell'oggetto, chiamando la Free().
 
Ciao,
  Marco.


"Alberto Salvati"  ha scritto nel messaggio 
news:8b3c7907-115a-46e4...@googlegroups.com...
 
1) xche hai messo il metodo nella published e non in public?
Giusto, dovevo metterlo in Public
2) fai tutto nel costruttore. Salvo casi particolari non è una buona idea
Solo perchè pensavo che quando creo questo oggetto il suo contenuto è sempre 
e solo la lista dei valori che acquisisce dal file ini. Non mi sono posto 
altro problema..
3) cmq, facendo tutto nel costruttore, tanto vale avere una classe con un 
unico metodo statico, che ti permette di usare la classe senza doverne 
creare una istanza
Questa non la conoscevo, nemmeno come concetto. Ma se non devo istanziarla, 
come la definisco e  uso nel main ?
Poi la lista acquisita in una listbox, se aggiornata dall'utente, va a 
sostituire quella presente nel file ini. Quindi dovrò prevedere un metodo 
per questo che ancora devo scrivere. Vale lo stesso il tuo suggerimento ?


come mai chiami GetList() dentro il costruttore? A cosa dovrebbe servire?
---
questa domanda dimostra che non ho ancora capito bene come funziona il 
tutto. Nel mio main, istanzio TQotes ma x accedere alla lista create usavo 
il metodo GetList, che adesso ho cancellato sostituendolo con una property:
property QuotesList: TStringList read FQuotesList write FQuotesList;
 
---
Occhio che l'istanza di *TStringList* che restituisci da questa funzione non 
viene mai distrutta.
---
Questa č la domanda che mi facevo: la stringList non viene distrutta 
distruggendo l'oggetto di tipo TQuotes ?
---
La lista che ottengo č fatta cosě:
26/05/2015=100,32
27/05/2015=105,00
...............................
 
Questo non c'entra con l'argomento principale, ma alla lista corrente 
l'utente puň aggiungere degli elementi che devo riscrivere nel file ini; non 
ho ancora pensato come fare. Hai suggerimenti ? 
 
 
---
Questa e-mail č stata controllata per individuare virus con Avast antivirus.
http://www.avast.com
 
 

 
 
 
class procedure WriteIniSection(const AFileName, ASectionName: string; AList: TStringList);
var
  FileQuotazioni: TIniFile;
begin
  Assert( Trim(AFileName) <> '');
  Assert( Trim(AsectionName) <> '');
  Assert( Assigned(AList));
  Assert( FileExists(AFileName));
 
  FileQuotazioni := TIniFile.Create(AFileName) ;
  try
    FileQuotazioni.Write...(ASectionName, AList);
  finally
    FileQuotazioni.Free;
  end;
end; 
 
 

"Alberto Salvati"  ha scritto nel messaggio 
news:3096bcb7-66d0-4d92...@googlegroups.com...
Hai chiara la differenza tra published e public?
- All'ingrosso, published dovrebbe essere un metodo o una property che 
appare nell'object inspector..
- Che vantaggio c'è ad usare la classe che mi hai insegnato ? Che non la 
devo istanziare e quindi non la devo distruggere ?


Ah, e grazie della soluzione; un'altra cosa che non sapevo era che puoi 
scrivere direttamente una Lista. Il Write è un WriteString, dato che i dati 
sono si numerici, ma scritti a stringa, visto che sono un misto di data e 
valore, vero? Con la stringList mostro una listBox a cui l'utente può 
aggiungere elementi, quindi devo aggiungere questi elementi, per cui 
riscrivo l'intera sezione. Ho appena provato a dare come parametro 
direttamente la Listbox.Items, ma essendo una TString mi dà errore. Devo 
ricostruire la stringList dai singoli elementi della ListBox? 


No, non si può scrivere una Lista. Ho dovuto fare un loop per scrivere una 
riga alla volta ... 


...ma forse il medico ti ha veitato di cambiare i metodi usando tstrings e non tstringlist?? :-|