怎样根据BLOB字段创建OLE对象?(100分)

  • 主题发起人 主题发起人 Shuzi
  • 开始时间 开始时间
S

Shuzi

Unregistered / Unconfirmed
GUEST, unregistred user!
我知道有一个OLE容器控件,但需要打开才能操纵OLE对象(如WORD),并且必须要放在一个窗口上。我其实是需要完全后台操纵,界面上可能根本没有。比如 CreateOleObject就很好,创建后就可以直接通过Variant使用OLE对象的命令等,但它是根据OLE类名创建的,所以我其实想问各位有没有类似CreateOleObjectFromStream或FromBlobField之类的东西,或者说怎样写这么一个函数。
请教
 
生成一个中间文件吧
从blob到文件,再用createobjectfromfile,要作成后台,visible=false不就可以了。
 
先把數據庫中的blob記在硬盤上,然後再ole打開...
 
问题是,速度怎么样呢?
另外,我那张数据表的BLOB字段不一定就是WORD一种类型的文档
 
无级 老大,你似乎没有明白我的意思,我是不想用TOleContainer,你说的createobjectfromfile还是TOleContainer中的,事实上我已经有一个TDBOleContainer控件了
 
我绝对用的着
 
一般BLOB字段只是内容,具体实现的时候另填加一个GUID字段。
根据GUID创建OleObbject
OleCreateFromData(DataObject, IOleObject,OLERENDER_DRAW, nil, Self, FStorage, FOleObject);
OleCreateLinkFromData(DataObject, IOleObject,OLERENDER_DRAW, nil, Self, FStorage, FOleObject);


procedure TOleContainer.CreateObjectFromInfo(const CreateInfo: TCreateInfo);
begin
DestroyObject;
try
CreateStorage;
with CreateInfo do
begin
case CreateType of
ctNewObject:
OleCheck(OleCreate(ClassID, IOleObject, OLERENDER_DRAW, nil,
Self, FStorage, FOleObject));
ctFromFile:
OleCheck(OleCreateFromFile(GUID_NULL, PWideChar(FileName), IOleObject,
OLERENDER_DRAW, nil, Self, FStorage, FOleObject));
ctLinkToFile:
OleCheck(OleCreateLinkToFile(PWideChar(FileName), IOleObject,
OLERENDER_DRAW, nil, Self, FStorage, FOleObject));
ctFromData:
OleCheck(OleCreateFromData(DataObject, IOleObject,
OLERENDER_DRAW, nil, Self, FStorage, FOleObject));
ctLinkFromData:
OleCheck(OleCreateLinkFromData(DataObject, IOleObject,
OLERENDER_DRAW, nil, Self, FStorage, FOleObject));
end;
FDrawAspect := DVASPECT_CONTENT;
InitObject;
FOleObject.SetExtent(DVASPECT_CONTENT, PixelsToHimetric(
Point(ClientWidth, ClientHeight)));
SetDrawAspect(ShowAsIcon, IconMetaPict);
UpdateView;
end;
except
DestroyObject;
raise;
end;
end;
 
版主不解决问题,我就要猛灌了,我也没办法。


楼主对不起,我不能提问,借用一下。



来自:lear_ner, 时间:2004-5-16 21:51:50, ID:2613149 | 编辑
我注册多天不见有回信(确认码)?也见很多同仁反应类似情况,不知大富翁的人(各位负责人)是吃什么饭的,怎么都不管呢? 像这样的破论坛不上也罢。


================================================================
游戏规则 免费注册 资料下载 关于本站
问题分类 问题列表 富翁列表 我的信息 提出问题 在线富翁 富翁日历 笔记列表 我的笔记 写作笔记 全文检索

请确认帐号
--------------------------------------------------------------------------------

富翁名称: lear_ner
专 家 分: 0
可用积分: 200

退出论坛


--------------------------------------------------------------------------------

友站直通车 !


管理我的信息
富翁之家模板
聊天室记事本
我的待答问题
我的已答问题
我收藏的问题
我参与的问题
查关键词
检索LID

--------------------------------------------------------------------------------

支持我们

--------------------------------------------------------------------------------

大富翁论坛版权所有
问题:给本论坛页面“/delphibbs/listq.asp”评论和建议。 ( 积分:0, 回复:28, 阅读:501 )
分类:建议和意见 ( 版主:g622, luyear )
来自:System, 时间:2004-1-18 12:53:00, ID:2418024 [显示:小字体 | 大字体]

