Sobre packed record...
Pessoal qual a direferença entre [b:feac028354]packed record[/b:feac028354] e [b:feac028354]record[/b:feac028354]... :?:
vi no codigo VCL a declaração do tipo [b:feac028354]TRect[/b:feac028354] dessa forma: o direfia se eu fizesse isso:
vi no codigo VCL a declaração do tipo [b:feac028354]TRect[/b:feac028354] dessa forma:
TRect = packed record case Integer of 0: (Left, Top, Right, Bottom: Integer); 1: (TopLeft, BottomRight: TPoint); end;
TRect = record Left: Integer; Top: Integer; Right: Integer; Bottom: Integer; TopLeft: TPoint; BottomRight: TPoint; end;
Bruno Belchior
Curtidas 0
Respostas
Beppe
06/05/2005
A diferença aí não é no packet, mas no case.
1) Packet:
Serve para indicar ao compilador não adicionar bytes de [i:945ef79b53]padding[/i:945ef79b53], para alinhar os componentes(campos) do record. Se [b:945ef79b53]packet[/b:945ef79b53] for deixado de fora, o Delphi coloca os campos no seu alinhamento natural(1 para byte, 2 para Word, 4 para Integer, etc...)
2) Case:
Conhecido como [i:945ef79b53]union[/i:945ef79b53] em outras linguagens, ele cria espaço no record apenas para o ´braço´ do case com o maior tamanho em bytes. Isto é feito para disponibilzar dados de maneiras diferentes, sem precisar type casts. Geralmente serve como atalhos, como é o caso do TRect. Você pode acessar como dois pontos ou quatro posições.
1) Packet:
Serve para indicar ao compilador não adicionar bytes de [i:945ef79b53]padding[/i:945ef79b53], para alinhar os componentes(campos) do record. Se [b:945ef79b53]packet[/b:945ef79b53] for deixado de fora, o Delphi coloca os campos no seu alinhamento natural(1 para byte, 2 para Word, 4 para Integer, etc...)
2) Case:
Conhecido como [i:945ef79b53]union[/i:945ef79b53] em outras linguagens, ele cria espaço no record apenas para o ´braço´ do case com o maior tamanho em bytes. Isto é feito para disponibilzar dados de maneiras diferentes, sem precisar type casts. Geralmente serve como atalhos, como é o caso do TRect. Você pode acessar como dois pontos ou quatro posições.
GOSTEI 0
Bruno Belchior
06/05/2005
certo qual outro exemplo você citaria?
GOSTEI 0
Beppe
06/05/2005
Os records em TypInfo.
Um uso bastante comum é quando alguns campos são dependentes de outros.
Neste caso, é definido os campos Nome e RecebePorHora, e os outros dois usam o mesmo espaço. Se modificar um, modifica outro.
Um uso bastante comum é quando alguns campos são dependentes de outros.
TFuncionario = record Nome: String; case RecebePorHora: Boolean False: (Salario: Currency); True: (ValorPorHora: Currency); end; end;
Neste caso, é definido os campos Nome e RecebePorHora, e os outros dois usam o mesmo espaço. Se modificar um, modifica outro.
GOSTEI 0