Newsgroup: it.comp.lang.delphi
Titolo: Maleddette Classi

D4Cs
ho una classe Tindirizzo (con i soliti campi via cap città...)
e da queste eridito una classe Tanagrafica con in + i campi nome cognome
ora ha una variabile indi:Tindirizzo;piena con i miei dati
e volgio riempire una anag:Tanagrafica con l'indirizzo di indi
come faccio?
vi prego ,un disperato di classi!!!!
var indi:Tindirizzo;
anag:Tanagrafica;
begin
indi:=Tindirizzo.create;
anag:=Tanagrafica.create;
indi.cap:=21210;
indi.citta:='milano';
// ora vorrei scirvere una riga tipo anag:=indi in maniera che i campi di
indi riempano quelli di anag
senza dover scirvere cose del tipo anag.cap:=indi.cap ........
end;
aw...@tin.it

 ho una classe Tindirizzo (con i soliti campi via cap cittą...)


Dovrebbe esistere il metodo Assign, ma non ricordo se è su TObject o parte
da TPersistent.
Ciao !

 senza dover scirvere cose del tipo anag.cap:=indi.cap ........
Penso che la soluzione + pulita sia quella di scrivere un metodo di
TAnagrafica che accetti un parametro di tipo TIndirizzo da cui copi i valori
(una specie di Assign)...
Però ho come il presentimento che ci siano anche altre soluzioni + raffinate
(ogni ipotesi è ben accetta)...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply


non va bene,perchè in realtà indirizzo è una classe con 100 campi
e non volgio scrivere cento linee tipo
anag.cap:=indi.cap ......

 come faccio?
se non ti serve una proprio una classe puoi usare un record
TIndirizzo = record
  indirizzo: string;
  cap: string;
  ...
end;
TAnagrafica = record
  Nome: string;
  Cognome: string;
  Indirizzo: TIndirizzo;
end;
I: TIndirizzo;
A: TAnagrafica;
A.Indirizzo := I;
se proprio ti servono le classi puoi fare in modo che TIndirizzo
abbia un metodo Assign che assegni le sue variabili prendendo
i valori da un altro TIndirizzo.

 i valori da un altro TIndirizzo.
non va bene neanche questo perchè se tu intendi assegnare una variabile una
a una,divento matto in quanto sono almeno 100
inoltre in realtà le classi  (Tanagrafica era solo un esempio )sono almeno 4
o 5 così mi ritroverei a scrivere 400 righe di codice,possibile non ci sia
un modo + semplice e breve?

 un modo + semplice e breve?
Probabilmente potresti usare le RTTI e copiare tutti i campi comuni da un
oggetto all'altro...
Sarebbero un paio di cicli for ma dubito molto sul fatto che sia + semplice
di scriverseli a manina... [anche se di sicuro sarebbe codice + robusto
rispetto a future modifiche alle classi in questione, ma questo legame così
stretto potrebbe rivelarsi un'arma a doppio taglio: per esempio se vuoi
copiare solo _alcuni_ attributi e non tutti quelli comuni...]



Combina le 2 cose.
Crei le classi i cui campi sono raggruppati in record e crei dei metodi
Assign nelle classi che assegnano i record.
Farai cioe':
TInidirizzoRec = record
  FVia: String;
  FCap: String;
  .....
end;
TIndirizzo = class
protected
    FDati: TIndirizzoRec;
public
    procedure Assign(oher: TIndirizzo); {fara' solo FDati := other.FDati;}
end;
Personalmente pero' non so se il Delphi gestisca correttamente
l'assegnazione di record contenenti AnsiString
Ciao,
Stefano

l'assegnazione di record contenenti AnsiString
non lo so nemmeno io ma penso proprio di si'
Ciao
Carlo

 copiare solo _alcuni_ attributi e non tutti quelli comuni...]
molto interessante
se ho capito bene c'è un modo per scorrere le proprietà di una classe con un
ciclo for????
mi fai un esempio?
RTTI? confesso ,sono ingorante cosa sono? per cosa sta la sigla?



 l'assegnazione di record contenenti AnsiString
A quel che ricordo non dovrebbe neanche permetterti di inserire un campo
stringa in un record (penso per motivi di allineamento, la "long" string è
un puntatore a x bytes, tutte le funzioni come quelle di Seek sui files of
records salterebbero...)
L'idea è buona, quello che pensavo era questo: Assign viene implementato da
TPersistent, vale la pena di ereditare da lì?
Io ci ho provato ma ottengo qualche problemino dopo l'assign (come se
sballasse i puntatori dei campi... -> AV)
Ciao LazyBoy ;-)



Dipende da cio' che deve fare.
La classe TPersistent implementa delle cose che potrebbero non servirgli e
tra l'altro potrebbero servirgli degli Assign differenti nella stessa classe
Ciao,
Stefano

   end;
Hai ragione, mi era rimasto in mente che non si poteva perchè effettivamente
non puoi fare un
var f: file of TMyRecord ...
Cmq è vero che puoi benissimo usarli (senza files di mezzo).
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
Ps: domanda: la differenza fra una AnsiString e una String è il character
set (8/16 bits)?


 RTTI? confesso ,sono ingorante cosa sono? per cosa sta la sigla?
RTTI = Run Time Type Information...
La unit in questione è la TypInfo, che ti fornisce tipi e funzioni per
lavorare con gli oggetti (a "basso livello") a run time...
Non sono semplici da usare [io le ho usate pochissimo, al limite per
cambiare una property di una serie di oggetti a run time e permettere
all'utente di decidere _quale_ property a run time...]
C'è una GetPropList che dovrebbe restituirti una lista delle proprietà
pubbliche di una classe, io non ho mai fatto nulla del genere ma so che qui
c'è gente che ha + familiarità di me con le RTTI...
[Tra l'altro se ben ricordo devi avere come minimo un TComponent per poterle
sfruttare]
Ps: cmq non credo che ne valga la pena, io resto della mia prima idea:
meglio farsi un metodo assign e farlo a manina (tanto, anche se sono tante
ti basta copia-incollare la definizione di una delle due classi e hai già il
50% di testo in meno da scrivere...)
E poi quanti campi hai in un'anagrafica?? ;-)
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere


sballasse i puntatori dei campi... -> AV)
Ci avevo pensato anch'io, ma se aggiungi delle proprieta', dovrai
anche ridefinire Assign affinche' gestisca questi nuovi dati. Il
diavolo esce dalla porta e rientra dalla finestra... :(
Ciao
--
Piero Bonanno
bop...@libero.it
pie...@tiscalinet.it
bop...@tin.it
bpie...@hotmail.com
______________________________________________
"Madame, lei ha tra le gambe uno strumento
che puo' offrire piacere a migliaia di persone,
e tutto quello che sa fare e' grattarlo"
- Sir Thomas Beechan a una violoncellista


io ho fatto un esempio prendendo indirizzo e anagrafica, in realta la mia
classe "indirizzo" ha circa 50 campi,
e di classi anagrafiche,cioè classi che eriditano da Tindirizzo ne ho circa
10;
quindi 50x10=500 righe di codice da scrivere
inolte a guardare bene ho anche casi in cui da Tanagrafica eredito in una
terza classe  Tcliente e così via quindi:
1) i metodi copia sono i + facili ma è assurdo scrivere tanto codice
2) ereditare da tpersistent non mi funziona ho sempre mille errori: se avete
un esempio...
3) rtti con componenti potrebbe essere soluzione ma è tutto da vedere
4) definire Tanagrafica con una proprietà di tipo Tindirizzo anzichè
ereditare e fare una solo copia dei 50 caratteri mi sembra la soluzione fino
ad ora migliore
5)CI DEVE ESSERE UNA SOLUZIONE MIGLIORE  QUINDI SONO DISPERATO
nb:anche se mi funzione solo parzialmente una strada potrebbe essere
Anagrafica:=Tanagrafica(indirizzo)
altre idee?


No. Normalmente String ed AnsiString sono la stessa cosa. Ho scritto
AnsiString per non far pensare che si trattasse di ShortString. Ambedue
gestiscono i caratteri ANSI a 8 bit.
Per gestire i caratteri a 16 bit occorre usare le WideString
Ciao,
Stefano


Fossero tutti questi i problemi ;-)
Ciao,
Stefano