Форум: "Начинающим";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
ВнизВозможности 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c