Конференция "Базы" » Blob & TOleContainer [D7, IB6.x]
 
  • AndrewG © (13.07.09 19:51) [0]
    В блоб поле находится файл ворда.

    Stream : TMemoryStream;
    (datamodule1.IBTCharTest.fieldbyname('Col1')as TBlobField).SaveToStream(stream);
    stream.Seek(0, sofrombeginning);
    OleContainer1.LoadFromStream(stream);

    Выдает ошибку
    Invalid stream format.

    Подскажите, как правильно загрузить в олеконтейнер?
  • Игорь Шевченко © (13.07.09 20:26) [1]
    через файл, например
  • AndrewG © (13.07.09 20:29) [2]
    хотелось бы из потока
  • Игорь Шевченко © (13.07.09 20:51) [3]
  • СовестьДМ © (13.07.09 22:17) [4]
    не надо ходить по этой ссылке - там несколько про другое


    > AndrewG ©   (13.07.09 19:51) 

    дело в том, что файл есть лишь внедренный объект, а не сам контейнер и поэтому потоку нужен контейнерный префикс
    uses ActiveX;
    ...
    const s = 'BDOC';
    ...
    Stream, stream2 : TMemoryStream;
    ...
    Stream:=TMemoryStream.Create;
    (datamodule1.IBTCharTest.fieldbyname('Col1')as TBlobField).SaveToStream(stream);
    Stream.Position:=0;

    stream2:=TMemoryStream.Create;
    stream2.Write(s[1],4);
    i:=DVASPECT_CONTENT;
    stream2.Write(i,4);
    i:=Stream.Size;
    stream2.Write(i,4);
    stream2.CopyFrom(Stream,Stream.Size);

    OleContainer1.LoadFromStream(stream2);
    OleContainer1.DoVerb(ovShow);

    Stream.Free;
    stream2.Free;

  • СовестьДМ © (13.07.09 22:19) [5]
    ...перед LoadFromStream надо stream2.Position:=0;
  • Amoeba © (13.07.09 23:19) [6]
    Готовое решение подойдет?

    unit DBOleContainer;
    {Author: Sergei V. Trepalin, 27 September 1998
    E-mail: trep@trep.home.chg.ru
            trep@ipac1.sherna.msk.su

    Free component. If some changes in source code will be made,
                    one has to highlight changes by any means}


    interface

    uses
     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
     OleCtnrs, DB, DBCtrls;

    type
     TDBOleContainer = class(TOleContainer)
     private
       FDataLink: TFieldDataLink;
       FAutoDisplay: Boolean;
       FFocused: Boolean;
       FObjectLoaded: Boolean;
       FDummy:integer;
       FFromActivate:boolean;
       procedure DataChange(Sender: TObject);
       function GetDataField: string;
       function GetDataSource: TDataSource;
       function GetField: TField;
       function GetReadOnly: Boolean;
       procedure SetDataField(const Value: string);
       procedure SetDataSource(Value: TDataSource);
       procedure SetReadOnly(Value: Boolean);
       procedure SetAutoDisplay(Value: Boolean);
       procedure SetFocused(Value: Boolean);
       procedure UpdateData(Sender: TObject);
       procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
       procedure CMExit(var Message: TCMExit); message CM_EXIT;
       procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
       procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
       procedure DoDeactivate(Sender:TObject);
     protected
       procedure Loaded; override;
       procedure Notification(AComponent: TComponent;
         Operation: TOperation); override;
       procedure LoadObject; virtual;
     public
       constructor Create(AOwner: TComponent); override;
       destructor Destroy; override;
       property Field: TField read GetField;
       function InsertObjectDialog:boolean;
       procedure DestroyObject;
     published
       { Published declarations }
       property DataSource:TDataSource read GetDataSource write SetDataSource;
       property DataField:string read GetDataField write SetDataField;
       property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
       property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
       property AutoActivate:integer read FDummy;
     end;

    procedure Register;

  • Amoeba © (13.07.09 23:20) [7]
    Удалено модератором
    Примечание: Не устраивай помойку из форума, такие объемы кода заменяй ссылкой на внешний ресурс
  • AndrewG © (14.07.09 11:40) [8]
    Получилось, но не все.
    Компонент установил.
    Указал датасоурс.
    Но при datasource ondatachange в Dbolecontainer ничего не загружается
    При дабл клике открывается окно вставки объекта, что понятно , ведь  
    if Assigned(OleObjectInterface) вернет фолс
    Подскажите что не так делаю?

    Спасибо за верхние ответы.
  • AndrewG © (15.07.09 10:23) [9]
    Никаких больше идей в тему???
    (((
  • СовестьДМ © (15.07.09 18:58) [10]

    > Никаких больше идей в тему???

    установи какой-нибудь ещё компонент глядишь полегчает
  • AndrewG © (15.07.09 22:02) [11]
    Спасибо 2 СовестьДМ ,будем использовать

    > СовестьДМ ©   (13.07.09 22:17) [4]

    Еще вопросик возник: как сохранить из олеконтейнера в блоб поле, чтобы после извлечении из блоба.сейвтуфайл документ мог открываться MSWord
  • AndrewG © (15.07.09 22:06) [12]
    ПС: без записи на диск получится?
  • Игорь Шевченко © (16.07.09 01:01) [13]
    через стрим
 
Конференция "Базы" » Blob & TOleContainer [D7, IB6.x]
Есть новые Нет новых   [134473   +33][b:0][p:0.002]