Pergunta

Peguei o código-fonte de um projeto mais antigo e preciso mudar pequenas coisas, mas tive um grande problema por ter apenas o delphi 2010 para fazer isso.

Existe um registro definido:

bbil = record
  path : string;
  pos: byte;
  nr: Word;
end;

posteriormente esta definição é usada para ler do arquivo:

b_bil: file of bbil;
pbbil: ^bbil;
l_bil : tlist;

while not(eof(b_bil)) do
  begin
    new(pbbil);
    read(b_bil, pbbil^);
    l_bil.add(pbbil);
  end

O principal problema é que o compilador não aceita o tipo “string” no registro porque deseja uma “finalização”.Então tentei mudar "string" para "string[255]" ou "shortstring".Fazendo isso o app está lendo o arquivo mas com conteúdo errado.

Minha dúvida é como converter o antigo tipo "string" com o qual os arquivos foram gravados para os "novos" tipos no Delphi 2010.

Eu já tentei muito, por ex."{$H-}".Adicionar apenas um caractere a mais no registro mostra que o arquivo está correto, porque o arquivo é lido quase correto, mas truncado um caractere a mais em cada conjunto de dados - o comprimento de lengthbyte + 255chars parece estar correto para a definição, mas a string curta não corresponde.

Foi útil?

Solução

Eek! Parece que seu código é anterior ou não usa strings longas. Se você deseja obter o mesmo comportamento do seu Delphi antigo, você precisa substituir string por ShortString.

Vejo que você já tentou fazer isso e relato que falhou. É realmente a única explicação que faz sentido para mim, porque todos os outros tipos de string são essencialmente ponteiros e, portanto, a única maneira que read poderia ter funcionado é com um ShortString. A migração que você está tentando é imensa e provavelmente você tem um grande número de problemas confusos.

@LU RD ressalta nos comentários que o layout do registro pode ser diferente entre as versões do Delphi, já que você não está usando um array packed. Você pode investigar o layout do registro usando as duas versões do Delphi que você tem em mãos. Você precisará providenciar para que o tamanho dos registros corresponda entre as versões e que os deslocamentos para os campos também correspondam.

Com base nos comentários abaixo, adicionar um byte de preenchimento entre pos e nr resolverá seus problemas.

bbil = record
  path : string;
  pos: byte;
  _pad: byte;
  nr: Word;
end;

Você também pode obter o mesmo efeito configurando o compilador $ALIGN opção para {$ALIGN ON}, que seria como eu acho que faria as coisas.

A longo prazo, você realmente deve se livrar das strings curtas, codificação ANSI, mapeamento direto entre seus registros internos e seus arquivos de dados e assim por diante. A curto prazo, pode ser melhor você obter a mesma versão do Delphi que foi usada para construir este código e usá-la. Eu esperava que esse problema fosse apenas a ponta do iceberg.

Outras dicas

Apenas lembre-se:

"string" <> "string [255]" <> "shortstring" <> AnsiString

Nos velhos tempos do DOS / Turbo Pascal, as "strings" eram de fato limitadas a 255 caracteres. Em grande parte porque o primeiro byte continha o comprimento da string e um byte só pode ter um valor entre 0 e 255.

Isso não é mais um problema nas versões contemporâneas do Delphi.

" ShortString " é o tipo para DOS / Pascal antigo tipo de string.

"LongString" tem sido o tipo de string padrão por um longo tempo (incluindo o Borland Delphi 2006 que uso atualmente para a maioria dos trabalhos de produção). De Delphi 3 .. Delphi 2009, LongStrings continha caracteres de 8 bits, e foram limitados apenas pela memória disponível. Do Delphi 3 .. Delphi 2009, "LongStrings" eram sinônimos de "AnsiStrings".

As versões recentes do Delphi (Delphi 2009 e superior, incluindo o novo Delphi XE2) agora são padronizadas para strings Unicode "WideString" multibyte. WideStrings , como AnsiStrings, também são efetivamente "ilimitadas" no comprimento máximo.

Este artigo explica em mais detalhes:

http://delphi.about.com/od/beginners/l/ aa071800a.htm

PS: Considere usar "sizeof (bbil)" e " Compactado " para registros binários .

Talvez eu esteja negligenciando alguma coisa, mas, a meu ver, seu código delphi 3 também está quebrado.Tente determinar o tamanho do seu registro:

bbil = record
  path : string;
  pos: byte;
  nr: Word;
end;

caminho (qualquer coisa entre 1 e 256 - um byte para comprimento, restante para dados), pos (1 byte), nr (2 bytes), fazendo com que o tamanho dos dados do registro varie de 1+1+2=4 bytes a 256+1+ 2=259 bytes.Sob essa circunstância, você obteria lixo do arquivo de qualquer maneira, já que seu programa não sabe quantos bytes ler, antes de realmente ler os dados.Sugiro que você corrija seu registro para que a string fique com um tamanho fixo, como:

path : ShortString[255];

Então, você seria capaz de escrever e ler bem no Delphi 3 e no 2010.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top