Главная страница
    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.47 MB
Время: 0.014 c
6-1127965848
VolanD666
2005-09-29 07:50
2006.01.15
Проблема передачи файлов


14-1133348949
Post
2005-11-30 14:09
2006.01.15
Framework SDK


1-1134110547
Max Zyuzin
2005-12-09 09:42
2006.01.15
TService не дружыт с ADODB


14-1135245189
bill2
2005-12-22 12:53
2006.01.15
Вот так вот захочешь денег поднять а тут ...


4-1131409177
Volf_555
2005-11-08 03:19
2006.01.15
Как в своей программе отловить выключение компьютера?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский