Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Фокус TWebBrowser [D6]


ВладОшин ©   (2014-01-09 10:17:00) 

Проблема, на самом деле, глобальнее..
(
Группа активных(X) контрлов(кнопки, лабел, и, в т.ч. TWebBrowser ) встраивается в чужое приложение(через dll(ocx)), в предоставленную тем приложением MDI форму.
Все работает нормально, пока не щелкнуть на браузере (как бы фокус на него перевести), и, не убирая с него фокуса, закрыть это чужое окно со своими встроенными на нем контрлами. В этом случае - AV. Адреса AV разные. Если при этом с браузера уйти - ткнуть в любой другой контрол, и закрыть окно - нет ошибок.

Натравил Эврику - говорит, что ошибка возможно ее собственная, что нет, конечно..

в стеке 30 вызовов, и ни одного моего модуля, все стандартные. Наверное ошибка еще раньше где-то..
)

воот..

, но спрошу сначала так:

Кидаем на форму браузер, кнопку, мемо, таймер
//---------
type
 TForm1 = class(TForm)
   WebBrowser1: TWebBrowser;
   Button1: TButton;
   Memo1: TMemo;
   Timer1: TTimer;
   procedure Button1Click(Sender: TObject);
   procedure WebBrowser1Enter(Sender: TObject);
   procedure WebBrowser1Exit(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private      { Private declarations }
 public       { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 WebBrowser1.Navigate(' http://www.delphimaster.ru');
end;

procedure TForm1.WebBrowser1Enter(Sender: TObject);
begin
 Memo1.Lines.Add('WebBrowser1Enter');
end;

procedure TForm1.WebBrowser1Exit(Sender: TObject);
begin
 Memo1.Lines.Add('WebBrowser1Exit');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if ActiveControl <> nil then
  Memo1.Lines.Add(ActiveControl.ClassName);
end;
------------------------------------------------------
после нажатия на кнопку, фокус с браузера уходит, и хоть что в нем делай , показывает, что активный контрол сейчас любой другой, но не он.
Даже не его контейнер, даже не..

Короче, фокус остается на кнопке, хоть в это время и набирать текст в браузере.

Куда посмотреть? (Что сделать, что бы это штука подчинялась общей логике "фокусника")


Smile   (2014-01-17 14:22:00) [1]

Интересна я века (монолог)
:)


ВладОшин   (2014-01-17 12:48:00) [2]

Решил так: Если закрыть окно, оно по любому не будет иметь фокус :)

собственно, перед закрытием Host-окна:

 if Assigned(ActiveOleControl) then
 begin
   // Log.Add (' ага 1');
   if ActiveOleControl.ClassName = 'TWebBrowser' then
   begin
     // Log.Add (' ага 2');
     Doc := TWebBrowser(ActiveOleControl).Document as IHTMLDocument2;
     if Assigned(Doc) then
     begin
       HTMLWindow := Doc.parentWindow;
       if Assigned(HTMLWindow) then
         HTMLWindow.Close;
     end;
   end;
 end;


ВладОшин   (2014-01-10 08:41:00) [3]

а в боевом проекте все равно AV, блин


ВладОшин   (2014-01-09 13:09:00) [4]

если просто сказать
PostMessage(Browser.Handle, CM_UIDEACTIVATE, 0,0);
PostMessage(Browser.Handle, CM_UIACTIVATE, 0,0);
то работает, фокус перемещается с него/ на него


ВладОшин   (2014-01-09 10:37:00) [5]

загуглить - загуглил
Пишут многое, пробовал пока не все, но что пробовал - не получилось, когда в
> Группа активных(X) контрлов(кнопки, лабел, и, в т.ч. TWebBrowser
> ) встраивается в чужое приложение(через dll(ocx)),

вставлял это (нагугленное) решение.


ВладОшин   (2014-01-09 10:22:00) [6]

Memo1 содержит

WebBrowser1Enter
TWebBrowser
TWebBrowser
WebBrowser1Exit
TButton
TButton
TButton
TButton
TButton
TButton
...


ВладОшин   (2014-01-09 10:20:00) [7]

да, непосредственно AV в TControl.HandleNeeded


Наверх

Титульная страница Поиск, карта сайта Написать письмо