![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Записать объект в поле Blob (Firebird)
Mitrofan © (2005-11-09 17:25:00)Создаю свой объект
MyObj = class
...
end;
В нем в основном динмаческие масивы. Как этот объект записать в блоб поле таблицы ?
Пытался через TMemoryStream, но ничего не получается.
Подскажите, может кто сталкивался с похожей проблемой.
Спасибо.
Digitman (2005-11-18 10:46:00) [1]пардон, в последнем примере соответственно
procedure TMyClass.ReadList(..)
procedure TMyClass.WriteList(..)
Digitman (2005-11-18 10:44:00) [2]тоже самое, но для TList:
TMyClass = class(TComponent)
private
FList: TList;
procedure ReadList(Stream: TStream);
procedure WriteList(Stream: TStream);
protected
procedure DefineProperties(Filer: TFiler); override;
end;
..
procedure TMyClass.DefineProperties(Filer: TFiler);
begin
inherited;
Filer.DefineBinaryProperty('MyList', ReadList, WriteList, True);
end;
procedure TMyClass.ReadDynArray(Stream: TStream);
var
Len: Integer;
begin
with Stream do begin
ReadBuffer(Len, SizeOf(Len));
FList.Count := Len;
FList.Capacity := FList.Count;
if Len > 0 then
ReadBuffer(FList.List^, Len * SizeOf(Pointer));
end;
end;
procedure TMyClass.WriteDynArray(Stream: TStream);
var
Len: Integer;
begin
Len := FList.Count;
with Stream do begin
WriteBuffer(Len, SizeOf(Len));
if Len > 0 then
WriteBuffer(FList.List^, Len * SizeOf(Pointer));
end;
end;
Digitman (2005-11-18 10:34:00) [3]procedure DefineProperties(Filer: TFiler); override;
Digitman (2005-11-18 10:32:00) [4]
> Mitrofan (18.11.05 10:08) [7]
> а можно ли как то попроще ?
а что в том вообще сложного ? .. поясни ..
> например, я свой масив, буду держать в виде TList.
> Это как то упростит проблему ?
абсолютно никак.
да и проблемы-то никакой вовсе нет - достаточно перекрыть в своем классе-наследнике вирт.метод предка DefineProperties() и в теле перекрытого метода указать свои методы записи/считывания того или иного св-ва, будь то массив или список
TMyClass = class(TComponent)
private
FArray: array of Integer;
procedure ReadDynArray(Stream: TStream);
procedure WriteDynArray(Stream: TStream);
protected
procedure DefineProperties(Filer: TFiler);
end;
..
procedure TMyClass.DefineProperties(Filer: TFiler);
begin
inherited;
Filer.DefineBinaryProperty('MyDynArray', ReadDynArray, WriteDynArray, True);
end;
procedure TMyClass.ReadDynArray(Stream: TStream);
var
Len: Integer;
begin
with Stream do begin
ReadBuffer(Len, SizeOf(Len));
SetLength(FArray, Len);
if Len > 0 then
ReadBuffer(@FArray[0], Len * SizeOf(Integer));
end;
end;
procedure TMyClass.WriteDynArray(Stream: TStream);
var
Len: Integer;
begin
Len := Length(FArray);
with Stream do begin
WriteBuffer(Len, SizeOf(Len));
if Len > 0 then
WriteBuffer(@FArray[0], Len * SizeOf(Integer));
end;
end;
Mitrofan (2005-11-18 10:08:00) [5]Хорошо, а можно ли как то попроще ?
Ну например, я свой масив, буду держать в виде TList.
Это как то упростит проблему ?
Digitman (2005-11-11 13:07:00) [6]
> Mitrofan
при Write/ReadComponent в указанном потоке сохраняются/восстанавливаются лишь published-свойства объекта (простых типов)
у тебя же объект имеет в своем составе дин.массивы, и даже если ты объявишь соотв. свойства как published они не могут быть автоматически сохранены/восстановлены в потоке - для этого придется поработать "ручками" с использованием перекрытого тобой метода DefineProperties()
Mitrofan (2005-11-11 12:36:00) [7]Я его и сделал потомком от этого объекта
myObj = class (TComponent)
public
...
...
end
Но он что то все равно не сохраняет :(
Digitman (2005-11-11 08:32:00) [8]
> пытался сохранить объект как obj.WriteComponent
для этого твой объект д.б. объектом-наследником класса TComponent
см. в справке описание метода TPersistent.DefineProperties(), там и пример есть
Mitrofan (2005-11-09 19:37:00) [9]А примерчик не подкинете ?
Я пытался сохранить объект как obj.WriteComponent ...
Mitrofan (2005-11-09 19:37:00) [10]А примерчик не подкинете ?
Я пытался сохранить объект как obj.WriteComponent ...
Desdechado (2005-11-09 19:27:00) [11]твой класс должен уметь сохранять себя в поток, как, например, это делают компоненты, размещенные на форме (сохраняют себя в файл формы)