?
Solved

Olecontainer to richedit

Posted on 1998-06-24
15
Medium Priority
?
514 Views
Last Modified: 2013-11-22
I am doing a program in which various objects are displayed in ole containers
for insertion in a richedit.
The richedit part of the program will paste objects with no problem and will
accept drag-drop objects with no problem. and it will
open them for editing via the doverb functions. All is AOK
However, when I insert them via the insertobject  function,
they seem to be inserted ok. You can edit them whatever.
But when the file is saved and reopened, the object is no longer there.
Well if you click around on the page you can find the object but it is empty.
The verb menu comes up but errors out.
If the object is manually dragged with mouse after I insert it,it will be saved .
Does it sound like I  missed a lot of code or is it a small matter.

BTW: If the object is inserted as a link, everything works perfect.
I really don't want to use a 3rd party richedit.
Thanks Jim
0
Comment
Question by:JStan
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 8
  • 7
15 Comments
 

Author Comment

by:JStan
ID: 1355543
BTW: after inserting the object, if the file is opened in another program (Wordpad),
the same thing happens. It is there but it isn't.
0
 
LVL 4

Expert Comment

by:d003303
ID: 1355544
How does your "Insert Object" into the RichEdit work ?
0
 

Author Comment

by:JStan
ID: 1355545
hOW ABOUT IF i SEND YOU THE CODE??
OR SHOULD i POST IT HERE.
tHIS IS MY FIRST TIME USING THIS BOARD
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 4

Expert Comment

by:d003303
ID: 1355546
Yo,
if it is not too much code, post it here. Some other experts can work on it then, too.

Slash/d003303
0
 

Author Comment

by:JStan
ID: 1355547
Here it is. This problems seems to me to be an interface problem.
But if I really knew, I might be able to fix it.
I think I sent it all.
Some of the code is in the Richedit1 which is an inherited creation of mine
because I added several functions ( linescroll, topline, curpos etc.)
If it looks like I missed some, I will post it. (If I have it)


procedure TForm1.InsertObject1Click(Sender: TObject);

begin
     with MyOle do {////This is a hidden ole container. User never sees this}
          if InsertObjectDialog  then
           begin
                Richedit1.InsertMyObject;
           end;
     end;
end;

procedure TForm1.InsertMyObject;
var
ReObject:TReObject;
MyStg:IStorage;
ClientSite: IOleClientSite;
H: THandle;
R: TRect;
ID:Tclsid;

begin
             szAppName := StringToOleStr(Paramstr(0));
      with Richedit1 do
        begin
               FRichEditOle.SetHostNames(szAppName,StringToOleStr(Richedit1.Hint));
               Olecheck(FRichEditOle.GetClientSite(ClientSite));
               ReObject.cbStruct := sizeof(ReObject);
               ReObject.cp := REO_CP_SELECTION;
               FRichEditOleCallback.GetNewStorage(MyStg);
               MyOle.OleObjectInterface.GetUserClassId(ID);
               ReObject.clsid := ID;
               ReObject.oleobj := MyOle.OleObjectInterface;
               ReObject.stg := MyStg;
               ReObject.olesite := ClientSite;
               ReObject.sizel.cx := 0;
               ReObject.sizel.cy := 0;
               If MyOle.Iconic then
               ReObject.dvAspect := DVASPECT_ICON Else
               ReObject.dvAspect := DVASPECT_CONTENT;
               ReObject. dwFlags := REO_RESIZABLE  OR REO_BELOWBASELINE;
               ReObject.dwUser := 0;
               FRicheditOle.InsertObject(ReObject);
               R := ClientRect;
               H := Handle;
               ReObject.oleobj.DoVerb(ovShow, NIL, ClientSite, 0, H, R);
         end;
end;

{/////////////This function is called when the richedit is created}
constructor TRichEditOleCallback.Create(AOwner: TMyRich);
begin
  inherited Create;
  FOwner:= AOwner;
end;

procedure TMyRich.CreateWnd;
begin
  inherited CreateWnd;
  if not RichEdit_GetOleInterface(Handle, FRichEditOle) then
    raise Exception.Create('Unable to get interface');
  if not RichEdit_SetOleCallback(Handle, FRichEditOlecallback) then
    raise Exception.Create('Unable to set callback');
end;

function TRichEditOleCallback.GetNewStorage(out stg: IStorage): HRESULT;
var LockBytes: ILockBytes;
begin
  Result:= S_OK;
  try
    OleCheck(CreateILockBytesOnHGlobal(0, True, LockBytes));
    OleCheck(StgCreateDocfileOnILockBytes(LockBytes, STGM_READWRITE
      or STGM_SHARE_EXCLUSIVE or STGM_CREATE, 0, stg));
  except
    Result:= E_OUTOFMEMORY;
  end;
end;
0
 
LVL 4

Expert Comment

by:d003303
ID: 1355548
a bunch of declarations is missing:
TReObject, FRichEditOle, RichEdit_SetOleCallback, Richedit1.InsertMyObject and a few more.
0
 

Author Comment

by:JStan
ID: 1355549
Yea, The prog uses :
The mainform
TMyRich which is the inherited richedit
and Richole.pas
Do you think that is too much to post??
Let me know  Jim
0
 

Author Comment

by:JStan
ID: 1355550
I will try to pull out the pertinent info and post it
0
 
LVL 4

Expert Comment

by:d003303
ID: 1355551
Hum, best would be you mail it to me.
andreas.hahn@sap-ag.de

0
 

Author Comment

by:JStan
ID: 1355552
Alright it is kinda bit.
I E-Mailed it to you.
Thanks
If anyone else would try to figure it out, let me know
and I will E-Mail it to you also.
Thanks- Jim
0
 
LVL 4

Expert Comment

by:d003303
ID: 1355553
Yo,
I got your EMail and took a look at the code. Not that easy, I have to work into it this weekend.

Slash/d003303
0
 

Author Comment

by:JStan
ID: 1355554
OK I appreciate it. I am STILL working on it also.
I bumped the points to 150.
If I had any more points I would raise it more.
Thanks for any help You can give me. It is beating me down.
Jim
0
 
LVL 4

Accepted Solution

by:
d003303 earned 600 total points
ID: 1355555
Yo,
got the problem ! It is, indeed, just a small matter. Take a look at the TMyRich.InsertMyObject procedure. You are obtaining the IOleObject interface from the container, but not its IStorage. So, when the OLE-Container is cleared, the stored data of the OLE-object is gone. This happens when the OLE-object is closed. You are creating a new storage interface that is empty, so this empty storage is written to the file.
Long words, quick solution : replace the line
               FRichEditOleCallback.GetNewStorage(MyStg);
with
               MyStg := OleContainer.StorageInterface;
and that's it.

Cheers,
Slash/d003303

0
 

Author Comment

by:JStan
ID: 1355556
Hey Man, You got it!!! ;-) ;-) ;-)
Do you have any idea how long I have benn pulling my hair out with this.
What you say makes perfect sense. But that's that HindSight people
talk about.
If I had more points, I would gladly give them to you.
Great work and Great Timing.
Jim
0
 
LVL 4

Expert Comment

by:d003303
ID: 1355557
No prob. Always the same if you look at your coding over and over.

Slash/d003303
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
This course is ideal for IT System Administrators working with VMware vSphere and its associated products in their company infrastructure. This course teaches you how to install and maintain this virtualization technology to store data, prevent vuln…
Add bar graphs to Access queries using Unicode block characters. Graphs appear on every record in the color you want. Give life to numbers. Hopes this gives you ideas on visualizing your data in new ways ~ Create a calculated field in a query: …
Suggested Courses

649 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question