Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.15;
Скачать: CL | DM;

Вниз

Записать объект в поле 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.066 c
2-1135751571
Bratskiy
2005-12-28 09:32
2006.01.15
Использование неопределёного числа параметров в процедуре


10-1111064667
kblc
2005-03-17 16:04
2006.01.15
Word.Application


14-1134824641
Ломброзо
2005-12-17 16:04
2006.01.15
Фёдор Михалыч!...


14-1135003361
GRAND25
2005-12-19 17:42
2006.01.15
Эстонцы тоже хочуть газу!


3-1132565926
Devmaster
2005-11-21 12:38
2006.01.15
Создать таблицу на основе SQL запроса