Newsgroup: it.comp.lang.delphi
Titolo: Array of records

Buongiorno a tutti,
esiste un modo per dichiarare un array di record diversi tra loro?
Es:
type Tr1 = record
  i:integer;
  end;
type Tr2 = record
  s:string;
  end;
var
  r1: Tr1;
  r2: Tr2;
  pippo: array[1..2] of pointer;
...
pippo[1] := @r1;
pippo[2] := @r2;
pippo[1].i := 10;  <-- errore!
Dovrei fare un cast ma non c'è un'altra strada?
Magari non utilizzando i puntatori....
Grazie in anticipo.
Davide

misa di no, salvo usare puntatori. Domanda: xche record e non classi?
diventa tutto molto semplice:
type
  Trrott= class
  public
  end;
  tr1 = class(trrott)
  public
    property IntValue: integer read write...
  end;
  tr2 = class(trrott)
  public
    property StringValue: string read write...
  end;
usi una tlist e buonanotte all'array..
magari puoi usare una sola classe ed esporre una property variant, e
invece dei cast fai dei check sul tipo di variant:
  Trr= class
  public
    property Value: variant....
  end;
A.


Grazie per la pronta risposta e perdonami ma...
in che senso una tlist?
come faccio ad assegnargli classi diverse?
...credo di non aver capito.

 wrote:

Questo è quello che ho provato a fare ma non funziona come vorrei...
devo fare di nuovo il cast.
Dove sbaglio?
Grazie di nuovo.
type
  Trrott= class
  public
  end;
  tr1 = class(trrott)
  private
    i: integer;
  public
    property IntValue: integer read i write i;
  end;
  tr2 = class(trrott)
  private
    s: string;
  public
    property StringValue: string read s write s;
  end;
var
  Form1: TForm1;
  t1: tr1;
  t2: tr2;
  l: tlist;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
l := tlist.Create;
t1:= tr1.Create;
t2:= tr2.Create;
l.Add(t1);
l.Add(t2);
l.Items[1].IntValue := 0;  <-- qui sono obbligato a fare ancora il
cast, così non funziona.
end;

 come faccio ad assegnargli classi diverse?
In tilist non "assegni"...
o meglio, ad una lista non "assegni", ma AGGIUNGI.
A.

 cast, così non funziona.
magari qualche dettaglio in piu su quello che devi fare aiuta..
A.


Abbiamo postato nello stesso istante...
Comunque anche utilizzando il componente tlist ricado sempre nello
stesso prblema.
Corretto?

Se usi una SOLA classe con una property variant il cast non ti
serve...
Magari puoi mettere 2 costruttori e in base a quale chiami metti una
seconda property readonly che ti dice se quella istanza ha un valore
integer o string
A

> magari qualche dettaglio in piu su quello che devi fare aiuta..
??
Allora, vorrei semplicemente dichiarare ed utilizzare un array di
record diversi tra loro.
Tu mi dicevi che non si può fare, ok... ma che con le TList.... etc
Ho provato a farlo ma senza esiti positivi. (es sopra esposto)
Quindi come posso risolvere il mio problema ? (sempre che si possa
fare...)
Scusami se scrivo "a stento" ma ho la mano dx rotta e scrivere solo
con la sx ti assicuro che è straziante...
Grazie di nuovo, Davide

 Grazie di nuovo, Davide
Non puoi farlo senza casting, pure usando la classe TList che � comunque
un array di puntatori. TList ti consente di aggiungere qualsiasi tipo di
oggetto a runtime ma poi devi sapere tu che tipo stai prelevando e farne
un uso corretto, per cui non credo che puoi prescindere dal type cast.
Quello che Alberto intendeva quando ti chiedeva ulteriori dettagli,
credo, si riferisse al tuo problema e alla eventuale ricerca della sua
soluzione; magari esistono dei pattern gi� conosciuti che possono
aiutarti agevolemente a risolverlo.
Antonio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - 
http://enigmail.mozdev.org
iEYEARECAAYFAkpCI4kACgkQYSsm1R1/E7wfaQCaA4lxetgjbO5MGx02HZM0a2NM
CmcAoKpFaQIj62InuhlulGrp+F8ebfou
=BTWK
-----END PGP SIGNATURE-----

 l.Items[1].IntValue := 0;  <-- qui sono obbligato a fare ancora il
...
prova a sostituire la linea sopra con:
if (l.Items[i] is tr1) then
   tr1(l.Items[i]).IntValue:=0
else if (l.Items[i] is tr2) then
   tr1(l.Items[i]).StringValue:='';
io uso spesso questo metodo e tutto funziona a meraviglia,
negli altri casi uso il variant e ugualmente tutto funziona a meraviglia
A presto,
Enrico


Ok, grazie a tutti per le dritte!


Altra possibilita' oltre a quello che ti hanno gia' suggerito: puoi
alle origini "turbo Pascal" del linguaggio Delphi e usare i record
varianti
(corrispondono grosso modo al costrutto "union" del C, se per caso lo
conosci):
// Non testato.
type
  Tr1 = record
    i:integer;
  end;
type
  Tr2 = record
    s:string;
  end;
type
  Tr0 = record
    case tr:integer of
    0:
    (
        r1 : Tr1;
     );
    1:
      (
        r2 : Tr2;
      );
  end;
var
  pippo: array[1..2] of Tr0;
begin
  pippo[1].r1.i := 10;
  pippo[2].r2.s := 'ciao';
end;
ciao
Giacomo

si ok.. ma delphi NON E' TP.
Dovremmo iniziare una buona volta a smetterla di usare delphi come
fosse tp o peggio VB6...
Poi il cliente chiama e bestemmiando e ulrando ti dice che non
funziona un cazzo....
tu sei li, apri il codice non scritto da te e trovi delle cose che ti
fanno cadere le OO a terra...e capisci immediatamente xche le cose
scoppiano.
Se ognuno di noi scrivesse le cose dando x scontato che:
1) di sicuro si faranno modifiche
2) al 90% non saro IO a fare le modifiche
forse avremmo delle cose scritte MEGLIO, che funzionano MEGLIO, che
sono piu' facili da MODIFICARE quando serve....eviteremmo parolacce,
bestemmie, nottate, perdite di tempo e ne guadagneremmo di salute...
Delphi è OO. Quindi:
record? solo per le api di winzozz. per il resto, CLASSI.
array? no grazie: liste come tlist, tobjectlist etc
varabili dichiarate nelle sezioni implementation o nella public/
published di una classe? mamma mia che SCHIFO.
ARRAY DI OGGETTI? puah!
Per me, lavorare in strutturato avendo la OOP è come sollevare con le
mani un auto per cambiare una ruota avendo li accanto un crick...
A.

 mani un auto per cambiare una ruota avendo li accanto un crick...
Questo me la segno e me la rivendo ;)
Antonio

 Questo me la segno e me la rivendo ;)
azz..qua tutti a copiare... e a me manco un centesimo di diritti
d'autore.... :-(((
ROTFL.
A.

 preesistente...
Pi� che altro, in questo thread - a meno che non mi sia sfuggito - non � 
stato detto qual � l'obiettivo per cui si intende utilizzare questo 
array, e perch� dovrebbe fare riferimento a record di tipo diverso.
Secondo me, l'iniziatore della discussione dovrebbe dire esattamente 
cosa sta cercando di fare, cio� i motivi per cui ha pensato di usare 
quell'array amorfo; detto questo, poi possiamo suggerire implementazioni 
alternative e pi� "pulite" per risolvere l'esigenza specifica.
Ciao!
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 array, e perch� dovrebbe fare riferimento a record di tipo diverso.
No, infatti hai ragione. E' quanto avevo sottolineato anche io in uno 
dei post cercando di capire le "criptiche" richieste di Alberto :)) LOL.
Antonio
p.s. Alberto, quando verrai qui ti pagher� le royalties a birre, ok :) ?

> p.s. Alberto, quando verrai qui ti pagherò le royalties a birre, ok :) ?
Occhio che potrebbe non essere conveniente, per
te.....ahahahahahahhahaahha
A.


Condivido quasi tutto quello che hai scritto, tranne un punto: il
fatto che
un linguaggio sia OO non significa che tutte le problematiche vadano
affrontate usando gli oggetti. Usando la tua metafora: lavorare sempre
a oggetti e' come sollevare la macchina con un crick, ma poi svitare i
bulloni con un crick e togliere la gomma con un crick! :)
Non dimenticare che i record hanno alcuni vantaggi rispetto alle
classi:
vengono creati e distrutti automaticamente, possono essere passati
per valore, possono avere gli operatori ridefiniti.
Insomma, se uno ha deciso di usare un record per risolvere il suo
problema
non penso proprio che debba essere considerato a prescindere un
deficiente
e secondo me meritava di avere una risposta attinente alla sua
domanda.
ciao
G

 domanda.
Nessuno considera nessuno deficiente a prescindere, posto che si 
giustifichi le proprie scelte, cos� come si pu� legittimamente pensare 
che la soluzione corretta ad un problema sia un'altra, senza vederla 
come un accanimento verso i record o un amore smodato e incondizionato 
per la OOP. :)
Ciao,


 per la OOP. :)
Quoto totalmente. La mia risposta pero' era al messaggio di Alberto
che
a giudicare dai suoi messaggi mi pare che non la pensi come te. :)
ciao
Giacomo

 come nei linguaggi piu' "fortemente orientati" come Java o C
Per quanto possa valere la mia opinione, io sono d'accordo parola per
parola 
con quanto dici qui sopra.
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 domanda.
Quindi, correggere e spingere alla crescita professionale e al
miglioramento è sbagliato, mentre è giusto assecondare comportamenti
sbagliati?  Sinceramente, mi aspettavo maggior buon senso, da te.
Pax vobiscum
A.

 a giudicare dai suoi messaggi mi pare che non la pensi come te. :)
io parto da una cosa che spesso non è scontata: il buon senso...
Se arriva uno qua e mi dice "devo mandare un pacchetto di dati via
socket" la risposta ovvia è "se puoi usa un record".
Ma quando vedo che devo gestire array di "cose" che hanno delle
property, per me è scontato che vanno usate le classi.
A

 completezza mettiamo gli svantaggi...
E qui mi cadi sull'uccello caro il mio signor Longari :). Locuzioni 
come: scendere in campo, mettere in campo, piazzarre in campo ecc.. 
vanno accuratamente evitate ;) LOL
Antonio

 Sinceramente, mi aspettavo maggior buon senso, da te.
Vabbe... questo lo accetto da te perche' frequntando il NG da un tot
e'
un po' come se ci conoscessimo davvero! ;)
ciao
Giacomo

 a giudicare dai suoi messaggi mi pare che non la pensi come te. :)
Conoscendo Alberto, si tratta del suo "stile", ma non penso che abbia 
rancori o risentimenti verso persone che non conosce, ma questo 
eventualmente lo confermer� lui. :)


 vanno accuratamente evitate ;) LOL
di questo passo finiremo a neolingua e bispensiero... rotfl!
A.

 e' un po' come se ci conoscessimo davvero! ;)
su..su...se passi per la capitale di Polentland, cioè, Milano, fatti
vivo che te la pago io una birra.. :-D
Pax vobiscum
A.

 OOP che sembra il più adatto
Si si, su questo direi che siamo sostanzialmente d'accordo: forse io
preferisco dare un pochettino piu' corda a chi chiede aiuto, correndo
poi il  rischio che con quella corda ci si impicchi da solo!  :P
ciao
G

 vivo che te la pago io una birra.. :-D
Eh eh, guarda che poi lo faccio davvero! Ovvio che ricambio appena
passi dalla capitale di Lasagnaland. :P
ciao
Giacomo

 venditori di fumo che i venditori di arrosto! :)
Imho non � neanche questo il problema. Credo che anche negli altri paesi
non esistano albi che, come per magia, possano eleggerti programmatore
D.O.C. .
Il vero problema in cui noi italiani incappiamo, sempre imho, � quello
di sentirsi arrivati "subito", si capisce sempre qualcosa in pi� degli
altri e questo � vero in tutte le materie a cui sono interessato anche
su altri newsgroup. Ovviamente, ci� � tutto da verificare e l'unico modo
di farlo � attraverso dati oggettivi, ovvero pubblicazione di proprio
codice, pubblicazione di articoli e/o volumi, partecipazione a lungo
termine a progetti (magari opensource ecc..). Questo tipico
atteggiamento porta ad una inevitabile conseguenza, ovvero l'incapacit�
assoluta di partecipare ad un gruppo di lavoro per la realizzazione di
un progetto comune (ovviamente mi riferisco a gruppi di lavoro senza
coercizione ;) ).
Le nostre intelligenze, quindi, perch� rimango convinto che in quanto a
materia prima non abbiamo nulla da invidiare ad alcun paese, rimangono
l� ...
Antonio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - 
http://enigmail.mozdev.org
iEYEARECAAYFAkpGK9QACgkQYSsm1R1/E7zj9QCfUjJYzEfOeE80pl+ZPIRJDy1p
ZhsAn1mjeIDwKibr4ioooOKVl1MBSWrG
=wtAQ
-----END PGP SIGNATURE-----

 passi dalla capitale di Lasagnaland. :P
lol :-D
A.