Fórum Sobre packed record... #280421
06/05/2005
0
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
Curtir tópico
+ 0Posts
06/05/2005
Beppe
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
06/05/2005
Bruno Belchior
Gostei + 0
06/05/2005
Beppe
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
Clique aqui para fazer login e interagir na Comunidade :)