Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.09;
Скачать: CL | DM;

Вниз

Возможности TWebBrowser, несколько вопросов   Найти похожие ветки 

 
Calm ©   (2006-06-22 13:03) [0]

Уважаемые коллеги,
необходимо отобразить пользователю довольно много разноообразной инфы с некоторым количеством простой графики (простейшие диаграммки, иконки). Помимо текста присутствуют таблицы. Вся инфа исключительно на чтение.

Есть мысль отобразить весь этот винегрет с помощью HTML и TWebBrowser или любом другом компоненте, показыающем HTML.

Вопрос: смогу ли я в TWebBrowser обработать клики, наведение, уход мышки с элементов SPAN и IMG ?

P.S. Используется D6.


 
Calm ©   (2006-06-22 17:39) [1]

Если кому итересно - частично можно реализовать с помощью THTMLViewer
Там можно делать конструкции типа
<a href="id_01" class="<чтобы_ссылка_не_была_отличима_от_текста><span>произвольный текст"</span></a>

По клику на текст в событие будет передан url, по которому можно одноначно определить, по какой ссылке кликали.

Насчет наведения мыши, похоже, не получится.

P.S. Может мне надо было не в начинающие постить? Просто я думал, что все знают, а я один такой темный.


 
anton773 ©   (2006-06-22 21:56) [2]


> Вопрос: смогу ли я в TWebBrowser обработать клики, наведение,
>  уход мышки с элементов SPAN и IMG ?

Да. Если там будут гиперссылки


 
palva ©   (2006-06-22 22:06) [3]

> Вопрос: смогу ли я в TWebBrowser обработать клики, наведение,
>  уход мышки с элементов SPAN и IMG ?

Все эти события может обработать клиентский скрипт, который, например, через строку статуса даст знать о событии Delphi обработчикам. Все это трудоемко, но можно сделать.


 
Gero ©   (2006-06-23 01:43) [4]

Можно.

Обьявляем класс:


 TEventMethod = procedure of object;

 TWBEventHandler = class(TInterfacedObject, IDispatch)
 private
   FOnEvent: TEventMethod;
 protected
   function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
   function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
   function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer;
    DispIDs: Pointer): HResult; stdcall;
   function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word;
    var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
 public
   constructor Create(const Method: TEventMethod);
   property OnEvent: TEventMethod read FOnEvent write FOnEvent;
 end;

implementation

constructor TWBEventHandler.Create(const Method: TEventMethod);
begin
 inherited Create;
 FOnEvent := Method;
end;

function TWBEventHandler.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer;
 DispIDs: Pointer): HResult;
begin
 Result := E_NOTIMPL;
end;

function TWBEventHandler.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
begin
 Result := E_NOTIMPL;
end;

function TWBEventHandler.GetTypeInfoCount(out Count: Integer): HResult;
begin
 Result := E_NOTIMPL;
end;

function TWBEventHandler.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word;
 var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
begin
 if (DispID = DISPID_VALUE) then
   begin
     if Assigned(FOnEvent) then
       FOnEvent;
     Result := S_OK;
   end
 else
   Result := E_NOTIMPL;
end;



Пишем обработчик:


procedure TForm1.MyEventHandler;
begin
 // обрабатываем событие. Всю инфу пожно получить из window.event
end;


И присваеваем нужному елементу новый обработчик:

element.onmouseover = TEventObject.Create(MyEventHandler) as IDispatch;


 
Gero ©   (2006-06-23 02:00) [5]

> И присваеваем нужному елементу новый обработчик:

Вернее

element.onmouseover = TWBEventHandler.Create(MyEventHandler) as IDispatch;


 
Calm ©   (2006-06-23 10:20) [6]

Gero, а как получить этот самый элемент
element.onmouseover = ?
Хотя бы в самых общих чертах, плиз.

palva

> Все эти события может обработать клиентский скрипт, который,
>  например, через строку статуса даст знать о событии Delphi
> обработчикам.

Клиентский скрипт - подразумевается java script в html ? Через строку статуса - это как?  В TWebBrowser есть событие вывода текста туда?

Если я правильно понял, вы предлагаете для каждого элемента при наведении мыши писать в строку статуса нечто, например ID элемента, а в событии изменения строки статуса этот id получать и обрабатывать в программе, верно ?


 
Gero ©   (2006-06-23 10:37) [7]

> Gero, а как получить этот самый элемент
> element.onmouseover = ?

Через MSHTML. Если знаешь JavaScript хоть немного, проблем возникнуть не должно.
По имени можно получить элемент примерно так:

function GetWBElementByName(WebBrowser: TWebBrowser; ElementName: string): IHTMLElement;
var
 Doc: IHTMLDocument2;
begin
 Doc := WebBrowser.Document as IHTMLDocument2;
 if Doc <> nil then
   Result := Doc.all.item(ElementName, 0) as IHTMLElement
 else
   Result := nil;
end;

Можно также использовать GetElementById и другие JS-средства.


 
Calm ©   (2006-06-23 11:46) [8]

Большое спасибо, Gero.

Знания HTML и JS присутствуют в хорошем объеме. Не хватало знаний (да что там, отсутствуют! :))  по работе со всем этим добром из Delphi.


 
parovoZZ ©   (2006-06-23 14:06) [9]

Вся эта байда глючит, если страницу грузить в потоке. Также не работает, если нажать F5 или из контекстного меню кликнуть обновить.


 
Gero ©   (2006-06-23 14:17) [10]

> [9] parovoZZ ©   (23.06.06 14:06)

Глючит только если руки неровные.


 
parovoZZ ©   (2006-06-23 19:20) [11]

Ну может быть, я ловил IHTMLEventObj.srcElement.getAttribute("id", 0). Но иногда это событие просто не возникало.



Страницы: 1 вся ветка

Текущий архив: 2006.07.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.068 c
1-1148632554
tytus
2006-05-26 12:35
2006.07.09
Русский язык


1-1148632794
wipr
2006-05-26 12:39
2006.07.09
OpenOffice.org можно использовать как OLE-Automation сервер?


1-1148550877
webpauk
2006-05-25 13:54
2006.07.09
Вставить gif в Richedit


1-1148901543
boalse
2006-05-29 15:19
2006.07.09
new и Getmem как покрасивее совместить?


2-1150964585
D@Nger
2006-06-22 12:23
2006.07.09
Не получается установить RxLib