Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.48 MB
Время: 0.012 c
2-1135285494
Crass
2005-12-23 00:04
2006.01.15
из длиного FileName- > сам Name /.без dir и attr


1-1134454223
Alec_C
2005-12-13 09:10
2006.01.15
TThread и повторный вызов


14-1134897585
Ух
2005-12-18 12:19
2006.01.15
Почему вымышленные истории называют баяном?


2-1135659572
DimonS
2005-12-27 07:59
2006.01.15
Подскажите по SQL


14-1135150795
Bless
2005-12-21 10:39
2006.01.15
hh.exe в папке c: windows?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский