GARANTIR DESCONTO

Fórum Sobre packed record... #280421

06/05/2005

0

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:
  TRect = packed record
  case Integer of
    0: (Left, Top, Right, Bottom: Integer);
    1: (TopLeft, BottomRight: TPoint);
  end;
o direfia se eu fizesse isso:
  TRect = record
    Left: Integer;
    Top: Integer;
    Right: Integer;
    Bottom: Integer;
    TopLeft: TPoint;
    BottomRight: TPoint;
  end;



Bruno Belchior

Bruno Belchior

Responder

Posts

06/05/2005

Beppe

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.


Responder

Gostei + 0

06/05/2005

Bruno Belchior

certo qual outro exemplo você citaria?


Responder

Gostei + 0

06/05/2005

Beppe

Os records em TypInfo.

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar