powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / WebView2
11 сообщений из 11, страница 1 из 1
WebView2
    #40134512
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь использовать WebView2 вместо IE. Доступа к DOM в нем нет, т.е. написать как раньше:

Код: pascal
1.
S = MyBrowser.OleObject.document.body.outerHTML


- Нельзя. Можно попробовать доступиться через JS, типа:

Код: pascal
1.
MyBrowser.GetEdgeInterface.DefaultInterface.ExecuteScript('document.body.outerHTML', ...)


Но он, с**а, асинхронный и ничего не возвращает. Ломать всю логику для для перехода на асинхронные события - без шансов.

В интернете - постоянно дается пример на C#

Код: c#
1.
html = Await WebView2.ExecuteScriptAsync("document.body.outerHTML")


Как это можно реализовать на Delphi?
...
Рейтинг: 0 / 0
WebView2
    #40134540
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там же в параметрах каллбэк процедура передается.
...
Рейтинг: 0 / 0
WebView2
    #40134548
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так она вызывается асинхронно. Как нибудь потом. А мне нужен результат сразу.
...
Рейтинг: 0 / 0
WebView2
    #40134549
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
Так она вызывается асинхронно. А мне нужен результат сразу.



System.Threading.TTask.Future ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
FutureObject := TTask.Future<Integer>(function: Integer
    begin
        Sleep(3000);
        Result := 16;
    end);
// …
MyValue := FutureObject.Value;



Ну или WaitForSigleObject прикрути.
...
Рейтинг: 0 / 0
WebView2
    #40134552
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай скидку на интеллектуальный уровень собеседника :). Куда тут вставить ExecuteScript?
...
Рейтинг: 0 / 0
WebView2
    #40134575
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, я, конечно, сделал через ProcessMessages. Но гложут меня сомнения, что "Await" реализована иначе...
...
Рейтинг: 0 / 0
WebView2
    #40134594
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:
Код: 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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
unit Unit23;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, WebView2, Winapi.ActiveX, Vcl.Edge;

type
  TForm23 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TExecuteScriptCallBack = procedure(Value: string) of object;

  TExecuteScript = class
    Result: string;
    procedure OnExecuteScript(Value: string);
    procedure ExecuteScript(Script: string; CallBack: TExecuteScriptCallBack);
  end;

var
  Form23: TForm23;

implementation

uses
  System.Threading;

{$R *.dfm}

procedure TExecuteScript.ExecuteScript(Script: string; CallBack: TExecuteScriptCallBack);
begin
  Sleep(1000);
  CallBack('Ok');
end;

procedure TExecuteScript.OnExecuteScript(Value: string);
begin
  Result:=Value;
end;

{ TForm23 }

procedure TForm23.Button1Click(Sender: TObject);
begin
  var ExecuteScript:=TTask.Future<string>(function: string begin
                       var ES:=TExecuteScript.Create;
                       try
                         ES.ExecuteScript('test',Es.OnExecuteScript);
                         repeat
                           Sleep(1);
                         until ES.Result<>'';
                         Result:=ES.Result;
                       finally
                         ES.Free;
                       end;
                     end);


  ShowMessage(ExecuteScript.Value);
end;

end.


Привет синтаксическому сахару.
...
Рейтинг: 0 / 0
WebView2
    #40134613
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня гложут смутные сомнения, что с Edge это работать не будет. ExecuteScript - это метод WebView, а не какая-то процедура, которую я сам написал. И callback он вызывает в главном потоке через посылку Windows Message...
...
Рейтинг: 0 / 0
WebView2
    #40134617
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
callback он вызывает в главном потоке через посылку Windows Message...
Че, правда?

Меня терзают смутные сомнения.
Но если это так - тогда страдай и пиши полноценные каллбэки или разбор сообщений главного потока руками.

Ну или переноси свой синхронный код из главного потока, дабы он не блокировался.
...
Рейтинг: 0 / 0
WebView2
    #40135148
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Ого, а можешь выложить тестовый проект, как ты WebView2 прикрутил?
...
Рейтинг: 0 / 0
WebView2
    #40135156
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, лень.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / WebView2
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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