CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

关于多文本编辑,即有文本,还能够插入图片及其它控件对象

楼主simpledevelop(阳光灿烂)2002-10-08 09:43:01 在 Delphi / VCL组件开发及应用 提问

我用VC实现了一个多文本编辑器,能够插入位图,继续写下去还可以插入任何COM控件,不知Delphi是怎样来实现边个功能,希望大家多多指教 问题点数:100、回复次数:10Top

1 楼newyj(吴刚vs西西弗)回复于 2002-10-08 09:46:09 得分 10

不就是richedit;  
   
   
   
  请大家去   http://www.new7wonders.com/c/voting.php   投长城一票  
  Top

2 楼simpledevelop(阳光灿烂)回复于 2002-10-08 11:15:06 得分 0

to   newyj(老鬼)   :我早就投过了,可不可提供一下思路,是怎样把BMP插进出的Top

3 楼hred(魂之火)回复于 2002-10-08 11:41:05 得分 10

可以吗?把程序拿出来看看?Top

4 楼simpledevelop(阳光灿烂)回复于 2002-10-08 11:52:40 得分 0

请问有没有办法在RichEdit类控件中画图?  
   
  想使用RichEdit控件完成类似图文混排的功能,如Word中的文本框,还有Wps2000等。  
  但发现RichEdit没有Canvas属性(即使有,也不知道是否能够正常显示)。  
  delphi有实现的可能吗?Top

5 楼hongqi162(失踪的月亮)回复于 2002-10-08 11:55:57 得分 0

关注!Top

6 楼xzhifei(饭桶超人(最讨厌两种人,一种是有种族歧视的人,一种是日本人!))回复于 2002-10-08 12:01:11 得分 80

 
  procedure   proPrintRTFWithBMP(strCaption,strPic,strTitle:string;rtf:TRichEdit);  
  {strText为要打印的文本   strCaption为打印标题   strPic为图像文件目录  
  strTitle为要显示在图像右侧的图像标题}  
  var  
      FRTF:IRichEditOle;  
      FOLE:IOLEObject;  
      formatEtc:tagFORMATETC;  
      FStorage   :ISTORAGE;  
      FClientSite:IOLECLIENTSITE;  
      FLockBytes:ILockBytes;  
      ReObject:TReObject;  
      xt:TGuid;  
      FTemp:IUnknown;  
      strTemp:string;  
      bCreateNew:boolean;  
      ABMP:TBitmap;  
      Ajpeg:TJpegImage;  
      i:Longint;  
  begin  
  //         rtfTemp:=TRichEdit.Create(frmPrintFrame);  
          try  
  {                 with     rtfTemp   do  
                  begin  
                          Parent   :=   frmPrintFrame;  
                          width:=200;  
                          height:=200;  
                          visible:=false;  
                          Text   :=   strText;  
                  end;     }  
   
                  //图片文件不存在,直接打印文本并退出  
                  if   not   fileexists(strPic)then  
                  begin  
                          PrintRichEdit(strCaption,rtf);  
                          exit;  
                  end;  
   
                  abmp:=TBitmap.Create;  
                  ajpeg:=   TJpegImage.Create;  
                  try  
                          if   ExtractFileExt(strPic)='.jpg'   then  
                          begin  
                                  bCreateNew:=true;  
                                  ajpeg.LoadFromFile(strPic);  
                                  abmp.Assign(ajpeg);  
                                  strTemp:=ExtractFilePath(strPic)+'0099www.bmp';  
                                  abmp.SaveToFile(strTemp);  
                                  for   i:=1   to   30000   do  
                                          application.ProcessMessages;  
                          end  
                          else  
                                  strTemp:=   strPic;  
                  finally  
                          abmp.Free;  
                          ajpeg.free;  
                          abmp:=nil;  
                          ajpeg:=nil;  
                  end;  
   
                  sendmessage(rtf.handle,EM_GETOLEINTERFACE,0,LongInt(@FRTF));  
                  if   not   assigned(FRTF)then  
                  begin  
                          showmessage('Error   to   get   Richedit   OLE   interface');  
                          exit;  
                  end;  
   
                  //建立一个可以访问全局内存的Byte数组   FLockBytes  
                  //返回ILockBytes接口  
                  if   CreateILockBytesOnHGlobal(0,true,FLockBytes)<>S_OK   then  
                  begin  
                          showmessage('Error   to   create   Global   Heap');  
                          exit;  
                  end;  
   
                  //建立一个混合文档存取对象  
                  if   StgCreateDocfileOnILockBytes(FLockBytes,STGM_SHARE_EXCLUSIVE   or  
                          STGM_CREATE   or   STGM_READWRITE,0,FStorage)<>S_OK   then  
                  begin  
                          showmessage('Error   to   create   storage');  
                          exit;  
                  end;  
                   
                  formatEtc.cfFormat   :=   0;  
                  FormatEtc.ptd   :=   nil;  
                  FormatEtc.dwAspect   :=   DVASPECT_CONTENT;  
                  FormatEtc.lindex   :=   -1;  
                  FormatEtc.tymed   :=   TYMED_NULL;  
   
                  FRTF.GetClientSite(FClientSite);  
   
                  //从文件中创建一个OLE对象  
                  if   OleCreateFromFile(GUID_NULL,PWideChar(WideString(strTemp)),IID_IUnknown,0,@formatEtc,  
                          FClientSite,FStorage,FOLE)<>S_OK   then  
                  begin  
                          showmessage('Error');  
                          exit;  
                  end;  
   
                  //现在的FOLE还是一个IUnKnown接口,将其转换为一个   IOleObject接口  
                  FTemp:=FOLE;  
                  FTemp.QueryInterface(IID_IOleObject,   FOle);  
                  OleSetContainedObject(FOle,   TRUE);  
   
   
                  //step   2  
                  reobject.cbStruct   :=   sizeof(TReObject);  
                  FOLE.GetUserClassID(xt);  
                  ReObject.clsid   :=   xt;  
                  reobject.cp   :=   ULong(REO_CP_SELECTION);  
                  reobject.dvaspect   :=   DVASPECT_CONTENT;  
                  reobject.dwFlags   :=   ULong(REO_RESIZABLE)   or   ULong(REO_BELOWBASELINE);  
                  reobject.dwUser   :=   0;  
                  reobject.poleobj   :=   FOle;  
                  reobject.polesite   :=   FClientSite;  
                  reobject.pstg   :=   FStorage;  
                  reobject.sizel.cx   :=   0;  
                  reobject.sizel.cy   :=   0;  
   
                  FRTF.InsertObject(reobject);  
   
                  PrintRichEdit(strCaption,rtf);  
          finally  
                  if   bCreateNew   then  
                          Deletefile(strTemp);  
                  FRTF:=nil;  
                  FOLE:=nil;  
          end;  
  end;  
  ================================================================  
  我是中国鹰派!  
  拒绝日货!Top

