![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сериализация своего объекта в базу
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ЧтоТоТам" ...