![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Файл записей [D7]
Firefly © (2006-05-19 00:44:00)Здравствуйте.
Есть запись -
type
TLogRecord = packed record
LogStringNum: string;
LogString : string;
end;
При попытке создать файловую переменную
F: file of TLogRecord;
- ругается Type "TLogRecord" needs finalization - not allowed in file type.
В чем дело то?
Сергей М. (2006-05-19 09:14:00) [1]
> Можно ли как-то обойти это ограничение?
Просто не вводить ограничение, т.е. использовать AnsiString
Но тогда придется отказаться от использования типизированного файла для хранения структуры
> для WideString нельзя зафиксировать длину.
Это действительно так.
Firefly (2006-05-19 03:30:00) [2]Еще вопрос:
В записи, если ограничивать stringпо длине, то максимальная длина 255 символов. Можно ли как-то обойти это ограничение? Почему-то для WideString нельзя зафиксировать длину.
Zeqfreed (2006-05-19 02:18:00) [3][7] Германн © (19.05.06 02:16)
Да, я уже понял, что со строкой записывается служебная информация о её длине размером в один байт.
Германн (2006-05-19 02:16:00) [4]
> Откуда 2 байта?
Имхо, длина записи. В записи две короткие строки. Каждая может иметь до 255 символов.
Zeqfreed (2006-05-19 02:13:00) [5][5] Zeqfreed © (19.05.06 02:04)
> Откуда 2 байта?
Вопрос снимается. В этом частном случае действительно 2 байта. :)
Zeqfreed (2006-05-19 02:04:00) [6]
> Вообще, забудь ты F: file of TLogRecord;, используй TFileStream.
>
Зачем?
> Если размер файла важен, то не увлекайся, так как размер
> одной такой записи = длинна(LogStringNum) + длинна(LogString)
> + 2 байт
Откуда 2 байта?
Firefly (2006-05-19 01:46:00) [7]
> DevilDevil ©
Туплю, string[55]- это ж и догадаться можно было:-)))
Спасибо за помощь.
DevilDevil (2006-05-19 01:40:00) [8]Вообще, забудь ты F: file of TLogRecord;, используй TFileStream. Можешь посмотреть: http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&search=TFileStream
Но по сабжу, можно ограничить записи по максимальному размеру строки, например:
type
TLogRecord = packed record
LogStringNum: string[55];
LogString : string[40];
end;
Если размер файла важен, то не увлекайся, так как размер одной такой записи = длинна(LogStringNum) + длинна(LogString) + 2 байт
Firefly (2006-05-19 01:30:00) [9]
> Zeqfreed ©
Спасибо.
А как указать явно длину строки(именно строки, создавать массив выльется потом в гемор)
Zeqfreed (2006-05-19 01:11:00) [10]Длинные (Ansi) строки не имеют постоянного размера в памяти и потому не могут быть записаны в типизированный файл. Чтобы избежать этого, используйте строки ограниченной длины (ShortString, или строки с явно указанным размером).