Конференция "Сети" » InternetExplorer, COM, readyState фрейма
 
  • hattak © (31.10.10 23:36) [0]
    Добрый день, уважаемые мастера!
    Возникла проблема, пишу плагин IE для работы с конкретным сайта. Сайт имеет фреймовую структуру. Задача - точно отслеживать загрузку каждого фрейма и потом делать бработку его содержимого. Что делаю ... подцепляю на IE обработчик собитий DWebBrowserEvents в итоге, могу отслеживать: FrameBeforeNavigate, FrameNavigateComplete ... вроде бы всё и хорошо, но FrameNavigateComplete срабатывает как только фрейм получает первую порцию данных, а не как хотелось бы, всю сраницу)) Решил после наступления FrameNavigateComplete отслеживать свойство readyState фрейма. Как бы оно есть у каждого фрейма и по идее срабатывает именно тогда, когда окумент полностью загружен - принимает значение "complete", пока грузится - "loading" или "interactive".
    Не нашёл ничего лучше, как в обработчике FrameNavigateComplete написать while IDoc.readyState <> 'complete' do Application.ProcessMessages; (где IDoc - документ фрейма типа IHTMLDocument2) Обычно это помогает дождаться какого-то события, а тут возникает проблема - после запуска этого цикла IE виснет, т.е. Application.ProcessMessages хоть в цикле и вызывается, но ничего не даёт, всё равно на этом цикле IE перестаёт выполнять все действия и IDoc.readyState  так и остаётся равным "interactive" ... висим в итоге ...
    Помогите пожалуйста, в чём тут проблема и как её можно решить?
    Спасибо!
  • hattak © (01.11.10 01:24) [1]
    проблемы я в принципе уже понял ...
    цикл while IDoc.readyState <> 'complete' do Application.ProcessMessages;
    вызывается внутри function TEventSink.Invoke, т.е. внутри функции, вызываемой IE, для оповещения моего приложения о том, что произошло какое-то событие и этот цикл "заклинивает" TEventSink.Invoke, а IE не продолжает ничего делать пока TEventSink.Invoke не выполнится полностью, другого объяснения найти не могу ... вопрос, есть ли какая-то возможность обойти это подвисание? пока тупо приходится обработать событие и передавать его в таймер))) там while IDoc.readyState <> 'complete' do Application.ProcessMessages; выполняется без проблем и ничего не вешает)
    а подругому никак, без таймера?))
 
Конференция "Сети" » InternetExplorer, COM, readyState фрейма
Есть новые Нет новых   [134436   +25][b:0][p:0]