проблемы со строкой при переносе Delphi 3 на Delphi 2010
-
29-10-2019 - |
Вопрос
У меня есть исходный код более старого проекта, и мне нужно изменить мелочи, но у меня были большие проблемы из-за того, что для этого был только 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 году.