Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];

Вниз

Момент нажатия ссылки в WebBrowser e   Найти похожие ветки 

 
smok_er   (2002-10-15 14:57) [0]

Мастера!
Помогите пожалуйста с сабжем.
Событие beforeNavigate не подходит, т.к. вызывается несколько раз во время загрузки документа, например если в нем есть фреймы.
А нужно отловить событие начала загрузки документа...

Заранее огромное спасибо!


 
int64   (2002-10-16 03:04) [1]

Если проблема только во фреймах, то можно в beforeNavigate проверять:

if TargetFrameName<>"" then {то, что хотел выполнить}

Хотя, имхо, надо ещё подумать и о зарезервированых именах фреймов (_blank, _self, ...). Не будет ли здесь граблей.

Если ничего не поможет, тогда уже ловить клики.


 
smok_er   (2002-10-16 03:23) [2]

Вот и хотелось бы узнать, как их отлавливать...
Можете дать кусок исходника?


 
int64   (2002-10-16 04:07) [3]

Подключение к событиям объектной модели DHTML:

http://rsdn.ru/article/default.asp?inet/dhtmlspy.xml

Правда на Сях. Может под Д переведу (только не сегодня) - покажу. А не переведу - не покажу.


 
smok_er   (2002-10-16 22:47) [4]

Спасибо! Но лучше конечно это увидеть на родном и близком к сердцу делфи :) Если будет время, переведите пожалуйста.


 
int64   (2002-10-17 09:19) [5]

Ну нет, статью переводить не буду. Вопервых, не благодарное занятие; вовторых перевод с языка на язык это даже не вольная интерпретация - надо заново статью писать. Втретьих, если уж очень интересует механизм ConnectionPoint, то видел когда-то статью на http://community.borland.com. Точной ссылки не помню.


 
int64   (2002-10-17 10:13) [6]

Вот ещё вариант набросал, как к событиям подключаться. Сам доработаешь.
Я ловлю события линков onclick и onmousemove. Можно все элементы на один объект натянуть, т.н. группой обслуживать. А можно на каждый линк свой объект создавать.

....

TDocEvent = class(TObject, IUnknown, IDispatch)
private
FRefCount: Integer;
FEventDisp: IDispatch;
FName: string;
{ IUnknown }
function QueryInterface(const IID: TGUID; out Obj): Integer; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
{ IDispatch }
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;
procedure SetName(const Value: string);
public
constructor Create(AName: string; event: OleVariant);
property Name: string read FName write SetName;
end;

var
Form1: TForm1;
DocEventClick, DocEventMouseMove: TDocEvent;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate("c:\temp\events.htm");
end;

function TDocEvent.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := S_OK
else
Result := E_NOINTERFACE;
end;

function TDocEvent._AddRef: Integer;
begin
Inc(FRefCount);
Result := FRefCount;
end;

function TDocEvent._Release: Integer;
begin
Dec(FRefCount);
Result := FRefCount;
end;

function TDocEvent.GetTypeInfoCount(out Count: Integer): HResult;
begin
if FEventDisp <> nil then
Result := FEventDisp.GetTypeInfoCount(Count)
else begin
Count := 0;
Result := S_OK;
end;
end;

function TDocEvent.GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
begin
if FEventDisp <> nil then
Result := FEventDisp.GetTypeInfo(Index, LocaleID, TypeInfo)
else begin
Pointer(TypeInfo) := nil;
Result := E_NOTIMPL;
end
end;

function TDocEvent.GetIDsOfNames(const IID: TGUID; Names:

Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
if FEventDisp <> nil then
Result := FEventDisp.GetIDsOfNames(IID, Names, NameCount, LocaleID, DispIDs)
else
Result := E_NOTIMPL;
end;

constructor TDocEvent.Create(AName: string; event: OleVariant);
begin
inherited Create;
FName:= AName;
if not VarIsNull(event) then
FEventDisp := IDispatch(event);
end;

procedure TDocEvent.SetName(const Value: string);
begin
FName := Value;
end;

function TDocEvent.Invoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
begin
try
if Name="DocEventClick" then
MessageDlg("DocEventClick", mtinformation, [mbok], 0);
if Name="DocEventMouseMove" then
Form1.Caption:= TimeTostr(Time);
except
//
end;
//след. строчки, чтоб не потерять обработчики из скриптов документа
if FEventDisp <> nil then
begin
Result := FEventDisp.Invoke(DispID, IID, LocaleID, Flags, Params,
VarResult, ExcepInfo, ArgErr);
end else
Result := E_NOTIMPL;
end;

procedure TForm1.WebBrowser1DocumentComplete(Sender:

TObject; pDisp: IDispatch;
var URL: OleVariant);
var
vA, vDoc, vColl: OleVariant;
i: integer;
begin
vDoc := WebBrowser1.Document;
vColl := vDoc.Links;// или то, что надо
for i := 0 to vColl.length - 1 do
begin
va:= vColl.item(i);
DocEventClick:=TDocEvent.Create("DocEventClick", vA.onclick);
vA.onclick := OleVariant(DocEventClick as IDispatch);
DocEventMouseMove:=TDocEvent.Create("DocEventMouseMove", vA.onMouseMove);
vA.onMouseMove := OleVariant(DocEventMouseMove as IDispatch);
end;
end;


end.

Идея, в принципе, понятна. Дерзай.



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

Форум: "Основная";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
14-92652
Aga
2002-10-05 20:35
2002.10.28
АААААааа-ааа-ааа!!!! Помогите!!!


1-92596
Gari
2002-10-16 08:33
2002.10.28
Инспектор объектов


1-92416
evgen_2001
2002-10-17 10:17
2002.10.28
Консольные приложения.


1-92550
Destroyer
2002-10-16 13:37
2002.10.28
VarArrayCreate


14-92695
raiv
2002-10-08 09:56
2002.10.28
Уважаемые знатоки Delphi, у меня к Вам вот такой вопрос.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский