Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по работе с webbrouser-ом  (Прочитано 6999 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Okkkks
Помогающий

by
Offline Offline

« : 18-06-2010 09:08 » 

Ребята, подскажите возможно ли изменять содержимое контекстного меню (для веббраузера) в зависимости от загруженной страницы? У меня получилось частично заблокировать стандартное контекстное меню и прицепить своё.  Улыбаюсь Теперь нужно, чтобы менялось содержимое меню...
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 18-06-2010 09:53 » 

есть два варианта:

1. ловить OnNavigateComplete2 (случается всегда, после того, как страница была успешно загружена).
2. ловить OnDownloadComplete (случается всегда, когда загрузка закончена, неважно, удалась она, не удалась, или была отменена пользователем).

если у вас уже есть своё контекстное меню, то в любом из этих разработчиков просто его меняйте.
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #2 : 18-06-2010 09:54 » 

или вопрос не о TWebBrowser-е, а о динамическом создании/изменении меню? Улыбаюсь
Записан

Okkkks
Помогающий

by
Offline Offline

« Ответ #3 : 18-06-2010 10:00 » 

нууу... можно и так сказать...  Краснею
мне нужно, чтобы при переходе на некоторую страницу команды. которые были в контекстном меню изменились... Например, было "Открыть" - стало "Закрыть" .   Простите если не понятно объясняю... не знаю как лучше рассказать... Краснею
« Последнее редактирование: 18-06-2010 10:02 от Okkkks » Записан
Okkkks
Помогающий

by
Offline Offline

« Ответ #4 : 18-06-2010 10:03 » 

"если у вас уже есть своё контекстное меню, то в любом из этих разработчиков просто его меняйте."

в смысле создать 2 контекстных меню и потом их просто взаимозаменять?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #5 : 18-06-2010 10:07 » 

меню - это коллекция. пункты меню - это члены коллекции. каждый из них - самостоятельный объект. если вы откроете своё меню в дизайнере, то увидите, что каждое меню называется Item1, Item2 и т.д. - это и есть объекты, к которым можно обращаться. т.е.

Код:
if <..> then
  Item1.Caption := 'Открыть'
else
  Item1.Caption := 'Закрыть';

З.Ы. я просто понять не могу, в чём конкретно проблема: изменить своё меню? отследить изменение контента браузера? изменить меню самого браузера?
Записан

Okkkks
Помогающий

by
Offline Offline

« Ответ #6 : 18-06-2010 10:19 » 

В принципе это, наверное, то, что надо... Улыбаюсь  Спасибо Улыбаюсь 
Попытаюсь ещё раз объяснить... Краснею
Есть веббраузер, а у него стандартное контекстное меню. Это его меню удалось заблокировать и прицепить своё. В меню (моём) есть некоторые команды.
Это меню должно отображаться на любой странице (кроме последнего уровня, т.е. когда дальше перейти по ссылке никуда не получится. (тупиковая страница)), если мы нажимаем правой кнопкой мыши по ссылке.
Если мы дошли до "тупиковой страницы", то при нажатии на правую кнопку мыши по ссылке у нас должно отобразиться контекстное меню, но не такое как раньше. Оно должно содержать другие команды. Вот как-тотак... Краснею
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #7 : 18-06-2010 10:23 » 

если меню изменяется всего в одном случае (последняя страница) - проще всего сделать два меню и посдавлять их в нужном месте. если бы у вас на каждом чихе всё меню менялось - да, а так - я не вижу смысла возиться с динамическим изменением. ставьте смело два меню, братва вас поймёт Ага
Записан

Okkkks
Помогающий

by
Offline Offline

« Ответ #8 : 18-06-2010 10:27 » 

спасибо =)) эххх... Вы настоящий друг! =))
Записан
Okkkks
Помогающий

by
Offline Offline

« Ответ #9 : 18-06-2010 10:29 » 

уммм.. ещё возник вопросик... А возможно как-то отследить попал пользователь правой кнопкой мыши по ссылке или нет? Или это только по координатам отслеживать?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 18-06-2010 11:02 » 

как вы запрещаете меню? через  WMMouseActivate, во всём приложении сразу, или через интерфейсы IDocHostUIHandler?

з.ы. а лучше просто этот кусок кода покажите Улыбаюсь
Записан

Okkkks
Помогающий

by
Offline Offline

« Ответ #11 : 18-06-2010 11:07 » 

через  WMMouseActivate,

procedure TForm1.WMMouseActivate(var Msg: TMessage);
begin
  try
    inherited;
    //Анализируем, какая кнопка мыши нажата
    if Msg.LParamHi = 516 then // если правая
      // показываем свое меню
      PopupMenu1.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
    Msg.Result := 0;
  except
  end;
end;
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #12 : 18-06-2010 11:25 » 

понятно. в вашем случае - это сделать довольно проблематично. потому что вызов меню произойдёт до того, как линк фактически будет выделен. если вы обратили внимание, как работает ваша конструкция, то вы увидите, что сначала вызывается меню, и только после его закрытия фактически происходит перевод фокуса на саму ссылку.
Записан

Okkkks
Помогающий

by
Offline Offline

« Ответ #13 : 18-06-2010 11:37 » 

ясно...
спасибо огромное   Улыбаюсь
а вообще, нравиться мне у вас  Краснею
« Последнее редактирование: 18-06-2010 11:38 от Okkkks » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #14 : 18-06-2010 12:54 » 

в принципе, если слегка наморщить моск, можно попробовать сделать то, что вы хотите. главная проблема в том, что до клика мышей по пункту меню, TWebBrowser-а не обрабатывает свою очередь сообщений. ну а мы можем заставить его обрабатывать её:
Код:
procedure TForm1.N11Click(Sender: TObject);
var
  document: IHTMLDocument2;
  element: IHTMLElement;
  attribute: OleVariant;
begin
  Application.ProcessMessages;
  ...
  а дальше - дело техники, получить активный элемент из браузера, и проверить, есть у него аттрибут href или нет:
Код:
  ...
  document := Web.Document as IHTMLDocument2;

  element := document.activeElement;
  attribute := element.getAttribute('href', 0);
  ShowMessage (VarToStr (attribute));
end;
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines