![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
LoadFromFile
Creative © (2006-02-20 15:08:00)я сохраняяю и загружаю объект класса
TMyClass
fField1: shortstring;
fField2: shortstring;
fField2: integer;
Поля типа shortstring грузятся нормально, а вот в поле типа integer загружается вместо ожидаемого числа "10" (например) какое то 7- значное число непонятного происхождения. Почему так получается?
Плохиш (2006-02-20 18:00:00) [1]
> Не совсем вас поняла. если это удалить - компилятор будет
> ругаться unsutisfied forward or external declaration ( ну,
> вы помните?)
Чесно не помню, я и ветку-то с начала полностью осилить не могу.
Ну а на вопрос Stakan © (20.02.06 17:54) [26] уже ответил :-)
PS. Creative, Вы бы почитали что-нибуть для начала по программированию, Hello World бы написали.
Ega23 (2006-02-20 17:58:00) [2]Ну я бы не стал удалять. Я бы прописал
constructor TAnimal.Create;
begin
FName:='';
FColor:='';
FAge:=-1;
end;
Или типа того.
Stakan (2006-02-20 17:54:00) [3]Creative (20.02.06 17:53) [25]
Дык и в объявлении класса надо тоже удалить :)
Creative (2006-02-20 17:53:00) [4]Плохиш © ;
> Если между begin и end ничего нет, то можно это удалить,
> потому что у родителя твоего класса уже есть конструктор
> и соответственно он уже унаследован и будет выполнен.
Не совсем вас поняла. если это удалить - компилятор будет ругаться unsutisfied forward or external declaration (ну, вы помните?)
Creative (2006-02-20 17:51:00) [5]> Ega23 © (20.02.06 17:48) [23]
> Это уже я намудрил. Забыл, что рекорд - это не объект...
> :о)
надо заметить, что вы меня весьма удручили в тот момент :-)
Ega23 (2006-02-20 17:48:00) [6]
> Но вопрос об инициализации рекорда по прежнему остается
> неясным - если все и так работает - зачем он нужен? или
> я опять чего то не заметила?
Это уже я намудрил. Забыл, что рекорд - это не объект... :о)
Плохиш (2006-02-20 17:41:00) [7]
> Огромное вам спасибо. Я исправила ошибку и реализацию класса
> переписало в таком вот виде:
>
> constructor TAnimal.Create;
> begin
>
> end;
Если между begin и end ничего нет, то можно это удалить, потому что у родителя твоего класса уже есть конструктор и соответственно он уже унаследован и будет выполнен.
Creative (2006-02-20 17:37:00) [8]Ega23 © >
2. При чтении и записи в Stream ты делаешь следующее:
Stream.WriteBuffer(Stream SizeOf(THourse)).
...........
> Нет, то что ты коструктор описываешь, и пытаешься в нём
> инициализировать поля - это правильно. Только посмотри внимательно
> на то, как ты эти поля инициализируешь.
Огромное вам спасибо. Я исправила ошибку и реализацию класса переписало в таком вот виде:
constructor TAnimal.Create;
begin
end;
и все стало нормально грузиться.
Но вопрос об инициализации рекорда по прежнему остается неясным - если все и так работает - зачем он нужен? или я опять чего то не заметила?
Ega23 (2006-02-20 17:33:00) [9]А, ну да.
Блин, так давно не работал с рекордами, что везде Create хочется поставить... :о)
Stakan (2006-02-20 17:31:00) [10]Ega23 © (20.02.06 17:10) [17]
Как я понял запись Thorse статическая, зачем там New() или GetMem()?
Если бы было
PHorse = ^THorse;
...
var
H: PHorse;
то тогда да
Плохиш (2006-02-20 17:29:00) [11]
> Ega23 © (20.02.06 17:10) [17]
>
> > это должно быть так:
> >
> > h = record
> > Name: shortstring;
> > Color: shortstring;
> > Age: integer;
>
>
> Это должно быть New() или GetMem()
Хм, что-то я там нигде указателей не заметил, только обычные статические переменные.
> procedure TAnimal.LoadFromStream(s: TFileStream);
> var
> h: THorse;
> begin
> S.Read(s, SizeOf(THorse));
Телепатор подсказывает, что вместо sнадо писать h
> FName:=h.Name;
> FColor:=h.Color;
> FAge:=h.Age;
> end;
>
> procedure TAnimal.SaveToStream(s: TFileStream);
> var
> h: THorse;
> begin
> S.Read(s, SizeOf(THorse));
Телепатор подсказывает, что эта строчка здесь лишняя.
> h.Name:=FName;
> h.Color:=FColor;
> h.Age:=FAge;
> S.Write(s, SizeOf(THorse));
> end;
PS. Ну и конструктор никакой осмысленной и полезной работы в данном случае не делает.
Ega23 (2006-02-20 17:10:00) [12]
> это должно быть так:
>
> h = record
> Name: shortstring;
> Color: shortstring;
> Age: integer;
Это должно быть New() или GetMem()
Ega23 (2006-02-20 17:06:00) [13]
> Как зачем??? Я создаю класс. Я не могу не реализовать его
> в программе. Или я чего то не понимаю?
Нет, то что ты коструктор описываешь, и пытаешься в нём инициализировать поля - это правильно. Только посмотри внимательно на то, как ты эти поля инициализируешь.
RO (2006-02-20 17:05:00) [14]
> Stream.WriteBuffer(Person, SizeOf(TPerson));
Эта строчка переводится так:
Прочитать из объекта-потока, на который указывает переменная Stream, в буфер, на который указывает переменная Person, SizeOf(TPerson) байт.
Ega23 (2006-02-20 17:04:00) [15]
> может быть я ее неправильно поняла
Конечно.
1. Ты ИГДЕ не создаёшь экземпляр структуры THorse
2. При чтении и записи в Stream ты делаешь следующее:
Stream.WriteBuffer( StreamSizeOf(THourse)).
А что в примере написано?
Creative (2006-02-20 17:03:00) [16]> > constructor TAnimal.Create;
....
> > end;
> 1. Зачем это????
Как зачем??? Я создаю класс. Я не могу не реализовать его в программе. Или я чего то не понимаю?
> procedure TAnimal.LoadFromStream(s: TFileStream);
> var
> h: THorse;
...
> end;
> И где инициализация h?
это должно быть так:
h = record
Name: shortstring;
Color: shortstring;
Age: integer;
?
> 1. Рекомендую Position у Stream в 0 выставлять
пойду узнаю, что это :-)
> 2. try except try-finally почаще использовать
аналогично
> 3. А почему THorse - record? Почему не наследник от TAnimal?
потомк что это специально приготовленный рекорд, чтобы записать в него значения полей объекта MyHorse: TAnimal. А что не так?
Creative (2006-02-20 16:58:00) [17]http://soft32.ru/delphi.shtml?topic=comps&title=use_tfilestream
а если конкретнее - вот эта строчка:
Stream.WriteBuffer(Person, SizeOf(TPerson));
может быть я ее неправильно поняла или неправильно применила, но это уже другой вопрос. мне было не у кого спросить
Ega23 (2006-02-20 16:51:00) [18]
> Так было написано в примере
Пример в студию.
Creative (2006-02-20 16:49:00) [19]> RO (20.02.06 15:24) [5]
> > S.Read(s, SizeOf(THorse));
> > S.Write(s, SizeOf(THorse));
> Безобразие как минимум в этих строчках.
Но почему??? Так было написано в примере
Ega23 (2006-02-20 16:18:00) [20]В файл сложно будет. Т.к. размер одной записи задать сложно. В БД - элементарно.
Если так надо в файл, то я бы посоветовал посмотреть в сторону, например, XML. Или что-то наподобие TIFF.