Solved

Delphi tOLEContainer CreateOLEObject LoadFromFile - gives Invalid Stream Format with HTML file

Posted on 2011-02-14
8
3,520 Views
Last Modified: 2012-05-11
Try the following steps:

1) Open MS Word and type "Hello World"
2) Save this document as an HTML WebPage file (eg C:\HelloWorld.HTM)
3) In Delphi create a form with a TOLEContainer and add the following code to a Button

    OleContainer1.CreateObject('Word.Document',false);
    OleContainer1.LoadFromFile('C:\HelloWorld.HTM');

The second line gives the error "Invalid Stream Format".  Why?

Note: If you save the "Hello World" as a word document it works fine.

How can I get a tOLEContainer to create an instance of MS Word and then load an HTML file for editing?

Surely this can be done - I mean MS Outlook does it.

If you can answer this question then there are more points to be found here...
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_26808908.html 

I am hoping that someone with a little Win API and OLE knowledge can solve this one for me.

I really want to use tOLEContainer or some derivitive or equivalent WinAPI calls.
0
Comment
Question by:enigmasolutions
  • 6
8 Comments
 
LVL 32

Expert Comment

by:ewangoya
ID: 34887892

Dont use lodafromfile unless it was saved from the OleContainer

use

OleContainer1.CreateObjectFromFile('C:\HelloWorld.HTM', False);
0
 
LVL 1

Accepted Solution

by:
enigmasolutions earned 0 total points
ID: 34894039
ewangoya,

Thank you.  So loadfromfile doesn't work by loading a file. That helps a bit.  Also the CreateObjectFromFile is part of teh answer.

Anyway we have found a solution.  It is a bit ugly - we had to save the HTML file with a .Doc extension first.  Then we could use CreateObjectFromFile.  (So in the steps at the very top of this question you jus tneed a fourth step to rename the .HTM file as a .DOC file)

Then the code below did the job.
//make sure teh HTML file has a .doc extension
OleContainer1.AutoActivate:=aaManual;
OleContainer1.CreateObjectFromFile('c:\HelloWorld.doc',False);

Open in new window

0
 
LVL 1

Author Comment

by:enigmasolutions
ID: 34894166
I have attached a sample application that does HTML emailing using MS Word as the editor within a Delphi form.
EmailerWordApp.zip
0
 
LVL 1

Author Comment

by:enigmasolutions
ID: 34894185
Here is a challenge:

Can anyone, work out a way of doing it without renaming the file?
What about not creating the file at all - just loading a stream with the HTML in it?

I doubt anyone will be able to do either of these.

Anyway I will leave the question open for a week - then close it and award points.

0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 24

Expert Comment

by:jimyX
ID: 34903882
From Delphi help files:
"Use the OleContainer component to provide your application with the ability to link and embed objects from an OLE server."
"When you activate an object inside the OLE container, control transfers to the OLE server application, so the user can access all the functionality of the server application from within your container application."
"OleContainer can create either an embedded or linked OLE object to an external application."

I am not sure if it is possible to have HTML files edited on OleContainer. But if you want to have the ability to work on the HTML file then you can use Memo to handle the HTML and link it to WebBrowser.
//http://delphi.about.com/od/twebbrowser/a/save-as-mht.htm
procedure WB_SaveAs_HTML(WB : TWebBrowser; const FileName : string) ;
 var
   PersistStream: IPersistStreamInit;
   Stream: IStream;
   FileStream: TFileStream;
 begin
   if not Assigned(WB.Document) then
   begin
     ShowMessage('Document not loaded!') ;
     Exit;
   end;

   PersistStream := WB.Document as IPersistStreamInit;
   FileStream := TFileStream.Create(FileName, fmCreate) ;
   try
     Stream := TStreamAdapter.Create(FileStream, soReference) as IStream;
     if Failed(PersistStream.Save(Stream, True)) then ShowMessage('SaveAs HTML fail!') ;
   finally
     FileStream.Free;
   end;
 end; (* WB_SaveAs_HTML *)

// http://delphi.about.com/cs/adptips2004/a/bltip0104_4.htm
procedure WBLoadHTML(WebBrowser: TWebBrowser; HTMLCode: string) ;
var
   sl: TStringList;
   ms: TMemoryStream;
begin
   WebBrowser.Navigate('about:blank') ;
   while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do
    Application.ProcessMessages;

   if Assigned(WebBrowser.Document) then
   begin
     sl := TStringList.Create;
     try
       ms := TMemoryStream.Create;
       try
         sl.Text := HTMLCode;
         sl.SaveToStream(ms) ;
         ms.Seek(0, 0) ;
         (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms)) ;
       finally
         ms.Free;
       end;
     finally
       sl.Free;
     end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('Hello World.htm');
end;

procedure TForm1.Memo1Change(Sender: TObject);
begin
  WBLoadHTML(WebBrowser1,Memo1.Text) ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  WB_SaveAs_HTML(WebBrowser1,'Hello World.htm') ;
end;

Open in new window

DelphiHTML.zip
0
 
LVL 1

Author Comment

by:enigmasolutions
ID: 34977192
JimmyX,

Thank you.  I got opening HTML in a tWebBrowser (see also my earlier post & attached sample application).  

I still have no better solution for opening it in a tOLEContainer (apart from my hack solution - which isn't too bad).

0
 
LVL 1

Author Comment

by:enigmasolutions
ID: 34978527
How do I award points to contributors - yet record my answer as the correct one?
0
 
LVL 1

Author Closing Comment

by:enigmasolutions
ID: 35005385
This is the best solution.  I will try to award points to the other experts fro their iinput.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Delphi XE10, DigitalPersona Fingerprint reader and MySQL 6 214
How to convert wav to mp3 in delphi 9 169
Internet Explorer View Settings Question 15 105
Dev Express grid collapse 2 39
In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
This tutorial demonstrates a quick way of adding group price to multiple Magento products.
A short film showing how OnPage and Connectwise integration works.

930 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

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now