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

Вниз

Как отлавливать события для IWebBrowser2?   Найти похожие ветки 

 
Zelius   (2003-01-14 13:33) [0]

Я понял, что нужно использовать IConnectionPoint, но у меня нету опыта в создании такий конструкций :( Помогите примером или ссылкой на статью! Спасибо!


 
Ihor Osov'yak   (2003-01-14 16:12) [1]

Вариант первый и основной. Подумать об использовании TWebBrowser или TInternetExplorer. И все проблемы исчезнут.

Если это не катит (немного поднапрягу фантазию и могу предположить, что Вы получили IWebBrowser2 от уже запущеной не Вами IE), то действительно - IConnectionPoint.

Примерно так:


<pre>
procedure TDWebBrowserEvents2.Connect (pSource : IUnknown);
var
pcpc : IConnectionPointContainer;
begin
Assert (pSource <> NIL);
try
OleCheck (pSource.QueryInterface (IConnectionPointContainer, pcpc));
OleCheck (pcpc.FindConnectionPoint (FSinkIID, F_CP));
OleCheck (F_CP.Advise (Self, FCookie));
F_Source := pSource;
except
raise Exception.Create (Format ("Unable to connect %s."#13"%s",
["TDWebBrowserEvents2", Exception (ExceptObject).Message]
));
end; { finally }
end;
</pre>


Понятно, что TDWebBrowserEvents2 должен имплементировать
IUnknown, IDispatch
ну и далее примерно так:

далее будет


 
Ihor Osov'yak   (2003-01-14 16:12) [2]



procedure BuildPositionalDispIds (pDispIds : PDispIdList; const dps : TDispParams);
var
i : integer;
begin
Assert (pDispIds <> NIL);

{ by default, directly arrange in reverse order }
for i := 0 to dps.cArgs - 1 do
pDispIds^ [i] := dps.cArgs - 1 - i;

{ check for named args }
if (dps.cNamedArgs <= 0) then Exit;

{ parse named args }
for i := 0 to dps.cNamedArgs - 1 do
pDispIds^ [dps.rgdispidNamedArgs^ [i]] := i;
end;



function TDWebBrowserEvents2.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
type
POleVariant = ^OleVariant;
var
dps : TDispParams absolute Params;
bHasParams : boolean;
pDispIds : PDispIdList;
iDispIdsSize : integer;

begin
Result := DISP_E_MEMBERNOTFOUND;

{ validity checks }
if (Flags AND DISPATCH_METHOD = 0) then
raise Exception.Create (
Format ("%s only supports sinking of method calls!", [ClassName]
));

{ build pDispIds array. this maybe a bit of overhead but it allows us to
sink named-argument calls such as Excel"s AppEvents, etc!
}
pDispIds := NIL;
iDispIdsSize := 0;
bHasParams := (dps.cArgs > 0);
if (bHasParams) then
begin
iDispIdsSize := dps.cArgs * SizeOf (TDispId);
GetMem (pDispIds, iDispIdsSize);
end; { if }

try
{ rearrange dispids properly }
if (bHasParams) then BuildPositionalDispIds (pDispIds, dps);

//SinkInvoke//
case DispId of
102 :
begin
DoStatusTextChange (dps.rgvarg^ [pDispIds^ [0]].bstrval);
Result := S_OK;
end;
108 :
begin
DoProgressChange (dps.rgvarg^ [pDispIds^ [0]].lval, dps.rgvarg^ [pDispIds^ [1]].lval);
Result := S_OK;
end;
105 :
begin
DoCommandStateChange (dps.rgvarg^ [pDispIds^ [0]].lval, dps.rgvarg^ [pDispIds^ [1]].vbool);
Result := S_OK;
end;
106 :
begin
DoDownloadBegin ();
Result := S_OK;
end;
104 :
begin
DoDownloadComplete ();
Result := S_OK;
end;
113 :
begin
DoTitleChange (dps.rgvarg^ [pDispIds^ [0]].bstrval);
Result := S_OK;
end;
112 :
begin
DoPropertyChange (dps.rgvarg^ [pDispIds^ [0]].bstrval);
Result := S_OK;
end;
250 :
begin
DoBeforeNavigate2 (IDispatch (dps.rgvarg^ [pDispIds^ [0]].dispval), POleVariant (dps.rgvarg^ [pDispIds^ [1]].pvarval)^, POleVariant (dps.rgvarg^ [pDispIds^ [2]].pvarval)^, POleVariant (dps.rgvarg^ [pDispIds^ [3]].pvarval)^, POleVariant (dps.rgvarg^ [pDispIds^ [4]].pvarval)^, POleVariant (dps.rgvarg^ [pDispIds^ [5]].pvarval)^, dps.rgvarg^ [pDispIds^ [6]].pbool^);
Result := S_OK;
end;
251 :
begin
DoNewWindow2 (IDispatch (dps.rgvarg^ [pDispIds^ [0]].pdispval^), dps.rgvarg^ [pDispIds^ [1]].pbool^);
Result := S_OK;
end;
252 :
begin
DoNavigateComplete2 (IDispatch (dps.rgvarg^ [pDispIds^ [0]].dispval), POleVariant (dps.rgvarg^ [pDispIds^ [1]].pvarval)^);
Result := S_OK;
end;
259 :
begin
DoDocumentComplete (IDispatch (dps.rgvarg^ [pDispIds^ [0]].dispval), POleVariant (dps.rgvarg^ [pDispIds^ [1]].pvarval)^);
Result := S_OK;
end;
253 :
begin
DoOnQuit ();
Result := S_OK;
end;
254 :
begin
DoOnVisible (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
255 :
begin
DoOnToolBar (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
256 :
begin
DoOnMenuBar (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
257 :
begin
DoOnStatusBar (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
258 :
begin
DoOnFullScreen (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
260 :
begin
DoOnTheaterMode (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
end; { case }
//SinkInvokeEnd//
finally
{ free pDispIds array }
if (bHasParams) then FreeMem (pDispIds, iDispIdsSize);
end; { finally }
end;




 
Zelius   (2003-01-14 16:32) [3]

Большое спасибо!
Я уже нашел TDWebBrowserEvents2! Но все равно спасибо! :)



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

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

Наверх





Память: 0.46 MB
Время: 0.008 c
3-29725
denis24
2003-02-19 10:28
2003.03.10
Вставка в ячейку Dbrid компонента


3-29778
User_OKA
2003-02-06 09:12
2003.03.10
Сортировка LokUp-полей


3-29782
User_OKA
2003-02-19 10:01
2003.03.10
сотировка по LookUp-полям


14-30028
OlegM
2003-02-19 07:20
2003.03.10
Какие можно писать проги имея нелицензионную Delphi


6-29978
Николай Быков
2003-01-10 03:10
2003.03.10
Browser.ExecWB();





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский