Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.014 c
3-1137753158
tyger
2006-01-20 13:32
2006.03.12
DBF + ДОС - Кодировка


4-1135076384
Grant
2005-12-20 13:59
2006.03.12
Поиск временного каталога.


15-1139941005
Кто - то
2006-02-14 21:16
2006.03.12
Вопрос законопослушного программиста


2-1140445949
Василь Быков
2006-02-20 17:32
2006.03.12
обновление в таблице ?


15-1140181761
Mirror
2006-02-17 16:09
2006.03.12
Jpeg2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский