powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CEF4Delphi в потоке с внешней формой
25 сообщений из 139, страница 5 из 6
CEF4Delphi в потоке с внешней формой
    #39887473
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, не так всё просто. Там куча событий используется и обрабатывается, в том числе и движение курсора мышки внутри фрейма.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887759
alfangur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11, посмотрите в сторону nwjs или electron либо другую реализацию в виде headless
так вы избавитесь от кучи костылей и получите актуальную версию браузера со всеми новыми фишками V8\JS и т.д.

как вариант:
- запускаете nwjs\eletron\headless приложение
-- окно скрыто по умолчанию, его всегда можно показать при необходимости либо показать нужную часть
- передаете адрес который необходимо посетить
-- получаете уведомление о полной загрузке страницы
- получаете код всей страницы
- выполняете необходимые действия на сайте

P.S. если задач не много могу оказать помощь
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887789
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я только-только более менее начал понимать, как работает Chromium api.
Плюс Chromium - это полноценный браузер с консолью и со встроенными средствами отладки полноценного браузера.
А ты предлагаешь изучать что-то новое. Мало того, ничего полезного я не нагуглил на тему: nwjs + delphi, а на тему Chromium + Delphi информация есть, пусть не так и много, но всё же есть.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887954
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Я только-только более менее начал понимать, как работает Chromium api.
Плюс Chromium - это полноценный браузер с консолью и со встроенными средствами отладки полноценного браузера.
А ты предлагаешь изучать что-то новое. Мало того, ничего полезного я не нагуглил на тему: nwjs + delphi, а на тему Chromium + Delphi информация есть, пусть не так и много, но всё же есть.

Электрон это тот же хромиум. Но Дельфи там, разумеется, никаким боком не применяется. Разве что FPC-шный pas2js присобачить

X11
В общем, не так всё просто. Там куча событий используется и обрабатывается, в том числе и движение курсора мышки внутри фрейма.

Еше бы ))) вопрос был из серии "банкомат требует пин-кода карточки, на что нажать, чтобы его не вводить?"
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887958
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2, не понял, и что?

Ещё раз. Я ничего не нашёл в сети по nwjs + delphi.

Мне что, самому нужно писать обёртку вокруг nwjs?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887968
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сколько я понял, то Electron и nwjs - это для создания приложений, чтобы отображать веб-контент.
У меня задача немножко другая. Мну нужно парсить сайты.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39888081
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Electron это движок браузера без обвязки, соответственно он позволяет писать приложения на html+js. Ну и отображать сайты, разумеется.
Но в общем случае CEF не имеет особых недостатков по сравнению с предложенным вариантом. Разве что вот каптчу обмануть... можно попробовать мышью над страницей "пошевелить". Но это опять же, с наскоку обмануть кодеров Гугла разве что гений сможет
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915349
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы "выловить" ответ (содержимое) response, приходится использовать монстро-код, но беда не в этом, а в том, что этот код работает на базе виндовых оконных сообщений (Winapi.Messages).
Это я изучаю пример ResponseFilterBrowser.

А у меня браузер работает в потоке, без окон. При чем класс, в котором создаётся и работает парсер и сам браузер не имеет доступа к модулю потока.
Я читал и смотрел примеры по Winapi.Messages в потоках, но там всё основано на том, что код обмена сообщениями находится непосредственно в модуле (в pas-файле) самого потока, в Thread.Execute.

Нет ли более менее простого способа, чтобы заменить Winapi.Messages на что-то другое?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915447
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В потоке вполне себе может быть окно, в чем проблема-то?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915465
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот в чем

X11
Я читал и смотрел примеры по Winapi.Messages в потоках, но там всё основано на том, что код обмена сообщениями находится непосредственно в модуле (в pas-файле) самого потока, в Thread.Execute.


вот пример
https://rsdn.org/forum/delphi/3112311.hot

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TMsgThread.Execute;
var
  msg: TMsg;

begin
  while not Terminated do begin
    if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then begin
      case msg.message of
         WM_USER: Synchronize(Answer);
      end;
    end;
  end;
end;



а мой код работает далеко не в TMsgThread.Execute.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915525
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и не нужно. Создай в начале Thread.Execute окно через AllocateHWnd и твори в обработчике что надо из другого модуля. Или вообще создаешь окно, в конструкторе либо до запуска задавай объект-заглушку, а при получении сообщения вызывай TObject.Dispatch. Преимущество тут в том, что не надо писать WndProc метод, можно задать обработчики как TMsgHandler.Msg_That(var Message); message MSG_THAT
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915551
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,
Что за код? Выложи?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915557
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014, код именно чего?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915560
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, я посмотрел пример использования компоненты TCEFUrlRequestClientComponent.
Добавил модуль TCEFUrlRequestClientComponent и в событии Chromium1.OnResourceResponse запускаю процедуру скачивания, типа:

Код: pascal
1.
2.
3.
4.
5.
  s := UTF8ToString(request.Url);

// вылавливаем нужный URL
  if s.ToLowerInvariant.Contains(fResponsePath.ToLowerInvariant) then
    DownloadRequestDataStart(s);
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915561
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
ziv-2014, код именно чего?

Чтобы "выловить" ответ (содержимое) response, приходится использовать монстро-код, но беда не в этом, а в том, что этот код работает на базе виндовых оконных сообщений (Winapi.Messages).
Это я изучаю пример ResponseFilterBrowser.

Получения ответа response
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915570
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё один вариант мне предложили.
Где-то, в какой-то момент с пом. JS скачивать ещё раз тело ответа и внедрять его прямо в HTML, чтобы парсер видел прямо в теле страницы нужные данные.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915571
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014
X11
ziv-2014, код именно чего?

Чтобы "выловить" ответ (содержимое) response, приходится использовать монстро-код, но беда не в этом, а в том, что этот код работает на базе виндовых оконных сообщений (Winapi.Messages).
Это я изучаю пример ResponseFilterBrowser.

Получения ответа response

так это стандартный пример, см в папке
CEF4Delphi\demos\Delphi_VCL\ResponseFilterBrowser
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917267
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Ну и не нужно. Создай в начале Thread.Execute окно через AllocateHWnd и твори в обработчике что надо из другого модуля.


Дело в том, что у меня как раз всё в другом модуле и работает.
В модуле создания и запуска потока только одно действие в Execute - создание объекта (класса) парсера и старт этого парсера.

В методе Execute нет никаких while ... repeate ... terminate.
Просто выполнить один проход и завершить поток.

вот пример старта парсинга:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
type
  TDlThreadXXXXX = class(TDlThread)
  private
    Parser: TParseXXXXX;

  public
    procedure Execute; override;
  end;
  
...
...
...

procedure TDlThreadXXXXX.Execute;
begin

//создать объект класса парсера  
  Parser := TParseXXXXX.Create(proxy, ProfId);

  try
    self.ParserAd           := Parser;
    Parser.OnProgress       := OnSiteParseProgress;

    Parser.ProfileID        := ProfId;
    Parser.StartURL         := StartUrl;

    synchronize(GetfmMainCaption);

    try
        Synchronize(ShowBaloonStartProcess);// уведомление
		
// старт парсинга
        if not Parser.DownloadInProcess then
          Parser.DoParse;

        Synchronize(ShowBaloonEndProcess);// уведомление

    except
      on e:exception do
        raise;

    end;// try except

  finally

    if assigned(Parser) then
    begin
      Parser.Free;
      Parser := nil;
    end;

    if Assigned(dltXXXXX) then
    dltXXXXX := nil;
  end;//try finally
end;



вот там, внутри, под капотом у Parser.DoParse и работает Хромиум.

Т.е. не в этом модуле нужно создавать окно AllocateHWnd и обработку сообщения (PeekMessage), а именно в модуле Parser: TParseXXXXX??? Я правильно понимаю?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917285
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или где-то внутри Parser: TParseXXXXX нужно создавать ещё один "внутренний" поток и в нем запускать цикл ожидания, получения и обработки сообщений?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917494
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну стало быть надо залезать внутрь DoParse. Я не очень понял, как у тебя хромиум может "работать через сообщения", если ты его засовываешь в цикл.
Обычная схема работы с выборкой сообщений в потоке - в Execute:

Код: pascal
1.
2.
3.
4.
5.
while not Terminated and GetMessage(Msg, 0, 0) do
case Msg.message of
  MSG_1: ...
  MSG_2: ...
end;



Как там устроен парсер - по названию функции сложно сказать, нужно больше деталей
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917938
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В DoParse организован тупо цикл whilte true по страницам сайта.


Василий 2
. Я не очень понял, как у тебя хромиум может "работать через сообщения",


А он у меня и не работает через сообщения. Я ж написал вроде, что это в официальном примере получение response-содержимого через сообщения реализовано.
Если у вас установлен Хромиум в Дельфи, откройте и посмотрите (CEF4Delphi\demos\Delphi_VCL\ ResponseFilterBrowser ).

А у меня Хромиум скачивает странички примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function TChrom.GetInnerHTMLPage(const url: string): string;
begin
  if fParseAD.MyProgressMsg.Stop then exit;

// обнуляем переменные
  bIsLoadingPage := True;// указываем, что страница грузится, см. ChromiumProcessMessageReceived()
  sInnerHTMLPage := '';
  iFinishedHTMLCount := 0;

// старт процесса загрузки и рендеринга, ответ ждать в ChromiumProcessMessageReceived()
  CefGetUrl(Chromium, url, fParseAD.ProfileName);

// ждём, пока грузится страница в процессе рендеринга
  while bIsLoadingPage do
  begin
    Sleep(3000);

    if fParseAD.MyProgressMsg.Stop then
      break;//выходим из цикла

  end;

  result := sInnerHTMLPage;
end;


Ну там ещё около 10+ разных событий и вспомогательных методов.


Вот я и хочу пример из ResponseFilterBrowser применить для себя.
Может быть есть возможность заменить сообщения на другой вид обмена, т.к. фактически скачивание и получение response-содержимого живет в одном классе, в одном модуле.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917950
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, что отправку сообщения самому себе можно заменить процедурой ожидания, где будет цикл while true, как в вышеописанном методе GetInnerHTMLPage
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917977
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, в примере PostMessage просто чтобы не блокировать форму, в случае потока можно заменить на вызовы соответствующих функций
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39920106
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так и не разобрался, что это за WasHidden
Код: pascal
1.
Chromium.WasHidden(True);


но если вызывать этот метод, то не все ссылки и не вся страничка грузится
просто имейте ввиду


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  if Chromium.Initialized then
  begin
    Chromium.WasHidden(True);
    Chromium.LoadURL(url);
  end
  else
  begin
    Chromium.CreateBrowser(nil);
    Chromium.WasHidden(True);
    Chromium.LoadURL(url);
  end;
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39920131
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

так красивше
Код: pascal
1.
2.
3.
if not Chromium.Initialized then Chromium.CreateBrowser(nil);
Chromium.WasHidden(True);
Chromium.LoadURL(url);
...
Рейтинг: 0 / 0
25 сообщений из 139, страница 5 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CEF4Delphi в потоке с внешней формой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]