![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; |
|
#3
|
|||
|
|||
|
Цитата:
Думал, что может быть protocol - какое-то системное имя, но переименование тоже результата не дало. |
|
#4
|
||||
|
||||
|
Цитата:
|
|
#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, далее "прошагать" проблемное место.
|
|
#7
|
|||
|
|||
|
Цитата:
Проблема повторяется уже третий день, String ограничил, отладчик при сохранении в файл показывает, что в переменной значение есть, а при загрузке - что она пустая. Открывать файл hex-редактором пробовал, но толку мало. В какую еще сторону глядеть не могу даже представить. p.s. Да и стал бы я напрягать других людей, не поискав прежде причину сам =) Последний раз редактировалось nixel, 18.02.2012 в 22:58. |