Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли в типиз. файле сохранить динамический, массив??? 
:(
    Опции темы
Sniper
Дата 28.10.2003, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Я вот пишу:
Код

 objects: array of TObjects;

var
 savesettings: File of TObjects;
 gsavesettings: TObjects;

// запись
assignfile(savesettings,'C:\config_cfg.cfg');
rewrite(savesettings);
write(savesettings,gsavesettings);
closefile(savesettings);
// чтение
assignfile(savesettings,'C:\config_cfg.cfg');
reset(savesettings);
read(savesettings,gsavesettings);
closefile(savesettings);

В файле пишутся только несколько пробелов! Как мне быть?

Это сообщение отредактировал(а) Sniper - 28.10.2003, 22:50


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
p0s0l
Дата 29.10.2003, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Расскажи поподробнее, какие объекты ты хочешь записать. Если это компоненты (наследники TComponent), то можно попробовать через потоки...



--------------------
С уважением, г-н Посол.
PM   Вверх
Sniper
Дата 29.10.2003, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



поподробнее так поподробнее :-))

Я хочу записать:
Код

type
 Tobj0Vector = record
  x,y,z,w : single;
 end;
 Tobj1Vector = record
  x_dir,y_dir,z_dir : single;
 end;
 Tobj2Vector = record
  x,y,z, angle_x, angle_y, angle_z, scale_x, scale_y, scale_z : single;
  model : TModel;
  texture : GLuInt;
 end;

var
 objects0: array of Tobj0Vector;
 objects1: array of Tobj1Vector;
 objects2: array of Tobj2Vector;

Вот такие массивы! %-)


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Vit
Дата 29.10.2003, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Запись типа объекта так как вы делаете приводит к записи в файл лишь 4х байтового значения указателя на объект.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 29.10.2003, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Записать массивы из Tobj0Vector и Tobj1Vector - легко...
А насчет Tobj2Vector - в принципе это тоже решаемо, если раскажешь что такое TModel...



--------------------
С уважением, г-н Посол.
PM   Вверх
Sniper
Дата 29.10.2003, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



p0s0l
А как? %-)

TModel = class
Meshes : TList; // Сетки
CurMesh : word; // Текущий кадр
TexVertices : PGLVertexArray; // Массив вершин текстуры
TexFaces : PGLFacesArray; // Массив граней текстуры
{animation speed}
TimeIsSet : boolean;
TimeEnd : dword;
{model info}
MeshCount, //meshes count
MeshVCount, //mesh vertices count
MeshFCount : word; //mesh faces count
isFaset, //1=faset normals was included
isSmooth : byte; //1=smooth normals was included
TexVCount, //tex vertices count
TexFCount : word; //tex faces count
IsOwnTexture : byte; //1=texture file was included
{}
OwnTexture : gluint; //use if texture file included

Это сообщение отредактировал(а) Sniper - 29.10.2003, 00:23


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
p0s0l
Дата 29.10.2003, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



TList, TGLVertexArray, TGLFacesArray - тоже их распиши...


--------------------
С уважением, г-н Посол.
PM   Вверх
Sniper
Дата 29.10.2003, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



PGLVertex = ^TGLVertex;
TGLVertex =
record
x,y,z : glfloat;
end;

PGLVector = ^TGLVector;
TGLVector = array[0..2] of glfloat;//тип GLFloat = single

PGLFace = ^TGLFace;
TGLFace = array[0..2] of word;

PGLVertexArray = ^TGLVertexArray;
TGLVertexArray = array[Word] of TGLVertex;

PGLFacesArray = ^TGLFacesArray;
TGLFacesArray = array[word] of TGLFace;


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
p0s0l
Дата 29.10.2003, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Это писалось навскидку, так что должны быть глюки...
Запись:
Код
var
 s : TFileStream;
 i : integer;
begin
 s := TFileStream.Create('c:\config_cgf.cfg', fmCreate);
// Запись objects0
 i := Length(objects0);
 s.Write(i, SizeOf(i));
 s.Write(objects0[0], SizeOf(Tobj0Vector)*Length(objects0));
