Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/35: Рейтинг темы: голосов - 35, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44

Получение кода страницы TChromium DCEF3

27.04.2016, 00:33. Показов 7157. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, гуру.

Необходимо получать код страницы, загруженной в хромиум, из главного потока приложения и из созданного мной. Используется версия хромиума отсюда. В этой версии у него нет свойства Browser.MainFrame.Source.

В примере guiclient из папки demos для получения кода загруженной страницы используют:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TMainForm.actGetSourceExecute(Sender: TObject);
begin
  crm.Browser.MainFrame.GetSourceProc(CallbackGetSource);
end;
 
procedure CallbackGetSource(const src: ustring);
var
  source: ustring;
begin
  source := src;
  source := StringReplace(source, '<', '&lt;', [rfReplaceAll]);
  source := StringReplace(source, '>', '&gt;', [rfReplaceAll]);
  source := '<html><body>Source:<pre>' + source + '</pre></body></html>';
  MainForm.crm.Browser.MainFrame.LoadString(source, 'source://html');
end;
Если использую этот код, то в переменной, в которой храню код страницы, верный код появляется только после нескольких получений. Гуглеж показал что этот способ получения кода требует некоторого времени для того, чтобы получился код текущей старницы (что-то связанное с асинхронностью и колбэками). Т.е. если проверять значение переменной с кодом сразу после вызова crm.Browser.MainFrame.GetSourceProc(Call backGetSource), то там будет предыдущее состояние.

Поэтому вопрос: как корректно получать код страницы, чтобы быть уверенным в его актуальности? И второй вопрос: как корректно получать код страницы из доп. потока?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.04.2016, 00:33
Ответы с готовыми решениями:

Tchromium-Получение кода с страницы
Всем доброго времени суток, есть одна проблема при получении кода с страницы выбивает ошибку, ломаю голову над этим но не как не решу, кто...

Delphi 7 + TChromium (DCEF3) = Flash Player Not Working
Установил на Delphi 7 компонент TChromium, новенький DCEF3. Помимо прочих непонятных глюков: Flash Player не работает - лишь предлагает...

TChromium (dcef3): как правильно сформировать POST запрос
Доброго здоровья! Прошу помощи в формировании правильного POST запроса. Известно все, что нужно отправить. Неизвестно как правильно это...

18
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
27.04.2016, 15:50
Версия Делфи?
Версия DCEF?
Какого ещё потока?

Ну проверяйте не сразу после вызова, не? С:
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44
27.04.2016, 18:49  [ТС]
Цитата Сообщение от BOGG ART Посмотреть сообщение
Версия Делфи?
Версия DCEF?
Какого ещё потока?

Ну проверяйте не сразу после вызова, не? С:
1. XE3.
2. Указана первом сообщении.
3. Есть доп. поток в котором проверяю код страницы и делаю что надо.

Если проверять не сразу после вызова так:
Delphi
1
2
3
4
5
6
7
PageSource = '';
crm.Browser.MainFrame.GetSourceProc(CallbackGetSource);
while PageSource = '' do
  begin
    sleep(100);
    Application.ProcessMessages;
  end;
то это не вариант.
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44
29.04.2016, 20:24  [ТС]
Погуглил. Проблема (как я и писал) в том, что колбэк ф-я выполняется асинхронно, т.е. если после строчки
Delphi
1
crm.Browser.MainFrame.GetSourceProc(CallbackGetSource)
сразу же проверить переменную в которую пишем код страницы, то в ней не будет актуальной инфы. Она там появится только после того, как отработает CallbackGetSource.

Поэтому вопрос: как узнать о том, что CallbackGetSource выполнилась?
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
29.04.2016, 21:47
Ну я именно это и подразумевал под "проверяйте не сразу".

Цитата Сообщение от FF117 Посмотреть сообщение
2. Указана первом сообщении.
эм... Нет. Это репозиторий. Грубо говоря папка на сервере. Что-то удаляют, что-то добавляют, что-то меняют. Сейчас там есть 4 разные версии.
Кажется у вас какая-то старая. Вот так сделайте:
Delphi
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
Chromium1.Load('about:version');
end;
Добавлено через 50 минут
https://groups.google.com/foru... ckdcKOCLzw
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44
30.04.2016, 17:10  [ТС]
Цитата Сообщение от BOGG ART Посмотреть сообщение
Кажется у вас какая-то старая.
CEF 3.2171.1979
Chromium 39.0.2171.95
WebKit 537.36

Цитата Сообщение от BOGG ART Посмотреть сообщение
GetSource() же тоже асинхронно вызывается, так что не подходит.

Да и во всех примерах, что есть в сети, код получают либо по событию OnLoadEnd, либо просто пишут в мемо. Мне же надо получить код и сразу же обработать результат.
0
 Аватар для madzal
54 / 54 / 40
Регистрация: 22.08.2014
Сообщений: 424
30.04.2016, 18:04
попробуй через js повесить код на событие DomContentLoad
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
30.04.2016, 18:10
CEF 3.2171.1979
Вывод, CEF3 версии 2171. Ей почти год. Сейчас на третьем месте по старости.
У меня пока как оказалось самая новая - 2454, но на Делфи 7 глючит чудовищно. А на XE+ вроде слышал что нормально.

Чем же не подходит? GetSource() > Visit > готово.
Или на самый-самый крайний случай: выключаем флаг > GetSource > Visit (включает флаг в конце) > ждём флаг > готово.
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44
30.04.2016, 20:11  [ТС]
Цитата Сообщение от BOGG ART Посмотреть сообщение
Чем же не подходит? GetSource() > Visit > готово.
Пробовал этот вариант http://stackoverflow.com/quest... and-method, суть та же, что и в том, что по твоей ссылке https://groups.google.com/foru... ckdcKOCLzw. Visit выполняется после того, как сработает моя проверка переменной с кодом.

Цитата Сообщение от BOGG ART Посмотреть сообщение
Или на самый-самый крайний случай: выключаем флаг > GetSource > Visit (включает флаг в конце) > ждём флаг > готово.
Мой вопрос как раз в том и заключается: как ждать флаг? Причем ждать его нужно как из главного потока приложения, так и из доп. потока, созданного мной.
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
30.04.2016, 23:14
А нельзя просто делать всё что нужно в Visit() ?
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44
01.05.2016, 02:38  [ТС]
Цитата Сообщение от BOGG ART Посмотреть сообщение
А нельзя просто делать всё что нужно в Visit() ?
Нельзя. После проверки куча кода идет.
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44
04.05.2016, 21:34  [ТС]
ап темы
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44
11.05.2016, 00:23  [ТС]
есть идеи?
0
17 / 17 / 4
Регистрация: 20.08.2010
Сообщений: 128
12.05.2016, 14:07
Там демки роде есть...

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure GetChromSource(const src: ustring);
var
  source: ustring;
begin
  source := src;
  Form1.Memo1.Lines.Add( source );
end;
 
procedure TForm1.Button5Click(Sender: TObject);
var HTML : ustring;
begin
 Chromium1.Browser.MainFrame.GetSourceProc(GetChromSource);
end;
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44
12.05.2016, 21:44  [ТС]
Цитата Сообщение от Fix777 Посмотреть сообщение
Там демки роде есть...

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure GetChromSource(const src: ustring);
var
  source: ustring;
begin
  source := src;
  Form1.Memo1.Lines.Add( source );
end;
 
procedure TForm1.Button5Click(Sender: TObject);
var HTML : ustring;
begin
 Chromium1.Browser.MainFrame.GetSourceProc(GetChromSource);
end;
Перечитай мое самое первое сообщение в теме...
GetChromSource вызывается асинхронно. Вопрос в том, как ждать результат ее выполнения.
0
12.05.2016, 22:05

Не по теме:

Цитата Сообщение от FF117 Посмотреть сообщение
После куча кода идет.
А я всё ещё не понимаю почему эту кучу нельзя вызвать из Visit()...

0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44
19.05.2016, 21:58  [ТС]
Цитата Сообщение от BOGG ART Посмотреть сообщение

Не по теме:


А я всё ещё не понимаю почему эту кучу нельзя вызвать из Visit()...

Потому что тогда проект с понятной структурой кода превратится непонятно во что. Однако, если не требуется большого числа проверок кода страницы, то такой метод вполне имеет право на жизнь.
0
20.05.2016, 00:46

Не по теме:

Метод вида AfterGetSource() вполне себе понятен... А что значит "проверять"? Зачем его "проверять"? Получили - обработали.

0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 44
20.05.2016, 17:36  [ТС]
Тему можно закрывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.05.2016, 17:36
Помогаю со студенческими работами здесь

Получение кода страницы HTTPS
Собственно, как я понимаю, тема избитая, но разобраться я так не смог. Имеется задача получать код страницы HTTPS в строку для...

Получение исходного кода html страницы
Здравствуйте, интересует собственно как например в Memo получить исходный код указанной страницы. Искал по форумам, но ничего чтоб работало...

Получение исходного кода страницы авторизации
Добрый день. Есть сайт http://joyreactor.cc. Хочу при помощи TIdHTTP на нём авторизироваться. Авторизация происходит через страницу...

Получение html кода страницы из TWebBrowser
Собственно вопрос, как можно получить html код с TWebBrowser, если можно с комментариями, что есть что... Добавлено через 54 минуты ...

Synapce: получение кода страницы через протокол TLS 1.2
Нужно вытащить со страницы некоторую информацию, всё бы ничего, если бы на данном сайте не было использования протокола TLS 1.2. Библиотеку...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru