Форум: "Базы";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
ВнизЗаписать объект в поле Blob (Firebird) Найти похожие ветки
← →
Mitrofan (2005-11-09 17:25) [0]Создаю свой объект
MyObj = class
...
end;
В нем в основном динмаческие масивы. Как этот объект записать в блоб поле таблицы ?
Пытался через TMemoryStream, но ничего не получается.
Подскажите, может кто сталкивался с похожей проблемой.
Спасибо.
← →
Desdechado © (2005-11-09 19:27) [1]твой класс должен уметь сохранять себя в поток, как, например, это делают компоненты, размещенные на форме (сохраняют себя в файл формы)
← →
Mitrofan (2005-11-09 19:37) [2]А примерчик не подкинете ?
Я пытался сохранить объект как obj.WriteComponent ...
← →
Mitrofan (2005-11-09 19:37) [3]А примерчик не подкинете ?
Я пытался сохранить объект как obj.WriteComponent ...
← →
Digitman © (2005-11-11 08:32) [4]
> пытался сохранить объект как obj.WriteComponent
для этого твой объект д.б. объектом-наследником класса TComponent
см. в справке описание метода TPersistent.DefineProperties(), там и пример есть
← →
Mitrofan (2005-11-11 12:36) [5]Я его и сделал потомком от этого объекта
myObj = class (TComponent)
public
...
...
end
Но он что то все равно не сохраняет :(
← →
Digitman © (2005-11-11 13:07) [6]
> Mitrofan
при Write/ReadComponent в указанном потоке сохраняются/восстанавливаются лишь published-свойства объекта (простых типов)
у тебя же объект имеет в своем составе дин.массивы, и даже если ты объявишь соотв. свойства как published они не могут быть автоматически сохранены/восстановлены в потоке - для этого придется поработать "ручками" с использованием перекрытого тобой метода DefineProperties()
← →
Mitrofan (2005-11-18 10:08) [7]Хорошо, а можно ли как то попроще ?
Ну например, я свой масив, буду держать в виде TList.
Это как то упростит проблему ?
← →
Digitman © (2005-11-18 10:32) [8]
> 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;
← →
Digitman © (2005-11-18 10:34) [9]procedure DefineProperties(Filer: TFiler); override;
← →
Digitman © (2005-11-18 10:44) [10]тоже самое, но для 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:46) [11]пардон, в последнем примере соответственно
procedure TMyClass.ReadList(..)
procedure TMyClass.WriteList(..)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.014 c