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

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

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

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

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

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

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

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

Добавлено через 4 минуты
Да, ещё забыл интересный момент.
После загрузки второй страницы, если добавить код
C++
1
ShowMessage("Любой текст");
перед обработкой страницы браузера, то всё великолепно.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 417
26.11.2025, 09:42  [ТС]
Цитата Сообщение от sqltd1 Посмотреть сообщение
Используют эвристики.
Возможно, я использовал эвристику, хотя многие асы программирования назовут это "быдло кодом" или "костылём".
А всё просто, как я и писал выше:
C++
1
2
3
4
5
6
//...
if(Application->MessageBox("Будете использовать данную страницу?", "Запрос", MB_YESNO) == 6)
{ //Обработка "данной страницы"
  //...
}
else return;
и идёт обработка не старой страницы, загруженной в CppWebBrowser1, а новой - выбранной.
0
352 / 315 / 83
Регистрация: 17.04.2022
Сообщений: 1,036
Записей в блоге: 8
26.11.2025, 14:31
Цитата Сообщение от Инженер_3 Посмотреть сообщение
многие асы программирования назовут это "быдло кодом" или "костылём".
Меньше обращайте внимание на "асов".
Есть один критерий - хорошая программа - это та программа, которая работает (выполняет то, что от нее требуется)
1
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 417
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
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
27.11.2025, 05:56
Цитата Сообщение от Инженер_3 Посмотреть сообщение
TStreamAdapter *sa = new TStreamAdapter(stm, soReference);
Не увидел, где удаляется этот объект sa...
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 417
27.11.2025, 14:16  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Не увидел, где удаляется этот объект sa...
Надо в 14-ю строку добавить:
C++
1
delete sa;
Вообще, второй код, с которым я толком не разобрался, довольно сложный по сравнению с первым кодом.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 417
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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru