Вниз
Скачать: CL | DM;

Файл записей   Найти похожие ветки 

← →
Firefly ©   (2006-05-19 00:44) [0]

Здравствуйте.
Есть запись -
type
TLogRecord = packed record
  LogStringNum: string;
  LogString : string;
end;


При попытке создать файловую переменную
F: file of TLogRecord;
- ругается Type "TLogRecord" needs finalization - not allowed in file type.

В чем дело то?


← →
Zeqfreed ©   (2006-05-19 01:11) [1]

Длинные (Ansi) строки не имеют постоянного размера в памяти и потому не могут быть записаны в типизированный файл. Чтобы избежать этого, используйте строки ограниченной длины (ShortString, или строки с явно указанным размером).


← →
Firefly ©   (2006-05-19 01:30) [2]


> Zeqfreed ©  

Спасибо.
А как указать явно длину строки(именно строки, создавать массив выльется потом в гемор)


← →
DevilDevil ©   (2006-05-19 01:40) [3]

Вообще, забудь ты 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:46) [4]


> DevilDevil ©  

Туплю, string[55] - это ж и догадаться можно было:-)))
Спасибо за помощь.


← →
Zeqfreed ©   (2006-05-19 02:04) [5]


> Вообще, забудь ты F: file of TLogRecord;, используй TFileStream.
>

Зачем?


> Если размер файла важен, то не увлекайся, так как размер
> одной такой записи = длинна(LogStringNum) + длинна(LogString)
> + 2 байт

Откуда 2 байта?


← →
Zeqfreed ©   (2006-05-19 02:13) [6]

[5] Zeqfreed ©   (19.05.06 02:04)

> Откуда 2 байта?

Вопрос снимается. В этом частном случае действительно 2 байта. :)


← →
Германн ©   (2006-05-19 02:16) [7]


> Откуда 2 байта?

Имхо, длина записи. В записи две короткие строки. Каждая может иметь до 255 символов.


← →
Zeqfreed ©   (2006-05-19 02:18) [8]

[7] Германн ©   (19.05.06 02:16)
Да, я уже понял, что со строкой записывается служебная информация о её длине размером в один байт.


← →
Firefly ©   (2006-05-19 03:30) [9]

Еще вопрос:
В записи, если ограничивать string по длине, то максимальная длина 255 символов. Можно ли как-то обойти это ограничение? Почему-то для WideString нельзя зафиксировать длину.


← →
Сергей М. ©   (2006-05-19 09:14) [10]


> Можно ли как-то обойти это ограничение?


Просто не вводить ограничение, т.е. использовать AnsiString
Но тогда придется отказаться от использования типизированного файла для хранения структуры


> для WideString нельзя зафиксировать длину.


Это действительно так.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.026 c
2-1147851226
Ironman83
2006-05-17 11:33
2006.06.04
DBNavigator


8-1135515760
Glex
2005-12-25 16:02
2006.06.04
Как управлять Z-Index ом у TPanel?


15-1146768050
bogdan
2006-05-04 22:40
2006.06.04
Представить суму всемя способами


2-1147792001
AlexanderMS
2006-05-16 19:06
2006.06.04
С процедурами - лучше?


6-1138875955
anton_xa
2006-02-02 13:25
2006.06.04
локальная сеть и пользователи




   Наверх