Newsgroup: it.comp.lang.delphi
Titolo: Case Integer ?

Tanto per diradare la nebbia che ho nel cervello :-)
Curiosando nel listato della vcl, ho visto questa roba:
type TGridRect = record
    case Integer of   <------- ????????
      0: (Left, Top, Right, Bottom: Longint);
      1: (TopLeft, BottomRight: TGridCoord);
  end;
Come mai "Integer", che dovrebbe essere un tipo, può
contenere/ritornare valori, in questo caso 0 e 1?
Ciao.

 contenere/ritornare valori, in questo caso 0 e 1?
č soltanto una indicazione per il compilatore.
cerca nell'help dei delphi:
variant parts in records
guarda quest'esempio...
procedure TForm1.FormCreate(Sender: TObject);
var Data : record
 case byte of // o altro tipo ordinale
  0 : (estesa: array [0..9] of char);
  1 : (
       giorno: array [0..1] of char;
       slash1: char; // sarebbe "/"
       mese: array [0..1] of char;
       slash2: char; // un altro "/"
       anno: array [0..3] of char;
      );
  2 : (
       giornomese: array [0..4] of char;
      );
 end;
begin
 data.giorno := '13';
 data.slash1 := '/';
 data.mese := '02';
 data.slash2 := '/';
 data.anno := '2001';
 caption := data.giornomese;
 // oppure caption := data.estesa;
 {
  // oppure
  data.estesa := '12/12/1999';
  caption := data.anno;
 }
end;
in pratica sia la parte 0 che la parte 1 occupano la
memoria a partire dallo stesso indirizzo.
l'ampiezza della memoria occupata č pari all'ampiezza
della parte piů grande; in questo caso, le parti 0 e 1
sono uguali ed occupano esattamente la stessa memoria,
mentre la parte 2 č piu' piccola ma cmq inclusa nelle
altre: il cambiamento di ogni variabile ha effetto
diretto su tutte quelle che condividono la stessa
memoria.
Ciao!
Ammatwain;


Si!

 ha scritto nel messaggio
news:969vuq$94l$1...@pegasus.tiscalinet.it...



Come le union del C ?
Esatto.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

Avrei una domanda da farti, il tuo indirizzo email è valido?
Lawrence Oluyede
rhy...@insieme.net
"La realtà delle cose si nasconde dietro 
la loro reale apparenza (Maestro Hiamuri)"


> è soltanto una indicazione per il compilatore.
Quindi quel "case" non è una vera e propria struttura decisionale (nel qual
caso sarebbe stata valida solo una delle istruzioni) ma è un modo per dire
al compilatore che voglio accedere a quei dati in quel blocco di memoria -
indicato dal record - usando nomi/variabili diverse?
Quindi posso scrivere:
type
struct = record
case integer of
    1: A, B : byte;
    2: C : word;
end;
e quindi LoByte(C) = B  e  HiByte(C) = A ?
Azz.. ho imparato una cosa nuova :-)))

 e quindi LoByte(C) = B  e  HiByte(C) = A ?
il concetto l'hai appreso ma l'esempio va corretto...
Nei processori intel l'ordine dei byte all'interno delle
word č invertito, cosi come l'ordine delle
word all'interno delle long;
AABB in realtą viene scritto BBAA
AAAABBBB in realtą viene scritto BBBBAAAA
e quindi
AABBCCDD viene scritto DDCCBBAA
insomma, nel tuo caso
LoByte(C) = A  e  HiByte(C) = B
questo si verifica solo per le situazioni numeriche
numero = record
 case word of
  0 : (Long : Longint);
  1 : (LoWord, HiWord: word);
  2 : (LoByteLoWord, HiByteLoWord,LoByteHiWord,LoByteHiWord: byte);
 end;