大家好,请大家给这个页面(/delphibbs/listq.asp)一点建议和评价,我们会根据这些建议逐步改善系统。 谢谢大家的支持


来自:011101, 时间:2004-1-18 14:49:00, ID:2418198
字体在偶電腦上變大了.
如:
http://218.247.199.234/~photopub/user_3153ea34f8d7bae2d814f727f0b09843/bilder/photos_01/photo_0103.jpg


来自:帮帮我, 时间:2004-1-18 14:53:00, ID:2418209
评价不敢说,借此说个谢谢。
对我帮助很大


来自:app2001, 时间:2004-1-18 15:15:00, ID:2418241
如果在个人的待答、已答、收藏、参与问题及回答别人已结贴的贴子里都能使用上排序及查询功能,就太好了!


来自:恒子, 时间:2004-1-18 15:18:00, ID:2418249
评价不敢说,借此说个谢谢。
对我帮助很大


来自:纯粹新手, 时间:2004-1-18 15:30:00, ID:2418263
listq.asp,说页面有错误,不能搜索,真急人


来自:renyi, 时间:2004-1-18 21:33:00, ID:2418756
大富翁是我见过的最好的技术论坛,但主要讨论Delphi,我想,很多高手都转向Java 或.Net了
这怎么办?



来自:wind8bell, 时间:2004-1-18 22:51:00, ID:2418798
为什么我参与的贴子在结贴后就不见了?能不能方便的找到啊?


来自:jobsxy, 时间:2004-1-19 1:39:00, ID:2418864
分版主应负起责任来,清理各自辖区的未结帖子,有许多帖子,明明已经有了明确的答案,可提问者就是不结帖,而且相当多一部分并没有消失,还时不时地光临论坛,这样对回答者是很大的挫折。

建议:
1、规定每位提问者最多只能有15个待答帖,超过则只能浏览不能提问;凡提问帖最后回复期超过一年,则提问者登录后,将定时弹出对话框,提醒结帖。
2、对于超期注册用户,比如一年以上未登隶者,并给予删除,并将其下未结帖子由分坛主根据所答质量进行分配,暂无结果的,扣除一半的分数,其余分配给回答者。
3、专家分应翻倍给予回答者,以鼓励助人精神,同时给予初学者获得专家分的机会,比如转载优秀的文章、翻译作品、资源链接等等。
2、我们经常看到许多已答回题,其实提问者并没有得到正确答案,或答案的质量不高,这样的帖主往往对所有参与者平均分配,这对浏览的人来说是一种浪费和负担。所以我建议,应允许提问者对所解问题进行满意度打分,10分为最为满意,5分以下为不满意但因种种原因只好结帖,这样做,我们在做离线浏览器时,就可以在相同的N个问题中,挑选满意值最高的看,节省不少时间。


来自:mzr, 时间:2004-1-19 8:57:00, ID:2418940
最好能显示富翁的联系方式如Email


来自:archonwang, 时间:2004-1-19 9:07:00, ID:2418963
很想有个笔记搜索功能啊~免得我翻来覆去地找,挺好的。
对于超期注册用户,比如半年以上未登隶者(或非特殊情况),并给予删除,并将其下未结帖子由分坛主根据所答质量进行分配,暂无结果的,扣除一半的分数,其余分配给回答者。
这也是个办法。不过对版主不是什么好消息,如果每天都要清除这些个问题,工作量式非常巨大地。
另外,个人不太鼓励使用问题满意度分级,每个人有每个人看法和观点,一个问题地好坏不是由我们所能决定地。所以不推荐。


来自:mmzmagic, 时间:2004-1-19 9:32:00, ID:2419012
我想这里有大半人都喜欢游戏也想写游戏吧,坛主能不能加个游戏的讨论区呢?
评价不敢说,在此说个谢谢。
对我帮助非常大。


来自:yczjs, 时间:2004-1-20 10:29:00, ID:2420170
官方定期发布离线数据包,Access格式的
偶也来吼吼![:D]


来自:阿锋, 时间:2004-1-20 12:16:00, ID:2420282
查找功能有点问题


来自:njcliff, 时间:2004-1-26 21:35:00, ID:2423178
非常高兴有这样一个好的论坛。


来自:||||||||bbw||||||||, 时间:2004-1-27 13:45:00, ID:2423577
像以前一样可以删账号啦


来自:Dusy, 时间:2004-1-28 19:09:00, ID:2424733
全文检索功能总是出问题!!又不好使了!!!


来自:2days, 时间:2004-1-29 15:06:00, ID:2425624
全文搜索,还有,贴子列表处加搜索,笔记加搜索。。。


来自:htw, 时间:2004-1-30 8:57:00, ID:2426407
按阅读次数, 回复次数或积分值方式搜索功能不能用
好象不能用有很长一段时间了


来自:mdasky, 时间:2004-2-3 17:30:00, ID:2434091
[blue]头脑风暴MDA使你面临重大选择[/blue]


头脑风暴 ----- MDA 使你面临重大选择 ------ foxcrane谈MDA

今天我们谈谈MDA和企业应用
问: 请谈谈MDA真的能不用写一行代码么
答: 全部自动生成?可执行模型?是永远的梦?!是的,永远的梦,不要指望一行代码不写,MDA工具提供一个功能扩展脚本的编辑器是非常必要的, 为什么FLASH提供脚本语言支持?
可从另一个角度讲,企业应用更多时候是做的仅是一个DB的壳(shell)而已,所以还是很容易的实现MDA的
EJB部署?IDL?WEB SERIVCE?全部可以生成
问:据说现在的计算机人员很缺乏,随着计算机的发展和普及计算机人才会更抢手
答:
现在大量的DB加壳人员是一个非正常现象,MDA将使一切变的正常,而程序员们将面临者前所未有的选择,国内很多硕士在做编码工作,在给DB加壳,哈哈,很是有趣
问:你的意思是说,将来企业应用系统,将不用很多的计算机本科生,研究生了么
答: 使用MDA开发,将有领域专家(DOMAIN EXPERT)和模型分析(学院派的OOA专家)以及翻译人员(翻译人员的工作就是将领域专家做的东西描述成机器能理解的模型语言)
比如:原来是50万个职位,现在只需要10万计算机中级人才,甚至更少,你认为将会发生什么?
问:恩,技术要求会提高并且待遇降低, 那我们现在的程序员该做些什么呢?
答: MDA之前,有几个选择
一、深入了解业务,将来使用MDA做业务模型
二、学习MDA实现思想,将来开发MDA工具
三、转行, 做游戏,手机之类(不过也都有引擎啊,建模之类的工具)
问:有的人研究J2EE设计模式和各种FRameWORK,希望将来能成为架构设计师,在MDA时代,架构师将是一个什么样的角色?
答:MDA和具体的语言无关,无论你是J2EE还是。NET,还是什么,所有语言相关的东西,将成为编译器级的问题,也就是说,整个地球上有一两个专家搞好了架构,别的人只要选择一下就可以了
问:现在需要学习MDA么?
答: 工具只会使你的开发变的更简单,MDA工具非常简单,使用MDA技术含量极低,用的时候再学即可
如果你还想做技术,那么你的选择是开发MDA工具本身,或是研究中间件,或是架构设计,或是转行
即使是5年、8年后才能MDA,但我想你不希望在你工作了5年、8年后,以前的经验再没有用处,一切从头再来把
人生能够输几次?!?!
能有几次可以选择?!?
问:好,今天我们就到这里吧,谢谢foxcrane

mdasky的想法:
抛砖引玉,希望大家都发表一下自己的见解。
个人认为MDA其实就是倡导一种将创造性思维转化为精确的模型,让开发人员从繁琐的重复的低级劳动中解脱出来,去关注更多的业务逻辑层面。因此,提出软件蓝领失业的想法就不足为奇了。
但是这种提升程序员层次的想法早就提出来了,已经发展了一段时间,但是效果并不好。为什么?因为不可能要求所有的程序员都以软件架构师的战略性眼光去看....

来自:www.Mdasky.com





来自:qyxsd, 时间:2004-2-26 14:15:13, ID:2471984
为什么查询老是查不到东西?


来自:zjy2004, 时间:2004-2-26 15:12:31, ID:2472130
我怎么看不懂这个论坛怎么用呢,


来自:sql_my, 时间:2004-3-5 17:48:59, ID:2487074
大富翁论坛的好几项查询有问题,能不能维修一下,在此表示感谢;大富翁论坛可以说是
最好的论坛!


来自:unregister, 时间:2004-3-29 15:43:03, ID:2528132
我毕业就全靠这里了!谢谢



来自:wenkie, 时间:2004-4-7 11:49:26, ID:2544557
为什么我不能发表信息呢



来自:wenkie, 时间:2004-4-7 11:50:34, ID:2544561
我看不见问题的文字呀,叫我如何回答问题呢,哎,不知道是什么原因


来自:雨中飘, 时间:2004-4-15 8:34:51, ID:2559881
我想提问,但不知道在什么地方提问?


来自:xiexiebangmang, 时间:2004-5-13 11:01:20, ID:2607524
上午注册,可是现在还没有收到信,郁闷呢。


来自:lear_ner, 时间:2004-5-16 21:51:50, ID:2613149 | 编辑
我注册多天不见有回信(确认码)?也见很多同仁反应类似情况,不知大富翁的人(各位负责人)是吃什么饭的,怎么都不管呢? 像这样的破论坛不上也罢。
 
我知道有一个OLE容器控件,但需要打开才能操纵OLE对象(如WORD),并且必须要放在一个窗口上。我其实是需要完全后台操纵,界面上可能根本没有。比如 CreateOleObject就很好,创建后就可以直接通过Variant使用OLE对象的命令等,但它是根据OLE类名创建的,所以我其实想问各位有没有类似CreateOleObjectFromStream或FromBlobField之类的东西,或者说怎样写这么一个函数。
请教
 
在你的ole容器控件中,肯定可以获取当前对象的progid,把这个ID保存在另一个字段中。当读取blobfield内容时。也读取这个progid,你用createoleobject来创建OLE对象,参数就是这个progid。然后这个对象再载入你从blobfield中读取的内容存成的临时文件就可以操纵了。
 
shangshang:
你说的似乎在理,我得试试
 
大哥,我搞不定
“然后这个对象再载入你从blobfield中读取的内容存成的临时文件就可以操纵了”怎样载入?
 
有些错会你的意思,以为你要用olecontainer. 你的blob字段没存文件吧.

如果不是我觉得更好办啊.用progid创建oleobject后,就可以用返回的ole变量直接试用对象的方法啦.

我说的blobfield.savetofile是指一个ole文档,比如word文档.你可以存入数据库,然后需要时用上面的方法存成临时文件再操作.如果有好多中ole对象.就考虑存储一下他们的progid嘛, 

总的来说.我的讲法不冲突.
 
我看我还是再理一理我的问题吧
我现在的做法:
有一个文档模板表,其中两个关键字段:一个保存文档内容,即BLOB字段,另一个保存文档内容的OleClassName,如:'Word.Document'(请注意,也可能是其它OLE类,仅于操作系统的支持).
在创建文档模板时,即生成该文档表的记录时,我使用的是TDBOleContainer控件(这个控件直接从TOleContainer继承的)编辑文档内容,根据需要用户可能选择任意Ole类,在Post前取出了TDBOleContainer的OleClassName属性值填入文档类字段中。
现在以定义一个Word模板为例,在创建内容时我自动定义了一些文档变量,以便在应用模板时可以修改这些变量,快速地生成文件。
我的问题就是:在应用模板的地方,我该怎样去修改模板中的文档变量?因为此时根本就不需要TDBOleContainer控件了,修改文档变量应该是后台不可见的。所以我需要象CreateOleObject(<类名>)一样,希望直接根据Blob内容创建OleObject的函数,返回一个内容是Blob字段内容的Ole对象,然后调用该OLE对象中的方法修改文档变量。
根据shangshang兄的提示,我先将BLOB内容保存为一个临时文件,然后调CreateOleObject(<模板表中OLE类字段的值>),得到了一个空的OLE对象Disp,然后用Disp.QueryInterface(IPersistFile,TempFile)得到一个IPersistFile接口,接着调该接口的Load(临时文件名),这样还是不行,因为临时文件中的内容是OLE对象本身,而不是文档内容,如WORD。我就卡在这儿了,各位再想想办法吧
 
我以前用olecontainer, 数据的保存,读取都是自己编程(三两句而已)
在编辑文档内容时,也是对生成的临时文件进行的,修改完后,又loadfromfile保存入数据库中.
等于说我把所有操作都认为是针对文件的,不管是blobfield还是olecontainer还是ole服务器程序.
 
完全可以使用tblobstream来操作 TMemoryStream 的
不过在 TMemoryStream 读取数据后,记得将 .postion:=0
 
你把BLOG字段的内容保存成流后,OLE直接装入流就自动生成OLE对像了呀。
 
怎样直接装入?
 
use adodb

bcontent: TMemoryStream;

With adoquery1 do
begin
bcontent:=TADOBlobStream.Create(TBlobField(fieldbyname('Adoc_bcontent')),bmRead); //创建内存流
OleC_Doc.LoadFromStream(bcontent);
end;
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2198741
这个文章和你问题是不是一样 先看看
我也有类似的问题
 
后退
顶部