Hallo,
ich versuche gerade eine
HTML-Seite, bestehend aus FrameSet und 7 Frames,
aus einem RichEdit1 heraus in ein TWebBrowser-control hineinzubuxieren. Das Ganze funktioniert ja eigentlich auch, allerdings darf die
HTML-Seite dann nur aus einem einzigen
HTML-Document besteht. Bei einer Aufteilung in einen FrameSet und mehrer Frames klappt es dann jedoch leider nicht mehr. Eventuell gibt es ja irgendwo doch noch jemand (auf dieser ganzen großen weiten Welt *g*)
, der da etwas Erfahrung hat oder sonst vielleicht eine gute Idee
.
Zum Vorgehen, bzw. den jeweiligen Sequenzen:
'sendToWBrowserClick' startet die Aktion, bei der ich die jeweilige Seite dann schließlich mit der Proc 'LadeQuelltext' einlese, dh. in meinem Falle wird damit jetzt also zuerst mal das FrameSet-Document geladen. Das klappt auch so weit -- bleibt also nur die Frage offen 'wie jetzt noch die eigentlichen Frames nachschieben' (welches ich dann unten im OnBeforeNavigate2-event zu lösen versuche). Bis dahin aber zuerst nochmal kurz der übrige Code zum Überblick:
Code:
procedure TForm4.sendToWBrowserClick(Sender: TObject);
begin
Form2.WebBrowser1.Navigate('about:blank');
while Form2.WebBrowser1.ReadyState < readystate_interactive do Application.ProcessMessages;
fRichEditLinePtr := -1; // Hilfsvariable zum Auslesen der richtigen Codetexte aus RichEdit1
fCancel_Flag := true; // Flag für's OnBeforeNavigate2-event
LadeQuelltext(Form2.WebBrowser1.Document);
end;
Diese eigentliche Lade-Routine ('LadeQuelltext') ist eine kleine Abart einer Procedure, die zum gleichen Zwecke auch aus dem SwissDelphiCenter kopiert werden kann (aber eben auch nur für Pages ohne Aufteilung in FrameSet u. Frames funktioniert)
Code:
procedure TForm4.LadeQuelltext(DocuToLoad: IDispatch);
var
ms: TMemoryStream;
begin
if Assigned(DocuToLoad) then
begin
ms := TMemoryStream.Create;
try
if Load_fStringList1 then
begin
fStringList1.SaveToStream(ms);
ms.Seek(0, 0);
(DocuToLoad as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
end;
finally
ms.Free;
end;
end;
end;
'And last but not least' der OnBeforeNavigate2-eventhandler des TWebBrowser-controls, der sofort nach Beendigung der obersten Routine anfängt pro im FrameSet angegebenen Frame einmal zu feuern:
Code:
procedure TForm2.WebBrowser1BeforeNavigate2(ASender: TObject;
const pDisp: IDispatch; var
URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
var URLStr : string;
docu : IDispatch;
begin
if form4.fCancel_Flag then
begin
Cancel := true;
docu := (PDisp as IWebBrowser).document;
form4.ladeQuelltext(docu);
end;
end;
In diesem Eventhandler wird also pro Versuch des WebBrowsers, sich einen Frame über seinen original
URL zu besorgen, zuerst mal dieses gecancled und dann versuche ich selbst diesen Frame über dessen IDispatch auf die gleiche Art zu laden wie der Frameset selbst geladen wurde. Leider kommen die Frames dort dann aber irgendwie nicht so richtig an. Anstelle des eigentlichen Codetextes der Frames taucht dort dann nämlich jeweils immer nur diese folgende Zeile auf (die sonst nicht Bestandteil der jeweiligen Frame-Codes ist):
<!DOCTYPE
HTML PUBLIC "-//
W3C//DTD
HTML 4.0 Transitional//EN">
(Das diese Zeile dort auftaucht weiß ich daher, weil ich in diesem Programm auch gleichzeitig noch eine Routine habe, mit der ich den Quellcode von angezeigten
HTML-Pages auch auslesen kann – und zwar auch von solchen Pages die auf FrameSets basieren). Nehme nun an, dieses hat der WebBrowser einfach als quasi Leerframe dort installiert, als ihm meine Zusendungen warum auch immer nicht gefiel o.ä..
Also, vielleicht hat ja jemand eine Idee, wo der (womöglich nur kleine) Fehler in diesem Vorgehen liegen könnte oder aber gibt es speziell dafür sogar wieder eine gänzlichst andere Technik?
Thx schonmal fürs Durchlesen
(Edit:
in this Color)