enigmasolutions
asked on
Delphi tOLEContainer CreateOLEObject LoadFromFile - gives Invalid Stream Format with HTML file
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.Doc ument',fal se);
OleContainer1.LoadFromFile ('C:\Hello World.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...
https://www.experts-exchange.com/questions/26808908/tOLEContainer-CreateOleObject-tIDHTMLMessageBuilder-and-MS-WORD-as-HTML-Email-Editor-with-email-stored-retrieved-from-dataset.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.
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
OleContainer1.LoadFromFile
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...
https://www.experts-exchange.com/questions/26808908/tOLEContainer-CreateOleObject-tIDHTMLMessageBuilder-and-MS-WORD-as-HTML-Email-Editor-with-email-stored-retrieved-from-dataset.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.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I have attached a sample application that does HTML emailing using MS Word as the editor within a Delphi form.
EmailerWordApp.zip
EmailerWordApp.zip
ASKER
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.
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.
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.
"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;
DelphiHTML.zip
ASKER
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).
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).
ASKER
How do I award points to contributors - yet record my answer as the correct one?
ASKER
This is the best solution. I will try to award points to the other experts fro their iinput.
Dont use lodafromfile unless it was saved from the OleContainer
use
OleContainer1.CreateObject