| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > как связать EmbeddedWB1NewWindow2 с Paramstr(2) |
| Автор: s2004 2.10.2012, 19:58 | ||||
| в embeddedwb имеется событие EmbeddedWB1NewWindow2 необходимое для открытия нового окна при кликание сылки при этом подставляется урл открывается новое окно, но при закрытие родительской формы всё тоже закрывается решил о необходимости запускать копию программы с подстановкой урла тут в некоторых форумах были советы с испрользованием Paramstrp и shellexecute. перепрообвал многие, но только получилось так, что запускается копия и плюс ещё iexplorer ... Код вначале который был
коды некоторые которые перепробовал меня смущает, что получается в них я не задействовал парметр заданый в событие это var ppDisp: IDispatch;
одним словом запутался |
| Автор: s2004 5.10.2012, 22:40 | ||
запускается копия программы, но урл неподстовляется |
| Автор: s2004 6.10.2012, 18:32 | ||||||
| по порядку в DRKB идёт такой пример OnNewWindow2 Возникает при попытке открыть документ в новом окне. Если Вы хотите, чтобы документ был открыт в Вашем экземпляре броузера, то Вам нужно создать свой экземпляр броузера и параметру ppDisp присвоить интерфейсную ссылку на этот экземпляр:
как видите код, как у меня практически, он запускает новое окно, НО ТОЛЬКО, КАК ДОЧЕРНЕЕ при этом при закрытие родительского закрывается и дочернее на форуме http://forum.sources.ru/index.php?showtopic=346017 посоветовали использовать winexec (shellexec) в связки с paramcount при этом рассуждаем так
не нужен? ведь с помощью shellexecute мы должны запустить копию программы с диска по умолчанию в c:\program files\net\net.exe пробовал разные варианты перечисляю
но это запустит только копию программы с установочной папки а как сотворить подстановку урла? Куда прикрутить ppdisp? |
| Автор: s2004 7.10.2012, 22:22 | ||
вот нашёл на одном форуме |
| Автор: s2004 7.10.2012, 22:51 |
| вот только теперь любой клик открывается в новом окне ... а как сделать чтобы выбор был открыть в новом или в старом |
| Автор: s2004 8.10.2012, 20:09 | ||
всё работает и в новом окне и в текущем... |
| Автор: Чучмек 9.10.2012, 01:57 |
| Открытие страницы в новом окне, это нечто большее, чем запуск копии браузера с новым урл. Сохраняется связь между старой страницей и новой. Поэтому в OnNewWindow2 мы имеем ppDisp: IDispatch, а не URL:string. Правильное решение с другой стороны (COM). Аналогично использованию MS Office через CreateOleObject('Word.Application') |
| Автор: Чучмек 9.10.2012, 17:32 |
| Отмечаю все сообщения минусом, потому что в корне неверное решение. Если правая нога не лезет в левый ботинок - примотаем ботнки к ногам изолентой. |
| Автор: s2004 9.10.2012, 19:48 | ||||
| чучмек прочитай своё , что написал.... твоё сообщение один минус Повторю кто в танке, событие onnewwindow при использование
открывала новое окно но только как дочернее которое закрывалось при закрытие родительского окна а мне в моей пргги этого не нужно поэтому код был изменён на
при этом и запускается копия проги с диска с подстановкой урла, что мне и надо было, а различные опусы не нужны, выложил тем кому возможно понадобится. p.s.Модераторы прошу заблокировать тему без возможности суда ещё что- то писать. |
| Автор: Чучмек 9.10.2012, 19:59 |
| Писать лень. Вот посмотри. |
| Автор: MetalFan 9.10.2012, 20:10 | ||
ну-ну, полегче. не вижу повода для санкций. |
| Автор: s2004 9.10.2012, 20:15 | ||
| архив посмотрел спасибо. это ещё одно решение - правда неудобно то, что на панели задач отображается в виде одного значка. так я понял код будет интересен зрителям поэтому выложу его:
|
| Автор: Чучмек 9.10.2012, 20:22 | ||
Это тоже легко решаеться. |
| Автор: Чучмек 12.10.2012, 11:34 | ||||||
| Вот. Наконец таки добрался. В глубь по интерфейсам... Перехват навигации. Пока без описания. unit1.pas
Unit_Obj.pas
Unit_Interfaces.pas
|
| Автор: Чучмек 12.10.2012, 12:11 |
| Этот код не имеет практического значения. Поскольку требует второго (скрытого) WB. С дополнительным WB все делается гораздо проще - через OnBeforeNavigate2. Однако, код показывает, как происходит открытие новой страницы. Через передаваемый в ppDisp, события OnNewWindow2, интерфес wb.DefaultDispatch, запрашивается ряд интерфейсов. В том числе ITargetFramePriv/ITargetFramePriv2. Для перехвата запроса интерфейсов используем TMyIC (метод QueryInterface). При запросе ITargetFramePriv/ITargetFramePriv2 передаем интерфейс от TTargetFramePriv/TTargetFramePriv2. При запросе остальных интерфейсов, передаем оригинальные интерфейсы от WB2. Через ITargetFramePriv/ITargetFramePriv2 происходит передача url в новую страницу. ITargetFramePriv - в старых версиях IE (метод NavigateHack), ITargetFramePriv2 (метод AggregatedNavigation2) - в новых. TTargetFramePriv/TTargetFramePriv2 - служат для перехвата передачи url. В ITargetFramePriv.NavigateHack url передается в виде WideString. (передаем в CallbackProc, и меняем на about:blank) В ITargetFramePriv2.AggregatedNavigation2 url передается в виде интерфейса IUri (в CallbackProc передаем строку полученную через pUri.GetAbsoluteUri, а вместо pUri передаем интерфейс от TUri) При желании можно написать заглушки для необходимых интерфейсов. Тогда второй WB не понадобиться. |
| Автор: Чучмек 12.10.2012, 23:22 |
Чтобы не быть голословным... |
| Автор: s2004 13.10.2012, 17:56 |
| попробовал последний архив, но значки просто так же, как у меня в программе отражаются- без содержимого? а я вроде докуче спрашивал чтобы именно с отражением сылки, так выбрать нужное окно легче. скомпиллировалось без проблем ошибки нет? Добавлено @ 18:00 коды привидённые в теме желательно поместить в FAQ или DRKB? а то там очень бедно по поводу брузера. Чучмек? архивы одинаковые.... |
| Автор: Чучмек 16.10.2012, 07:55 | ||||
Да нет, отличаются настолько, насколько
Это ты в другой теме спрашивал. ...Ну хорошо. Элементарно Уатсон. Я дурак, обещаю исправится |
| Автор: s2004 16.10.2012, 20:27 |
| запустил последний архив. значки, как отражались Form2 так и отражаются как и у меня. выбрать нужный значок нельзя - не открыв его и содержимое заглавия страницы не отражено. |
| Автор: Чучмек 16.10.2012, 20:56 |
![]() Разве ни это надо? |
| Автор: s2004 16.10.2012, 20:59 |
| да надо так, но у меня всё скомпилировалось, а этого нет -только form2 и всё. хорошо бы, если вместе form 2 отражалась и сылка страницы. |
| Автор: Чучмек 16.10.2012, 21:02 |
| Aero в винде включено? |
| Автор: s2004 16.10.2012, 21:07 |
| у меня виста basic, надо и чтобы в ХР работало. |
| Автор: Чучмек 16.10.2012, 21:29 |
Да не, это семерошный наворот. Он и так, сам по себе работает. Завтычил.Исправлюсь.Посмотрю,что можно сделать. Добавлено @ 21:36 Добавь обработчик OnTitleChange Вот тебе еще вариант. |
| Автор: s2004 17.10.2012, 20:02 | ||
| вот то, что практически нужно (правда без миниатюр) Чучмек благодарю выложу код думаю всем будет интересно
|
| Автор: s2004 17.10.2012, 20:55 | ||||
у меня код
если ввожу
поэтому в твоём архиве компиляция без проблем и всё работает, но у меня пока не работает. |
| Автор: Чучмек 18.10.2012, 20:12 | ||||||
Значит у тебя, в каком то модуле, до implementation есть что-нибудь типа
Если не хочешь исправлять (а НАДО) - напиши
|
| Автор: s2004 18.10.2012, 20:23 |
| да это я нашёл убирал, подстовлял твой код в свою прогу, так она hidden получается в диспечере висит, а так не видно. событие formcreate NewForm; сделала скрытым браузер при заремачивание начинает работать, но неполностью правильно. запускается прога- клик на сылку открывается новое окно при этом отображается название каждое своё в каждом окне, но вместо например двух значков проги на панели задач видны 3 значка. |
| Автор: Чучмек 18.10.2012, 20:54 | ||||
| А ты не понял зачем это? Как в примере? Основное окно приложения делаем не видимым
Из панели задач исчезает кнопка "Project1" Главную форму приложения делаем невидимой / скрытой
Главная форма у нас ничего не содержит. В событии главной формы OnCreate, создаем (Через TFormN.Create) видимую форму - окно браузера. При закрытии окна браузера, завершение приложения НЕ ПРОИСХОДИТ. Этим решаем проблему, с которой ты начинал эту тему. |
| Автор: s2004 19.10.2012, 20:39 | ||
Чучмек, если заремачено
то браузер работает, но не совсем правильно http://www.radikal.ru виден третий значок на панели задач (окон браузера только два), если строки кода прописаны ТО БРАУЗЕРА НЕТ, НИ ГЛАВНОГО ОКНА, НИ ФОРМЫ просто есть отражение в диспечере задач ну как "троян". весь остальной код, как у тебя. |
| Автор: Чучмек 20.10.2012, 07:46 |
| Скинь. Я посмотрю. |
| Автор: s2004 20.10.2012, 20:30 |
| вышлю через личку |
| Автор: Чучмек 20.10.2012, 22:00 | ||||||||||
| Ты так ничего не понял. Читай мой пост через один вверх. Давай заново. Из юнита, из того, который ты мне скинул, -(Unit1) Удаляй
из TForm1.FormCreate удаляй NewForm; Потом File->New->Form Form.Name=FormXXX Юнит новой формы сохрани как StartForm_Unit в нем
В dpr - первая создаваемая форма FormXXX
В uses Unit1 прописываешь StartForm_Unit |
| Автор: s2004 20.10.2012, 22:25 |
| попробую завтра спасибо. |
| Автор: s2004 21.10.2012, 16:17 | ||
| так сделал, заработало кроме одного - досадная ошибка в начале запуска. при закрытия окна грузится браузер нормально и все вкладки отражены на значке панели задач. http://www.radikal.ru
|
| Автор: Чучмек 21.10.2012, 17:29 | ||||||||
У тебя встречается код
За комментируй в unit1 строку
И исправь все
На
Добавлено через 2 минуты и 15 секунд После того как ты убрал строку Application.CreateForm(TForm1, Form1) Form1 у тебя больше не существует |
| Автор: s2004 21.10.2012, 21:45 |
| покрутил в выходные несколько часов. чтение без запроса с диска не идёт. после того, как например ещё убираю form1 на self среда дельфи начинает упорно подставить unit1 в unit1, что ошибка отказываясь от этого там другое лезет. я вот помню вроде на каком то этапе у меня давно работало отражение открытых cskjr в значках на панели задач. Возможно какое другое решение тут действительно начинаешь одно менять появляется куча другого. |
| Автор: Чучмек 21.10.2012, 22:09 | ||
| Вот когда начинаешь понимать, что глобальные переменные это зло. Вот что у тебя есть
Использовалось раньше одной формой - а теперь несколькими. Перенеси внутрь TForm1 |
| Автор: s2004 21.10.2012, 22:20 |
| попробую наверно уже завтра |
| Автор: s2004 21.10.2012, 22:38 | ||
| так вроде всё подправил, пока ошибок не пишет .... нет есть. такая при открытие файла с диска пишет примерно тоже самое - ошибка по такому адресу и прочая, но повторю возникает при открытие файла с диска, если просто ввести адрес или из истории с вкладок, то нормально, как только с диска - сбой. потом открывается браузер, но файл неподгружает. нет возможности регулировать показывать картинку или нет менял на self
|
| Автор: Чучмек 22.10.2012, 09:20 |
| У тебя еще куча юнитов, проверяй где еще есть обращение к form1 |
| Автор: s2004 22.10.2012, 19:36 | ||
| ещё 4 form1 нашёл теперь нет. но теперь программа при запуске ведёт так, как в начале темы - при открытие сылки из родительского окна и если это окно закрыть происходит и закрытие родительского и дочернего окна. вышлю unit1.pas. вопрос прописаны ini- файлы для сохранения параметров проги например включена возможность показа картинок? при закрытие проги и вновь открытии вновь приходится нажимать на соответсвующую кнопку чтобы отображались картинки прога несохраняет поему изменения. ну и нет докучи чтения с диска. так нашёл почему прога стала закрываться при закрытие родительского окна в form1 в onclose поставил
убрал выше названная ошибка прошла вопрос как заставить программу удалять себя из памяти? кстати по глобальным переменым в учебниках например расписывают, что это хорошо не надо прописовать к каждой процедуре, а тут действительно прав Чучмек - за них сбои. лучше прописать к каждой процедуре. |
| Автор: Чучмек 22.10.2012, 21:31 |
| В TForm1.FormClose Должно стоять (последней строкой) DecFormCount. Посмотри внимательно: при вызове NewForm увеличивается на единицу form_count. При вызове DecFormCount уменьшается. Если DecFormCount=0 ->application.Terminate |
| Автор: s2004 22.10.2012, 21:39 |
| да сработало прога из памяти выгружается. а вот чтение с диска почему не работает, ну и вопрос по несохранению параметров. |
| Автор: s2004 26.10.2012, 22:57 | ||
| перебрал параметры ини файлов, но код не работает. запись в ини файл идёт, а вот такое впечатление, что не читается.
|
| Автор: Чучмек 26.10.2012, 23:05 |
| breakpoint в TForm30.FormCreate поставь. И через F7/F8 посмотри читается или нет. Добавлено через 1 минуту и 56 секунд Form30 - это что за зверь? |
| Автор: Чучмек 27.10.2012, 14:28 | ||
|
| Автор: s2004 27.10.2012, 23:05 | ||||||
а переменную s ставил в
но при запуске ошибку пишет и браузер не работает заремачил вначале надо добиться чтобы положение и размер сохранял и восстанавливал. по выше привидённому коду пишет инифайл
и всё, его не меняет. размеры и положение не изменяет. |
| Автор: Чучмек 27.10.2012, 23:17 |
| Что такое Form30??? |
| Автор: s2004 28.10.2012, 16:50 |
| form30 это StartForm_Unit |
| Автор: Чучмек 28.10.2012, 17:25 |
| А зачем ты настройки невидимого окна сохраняешь??? |
| Автор: s2004 28.10.2012, 19:17 |
| так вот вначале сохранял form1, потом пробовал form30 |
| Автор: Чучмек 28.10.2012, 19:36 |
| Рановато ты за это взялся, по видимому :( |
| Автор: s2004 28.10.2012, 19:59 | ||
нормально, это у меня хобби на 1-2 месяца в год для себя. и разумеется, если незаниматься языком то забываешь и по новой приходится вспоминать, но хочется себе любимому архив распаковал, посмотрел не работает. у меня ini работали пока я не начал менять по теме, вероятно где то какая- та ошибка. файл config.ini несоздаётся. |
| Автор: Чучмек 28.10.2012, 20:14 |
В меню есть пункт "Запомнить позицию" |
| Автор: s2004 28.10.2012, 20:26 |
| да моя не внимательность :( - работает. |
| Автор: s2004 30.10.2012, 20:14 | ||||
Чучмек (благодарю за расширенные ответы с примерами) вопрос по чтению файла с диска без подтверждения - до модернизации код был в form1
теперь, как бы надо использовать form30. подстовлял различные параметры, но не работает
программа запускается, но при попытки открыть файл с диска пишет ошибку и загрузка файла непроисходит |
| Автор: Чучмек 31.10.2012, 12:49 | ||||
| Посмотри соседнюю тему про несколько окон одного класса. Если в функции/процедуре было обрашение к форме/компонентам на форме Возможны варианты а) сделать функцию методом класса TFormN (доступ к форме через self) б) добавить параметр Form:TForm и передавать self Добавь в функцию NewForm параметр SelfForm:TForm (как в моем последнем примере) И делай проверку SelfForm=nil (при первом вызове в NewForm передавай nil, при открытии нового окна передавай текущее(self))
Функцию get сделай методом TForm1
|
| Автор: s2004 6.11.2012, 19:41 |
| Чучмек при попытки в form30 исправить функции newform и tform.get вылетают ошибки, при исправление в form1 ошибки нет. но и не работает. ты уже объяснял нельзя ли подробней всё таки по поводу form30? |
| Автор: Чучмек 6.11.2012, 21:26 | ||||
| Исправляешь описание TForm1 Было
Стало
Потом ставишь курсор внутрь блока TForm1 =... end; и нажимаешь Ctrl+Shift+C получаешь заготовку метода Get |
| Автор: s2004 6.11.2012, 21:52 | ||
у меня было
... нажимаешь Ctrl+Shift+C получаешь заготовку метода Get - это не срабатывает. |
| Автор: Чучмек 7.11.2012, 09:55 | ||||
Ну добавь ручками TForm1.
Предварительно добавь в секцию public TForm1 строку
зы get должен быть в том же юните что и tform1 |
| Автор: s2004 7.11.2012, 20:00 | ||||||
этот код для form1?
|
| Автор: Чучмек 7.11.2012, 22:17 | ||||||
| Ну посмотри последний пример. Там в NewForm уже добавлен параметр. В EmbeddedWB1NewWindow2
В TForm30.FormCreate
Если SelfForm=nil (если не Assigned(SelfForm)) вызвать метод get параметр SelfForm (в NewForm ) - это форма, в WB которой, открывается новое окно. При старте программы еще никакого окна НЕТ, поэтому передаем nil Значит если SelfForm=nil программа только запустилась. |
| Автор: s2004 8.11.2012, 19:39 | ||||
когда подставил nil
|
| Автор: Чучмек 8.11.2012, 20:55 | ||
| Вот посмотри. ... и еще. Чтобы при закрытии форма уничтожалась а не скрывалась,необходимо в OnClose перед вызовом DecFormCount вызвать Free
|
| Автор: s2004 8.11.2012, 21:58 | ||
у меня вот так было подправил, но теперь ошибка при закрытие окна, ошибка по адресу, неверная работа с указателем. |
| Автор: Чучмек 8.11.2012, 22:20 |
| Можно и так. тогда DecFormCount лучше вызывать в OnDestroy |
| Автор: s2004 9.11.2012, 18:51 | ||
![]() ![]() ошибка при закрытии не стал кнопкой фиксировать нужную позицию, через
|
| Автор: Чучмек 9.11.2012, 20:10 |
| Форма должна уничтожатся до вызова Application.Terminate |
| Автор: s2004 10.11.2012, 18:07 | ||||||||
если в form1 ставлю
то ошибка сохраняется плюс закрывается все окна при закрытие любого окна браузера, а так Application.Terminate вызывается только в form30. как у тебя в примере. а так уменя в form1 стоит
Добавлено через 11 минут и 32 секунды а вот получилось при таком коде
|
| Автор: Чучмек 10.11.2012, 18:21 |
| Ошибка всегда, или только когда открываешь файл с диска? Добавлено через 13 минут и 24 секунды Перенеси вызов DecFormCount в OnDestroy. Так правильнее более правильно будет. |
| Автор: s2004 10.11.2012, 20:12 |
| так я же написал, что исправил в предыдущем посте. ошибки теперь нет. благодарю за ответы и помощь. |