![]() |
|
Модераторы: MetalFan |
![]()
|
|
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 12 Всего: 57 |
Greetings all!
Помогите разобраться с траблой... Не, не так. Помогите перенести объект TWebBrowser (в который загружена какая-нибудь страница) из одной панели на другую, чтобы при этом объект не сдох подлейшим образом. Вот пример. На форме есть панель в которой лежит TWebBrowser. Мы делаем ему Navigate куда-нибудь. Потом пытаемся переместить WebBrowser с загруженной страницей на другую панель Panel2 с помощью следующего кода:
После успешного выполнения этих магических строчек WebBrowser переезжает на другую панельку, но при этом становится клиническим идиотом: на контента странички, ни popup-menu, ни реакции на клаву. Кажется, он "обнуляется", поскольку если ему сделать повторный Navigate, то он работает нормально. Что хуже всего, для достижения таких симптомов достаточно поменять парент у любого парента TWebBrowser'a. То есть перемещение Panel1 (в котором лежит TWebBrowser) на Panel2 приводит к тем же печальным симптомам. Вот такая грустная ситуация. У кого есть идеи, как переместить это мегаглючное чудо в иной контрол без потери контента? |
|||
|
||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 12 Всего: 57 |
Кстати, если скормить Яндексу строчку "TWebBrowser parent", то самая первая ссылка - НАША!
http://forum.vingrad.ru/index.php?oldss=3d...f=2&t=2757&st=0 |
|||
|
||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 1 Всего: 162 |
Вообще-то свойство perent у WebBrowser доступно только на чтение я думаю не с проста.
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 12 Всего: 57 |
Тот парент, который непосредственно у TWebBrowser'a ещё и для другого служит Мне дьявольски интересно, это трабла именно TWebBrowser'a или Delphi? |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 6 Всего: 112 |
Я полагаю проблема в реализации установки Parent'а в TControl'е...
По сути дела, смена парента сопровождается следующими действиями: 1) OldParent.RemoveControl 2) NewParent.InsertControl Т.е. есть промежуток времени, когда контрол не имеет парента. А если у TWinControl нет парента, то и Windows-окна (этого контрола) тоже нет... Если назначаем парента, то только тогда и создается Windows-окно (CreateWindow)... Теперь легко догадаться, что при OldParent.RemoveControl окно уничтожается, а при NewParent.InsertControl создаётся заново... Ну и сами понимается, в случае WebBrowser'а, содержимое нигде не запоминается и потом не восстанавливается... Поэтому можно обойти это кривым способом:
Но "оффициально" парент не изменится (т.е. WebBrowser1.GetParentComponent вернет прежнего парента, а Panel1.Controls не изменится)... Имхо, Borland схалявила. Можно было сделать "умный" SetParent, который бы в ряде случаев не уничтожал/создавал окно, а делал бы Windows.SetParent... -------------------- С уважением, г-н Посол. |
|||
|
||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 12 Всего: 57 |
Хммм.... Забавно... Сейчас попробую...
|
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 6 Всего: 112 |
-------------------- С уважением, г-н Посол. |
||||
|
|||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 12 Всего: 57 |
p0s0l, большое спасибо за информацию!
Поковырялся я с VCL'ом, но так и не смог добиться нужного результата. Не подскажешь ли, как можно поменять контролу предка без потери контента? Windows.SetParent не подходят, поскольку WebBrowser.Parent участвует во многих операциях, как, например, фокусировка... |
|||
|
||||
| p0s0l |
|
||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 6 Всего: 112 |
Поковырявшись, пришел к такому опять же кривому решению:
Еще поковырявшись, написал такое, более приемлимое решение:
Потести этот способ, но вроде должно нормально работать. Смысл в том, что DestroyWindowHandle будет уничтожать Windows-окно лишь в том случае, если у контрола убирают родителя (Parent := nil), иначе - уничтожение окна не проиходит, а делается Windows.SetParent (NewParent.Handle) Это сообщение отредактировал(а) p0s0l - 22.1.2005, 20:07 -------------------- С уважением, г-н Посол. |
||||||
|
|||||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 12 Всего: 57 |
p0s0l, спасибо за участие в теме!
Протестил этот вариант, получается забавная вещь. Суть такова: когда переносишь на другого парента бродильник, то всё классно. Когда же переносишь парентский контрол, в котором бродильник содержится, то выдаётся ошибка "Could not obtain OLE control window handle." Я прикрепляю тестовый проектик, можешь посмотреть (если тебе интересно) В принципе, цель достигнута. Для того, чтобы перенести целую группу контролов, сначала следует сохранить у какого-нибудь невидимого парента все TMyWebBrowser'ы, потом перенести все обычные контролы, потом вернуть на место бродильники. Черезанусно, но работает! Присоединённый файл ( Кол-во скачиваний: 11 )
Experiments.zip |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 6 Всего: 112 |
Мдя уж...
Мой метод только для "прямого" задания парента. А в твоём случае я не знаю как это можно обойти... Если бы можно было бы (всё "бы") запомнить контент... потом восстановить... то проблем бы не было... -------------------- С уважением, г-н Посол. |
|||
|
||||
| December |
|
||||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 12 Всего: 57 |
Я тщательно протестил метод "сохранения в невидимом контроле" - работает стабильно.
Вот именно это я сначала и сделал, через диск. Но такая куча новых проблем возникает, что ну его подальше... |
||||
|
|||||
![]()
|
| Правила форума "Delphi: ActiveX/СОМ/CORBA" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |