![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возможности TWebBrowser, несколько вопросов [D6, XP]
Calm © (2006-06-22 13:03:00)Уважаемые коллеги,
необходимо отобразить пользователю довольно много разноообразной инфы с некоторым количеством простой графики (простейшие диаграммки, иконки). Помимо текста присутствуют таблицы. Вся инфа исключительно на чтение.
Есть мысль отобразить весь этот винегрет с помощью HTML и TWebBrowser или любом другом компоненте, показыающем HTML.
Вопрос: смогу ли я в TWebBrowser обработать клики, наведение, уход мышки с элементов SPAN и IMG ?
P.S. Используется D6.
parovoZZ (2006-06-23 19:20:00) [1]Ну может быть, я ловил IHTMLEventObj.srcElement.getAttribute('id', 0). Но иногда это событие просто не возникало.
Gero (2006-06-23 14:17:00) [2]> [9] parovoZZ © (23.06.06 14:06)
Глючит только если руки неровные.
parovoZZ (2006-06-23 14:06:00) [3]Вся эта байда глючит, если страницу грузить в потоке. Также не работает, если нажать F5 или из контекстного меню кликнуть обновить.
Calm (2006-06-23 11:46:00) [4]Большое спасибо, Gero.
Знания HTML и JS присутствуют в хорошем объеме. Не хватало знаний (да что там, отсутствуют! :)) по работе со всем этим добром из Delphi.
Gero (2006-06-23 10:37:00) [5]> 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 10:20:00) [6]Gero, а как получить этот самый элемент
element.onmouseover = ?
Хотя бы в самых общих чертах, плиз.
palva
> Все эти события может обработать клиентский скрипт, который,
> например, через строку статуса даст знать о событии Delphi
> обработчикам.
Клиентский скрипт - подразумевается java script в html ? Через строку статуса - это как? В TWebBrowser есть событие вывода текста туда?
Если я правильно понял, вы предлагаете для каждого элемента при наведении мыши писать в строку статуса нечто, например ID элемента, а в событии изменения строки статуса этот id получать и обрабатывать в программе, верно ?
Gero (2006-06-23 02:00:00) [7]> И присваеваем нужному елементу новый обработчик:
Вернее
element.onmouseover = TWBEventHandler.Create(MyEventHandler) as IDispatch;
Gero (2006-06-23 01:43:00) [8]Можно.
Обьявляем класс:
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;
palva (2006-06-22 22:06:00) [9]> Вопрос: смогу ли я в TWebBrowser обработать клики, наведение,
> уход мышки с элементов SPAN и IMG ?
Все эти события может обработать клиентский скрипт, который, например, через строку статуса даст знать о событии Delphi обработчикам. Все это трудоемко, но можно сделать.
anton773 (2006-06-22 21:56:00) [10]
> Вопрос: смогу ли я в TWebBrowser обработать клики, наведение,
> уход мышки с элементов SPAN и IMG ?
Да. Если там будут гиперссылки
Calm (2006-06-22 17:39:00) [11]Если кому итересно - частично можно реализовать с помощью THTMLViewer
Там можно делать конструкции типа
<a href="id_01" class="<чтобы_ссылка_не_была_отличима_от_текста><span>произвольный текст"</span></a>
По клику на текст в событие будет передан url, по которому можно одноначно определить, по какой ссылке кликали.
Насчет наведения мыши, похоже, не получится.
P.S. Может мне надо было не в начинающие постить? Просто я думал, что все знают, а я один такой темный.