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

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

Blob & TOleContainer [D7, IB6.x]


AndrewG ©   (2009-07-13 19:51:00) 

В блоб поле находится файл ворда.

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

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

Подскажите, как правильно загрузить в олеконтейнер?


Игорь Шевченко   (2009-07-16 01:01:00) [1]

через стрим


AndrewG   (2009-07-15 22:06:00) [2]

ПС: без записи на диск получится?


AndrewG   (2009-07-15 22:02:00) [3]

Спасибо 2 СовестьДМ,будем использовать

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

Еще вопросик возник: как сохранить из олеконтейнера в блоб поле, чтобы после извлечении из блоба.сейвтуфайл документ мог открываться MSWord


СовестьДМ   (2009-07-15 18:58:00) [4]


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

установи какой-нибудь ещё компонент глядишь полегчает


AndrewG   (2009-07-15 10:23:00) [5]

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


AndrewG   (2009-07-14 11:40:00) [6]

Получилось, но не все.
Компонент установил.
Указал датасоурс.
Но при datasource ondatachange в Dbolecontainer ничего не загружается
При дабл клике открывается окно вставки объекта, что понятно , ведь  
if Assigned(OleObjectInterface) вернет фолс
Подскажите что не так делаю?

Спасибо за верхние ответы.


Amoeba   (2009-07-13 23:20:00) [7]

Удалено модератором
Примечание: Не устраивай помойку из форума, такие объемы кода заменяй ссылкой на внешний ресурс


Amoeba   (2009-07-13 23:19:00) [8]

Готовое решение подойдет?

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;


СовестьДМ   (2009-07-13 22:19:00) [9]

...перед LoadFromStream надо stream2.Position:=0;


СовестьДМ   (2009-07-13 22:17:00) [10]

не надо ходить по этой ссылке - там несколько про другое


> 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;


Игорь Шевченко   (2009-07-13 20:51:00) [11]

тогда изучай:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1245321411&n=3


AndrewG   (2009-07-13 20:29:00) [12]

хотелось бы из потока


Игорь Шевченко   (2009-07-13 20:26:00) [13]

через файл, например


Наверх

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