7 楼simpledevelop(阳光灿烂)回复于 2002-10-08 12:48:44 得分 0

从//step   2开始,和我用VC中实现的方法一样,不过在delphi中IRichEditOle;  
  IOLEObject;  
  tagFORMATETC;  
  ISTORAGE;  
  IOLECLIENTSITE;  
  ILockBytes;  
  TReObject;  
  这些接口不知道在哪个单元文件中?Top

8 楼simpledevelop(阳光灿烂)回复于 2002-10-08 13:21:37 得分 0

xzhifei(飞)   :TReObject结构是你自己定义的吗Top

9 楼xzhifei(饭桶超人(最讨厌两种人,一种是有种族歧视的人,一种是日本人!))回复于 2002-10-08 13:30:08 得分 0

NO!  
  不瞒你说,我只是粘过来的,不要告诉别人啊!!  
  ================================================================  
  我是中国鹰派!  
  拒绝日货!打倒小日本!Top

10 楼simpledevelop(阳光灿烂)回复于 2002-10-25 12:46:44 得分 0

www.richedit.com   做得非常好,谁能实现和它差不多的功能Top

相关问题

  • 有没有既能编辑文本又能插入对象的控件?
  • 如何使自己的LABLE控件插入超文本链接?
  • 如何在asp.net服务器控件之间插入文本
  • 怎样将一个控件插入到Office的可插入对象列表中
  • 如何在EDIT控件里面设置文本颜色和插入图标
  • 如果将插入WORD的ActiveX控件对象持久化到WORD文档中?
  • 关于如何实现在文本编辑控件如(memo,richedit)中插入图片?
  • 文本控件的问题
  • 文本控件的困惑
  • ADO对象.控件

关键词

  • 文本
  • 控件
  • 文件
  • 接口
  • 图像
  • fole
  • reobject
  • formatetc
  • strpic
  • abmp

得分解答快速导航

  • 帖主:simpledevelop
  • newyj
  • hred
  • xzhifei

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo