首页  编辑  

不调用InsertObjectDialog而插入一个对象

Tags: /超级猛料/VCL/Memo&Edit&Richedit/RichEdit、RxRichEdit/   Date Created:

附件中是修改过的RxRichEdit控件,这个可以随意使用。

特别鸣谢:杨进宝

/////////////////////////////////

{/*********************************************************************

// 单元名称:RxRichEd

// 单元描述:

// 编码人:  xjx  Email:x7x@263.net

// 交付时间:2002-7-23 12:32:04

// 版本号:  0.01 ( 每修改一次加1)

// 修正记录:

//*********************************************************************

// 时间                 修正人               备注

//----------------------------------------------------------------------

 20020723              xjx      添加了InsertObject过程实现在RxRichEdit

                                中插入Ole对象功能

                                例子:reole.InsertObject('PBrush');

                                      reOle 为TRxRichEdit 类的实例

//***********************************************************************}

{*******************************************************}

{                                                       }

{         Delphi VCL Extensions (RX)                    }

{                                                       }

{         Copyright (c) 1998 Master-Bank                }

{                                                       }

{*******************************************************}

procedure TRxCustomRichEdit.InsertObject(const AOleClassName: string);

var

 //Data: TOleUIInsertObject;

 NameBuffer: array[0..255] of Char;

 OleClientSite: IOleClientSite;

 Storage: IStorage;

 OleObject: IOleObject;

 ReObject: TReObject;

 IsNewObject: Boolean;

 Selection: TCharRange;

begin

 {TODO -c扩展-oxjx:加入InsertObject过程的实现}

 //FillChar(Data, SizeOf(Data), 0);

 FillChar(NameBuffer, SizeOf(NameBuffer), 0);

 FillChar(ReObject, SizeOf(TReObject), 0);

 if Assigned(FRichEditOle) then begin

   IRichEditOle(FRichEditOle).GetClientSite(OleClientSite);

   Storage := nil;

   try //try1

     CreateStorage(Storage);

     try //try2      Data.dwFlags and

       IsNewObject := IOF_SELECTCREATENEW = IOF_SELECTCREATENEW;

       OleCheck(OleCreate(ProgIDToClassID(AOleClassName), IOleObject, OLERENDER_DRAW, nil, // ClassID

         OleClientSite, Storage, OleObject));

       with ReObject do begin

         cbStruct := SizeOf(TReObject);

         cp := REO_CP_SELECTION;

         clsid := ProgIDToClassID(AOleClassName);

         poleobj := OleObject;

         pstg := Storage;

         polesite := OleClientSite;

         dvAspect := DVASPECT_CONTENT;

         dwFlags := REO_RESIZABLE;

         if IsNewObject then dwFlags := dwFlags or REO_BLANK;

         OleCheck(OleSetDrawAspect(OleObject,

           IOF_SELECTCREATENEW {Data.dwFlags} and IOF_CHECKDISPLAYASICON <> 0,

           0 {Data.hMetaPict}, dvAspect));

       end;

       SendMessage(Handle, EM_EXGETSEL, 0, Longint(@Selection));

       Selection.cpMax := Selection.cpMin + 1;

       OleCheck(IRichEditOle(FRichEditOle).InsertObject(ReObject));

       SendMessage(Handle, EM_EXSETSEL, 0, Longint(@Selection));

       SendMessage(Handle, EM_SCROLLCARET, 0, 0);

       IRichEditOle(FRichEditOle).SetDvaspect(

         Longint(REO_IOB_SELECTION), ReObject.dvAspect);

       if IsNewObject then OleObject.DoVerb(OLEIVERB_SHOW, nil,

           OleClientSite, 0, Handle, ClientRect);

     finally

       ReleaseObject(OleObject);

     end; //try2

   finally

     ReleaseObject(OleClientSite);

     ReleaseObject(Storage);

   end; //try1

 end;

end;

RxRichEd.rar (28.4KB)