// Запись objects1
 i := Length(objects1);
 s.Write(i, SizeOf(i));
 s.Write(objects1[0], SizeOf(Tobj1Vector)*Length(objects1));
// Запись objects2
 i := Length(objects2);
 s.Write(i, SizeOf(i));
 s.Write(objects2[0], SizeOf(Tobj2Vector)*Length(objects2));
// Запись моделей, на которые идут ссылки из массива objects2
 for i := 0 to Length(objects2)-1 do objects2[i].Model.SaveToStream(s);
 s.Free;
end;

Чтение:
Код
var
 s : TFileStream;
 i : integer;
begin
 s := TFileStream.Create('c:\config_cgf.cfg', fmOpenRead);
// Чтение objects0
 s.Read(i, SizeOf(i));
 SetLength(objects0, i);
 s.Read(objects0[0], SizeOf(Tobj0Vector)*Length(objects0));
// Чтение objects1
 s.Read(i, SizeOf(i));
 SetLength(objects1, i);
 s.Write(objects1[0], SizeOf(Tobj1Vector)*Length(objects1));
// Чтение objects2
 s.Read(i, SizeOf(i));
 SetLength(objects2, i);
 s.Write(objects2[0], SizeOf(Tobj2Vector)*Length(objects2));
// Чтение моделей, на которые идут ссылки из массива objects2
 for i := 0 to Length(objects2)-1 do
 begin
   objects2[i].Model := TModel.Create(...тут ты сам должен знать что писать...);
   objects2[i].Model.LoadFromStream(s);
 end;
 s.Free;
end;


Только в классе TModel придется добавить два метода в секции Public:
Для записи:
Код
procedure TModel.SaveToStream(s : TFileStream);
begin
 s.Write(CurMesh, SizeOf(CurMesh));
 s.Write(TimeIsSet, SizeOf(TimeIsSet));
 ... // и т.д. записываешь все данные, кроме массивов
 s.Write(OwnTexture, SizeOf(OwnTexture));
// Запись массивов
 s.Write(TexVertices^, SizeOf(TGLVertex)*TexVCount);
 s.Write(TexFaces^, SizeOf(TGLFace)*TexFCount);
end;

Для чтения:
Код
procedure TModel.LoadFromStream(s : TFileStream);
begin
 s.Read(CurMesh, SizeOf(CurMesh));
 s.Read(TimeIsSet, SizeOf(TimeIsSet));
 ... // и т.д. записываешь все данные, кроме массивов
 s.Read(OwnTexture, SizeOf(OwnTexture));
// Выделение памяти под массивы
 GetMem(TexVertices, SizeOf(TGLVertex)*TexVCount);
 GetMem(TexFaces, SizeOf(TGLFace)*TexFCount);
// Чтение массивов
 s.Read(TexVertices^, SizeOf(TGLVertex)*TexVCount);
 s.Read(TexFaces^, SizeOf(TGLFace)*TexFCount);
end;

Для Mesh : TList - сам сделаешь, т.к. так и не написал, что это такое...

Это сообщение отредактировал(а) p0s0l - 29.10.2003, 01:11


--------------------
С уважением, г-н Посол.
PM   Вверх
Sniper
Дата 29.10.2003, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



p0s0l
TList - это стандартный класс Delphi! %-) Находится в Classes!


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
p0s0l
Дата 29.10.2003, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
p0s0l
TList - это стандартный класс Delphi! %-) Находится в Classes!

sad.gif
Ты видимо не понял суть затруднений сохранения данных в файл... А эта трудность заключается в сохранении динамических данных.
Первый раз с этим встречаешься в objects2. TModel - это класс, а значит поле model - это лишь указатель на объект. Запись этого указателя в файл ничего не даст, т.к. сам объект в файл не запишется, а запишется только лишь его адрес... Поэтому были сделаны два метода для записи/чтения модели.
Второй раз это были TexVertices и TexFaces из класса TModel - они тоже лишь указатели на массивы...
И третий - TList, который ты никак не хочешь расписать, что же в нем всё-таки хранится... Ведь TList - это массив указателей. И запись этих указателей опять-таки бессмыслена. Надо знать, на что ссылаются эти указатели. А из тебя как из партизана надо вытягивать все эти данные...
Тебе надо было идти в разведчики...

Это сообщение отредактировал(а) p0s0l - 29.10.2003, 23:54


--------------------
С уважением, г-н Посол.
PM   Вверх
Sniper
Дата 30.10.2003, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Вырезка из модуля Classes.pas

Код

{ Maximum TList size }
const
 MaxListSize = Maxint div 16;
{ TList class }

 PPointerList = ^TPointerList;
 TPointerList = array[0..MaxListSize - 1] of Pointer;
 TListSortCompare = function (Item1, Item2: Pointer): Integer;
 TListNotification = (lnAdded, lnExtracted, lnDeleted);

 // these operators are used in Assign and go beyond simply copying
 //   laCopy = dest becomes a copy of the source
 //   laAnd  = intersection of the two lists
 //   laOr   = union of the two lists
 //   laXor  = only those not in both lists
 // the last two operators can actually be thought of as binary operators but
 // their implementation has been optimized over their binary equivalent.
 //   laSrcUnique  = only those unique to source (same as laAnd followed by laXor)
 //   laDestUnique = only those unique to dest   (same as laOr followed by laXor)
 TListAssignOp = (laCopy, laAnd, laOr, laXor, laSrcUnique, laDestUnique);

 TList = class(TObject)
 private
   FList: PPointerList;
   FCount: Integer;
   FCapacity: Integer;
 protected
   function Get(Index: Integer): Pointer;
   procedure Grow; virtual;
   procedure Put(Index: Integer; Item: Pointer);
   procedure Notify(Ptr: Pointer; Action: TListNotification); virtual;
   procedure SetCapacity(NewCapacity: Integer);
   procedure SetCount(NewCount: Integer);
 public
   destructor Destroy; override;
   function Add(Item: Pointer): Integer;
   procedure Clear; virtual;
   procedure Delete(Index: Integer);
   class procedure Error(const Msg: string; Data: Integer); overload; virtual;
   class procedure Error(Msg: PResStringRec; Data: Integer); overload;
   procedure Exchange(Index1, Index2: Integer);
   function Expand: TList;
   function Extract(Item: Pointer): Pointer;
   function First: Pointer;
   function IndexOf(Item: Pointer): Integer;
   procedure Insert(Index: Integer; Item: Pointer);
   function Last: Pointer;
   procedure Move(CurIndex, NewIndex: Integer);
   function Remove(Item: Pointer): Integer;
   procedure Pack;
   procedure Sort(Compare: TListSortCompare);
   procedure Assign(ListA: TList; AOperator: TListAssignOp = laCopy; ListB: TList = nil);
   property Capacity: Integer read FCapacity write SetCapacity;
   property Count: Integer read FCount write SetCount;
   property Items[Index: Integer]: Pointer read Get write Put; default;
   property List: PPointerList read FList;
 end;


Это сообщение отредактировал(а) Sniper - 30.10.2003, 00:31


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Vit
Дата 30.10.2003, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



2 Sniper - мы вообще-то знаем модуль classes.pas, ровно как и классы в нём прописанные, приводить его не обязательно, а если привёл, так поясни - зачем? Что в этом коде тебя смущает?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Sniper
Дата 30.10.2003, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Vit
Это надо p0s0l спросить! %-) что в этом коде его смущает!
Он просил: расписать TList - я выполнил его просьбу! %-)


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
p0s0l
Дата 30.10.2003, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
TList - это массив указателей

Цитата
Надо знать, на что ссылаются эти указатели

Или ты его используешь для хранения не указателей, а чего-то другого ? Вообще, ты делал ту прогу, или откуда-то взял ?


--------------------
С уважением, г-н Посол.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1319 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.