Newsgroup: it.comp.lang.delphi
Titolo: Conoscere il nome dell'oggetto

Ciao a tutti, sinteticamente:
può la classe conoscere il nome dell'oggetto istanziato?
Grazie,
Matteo

 può la classe conoscere il nome dell'oggetto istanziato?
Forse sei stato troppo sintetico perche' non mi e' chiara
del tutto la domanda...
se hai una classe (un discendente di TClass) allora non hai
un'istanza di oggetto, hai una classe e basta!
se hai un'istanza di un oggetto perche' il nome non lo prendi
direttamente da quello? Per avere Name deve essere un
discendente (se non sbaglio) di TComponent, quindi:
if Myobject is TComponent then
  Result := TComponent(MyObject).Name;
Oppure ho capito male?
ciao
Giacomo

 discendente (se non sbaglio) di TComponent
Esatto, è quello che cercavo. Peccato che la mia classe discende da
TObjectList...
TMyClass= class(TObjectList)
...
MyCl := TMyClass.Create;
...
quello che vorrei è che dentro un qualche metodo di TMyClass poter
sapere che l'oggetto che è stato istanziato si chiama (nell'esempio)
"MyCl"
Il perchè è che vorrei salvare le istanze di TMyClass all'interno di
un file XML,
la sezione dedicata ad ogni oggetto istanziato lo vorrei chiamare come
l'oggetto stesso,
automaticamente senza doverlo passare come parametro, ovvero:
TMyClass.SaveToXML(NomeFile:String);
e NON TMyClass.SaveToXML(NomeFile:String; NomeObj:String);
Ma forse chiedo troppo, vero?
Spero di essere stato chiaro,
Matteo


Si', chiaro. E purtroppo e' si' anche per l'altra domanda! :)
Quello che chiedi e' impossibile: tu vuoi sapere quale variabile
contiene un'istanza del tuo oggetto, non il nome dell'oggetto!
E questo e' naturalmente impossibile se non altro perche'
puoi avere piu' variabili che referenziano lo stesso oggetto:
  MyCl := TMyClass.Create;
  MyCl2 := MyCl;
  MyCl := nil;
E' del tutto equivalente a :
  MyCl2 := TMyClass.Create;
Quindi che "nome" ti aspetteresti di avere? ;)
Temo che ti tocchera' scrivere a mano tutti i nomi oppure
trovare altri sistemi, provare a usare ClassName + un contatore
oppure aggiungere anche il nome alla classe creando un
nuovo costruttore:
MyCl := TMyClass.Create( 'MyCl' );
In questo caso ogni oggetto avrebbe il suo nome e puoi
gestire l'automatismo durante il salvataggio.
ciao
Giacomo

 Quindi che "nome" ti aspetteresti di avere? ;)
Beh... A me basterebbe 'MyCl'....   ;)
Comunque si, ne percepisco la possibile ambiguità...
Passo quindi alla soluzione 'nuovo costruttore con parametro'.
Grazie,
Matteo

 Passo quindi alla soluzione 'nuovo costruttore con parametro'.
Io per fare una cosa del genere utilizzavo un attributo "xmltag" con il 
nome della classe. Quando dalle istanze serializzavo su xml, prendevo 
miaclasse.xmltag e lo utilizzavo come nome del nodo.
quando deserializzavo e ricostruivo le istanze, facevo il test sul tag 
xml del nodo, e sapevo cosa istanziare.
xml:
<TFatture>
   <TFattura>
     <ID="1">
     ...
   <TFattura/>	  	
   <TFattura>
     <ID="2">
     ...
   <TFattura/>	  	
</TFatture>
a codice:
if nodename = "TFattura" then begin
   obj := TFattura.Create
end
else if nodename = "TArticoloFattura" then begin
   obj := TArticoloFattura.Create
end;
obj.deserialize(XMLNode);
Questo e' uno dei tanti possibili modi, e non è neanche poi tanto OO..
Ciao
-- 
morde
D5,D6,D7
QT4.6.3 QT Creator 2.0

 automaticamente senza doverlo passare come parametro, ovvero [...]
Non mi pare che questa implementazione abbia senso: e se io volessi 
creare un oggetto di quella classe senza volerlo salvare su file?
Io semplicemente aggiungerei una classe la cui istanza faccia da 
"contenitore" e che possa racchiudere questi oggetti al suo interno, 
consentendo di salvarli con un apposito metodo, oppure una classe che 
abbia un metodo in grado di accettare la lista degli oggetti, o 
l'istanza del contenitore, per salvarne il contenuto su file.
In questi frangenti, io mi sono affidato direttamente al meccanismo di 
"streaming" nel formato dei file DFM di Delphi. :)
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 l'istanza del contenitore, per salvarne il contenuto su file.
Se non ho capito male ti riferischi ad un helper che conosce tutte le 
classi di dominio e sa come persisterle. Un avvertimento nell'uso di 
oggetti di questo tipo: se le classi da persistere sono tante, presto 
questo helper finisce per diventare un grosso "oggettone" onniscente e 
quindi difficile da manutenere e pericoloso da gestire, proprio perchè 
sa troppo su tutti gli altri oggetti.
Se si ha il tempo di implementarlo o di inserirlo nella progettazione, 
il miglor metodo da adottare imho è quello di creare nell'oggetto padre 
della gerarchia un metodo virtuale asStream(..) oppure toStream() che 
faccia il lavoro di serializzazione, e reimplementarlo nel caso servisse 
per un suo derivato particolare.
Credo che la VCL ragioni in questo modo: ogni oggetto sa come persistersi.
ciao


 Credo che la VCL ragioni in questo modo: ogni oggetto sa come persistersi.
Intendevo dire questo, quindi se si capiva male hai fatto bene a 
precisarlo. :)
