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

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

сериализация своего объекта в базу


Страницы:   1 2

Tab ©   (2006-10-18 10:48:00) 

Создал свой объект, как сериализовать его в базу? например FB. Буду благодарен за пример.


Ученик чародея   (2006-10-20 16:56:00) [1]


> Игорь Шевченко ©   (20.10.06 16:50) [35]
>
> Ученик чародея ©   (20.10.06 16:12) [33]
>
>
> > Чистый класс при создании от TObject занимает 8 байт памяти,
>
> >  чистый класс наследованный от TComponent занимает 48
> байт
> > памяти.
>
>
> И какое отношение это имеет к теме ветки ?


[11],[12]


Игорь Шевченко   (2006-10-20 16:50:00) [2]

Ученик чародея ©   (20.10.06 16:12) [33]


> Чистый класс при создании от TObject занимает 8 байт памяти,
>  чистый класс наследованный от TComponent занимает 48 байт
> памяти.


И какое отношение это имеет к теме ветки ?


Ученик чародея.   (2006-10-20 16:14:00) [3]

Ну тоесть объект этого класса.

А если у меня этих объектов более 10^7 то выигрыш налицо.


Ученик чародея   (2006-10-20 16:12:00) [4]

Чистый класс при создании от TObject занимает 8 байт памяти, чистый класс наследованный от TComponent занимает 48 байт памяти.

type TMyClass=class(TComponent)
 end;

var
 Form1: TForm1;
var MC:array of TMyClass;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
 Form1.Caption:='Old='+IntToStr(AllocMemSize);
 //SetLength(MC,cArrLen);
 for i:=0 to (cArrLen-1) do
   MC[i]:=TMyClass.Create(nil);
 //
 Form1.Caption:=Form1.Caption+'Now='+IntToStr(AllocMemSize);

end;


StriderMan   (2006-10-20 13:57:00) [5]


> type
>  MFigure_= class (TComponent)
   private
     fMPen: TGPen;
>  published?
>   property MPen : TGPPen read fMPen write fMPen;
>   property objType: integer read .. write...;
>   property pt_l: array [1..2] of TGPPoint read .. write ..;
> end;


Tab   (2006-10-20 13:48:00) [6]

после указания
published
не принимает типы Integer проч. как их тогда добавить в класс.


Slym   (2006-10-20 10:54:00) [7]

type
 MFigure_= class (TComponent)
  published?
  MPen : TGPPen;
  objType: integer;
  pt_l: array [1..2] of TGPPoint;
end;


Сергей М.   (2006-10-20 10:28:00) [8]


> в Blob строки или числа не записываются


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


Tab   (2006-10-19 20:37:00) [9]

Решил попробовать сначала на числах и  строках. Сделал аналог SaveFoo, но в Blob строки или числа не записываются.


Игорь Шевченко   (2006-10-19 17:12:00) [10]

Tab   (19.10.06 15:10) [21]


> да нет, зачем же выкидывать. Лучше поделитесь своим успешным
> опытом использования, дав пару примеров. Буду очень благодарен.
>


Выкидывать затем, что это неправильный способ работы с данными в базе.

Писать примеры долго, промышленный код я не дам, но общая схема проста:
Сохраняемый объект наследуется от TComponent, у него переписывается метод DefineProperties, если класс содержит что-то кроме элементарных типов.
Класс обязательно регистрируется (RegisterClass)

Код сохранения схематично выглядит так:

procedure SaveFoo(Foo: TFoo; KeyID: Integer);
begin
var
 MS: TMemoryStream;
begin
 MS := TMemoryStream.Create;
 try
   MS.WriteComponent(Foo);
   qryFooUpd.ParamByName('KEYID').AsInteger := KeyID;
   qryFooUpd.ParamByName('AnObject').LoadFromStream(MS, ftBlob);
   qryFooUpd.ExecSQL;
 finally
   MS.Free;
 end;
end;

Код загрузки схематично выглядит так:

function LoadFoo (ABlob: TBlobField): TFoo;
begin
 Result := TFoo.Create(nil);
 if not Result.Load(ABlob) then
   FreeAndNil(Result);
end;

function TFoo.Load(ABlob: TBlobField): Boolean;
var
 MS: TMemoryStream;
