Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

LoadFromFile   Найти похожие ветки 

 
Creative   (2006-02-20 15:08) [0]

я сохраняяю и загружаю объект класса
TMyClass
 fField1: shortstring;
 fField2: shortstring;
 fField2: integer;

Поля типа shortstring грузятся нормально, а вот в поле типа integer загружается вместо ожидаемого числа "10" (например) какое то 7- значное число непонятного происхождения. Почему так получается?


 
Ega23 ©   (2006-02-20 15:10) [1]

Полный код давай. Как сохраняешь, как загружаешь и как создаёшь класс.


 
RO   (2006-02-20 15:10) [2]

Потому что у тебя в программе ошибка.


 
Creative   (2006-02-20 15:17) [3]

type
  TAnimal = class
   private
    fName: shortstring;
    fColor: shortstring;
    fAge: integer;

   public
    constructor Create;
    destructor Destroy;   override;
    procedure SaveToStream(s: TFileStream);
    procedure LoadFromFile(FileName: string);
    procedure LoadFromStream(s: TFileStream);
    procedure SaveToFile(FileName: string);
    property Name: shortstring read FName write FName;
    property Color: shortstring read FColor write FColor;
    property Age: integer read FAge write FAge;

  end;

 THorse = record
   Name: shortstring;
   Color: shortstring;
   Age: integer;
 end;

======================

constructor TAnimal.Create;
begin
 FName:=Name;
 FColor:=Color;
 FAge:=Age;
end;

destructor TAnimal.Destroy;
begin
 inherited;
end;

procedure TAnimal.LoadFromFile(FileName: string);
var
s: TFileStream;
begin
S := TFileStream.Create(FileName, fmOpenRead );
LoadFromStream(s);
S.Free;
end;

procedure TAnimal.LoadFromStream(s: TFileStream);
var
h: THorse;
begin
S.Read(s, SizeOf(THorse));
FName:=h.Name;
FColor:=h.Color;
FAge:=h.Age;
end;

procedure TAnimal.SaveToFile(FileName: string);
var s : TFileStream;
begin
s := TFileStream.Create(FileName, fmCreate or fmShareDenyWrite);
SaveToStream(s);
s.Free;
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;

procedure TForm1.FormCreate(Sender: TObject);
begin
MyHorse := TAnimal.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyHorse.fName:= Edit1.Text;
MyHorse.fColor:= Edit2.Text;
MyHorse.fAge:= StrToInt(Edit3.Text);
Label1.Caption:= MyHorse.fName;
Label2.Caption:= MyHorse.fColor;
Label3.Caption:= IntToStr(MyHorse.fAge);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then MyHorse.SaveToFile(FileName);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if OpenDialog1.Execute then MyHorse.LoadFromFile(OpenDialog1.FileName);
Label1.Caption:= MyHorse.fName;
Label2.Caption:= MyHorse.fColor;
Label3.Caption:= IntToStr(MyHorse.fAge);
end;

end.


 
Ega23 ©   (2006-02-20 15:22) [4]


> constructor TAnimal.Create;
> begin
>  FName:=Name;
>  FColor:=Color;
>  FAge:=Age;
> end;


1. Зачем это????

procedure TAnimal.LoadFromStream(s: TFileStream);
var
h: THorse;
begin
S.Read(s, SizeOf(THorse));
FName:=h.Name;
FColor:=h.Color;
FAge:=h.Age;
end;

И где инициализация h?

Общие впечатления:
1. Рекомендую Position у Stream в 0 выставлять
2. try except  try-finally почаще использовать
3. А почему THorse - record? Почему не наследник от TAnimal?


 
RO   (2006-02-20 15:24) [5]


> S.Read(s, SizeOf(THorse));


> S.Write(s, SizeOf(THorse));


Безобразие как минимум в этих строчках.


 
Creative   (2006-02-20 16:07) [6]

Чтбы не морочить, задам вопрос позитивно: не могли бы вы привести простой пример (желательно с комментариями) сохранения и загрузки объекта класса с произвольними полями (в т. ч. типа TBitmap).
Или хоть скажите, где это можно найти, я искала - не нашла. Может книжки не те читаю...


 
Ega23 ©   (2006-02-20 16:09) [7]


> Чтбы не морочить, задам вопрос позитивно: не могли бы вы
> привести простой пример (желательно с комментариями) сохранения
> и загрузки объекта класса с произвольними полями (в т. ч.
>  типа TBitmap).


В файл?


 
Creative   (2006-02-20 16:15) [8]

Да, в файл.
Мне хочу понять, как должна быть устроена процедура (ы), соскребающая все изменяемые данные в программе и сохраняющая их в файл. (естественно обратная процедура  тоже)
Если это неудобно делать в  форуме - можно в почту.


 
Ega23 ©   (2006-02-20 16:18) [9]

В файл сложно будет. Т.к. размер одной записи задать сложно. В БД - элементарно.
Если так надо в файл, то я бы посоветовал посмотреть в сторону, например, XML. Или что-то наподобие TIFF.


 
Creative   (2006-02-20 16:49) [10]

> RO   (20.02.06 15:24) [5]
> > S.Read(s, SizeOf(THorse));
> > S.Write(s, SizeOf(THorse));
> Безобразие как минимум в этих строчках.

Но почему??? Так было написано в примере


 
Ega23 ©   (2006-02-20 16:51) [11]


> Так было написано в примере


Пример в студию.


 
Creative   (2006-02-20 16:58) [12]

http://soft32.ru/delphi.shtml?topic=comps&title=use_tfilestream

