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

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

Записать объект в поле 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]

твой класс должен уметь сохранять себя в поток, как, например, это делают компоненты, размещенные на форме (сохраняют себя в файл формы)


Наверх

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