begin
 Result := not ABlob.IsNull;
 if Result then begin
   Clear;
   MS := TMemoryStream.Create;
   try
     ABlob.SaveToStream(MS);
     MS.Position := 0;
     MS.ReadComponent(Self);
   finally
     MS.Free;
   end;
 end;
end;


StriderMan   (2006-10-19 16:21:00) [11]


> Tab   (19.10.06 15:46) [24]

автоматом только простые типы сохраняются ну и другие компоненты.
сложные типы надо научить сохранять

для этого есть метод.

procedure DefineProperties(Filer: TFiler); override;

там надо написать что-то типа

 inherited DefineProperties(Filer);
 Filer.DefineProperty('RecParts', ReadRecParts, WriteRecParts, True);
//жирные - ссылки на методы чтения/записи

procedure TKLCReceiptForm.ReadRecParts(Reader: TReader);
var
 i: TReceiptPart;
begin
 i := TReceiptPart(0);
 Reader.ReadListBegin;
 while not Reader.EndOfList do
 begin
   fRecParts[i] := Reader.ReadFloat;
   if i > high(fRecParts) then break;
   inc(i);
 end;
 Reader.ReadListEnd;
end;


Tab   (2006-10-19 15:52:00) [12]

Может запись не правильно:
procedure MLine.SaveToStream(const AField: TBlobField);
var
bs: TStream;
begin
bs := AField.DataSet.CreateBlobStream(AField, bmWrite);
try
 bs.WriteDescendent(Self, nil);
finally
  bs.Free;
end;
end;


Tab   (2006-10-19 15:46:00) [13]

проверил на Integer и String
а вот типы TGPPen, TGPPoint не читает пишет по нулям.
почему может быть?
type
  MFigure_= class (TComponent)
  public
   MPen : TGPPen;
   objType: integer;
   pt_l: array [1..2] of TGPPoint;
end;


StriderMan   (2006-10-19 15:27:00) [14]


> Tab   (19.10.06 13:24) [16]
> procedure MLine.LoadFromStream(const AField: TBlobField);
> var
> bs: TStream;
> begin
> bs := AField.DataSet.CreateBlobStream(AField, bmRead);
> try
>   bs.ReadComponent( Self);
> finally
>   bs.Free;
> end;
> end;


Tab   (2006-10-19 15:21:00) [15]

т.е. снначала надо из blob в Stream  а как потом из Stream прочесть данные их класса?
procedure MLine.LoadFromStream(const AField: TBlobField);
var
bs: TStream;
begin
 bs := AField.DataSet.CreateBlobStream(AField, bmRead);
try
  TComponent(self):=bs.ReadComponent(nil);
finally
  bs.Free;
end;
end;
на выделенной строчке ругается class MLine not found


Tab   (2006-10-19 15:10:00) [16]


> Успешно использую SaveToBlob, LoadFromBlob в течение нескольких
> лет.Теперь придется выкидывать, а жалко...

да нет, зачем же выкидывать. Лучше поделитесь своим успешным опытом использования, дав пару примеров. Буду очень благодарен.


> Ошибка за пределами этого кода не исключена.

кажется одну нашел:

procedure MLine.LoadFromStream(const AField: TBlobField);
var
bs: TStream;
begin
bs := AField.DataSet.CreateBlobStream(AField, bmRead ?);
try
 self:=bs.ReadComponent(nil);
finally
 bs.Free;
end;
end


Сергей М.   (2006-10-19 15:00:00) [17]


> Tab   (19.10.06 14:54) [18]



> приведеный выше мной код для чтенеия не работает


Ошибка за пределами этого кода не исключена.


> какие-то нечитаемые.


Значит лупа не той системы


Игорь Шевченко   (2006-10-19 14:57:00) [18]

Успешно использую SaveToBlob, LoadFromBlob в течение нескольких лет.
Теперь придется выкидывать, а жалко...


Tab   (2006-10-19 14:54:00) [19]


> Ну куда уж тут понятней ...Если "запись" - это "SaveToЧтоТоТам",
>  то "чтение" = "LoadFromЧтоТоТам" ...

ну приведеный выше мной код для чтенеия не работает. В BLOB записались данные название класса, и еще какие-то нечитаемые.


Сергей М.   (2006-10-19 14:38:00) [20]


> обратную операцию чето не понял как?


Ну куда уж тут понятней ...

Если "запись" - это "SaveToЧтоТоТам", то "чтение" = "LoadFromЧтоТоТам" ...


Страницы:   1 2

Наверх

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