![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]через файл, например