Вопрос

У меня есть исходный код более старого проекта, и мне нужно изменить мелочи, но у меня были большие проблемы из-за того, что для этого был только delphi 2010.

Определена запись:

родовое слово

позже это определение используется для чтения из файла:

родовое слово

Основная проблема заключается в том, что компилятор не принимает тип «строка» в записи, потому что ему нужна «финализация». Итак, я попытался заменить «строку» на «строку [255]» или «короткую строку».При этом приложение читает файл, но с неправильным содержимым.

У меня вопрос, как преобразовать старый «строковый» тип, с помощью которого файлы были записаны, в «новые» типы в Delphi 2010.

Я уже много пробовал, например,"{$ H-}".Добавление только одного символа в запись показывает, что файл правильный, потому что файл читается почти правильно, но усекается на один символ больше для каждого набора данных - длина lengthbyte + 255chars кажется правильной fpr определение, но shortstring не соответствует.

Это было полезно?

Решение

Ура! Похоже, ваш код либо предшествует дате, либо не использует длинные строки. Если вы хотите добиться того же поведения, что и в вашем старом Delphi, вам необходимо заменить string на ShortString.

Я вижу, что вы уже пробовали это, и сообщаете, что это не удалось. На самом деле это единственное объяснение, которое имеет для меня какой-то смысл, потому что все другие строковые типы по сути являются указателями, и поэтому единственный способ работы сгенерированного кодового кода - это сгенерированный кодовый код. Миграция, которую вы пытаетесь выполнить, огромна и, вероятно, у вас огромное количество сбивающих с толку проблем.

@LU RD указывает в комментариях, что макет записи может отличаться в разных версиях Delphi, поскольку вы не используете массив read. Вы можете изучить макет записи, используя две версии Delphi, которые у вас есть. Вам нужно будет сделать так, чтобы размер записей соответствовал между версиями, и чтобы смещения полей также совпадали.

Основываясь на комментариях ниже, добавление байта заполнения между pos и nr решит ваши проблемы.

родовое слово

Вы также можете добиться того же эффекта, установив компилятор ShortString вариант для генерации кода кода, который, я думаю, был бы таким, как я бы поступил.

В конечном итоге вам действительно следует отказаться от коротких строк, кодировки ANSI, прямого сопоставления между вашими внутренними записями и вашими файлами данных и так далее. В краткосрочной перспективе вам может быть лучше получить ту же версию Delphi, которая использовалась для создания этого кода и его использования. Я ожидал, что эта проблема будет лишь верхушкой айсберга.

Другие советы

Просто помните:

"строка" <> "строка [255]" <> "короткая строка" <> AnsiString

В старые времена DOS / Turbo Pascal «строки» действительно были ограничены 255 символами. В значительной степени потому, что 1-й байт содержит длину строки, а байт может иметь значение только от 0 до 255.

Это больше не проблема в современных версиях Delphi.

" ShortString " - это тип старой DOS / Pascal. строковый тип.

LongString долгое время был строковым типом по умолчанию (включая Borland Delphi 2006, который я в настоящее время использую для большинства производственных работ). Из Delphi 3 .. Delphi 2009, LongString содержал 8-битные символы, и были ограничены только доступной памятью. Начиная с Delphi 3 .. Delphi 2009, "LongStrings" были синонимами "AnsiStrings".

Последние версии Delphi (Delphi 2009 и выше, включая новый Delphi XE2) теперь по умолчанию используют многобайтовые строки Unicode «WideString». WideString , как и AnsiStrings, также фактически "неограниченны" по максимальной длине.

Эта статья объясняет более подробно:

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

PS: Рассмотрите возможность использования "sizeof (bbil)" и " Packed " для двоичных записей. .

Может быть, я что-то упускаю, но, как я его вижу, ваш код Delphi 3 тоже сломан.Попробуйте определить размер вашей записи:

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

Путь (все, что от 1 до 256 - один байт для длины, отдых для данных), POS (1 байт), NR (2 байта), сделав размер данных данных варьироваться от 1 + 1 + 2= 4 байта до 256+ 1 + 2= 259 байт.В этом обстоятельстве вы получите мусор из файла в любом случае, поскольку ваша программа теперь не может быть, сколько байтов читать, прежде чем фактически читать данные.Я предлагаю вам исправить вашу запись, чтобы строка из фиксированного размера, как:

path : ShortString[255];
.

Тогда вы сможете написать и читать штраф как в Delphi 3, так и в 2010 году.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top