а если конкретнее - вот эта строчка:
Stream.WriteBuffer(Person, SizeOf(TPerson));

может быть я ее неправильно поняла или неправильно применила, но это уже другой вопрос. мне было не у кого спросить


 
Creative   (2006-02-20 17:03) [13]

> > 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. А что не так?


 
Ega23 ©   (2006-02-20 17:04) [14]


> может быть я ее неправильно поняла


Конечно.
1. Ты ИГДЕ не создаёшь экземпляр структуры THorse
2. При чтении и записи в Stream ты делаешь следующее:
Stream.WriteBuffer(Stream SizeOf(THourse)).
А что в примере написано?


 
RO   (2006-02-20 17:05) [15]


> Stream.WriteBuffer(Person, SizeOf(TPerson));


Эта строчка переводится так:

Прочитать из объекта-потока, на который указывает переменная Stream, в буфер, на который указывает переменная Person, SizeOf(TPerson) байт.


 
Ega23 ©   (2006-02-20 17:06) [16]


> Как зачем??? Я создаю класс. Я не могу не реализовать его
> в программе. Или я чего то не понимаю?


Нет, то что ты коструктор описываешь, и пытаешься в нём инициализировать поля - это правильно. Только посмотри внимательно на то, как ты эти поля инициализируешь.


 
Ega23 ©   (2006-02-20 17:10) [17]


> это должно быть так:
>
> h = record
>    Name: shortstring;
>    Color: shortstring;
>    Age: integer;


Это должно быть New() или GetMem()


 
Плохиш ©   (2006-02-20 17:29) [18]


> 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. Ну и конструктор никакой осмысленной и полезной работы в данном случае не делает.


 
Stakan ©   (2006-02-20 17:31) [19]

Ega23 ©   (20.02.06 17:10) [17]
Как я понял запись Thorse статическая, зачем там New() или GetMem()?
Если бы было
PHorse = ^THorse;
...
var
 H: PHorse;

то тогда да


 
Ega23 ©   (2006-02-20 17:33) [20]

А, ну да.
Блин, так давно не работал с рекордами, что везде Create хочется поставить...   :о)


 
Creative   (2006-02-20 17:37) [21]

Ega23 ©   >
2. При чтении и записи в Stream ты делаешь следующее:
Stream.WriteBuffer(Stream SizeOf(THourse)).

...........
> Нет, то что ты коструктор описываешь, и пытаешься в нём
> инициализировать поля - это правильно. Только посмотри внимательно
> на то, как ты эти поля инициализируешь.

Огромное вам спасибо. Я исправила ошибку и реализацию класса переписало в таком вот виде:

constructor TAnimal.Create;
begin

end;

и все стало нормально грузиться.

Но вопрос об инициализации рекорда по прежнему остается неясным - если все и так работает - зачем он нужен? или я опять чего то не заметила?


 
Плохиш ©   (2006-02-20 17:41) [22]


> Огромное вам спасибо. Я исправила ошибку и реализацию класса
> переписало в таком вот виде:
>
> constructor TAnimal.Create;
> begin
>
> end;

Если между begin и end ничего нет, то можно это удалить, потому что у родителя твоего класса уже есть конструктор и соответственно он уже унаследован и будет выполнен.


 
Ega23 ©   (2006-02-20 17:48) [23]


> Но вопрос об инициализации рекорда по прежнему остается
> неясным - если все и так работает - зачем он нужен? или
> я опять чего то не заметила?


Это уже я намудрил. Забыл, что рекорд - это не объект...  :о)


 
Creative   (2006-02-20 17:51) [24]

> Ega23 ©   (20.02.06 17:48) [23]

> Это уже я намудрил. Забыл, что рекорд - это не объект...
>   :о)

надо заметить, что вы меня весьма удручили в тот момент :-)


 
Creative   (2006-02-20 17:53) [25]

Плохиш © ;
> Если между begin и end ничего нет, то можно это удалить,
>  потому что у родителя твоего класса уже есть конструктор
> и соответственно он уже унаследован и будет выполнен.

Не совсем вас поняла. если это удалить - компилятор будет ругаться unsutisfied forward or external declaration (ну, вы помните?)


 
Stakan ©   (2006-02-20 17:54) [26]

Creative   (20.02.06 17:53) [25]
Дык и в объявлении класса надо тоже удалить :)


 
Ega23 ©   (2006-02-20 17:58) [27]

Ну я бы не стал удалять. Я бы прописал

constructor TAnimal.Create;
begin
FName:="";
FColor:="";
FAge:=-1;
end;


Или типа того.


 
Плохиш ©   (2006-02-20 18:00) [28]


> Не совсем вас поняла. если это удалить - компилятор будет
> ругаться unsutisfied forward or external declaration (ну,
>  вы помните?
)

Чесно не помню, я и ветку-то с начала полностью осилить не могу.
Ну а на вопрос Stakan ©   (20.02.06 17:54) [26] уже ответил :-)

PS. Creative, Вы бы почитали что-нибуть для начала по программированию, Hello World бы написали.



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.066 c
3-1137757377
_RusLAN
2006-01-20 14:42
2006.03.12
Нужна идея. Передача даных с одной БД в другую (FireBird)


15-1140446817
ArtemESC
2006-02-20 17:46
2006.03.12
Смена текстового видеорежима


15-1139423173
Marser
2006-02-08 21:26
2006.03.12
О пользе высшего образования


15-1140309906
Ученик чародея
2006-02-19 03:45
2006.03.12
Провал российского образования на международном тестировании.


2-1140779880
VitV
2006-02-24 14:18
2006.03.12
Вставка BLOB из файла...