Форум: "Начинающим";
Текущий архив: 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