-
В блоб поле находится файл ворда.
Stream : TMemoryStream; (datamodule1.IBTCharTest.fieldbyname('Col1')as TBlobField).SaveToStream(stream); stream.Seek(0, sofrombeginning); OleContainer1.LoadFromStream(stream);
Выдает ошибку Invalid stream format.
Подскажите, как правильно загрузить в олеконтейнер?
-
через файл, например
-
хотелось бы из потока
-
-
не надо ходить по этой ссылке - там несколько про другое > 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;
-
...перед LoadFromStream надо stream2.Position:=0;
-
Готовое решение подойдет?
unit DBOleContainer;
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
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;
-
Удалено модератором Примечание: Не устраивай помойку из форума, такие объемы кода заменяй ссылкой на внешний ресурс
-
Получилось, но не все. Компонент установил. Указал датасоурс. Но при datasource ondatachange в Dbolecontainer ничего не загружается При дабл клике открывается окно вставки объекта, что понятно , ведь if Assigned(OleObjectInterface) вернет фолс Подскажите что не так делаю?
Спасибо за верхние ответы.
-
Никаких больше идей в тему??? (((
-
> Никаких больше идей в тему???
установи какой-нибудь ещё компонент глядишь полегчает
-
Спасибо 2 СовестьДМ ,будем использовать
> СовестьДМ © (13.07.09 22:17) [4]
Еще вопросик возник: как сохранить из олеконтейнера в блоб поле, чтобы после извлечении из блоба.сейвтуфайл документ мог открываться MSWord
-
ПС: без записи на диск получится?
-
через стрим
|