![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день, уважаемые форумчане.
Возникла проблема при чтении одного из полей записи, которая была предварительно слита в файл через TFileStream. Суть: Была record, полям которой присваивались значения некоторых переменных, а потом эта запись заливалась в файл. В другом методе из этого файла считывались данные и заливались в эту же record. Все работало отлично и без нареканий, пока я не решил добавить в запись новое поле. Проблема возникла при чтении данных из файла - в это новое поле не пишется ничего, хотя все остальные поля прогружаются исправно. Привожу кусок кода. Может быть замыленный взгляд пропустил какую-то мелочь. Заранее спасибо за помощь. Код:
var Count: integer; protocol: string= '0.04.02.00'; ... type RTempField= record //для справки в ней так же есть и массивы. ... count: integer; protocol: string; //вот проблемное поле. пробовал менять тип на integer (с изменением типа переменной разумеется) - результата не принесло. ... end; procedure TMasField.SaveToFile(FileName: string); var TempField: RTempField; FileData: TFileStream; begin ... TempField.count:= Count; TempField.protocol:= protocol; //прогонял дебаггером - в поле записи значение стоит ... FileData:= TFileStream.Create(FileName, fmCreate); FileData.Write(TempField, sizeof(TempField)); FileData.Free; end; procedure TMasField.LoadFromFile(FileName: string); var FileData: TFileStream; TempField: RTempField; begin FileData:= TFileStream.Create(FileName, fmOpenRead); FileData.Read(TempField, sizeof(TempField)); FileData.Free; if (TempField.protocol) < (protocol) then //А вот здесь в поле записи уже стоит "", хотя должно быть загружено из файла. begin ... end; Count:= TempField.count; //Тут все работает нормально. ... end; |
#2
|
||||
|
||||
![]() Думаю, следует ограничить размер всех STRINGовых полей записи.
Код:
var Count: integer; protocol: string[10]= '0.04.02.00'; ... type RTempField= record //для справки в ней так же есть и массивы. ... count: integer; protocol: string[10]; //вот проблемное поле. пробовал менять тип на integer (с изменением типа переменной разумеется) - результата не принесло. ... end; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#3
|
|||
|
|||
![]() Цитата:
Думал, что может быть protocol - какое-то системное имя, но переименование тоже результата не дало. |
#4
|
||||
|
||||
![]() Цитата:
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#5
|
|||
|
|||
![]() Цитата:
Код:
RTempField= record Mas: array[1..8, 1..8] of byte; FieldOwner: array[1..8, 1..8] of byte; side: byte; players: byte; count: integer; protocol: string; AbsLose: array[1..4] of boolean; end; Про массивы это я к тому, что там не только integer'ы. И что все нормально туда обратно выгружается, кроме почему-то вот этого одного поля. |
#6
|
||||
|
||||
![]() Для начала нужно в обязательном порядке перегрузить Дельфи (имеется у него такой глюк), затем желательно ограничить String, далее "прошагать" проблемное место.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
![]() Цитата:
Проблема повторяется уже третий день, String ограничил, отладчик при сохранении в файл показывает, что в переменной значение есть, а при загрузке - что она пустая. Открывать файл hex-редактором пробовал, но толку мало. В какую еще сторону глядеть не могу даже представить. p.s. Да и стал бы я напрягать других людей, не поискав прежде причину сам =) Последний раз редактировалось nixel, 18.02.2012 в 22:58. |
#8
|
||||
|
||||
![]() Повторюсь, "прошагать". Ставишь курсор на строку где начинается чтение файла и далее F7, F8, в зависимости от того, нужно входить в какие-либо процедуры/функции или "перескочить" их. Чтобы сразу попасть на нужную строку, жмём F4.
Кстати, обратил внимание. Почему record без указания packed? И не стал бы я такую структуру читать через TFileStream, BlockRead и все дела. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 18.02.2012 в 23:13. |
#9
|
|||
|
|||
![]() Цитата:
Под отладчиком я имел ввиду весь инструментарий отладки: и проход кода построчно, и watches и много чего еще. Разве что содержимое памяти и ассемблерную мнемонику не просматривал, ибо не разбираюсь. |
#10
|
||||
|
||||
![]() Ух тяжко:
Код:
type TTempField= record Mas: array[1..8, 1..8] of byte; FieldOwner: array[1..8, 1..8] of byte; side: byte; players: byte; count: integer; protocol: string; AbsLose: array[1..4] of boolean; end; var TempField : TTempField; ... читаем ... var FileIn : File of TTempField; begin AssignFile(FileIn, 'MyFile'); Reset(FileIn); Read(FileIn, TempField]); CloseFile(FileIn); end; ... пишем ... var FileOut : File of TTempField; begin AssignFile(FileOut, 'MyFile'); Rewrite(FileOut); Write(FileOut, TempField]); CloseFile(FileOut); end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
nixel (18.02.2012)
|
#11
|
|||
|
|||
![]() Интересное решение. В скором времени попробую и отпишусь. Спасибо.
|
#12
|
|||
|
|||
![]() Спасибо всем за ответы.
Проблема решилась очень просто: я три дня каждый раз грузил из файла (через opendialog) в котором вообще нет данных о поле protocol. Извините за потраченное время. p.s. Заработало и с потоками, так что не пришлось переделывать код под работу с типизированным файлом. |