Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

LoadFromFile


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо