Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TWebBrowser. PopupMenu глючит 
:(
    Опции темы
RaIDeR
Дата 15.7.2005, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 2
Всего: 4



Я сделал для TWebBrowser PopumMenu при помощи отлова сообщения WM_RButtonUP компонентом TApplicationEvents,всё нормально работает, но недавно странный глюк обнаружился, вобщем частенько бывает такое что когда PopupmMenu Popup'ится smile близко к краям браузера(особенно к нижнему и правому), то оно выскакивает, и сразу исчезает.
Что за фигня smile smile smile
PM MAIL   Вверх
December
Дата 15.7.2005, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 12
Всего: 57



Покажи код, имеющий отношение к попапу.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
RaIDeR
Дата 16.7.2005, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 2
Всего: 4



Иногда всё нормально, а иногда глючит постоянно, вот код:

Код

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
if Msg.message = WM_RBUTTONUP then  // Если нужное сообщение, то
if TWinControl(ControlAtPos(ScreenToClient(Mouse.CursorPos), True, True)).ClassName = 'TWebBrowser' then // Если мышь в пределах браузера, то
begin
  PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
  Handled := True;
end;
end;

PM MAIL   Вверх
December
Дата 16.7.2005, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 12
Всего: 57



Странно, что он у тебя вообще работает. У меня конструкция TWinControl(ControlAtPos(ScreenToClient(Mouse.CursorPos), True, True)).ClassName возвращает TPanel - "подстилку" для TWebBrowser. Для того, чтобы отлавливать, над каким именно TWebBrowser'om произошёл правый клик, я использую такую процедурину:

Код

function ImmediateParentToClient(gControl:TControl;
                                 const Point: TPoint): TPoint;
begin
Result.X:=Point.X-gControl.Left;
Result.Y:=Point.Y-gControl.Top;
end;//ImmediateParentToClient


function GetWBUnderneath(gP:TPoint):TWebBrowser;
var
  cControl:TControl;
  cPos:TPoint;
begin
result:=nil;
cControl:=MainForm.PageControl;
cPos:=cControl.ScreenToClient(gP);
while (cControl is TWinControl) do
  begin
  cControl:=(cControl as TWinControl).ControlAtPos(cPos,false,true);
  if Assigned(cControl) 
    then if cControl is TWebBrowser then result:=cControl as TWebBrowser
    else exit;
  cPos:=ImmediateParentToClient(cControl,cPos);
  end;//while
end;//GetWBUnderneath


О причине использования ImmediateParentToClient вместо стандартного ParentToClient я писал в топике http://forum.vingrad.ru/index.php?showtopic=42422

PS Не забудь ставить Handled-true и на WM_RBUTTONDOWN, а то стандартное меню все равно будет вылазить.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
RaIDeR
Дата 16.7.2005, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 2
Всего: 4



Большое спасибо за код ! smile
-
Я тоже подстелил TPanel под браузер, и мой код стал возвращать тоже самое(TPanel) smile Да и зачем она нужна эта подстилка ? Разве что изменять св-во Visible ...
По поводу WM_RBUTTONDOWN: странно, но у меня если не поставить Handled := True, всё нормально работает, но я всё равно послушаю твоего совета smile

PM MAIL   Вверх
RaIDeR
Дата 16.7.2005, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 2
Всего: 4



Кстати, вместо Handled := True, можно делать Msg.message := 0.
PM MAIL   Вверх
December
Дата 17.7.2005, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 12
Всего: 57



Цитата(RaIDeR @ 16.7.2005, 18:59)
Да и зачем она нужна эта подстилка

Как минимум, две цели. Первую ты сам назвал. Вторая - при изменении размеров TWebBrowser у него может заморозиться картинка, так что следует изменять размеры подстилки, а окна бродилка align=alClient.
А ещё есть такое интуитивное чувство, что если за день общения с TWebBrowser выяснились два таких серьёзных глюка, то сколько ещё сюрпризов чудных нам припас сей компонент?..
smile


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Gorinich
Дата 21.10.2005, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.10.2005

Репутация: нет
Всего: нет



Пользуюсь вот этим кодом. Хотя и громоздко, но все работает без глюков (пока smile ):
Код

function MouseProc( nCode: Integer; wParam, lParam: Longint ): Longint; stdcall;
const
  IE_NAME = 'Internet Explorer_Server';
var
  szClassName: array[0..255] of Char;
begin
   case nCode < 0 of
      true: Result := CallNextHookEx( HookID, nCode, wParam, lParam )
      else
         case wParam of
            WM_RBUTTONUP:
            begin
               GetClassName( PMOUSEHOOKSTRUCT( lParam )^.HWND, szClassName,
                             SizeOf( szClassName ) );
               if lstrcmp( @szClassName[0], @IE_NAME[1] ) = 0 then
               Result := HC_SKIP
               else
               Result := CallNextHookEx( HookID, nCode, wParam, lParam );
               MX:=Mouse.CursorPos.x;
               MY:=Mouse.CursorPos.y;
               if(MX>(Form1.Left+Form1.treeView1.Width))
                 and(MX<(Form1.Left+Form1.Width))
                 and(MY>Form1.Top+80)
                 and(MY<(Form1.Top+Form1.Height))
                 and(Form1.doc<>nil)
                 then Form1.PopupMenu2.Popup(MX,MY);
            end
            else
               Result := CallNextHookEx( HookID, nCode, wParam, lParam );
         end;
   end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//...
HookID:=SetWindowsHookEx(WH_MOUSE, MouseProc, 0, GetCurrentThreadId );
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
//...
if HookID <> 0 then UnHookWindowsHookEx( HookID );
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1051 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.