Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420

Как определить окончание загрузки страницы в CppWebBrowser?

25.11.2025, 17:23. Показов 780. Ответов 13

Студворк — интернет-сервис помощи студентам
Как определить окончание загрузки новой страницы в CppWebBrowser1 и начать обработку новой страницы?
CppWebBrowser1NavigateComplete2() и CppWebBrowser1DocumentComplete() не помогли.

Есть следующие компоненты:
Form1 - окно
CppWebBrowser1 - браузер
OpenDialig1 - всплывающее диалоговое окно выбора файла
ComboBox1 - список каталогов, в которые нужно загружать обработанное изображение
Button1 - кнопка запуска процесса поиска/вырезания/записи изображения

Действия:
  1. Выбираю в ComboBox1 каталог, например, "cat"
  2. Нажимаю Button1
    • В OpenDialog1 выбираю страницу соответствующего содержания (фон страницы белый, шрифт чёрный с серыми оттенками, изображение цветное), которая загружается в CppWebBrowser1
    • Копирую изображение окна в bitmap
    • Копирую изображение браузера из bitmap в bitmap2
    • Ищу в bitmap2 координаты изображения для последующего вырезания
    • В bitmap2 вырезаю изображение в bitmap3
    • bitmap3 сохраняю в файл /cat/000120.bmp

Как сделать, что бы обработка страницы начиналась после окончания загрузки новой страницы?
В данный момент идёт обработка старой загруженной страницы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.11.2025, 17:23
Ответы с готовыми решениями:

Определение завершения загрузки страницы в CppWebBrowser
Проблема в следующем: есть страница, содержащая в себе несколько фреймов и ява-скриптов. Как...

CppWebBrowser. Как открыть часть страницы.
Всем доброго времени суток. интересует как открыть часть страницы с помощью cppwebbrowser. (Есть...

Как узнать html код страницы в CppWebBrowser
Гружу страницу в CppWebBrowser. После этого надо в Memo2 передать ее код. пробовал и...

13
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
25.11.2025, 18:23
Доброго, событие OnDocumentComplete?
0
 Аватар для MallSerg
91 / 58 / 14
Регистрация: 16.11.2018
Сообщений: 274
25.11.2025, 19:05
Можно попробовать пример с аналогией.
Как определить что яма выкопана и не будет копаться дальше? нужна версия 100% работающая для всех возможных раскопанных ям на всей планете =).
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
25.11.2025, 19:14  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
Доброго, событие OnDocumentComplete?
Я же писал, что не помогло.
Обработка идёт ранее загруженной страницы в CppWebBrowser1.
Очистка CppWebBrowser1->Navigate(L"about:blank"); тоже не помогло.

Добавлено через 44 секунды
Цитата Сообщение от MallSerg Посмотреть сообщение
Можно попробовать пример с аналогией.
Как определить что яма выкопана и не будет копаться дальше? нужна версия 100% работающая для всех возможных раскопанных ям на всей планете =).
Намёка не понял.
0
367 / 332 / 83
Регистрация: 17.04.2022
Сообщений: 1,115
Записей в блоге: 8
25.11.2025, 19:23
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Как сделать, что бы обработка страницы начиналась после окончания загрузки новой страницы?
Нет точного решения. Особенно, используя те инструменты, которыми вы оперируете. Используют эвристики.

Например, сетевой трафик отсутствовал какое-то время.
Или, на странице обнаружен элемент с определенными свойствами.
Или, количество изменившихся элементов на странице за единицу времени стало меньше определенного уровня...
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
25.11.2025, 19:41  [ТС]
Цитата Сообщение от sqltd1 Посмотреть сообщение
Например, сетевой трафик отсутствовал какое-то время.
Или, на странице обнаружен элемент с определенными свойствами.
Или, количество изменившихся элементов на странице за единицу времени стало меньше определенного уровня...
Сетевого трафика нет - всё на локалке.
На странице нет элементов с определёнными свойствами
И число элементов на странице не меняется.

Тут всё дело, на мой взгляд, в самом CppWebBrowser1, он работает асинхронно и выдаёт сигнал об окончании загрузки намного позже, чем заканчивают работу все функции.
0
 Аватар для MallSerg
91 / 58 / 14
Регистрация: 16.11.2018
Сообщений: 274
25.11.2025, 19:42
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Намёка не понял.
Клиент отправляет запрос серверу.
Сервер присылает ответ на запрос.
Проблема в том что клиент не может заранее знать сколько и чего ему пришлет сервер и как следствие из этого он не может знать когда когда все это закончится это стохастический процесс.

Можно конечно отслеживать изменения на экране или отключение сетевого подключения В браузере хроме иконка крутится а в 6й версии IE в статусной строке появляется слово "Готово" (как и в CppWebBrowser1 который вроде на базе mshtml) но по факту это еще ничего не значит.

Делать скриншоты гораздо проще приложениями для хрома. нарожать ифреймов и по приблизительному факту загрузки ресайзить их под скриншот. страниц по 500 вполне себе одновременно грузит лишбы оперативки да скорости сети хватало.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
25.11.2025, 19:49  [ТС]
Добавил
C++
1
CppWebBrowser1->Refresh();
так вообще старая страница загрузилась

Добавлено через 4 минуты
Да, ещё забыл интересный момент.
После загрузки второй страницы, если добавить код
C++
1
ShowMessage("Любой текст");
перед обработкой страницы браузера, то всё великолепно.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
26.11.2025, 09:42  [ТС]
Цитата Сообщение от sqltd1 Посмотреть сообщение
Используют эвристики.
Возможно, я использовал эвристику, хотя многие асы программирования назовут это "быдло кодом" или "костылём".
А всё просто, как я и писал выше:
C++
1
2
3
4
5
6
//...
if(Application->MessageBox("Будете использовать данную страницу?", "Запрос", MB_YESNO) == 6)
{ //Обработка "данной страницы"
  //...
}
else return;
и идёт обработка не старой страницы, загруженной в CppWebBrowser1, а новой - выбранной.
0
367 / 332 / 83
Регистрация: 17.04.2022
Сообщений: 1,115
Записей в блоге: 8
26.11.2025, 14:31
Цитата Сообщение от Инженер_3 Посмотреть сообщение
многие асы программирования назовут это "быдло кодом" или "костылём".
Меньше обращайте внимание на "асов".
Есть один критерий - хорошая программа - это та программа, которая работает (выполняет то, что от нее требуется)
1
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
26.11.2025, 19:20  [ТС]
Цитата Сообщение от sqltd1 Посмотреть сообщение
Меньше обращайте внимание на "асов".
Есть один критерий - хорошая программа - это та программа, которая работает (выполняет то, что от нее требуется)
Программа то работает и выполняет, но бывают и "подводные камни". Да и вариантов решения проблемы бывает несколько.
Например, загрузка html-кода в CppWebBrowser:
Вариант_1 (к нему пришёл сам):
C++
1
2
char s[10000]={"about:<html><head><style>...</style></head><body>...</body</html>"};
CppWebBrowser1->Navigate(WideString(s).c_bstr(),0,NULL,NULL,NULL);
Вариант_2 (нашёл в интернете):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char s[10000]={"about:<html><head><style>...</style></head><body>...</body</html>"};
TMemoryStream *stm = new TMemoryStream();
TStringList *st = new TStringList();
st->Text=AnsiString(s);
st->SaveToStream(stm);
stm->Seek(0, soFromBeginning);
TStreamAdapter *sa = new TStreamAdapter(stm, soReference);
IPersistStreamInit *psi;
CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi);
if(psi)
{ psi->Load(*sa);
  psi->Release();
}
delete stm; delete st;
Второй вариант большой по объёму.
По времени работы, вроде, одинаковы.
Какие преимущества и недостатки у этих вариантов? Оба рабочие.
0
Модератор
 Аватар для D1973
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,406
Записей в блоге: 3
27.11.2025, 05:56
Цитата Сообщение от Инженер_3 Посмотреть сообщение
TStreamAdapter *sa = new TStreamAdapter(stm, soReference);
Не увидел, где удаляется этот объект sa...
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
27.11.2025, 14:16  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Не увидел, где удаляется этот объект sa...
Надо в 14-ю строку добавить:
C++
1
delete sa;
Вообще, второй код, с которым я толком не разобрался, довольно сложный по сравнению с первым кодом.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
01.12.2025, 11:08  [ТС]
Цитата Сообщение от Инженер_3 Посмотреть сообщение
delete sa;
В 14-й строке не нужно добавлять
C++
1
delete sa;
Её удаляет psi->Release() - иначе ошибка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.12.2025, 11:08
Помогаю со студенческими работами здесь

CppWebBrowser - Узнать состояние страницы после выполнения команды Navigate
Доброе время суток! Проблема: Выполняю строку...

Высота страницы в CppWebBrowser
Доброе время суток. Подскажите пожалуйста можно ли в CppWebBrowser определить высоту...

CppWebBrowser, доступ к картинкам HTML страницы
Подскажите как быть. Есть компонент CppWebBrowser, в него загружаем некоторую страницу....

CppWebBrowser открытие интернет страницы
Такой вопрос собственно: Немогу найти негде нормального описания компоненты CppWebBrowser....

Получение кода страницы в потоке используя CppWebBrowser
Проблема состоит в том, что во время выполнения кода: AnsiString url_site =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru