Текущий архив: 2007.04.22;
Скачать: CL | DM;
Вниз
TWebBrowser Найти похожие ветки
← →
Кабан © (2007-02-22 11:04) [0]Пытаюсь загрузить страницу в WebBrowser следующим образом:
procedure TForm1.LoadData(FileName : String);
var
MS : TStringStream;
HTML : String;
begin
... // Загружаю файл в строку HTML
MS := TStringStream.Create(HTML);
try
(Webbrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(MS));
finally
MS.Free;
end
end;
В большинстве случаев файл загружается нормально, но иногда при внесении незначительных изменений в
браузере отображается исходный код страницы. Изменения могут быть совершенно незначительными, например,
иногда достаточно добавить, допустим, в тэг "td" строку align="center".
При этом, при попытке загрузить страницу следующим образом:
WebBrowser.Navigate(Path+"Index.html");
Все отображается нормально.
← →
Johnmen © (2007-02-22 23:03) [1]Боже, кругом одни извращенцы...:)
HTMLFileName : OleVariant;
HTMLFileName:="бла-бла-бла.html";
WebBrowser.Navigate2(HTMLFileName);
← →
VeLeS © (2007-02-23 01:20) [2]Можно и по другому
HTMLFileName : String;
HTMLFileName:="бла-бла-бла.html";
WebBrowser.Navigate(WideString(HTMLFileName));
← →
Кабан © (2007-02-26 10:35) [3]Вы вопрос читали?
>>При этом, при попытке загрузить страницу следующим образом:
>>WebBrowser.Navigate(Path+"Index.html");
>>Все отображается нормально.
Очевидно, что все эти извращения при загрузке требуются для того, чтобы изменять некоторые данные, т.е. загружается шаблон, затем в разные места вставляется данные из БД.
Вопрос был не в том, КАК загружать файл, а ПОЧЕМУ при данном способе загрузки возникают проблемы.
← →
palva © (2007-02-26 13:16) [4]> ПОЧЕМУ при данном способе загрузки возникают проблемы.
Такая гипотеза:
Потому что работает движок браузера. А он понимает так: раз URL тот же самый, то перезагружать не нужно. Может быть попытаться не Navigate а инициировать Reload?
← →
Кабан © (2007-02-26 13:40) [5]Не пойдет, любое изменение шаблона браузер отражает корректно, но при НЕКОТОРЫХ, падает.
← →
Ш-К (2007-02-26 23:39) [6]Возможно, надо очищать предыдущий документ.
function TEmbeddedWB.InternalLoadDocumentFromStream(const Stream: TStream):
HRESULT;
var
PersistStreamInit: IPersistStreamInit;
StreamAdapter: IStream;
begin
Result := S_False;
Assert(Assigned(Document));
// Get IPersistStreamInit interface on document object
if Document.QueryInterface(
IPersistStreamInit, PersistStreamInit
) = S_OK then
begin
// Clear document
if PersistStreamInit.InitNew = S_OK then
begin
// Get IStream interface on stream
StreamAdapter:= TStreamAdapter.Create(Stream);
// Load data from Stream into WebBrowser
Result := PersistStreamInit.Load(StreamAdapter);
end;
end;
end;
← →
Кабан © (2007-02-27 10:06) [7]Падает при старте программы, загружается в первые
← →
Ш-К (2007-02-27 17:56) [8]Ну так проблема совсем в другом была. Изначально Webbrowser.Document не был инициализирован.
Webbrowser.Go("about:blank");
Webbrowser.Wait;
procedure TEmbeddedWB.Go(Url: string);
var
_URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
begin
_URL := Url;
Flags := 0;
TargetFrameName := 0;
Postdata := 0;
Headers := 0;
if (Trim(_URL) <> "") then
Navigate2(_URL, Flags, TargetFrameName, PostData, Headers);
end;
procedure TEmbeddedWB.Wait;
begin
while ReadyState <> READYSTATE_COMPLETE do
Forms.Application.ProcessMessages;
end;
Если создается в памяти и всегда невидимый, проверяется на READYSTATE_INTERACTIVE
← →
Кабан © (2007-02-28 09:50) [9]перед LoadData(FileName : String);
вызываю WebBrowser.Navigate("about:blank");
Видимо и это мимо...
← →
Arm79 © (2007-02-28 12:31) [10]Использую эту процедуру для получения текста из HTML
Но в ней процедура загрузки документа в WebBrowser.
Использую около полугода, проблем не наблюдал.function TfrmMain.GetPlainText(const HTMLStr: string): string;
var
sTemp : string;
Doc : IHTMLDocument2;
V : Variant;
begin
sTemp := HTMLStr;
if wbTransformer.Document = nil
then begin
wbTransformer.Navigate("about:blank");
repeat
Application.ProcessMessages;
until wbTransformer.Document <> nil;
end;
Doc := IHTMLDocument2(wbTransformer.Document);
v := VarArrayCreate([0, 0], varVariant);
v[0] := sTemp;
Doc.write(PSafeArray(TVarData(v).VArray));
Doc.close;
Result := Doc.body.outerText;
end;
← →
DiamondShark © (2007-02-28 12:57) [11]
> Кабан © (28.02.07 09:50) [9]
> перед LoadData(FileName : String);
> вызываю WebBrowser.Navigate("about:blank");
>
> Видимо и это мимо...
Navigate -- процедура асинхронная и немгновенная.
Надо дожидаться пока документ действительно загрузится.
← →
Кабан © (2007-02-28 13:18) [12]Вставил задержку, не помогает.
2 Arm79 © (28.02.07 12:31) [10]
Спасибо, попробовал этот код, работает.
Страницы: 1 вся ветка
Текущий архив: 2007.04.22;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.032 c