Я искал разные способы проверить, когда страница полностью загружена компонентом TChromium - пока безуспешно.
Пробовал использовать отложенную загрузку страницы и отправлять информацию о завершении через дополнительную переменную, но событие OnLoadEnd срабатывает раньше JS и других подобных, поэтому не всегда получается верная информация.
procedure Chromium1.OnLoadEnd(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer);
var EndTime: TTime;
begin
EndTime := IncSecond(Now, 2);
repeat Application.ProcessMessages until (Now > EndTime);
IsChromiumBusy := False;
end;
Я читал, что могу сделать JS-инъекцию и добавить объект, который должен появиться в конце:
Chromium1.Load('https://www.wp.pl');
Form1.Chromium1.Browser.MainFrame.ExecuteJavaScript('$("body").prepend(''<input type="text" id="msoftval" value=""/>'')', '', 0);
Form1.Chromium1.Browser.MainFrame.ExecuteJavaScript('$("#msoftval").val($("body").html());', '', 0);
Form1.Chromium1.Browser.MainFrame.VisitDomProc(getResult);
while result = '' do Application.ProcessMessages;
Но я не понимаю использование VisitDomProc(getResult) с процедурой внутри него (почему процедура является аргументом для VisitDomProc?):
procedure getResult(const doc: ICefDomDocument);
var
q: ICefDomNode;
begin
q := doc.GetElementById('msoftval');
if Assigned(q) then
result := q.GetValue
else
result := '';
end;
Что я должен объявить в качестве результата и когда его получить? Может ли кто-нибудь объяснить это мне?
Спасибо за советы.