Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.02.2012, 13:33
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию Проблема при чтении record из потока

Добрый день, уважаемые форумчане.

Возникла проблема при чтении одного из полей записи, которая была предварительно слита в файл через 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  
Старый 18.02.2012, 17:19
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Думаю, следует ограничить размер всех STRINGовых полей записи.
Код:
var
  Count: integer;  
  protocol: string[10]= '0.04.02.00';
  ...

type
  RTempField= record //для справки в ней так же есть и массивы.
    ...
    count: integer;
    protocol: string[10]; //вот проблемное поле. пробовал менять тип на integer (с изменением типа переменной разумеется) - результата не принесло.
    ...
  end;
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #3  
Старый 18.02.2012, 18:59
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Думаю, следует ограничить размер всех STRINGовых полей записи.
Спасибо, но не помогло.
Думал, что может быть protocol - какое-то системное имя, но переименование тоже результата не дало.
Ответить с цитированием
  #4  
Старый 18.02.2012, 20:13
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Код:
type
  RTempField= record //для справки в ней так же есть и массивы.
   end;
Какие массивы? Можно полностью увидеть стуктуру записи?
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #5  
Старый 18.02.2012, 20:30
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Какие массивы? Можно полностью увидеть стуктуру записи?
да, конечно. вот.

Код:
  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  
Старый 18.02.2012, 21:25
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Для начала нужно в обязательном порядке перегрузить Дельфи (имеется у него такой глюк), затем желательно ограничить String, далее "прошагать" проблемное место.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 18.02.2012, 22:47
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от angvelem
Для начала нужно в обязательном порядке перегрузить Дельфи (имеется у него такой глюк), затем желательно ограничить String, далее "прошагать" проблемное место.

Проблема повторяется уже третий день, String ограничил, отладчик при сохранении в файл показывает, что в переменной значение есть, а при загрузке - что она пустая.
Открывать файл hex-редактором пробовал, но толку мало.
В какую еще сторону глядеть не могу даже представить.

p.s. Да и стал бы я напрягать других людей, не поискав прежде причину сам =)

Последний раз редактировалось nixel, 18.02.2012 в 22:58.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:15.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025