powered by simpleCommunicator - 2.0.27     © 2024 Programmizd 02
Map
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как заставить работать Microsoft WebBrowser синхронно?
21 сообщений из 21, страница 1 из 1
Как заставить работать Microsoft WebBrowser синхронно?
    #39940239
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеем скрипт:
Код: sql
1.
ole_1.Object.Navigate2(ls_path)



В объекте ole_1 делаются какие-то телодвижения и на выходе создается файл PDF (ls_outputPDF)
Это занимает пару секунд.
Дальше нам нужно с этим файлом что-то делать.
Вопрос: как узнать, что файл готов?
ole_1.Object.Navigate2 работает асинхронно. Если добавить такое:

Код: sql
1.
2.
3.
4.
5.
6.
DO WHILE NOT FileExists(ls_outputPDF)
	//Yield()
	Sleep(1)
	IF li_counter > 15 THEN EXIT
	li_counter++
LOOP



то ole_1.Object.Navigate2 закончится только после завершения цикла.
Yield() решает эту проблему, но использовать его нельзя по другим причинам.

Короче, как запустить ole_1.Object.Navigate2 синхронно?
Или как асинхронно, но дождаться завершения БЕЗ использования Yield()?
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39940397
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska,
не совсем понятно: файл готов на сервере и ждет команды к отправке, или файл уже получен на клиенте и может быть уже использоваться?
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39940398
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может просто вывести этот файл в отдельное окно и пусть пользователь далее делает с ним что ему угодно?
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39940411
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про PowerBuilder не знаю, в нем с OLE не работал.

Но в IE 100% есть дофига колбеков на все случае жизни
Даже лезть в документацию и искать за автора - влом. Т.к. все описано и все на виду

Сложнее в том случае, если среда не позволяет отлавливать OLE Event'ы (Power Builder скорее всего умеет). Но тогда явно можно написать ф-цию на Java Script, которая будет выполняться синхронно.

IMHO RTFM

https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.forms.webbrowser?view=netframework-4.8

https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.forms.webbrowser.documentcompleted?view=netframework-4.8
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39940479
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Microsoft WebBrowser по возможностям не имеет того что имеет IE, это так к слову...
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39940528
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS
Leonid Kudryavtsev,
Microsoft WebBrowser по возможностям не имеет того что имеет IE, это так к слову...


Что он там не имеет - мне не ведомо (и в каких версиях, в каких Windows). Ссылку на доку я написал.
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39940815
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
AIS
Leonid Kudryavtsev,
Microsoft WebBrowser по возможностям не имеет того что имеет IE, это так к слову...


Что он там не имеет - мне не ведомо (и в каких версиях, в каких Windows). Ссылку на доку я написал.

И что это было - ссылка на доки где нет ответа? а конкретнее по PDF файлу и собственно по проблеме топика что посоветуете?
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39940914
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясняю подробно.
Отправляем ссылку в ОЛЕ. Там в событии documentcomplete создается файл PDF.

Т.е. как только в каком-то месте скрипта (на кнопке) запускается
Код: sql
1.
ole_1.Object.Navigate2(ls_path)


ОЛЕ начинает работать, а скрипт (на кнопке) продолжает работать асинхронно.
Перенести оставшийся скрипт с кнопки в ОЛЕ нельзя.
Если Javoj что-то сделать в ОЛЕ, то проблема останется. Нужно именно на кнопке выяснить, когда ОЛЕ завершил работу.
Код: sql
1.
2.
ole_1.Object.Navigate2(ls_path) // 
IF FileExists(ls_outputPDF) ...


Именно между этими двумя строчками проблема.
Есть ли возможность запустить ole_1.Object.Navigate2(ls_path) синхронно?
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941059
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska
Есть ли возможность запустить ole_1.Object.Navigate2(ls_path) синхронно?

Сомневаюсь

1) никто не мешает запустить ДРУГОЙ код, который будет контролировать "асинхронный" IE / WebBrowser но сам при этом, с точки зрения PB, работать синхронно.

2) код на кнопке побить на 2 (или более) части
2.1. ДО асинхронного вызова
2.2. Код после асинхронного вызова
2.3. + обработка ошибок

Первый отрабатывает по нажатию на кнопку
Второй при приходе DocumentCompleted
Т.к. подозреваю, что DocumentCompleted может и не приходить, то нужно вешаться еще на Callback'и/Event'ы которые вызываются при ошибках

Реальная задача в топике НЕ описана. Т.к., есть подозрение, что PDF банально готовится на стороне сервера и задача значительно более простая. Взять файл с URL и сохранить его на диске. Можно найти 100500 решений данной задачи без WebBrowser (например Linux'овый curl)
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941133
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
...Реальная задача в топике НЕ описана...

Тоже соглашусь. Например, где находится эта кнопка: в окне РВ или на странице в WebBrowser? Начинать "копать" надо с событий WebBrowser и его флагов состояния, как мне кажется.
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941319
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конкретная задача. Вы открываете в IE https://www.sql.ru/forum/1323683/kak-zastavit-rabotat-microsoft-webbrowser-sinhronno
То, что видите, нужно сохранить в формате ПДФ на компе.
Это задача.

Имеем решение: отправляем линк в ОЛЕ.
После загрузки страницы начинаем строить PDF.
Все делается на клиенте (кнопка в окне РВ).
documentcomplete срабатывает сразу, как только страница загружена, НО pdf еще не готов.
Поэтому решение
Первый отрабатывает по нажатию на кнопку
Второй при приходе DocumentCompleted

не подходит.
Плюс, как я уже сказал, переносить скрипт "после Navigate..." из кнопки нельзя.
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941357
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично мне, стало еще более НЕ понятно.

Riska

Имеем решение: отправляем линк в ОЛЕ.

"Сферичный" OLE никаких PDF не умеет. И вообще, это две разные вещи ничего общего между собой не имеющие.
OLE = Microsoft NASDAQ: MSFT 146,92 USD
PDF = Adobe NASDAQ: ADBE 305,91 USD
(цены на акции по гугле на 26.03.2020)

Riska

начинаем строить PDF..., НО pdf еще не готов.

И при чем тут Microsoft WebBrowser и Navigate2 ?
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941361
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в PDF сохраняете через Document.execCommand IDM_SAVEAS
то так и напишите (желательно все же с куском кода)

или как-то иначе?
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941475
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то иначе.
Код слишком большой.
Вопрос не в этом.

ole_1.Object.Navigate2( https://www.sql.ru/forum/1323683/kak-zastavit-rabotat-microsoft-webbrowser-sinhronno)
Это работает. Создается файл PDF. Скрипт по созданию PDF написан в событии documentcomplete.

Код на кнопке:

Код: sql
1.
2.
ole_1.Object.Navigate2(https://www.sql.ru/forum/1323683/kak-zastavit-rabotat-microsoft-webbrowser-sinhronno)
MessageBox('URA', 'Fail gotov!')



Нужно дать MessageBox('URA', 'Fail gotov!') ПОСЛЕ того, как файл готов.
Перенести MessageBox в documentcomplete нельза!
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941482
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska
Скрипт по созданию PDF написан в событии documentcomplete.

под скриптом Вы понимаете:
1. PowerBuilder в событие documentcomplete от WebBrowser
2. JavaScript на странице в событие onLoad или каком-то другом
?
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941568
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska,
а если вместо сообщения о готовности файла просто запустить его используя ShellExecuteEx и WaitForSingleObject, и уже в случае неудачи показать сообщение об ошибке.
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941963
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
под скриптом Вы понимаете:
1. PowerBuilder в событие documentcomplete от WebBrowser
2. JavaScript на странице в событие onLoad или каком-то другом
?

Код: sql
1.
2.
3.
Под скриптом понимается скрипт РВ (PowerBuilder 12.5), который написан в событии documentcomplete.
documentcomplete - это событие, которое находится в ОЛЕ от WebBrowser.
Начинает работать, как только загружен линк.



Отличный анекдот в тему:
Идет мужик по улице смотрит новый магазин. Дай думает зайду. Заходит его сразу же встречает улыбающийся продавец и говорит: Здравствуйте мы очень Вам рады чтобы Вы хотели приобрести? Мужик подумал и говорит:
- Ну перчатки нужны.
- Пройдите пожалуйста в тот отдел.
Мужик подходит:
- Здравствуйте мне нужны перчатки.
Ему в ответ:
- Вам какие летние или зимние?
М: Зимние
П: Тогда пройдите в вон тот отдел.
М. пошел спрашивает в очередном отделе: Здравствуйте мне нужны перчатки.
П: Вам кожаные или нет?
М: Кожаные.
П: Тогда Вам в вон тот отдел.
М: не понял но ладно пошел.
Здравствуйте мне нужны Зимние кожаные перчатки.
П: Вам с натуральным мехом или нет?
М.: С натуральным конечно.
П: Вам надо в отдел напротив.
М. напрягается но молча идет. В новом отделе с повышенным голосом говорит: Мне нужны перчатки ЗИМНИЕ КОЖАНЫЕ С НАТУРАЛЬНЫМ МЕХОМ.
П: Вам с застежкой или без?
М: С застежкой!
П: Вытяните руку растопырьте пальчики.
М: пожалуйста.
П: Вам надо в соседний отдел.
М. гневно: что это такое Вы что надо мной издеваетесь?!
Дайте мне перчатки и я уйду.
П: Не волнуйтесь мы просто хотим продать Вам именно
то что Вы хотите чтобы Вы получили максимум удовольствия от покупки. Вы перчатки подбираете под это пальто? М. в раздражении: Да! и идет дальше по отделам.
Подходит к следующему продавцу и с надрывом:
- Мне нужные зимние кожаные с натуральным мехом и застежкой на эти руки к этому пальто перчатки!!!
П: Вам застежка нужна на кнопочке или молния?
М (на грани истерики): На кнопочке!!!
П: Вам надо вон к тому продавцу.
В этот момент распахиваются входные двери в магазин заходит мужик который держит на вытянутых руках вырванный с корнем унитаз по краям которого
осталась еще плитка. Подходит к прилавку и кричит: Вот такой у меня унитаз вот такая плитка жопу я вам вчера показывал дайте мне наконец туалетную бумагу!!!!
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941964
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дайте мне наконец код, который запускает WebBrowser синхронно!!!!
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39941965
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,
а если вместо сообщения о готовности файла просто запустить его используя ShellExecuteEx
Мне не надо ничего запускать.
Нужно просто узнать, когда файл уже готов.
...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39942045
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska,
а так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
/* event documentcomplete */
lt_starttime = Now()
DO
  Yield()
  // Возвращает булево значение, сигнализирующее о том, занят ли объект операцией
  // навигации или скачивания. Только чтение. Если объект занят, можно применить
  // метод Stop для прерывания операции.
  if this.object.Busy then
     ...
  end if
LOOP Until SecondsAfter( lt_starttime, Now()) > 5


...
Рейтинг: 0 / 0
Как заставить работать Microsoft WebBrowser синхронно?
    #39942186
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы с этого начинали (см. первое сообщение):
Или как асинхронно, но дождаться завершения БЕЗ использования Yield() ?
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как заставить работать Microsoft WebBrowser синхронно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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