![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Реализация интерфейсов [D7]
SPeller_work © (2007-06-26 04:52:00)Всем снова привет. Если я совсем глупые вопросы задаю - пожалуйста ткните носом, буду рад. Проблема такая: есть портированный в KOL TWebBrowser = object(TOleCtl). Нужно чтобы он реализовывал, кроме всего прочего, еще и интерфейс IDocHostUIHandler. В VCL можно было просто написать TCustomizedWebBrowser = class(TWebBrowser, IDocHostUIHandler), а как сотворить подобное в KOL? Нужно настраивать внешний вид и поведение браузера через метод IDocHostUIHandler.GetHostInfo, который должен вызываться системой. Как воплотить это в жизнь - не могу понять. Прошу помощи.
SPeller_work (2007-06-28 08:39:00) [1]вобщем не стал ждать: http://speller.narod.ru/files/other/ActiveKOL.rar
Из неучтенных изменений - добавлен виртуальный конструктор в TOleCtlIntf чтобы в потомке можно было его перекрывать и выполнять какие-либо действия при создании класса. Пример потом выложу.
SPeller_work (2007-06-28 05:45:00) [2]мыло - то что в ссылке с ником?
Vladimir Kladov (2007-06-27 16:52:00) [3]Так присылайте. Долго ли обновить, коли уже написано.
homm (2007-06-27 13:04:00) [4]Я думаю не тольео Владимиру интересно :)
SPeller_work (2007-06-27 13:01:00) [5]Нашел тут еще очень хороший VCL-пример на rsdn.ru, который успешно был адаптирован под КОЛ. Радуюсь :) С небольшими модификациями ActiveKOL реализовал уже вызов из скриптов хтмл-странички функции в своей программе. Основное сделал. Если Владимиру интересно - могу выслать свой ActiveKOL, и пример использования.
SPeller_work (2007-06-27 05:58:00) [6]Забыл оформить. В методе TOleCtl.Init строки
if (assigned(OnGetIntfClass)) then
intfClass := OnGetIntfClass();
else
intfClass := TOleCtlIntf;
тоже добавлены, забыл комменты приписать перед постингом.
Думаю, это можно добавить в дистрибутив, потому что многим наверное еще захочется внедрять реализации интерфейсов в разные актив-икс компоненты.
SPeller_work (2007-06-27 05:55:00) [7]Я поборол! :))
Изменения коснулись модуля ActiveKOL. Так как кол-реализация всё-равно не может обойтись без классов, то там был введен тупиковый по замыслу тип TOleCtlIntf, который является реализатором нужных интерфейсов, и по сути аналогом того, с чем мы непосредственно работаем в VCL. А TOleCtl лишь оболочка. Поэтому мне пришла в голову закономерная мысль - надо наследоваться от TOleCtlIntf! Следуя идеологии KOL и ограничениям объектов, родилась такая реализация:
(добавленное отмечено комментарием в конце строки)
unit ActiveKOL;
...
TOleCtlIntfClass = class of TOleCtlIntf; //
TOleCtlIntf = class( TObject, IUnknown, IOleClientSite,
...
TOnGetIntfClass = function(): TOleCtlIntfClass of object; //
TOleCtl = object( TControl )
private
FOnGetIntfClass: TOnGetIntfClass; //
...
protected
property OnGetIntfClass: TOnGetIntfClass read FOnGetIntfClass write FOnGetIntfClass; //
...
end;
...
implementation
...
procedure TOleCtl.Init;
var
I: Integer;
intfClass: TOleCtlIntfClass; //
...
if (assigned(OnGetIntfClass)) then
intfClass := OnGetIntfClass();
else
intfClass := TOleCtlIntf;
fOleCtlIntf := intfClass.Create;
//fOleCtlIntf := TOleCtlIntf.Create;
Теперь нужно создать наследника от обёртки над activeX компонентом и наследника от TOleCtlIntf, который будет реализовывать нужный нам интерфейс:
unit mywb;
interface
TMyDocHost = class(TOleCtlIntf, IDocHostUIHandler)
...
end;
PMyWebBrowser = ^TMyWebBrowser;
TMyWebBrowser = object(TWebBrowser)
protected
procedure Init; virtual;
function DoGetIntfClass: TOleCtlIntfClass;
end;
implementation
{ TMyWebBrowser }
function TMyWebBrowser.DoGetIntfClass: TOleCtlIntfClass;
begin
Result := TMyDocHost;
end;
procedure TMyWebBrowser.Init;
begin
OnGetIntfClass := DoGetIntfClass;
inherited;
end;
...
SPeller (2007-06-27 03:37:00) [8]
> а зачем вам тогда вообще КОЛ использовать?
Имеется ввиду что для компонента браузера не требуется.
> В простейшем случае просто заменой Object на Class в объявлении
он наследуется от объекта, в этом вся сложность. а у меня еще флеш )
vpbar (2007-06-26 18:17:00) [9]>> SPeller © (26.06.07 16:53) [11]
>> От функционала коловского TControl я в принципе готов отказаться
а зачем вам тогда вообще КОЛ использовать?
>>Кстати, а можно переписать коловский TWebBrowser так чтобы он был классом,
В смысле классом? Это чтоб Class() вместо Object() - то можно. В простейшем случае просто заменой Object на Class в объявлении.
SPeller (2007-06-26 16:53:00) [10]Под D6 не проверял. На работе только 7, там ActiveKOL с сайта kolnmck.ru и KOLComObj скомпилились без проблем.
2 vpbar:
Спасибо за пример. Эту реализацию видел на сях, но что-то не очень хотелось применять замену хэндлера, поскольку сам микрософт не советует этого делать. И еще вот тут: http://msdn2.microsoft.com/en-us/library/aa753260.aspxсоветуется сохранить старый хэндлер, но метод GetClientSite возвращает тип IOleClientSite, который не приводится к типу IDocHostUIHandler и не возвращается через IOleClientSite.QueryInterface. Вот такая проблема. Подавить менюшку удалось, но метод управления оным я опустил. Нужный метод TDocHostUIHandler.GetHostInfo не вызывается перед показом контрола, и контрол остается с рамкой, полосами прокрутки и контекстным меню. Вызывается после клика правой кнопкой, но действия всё-равно не имеет. Код TDocHostUIHandler.GetHostInfo такой:
function TDocHostUIHandler.GetHostInfo(var pInfo: TDOCHOSTUIINFO): HRESULT;
begin
pInfo.dwFlags :=
DOCHOSTUIFLAG_NO3DBORDER or DOCHOSTUIFLAG_DIALOG or
DOCHOSTUIFLAG_DISABLE_HELP_MENU or DOCHOSTUIFLAG_SCROLL_NO or
DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY;
pInfo.dwDoubleClick := DOCHOSTUIDBLCLK_DEFAULT;
Result := S_OK;
end;
Кстати, а можно переписать коловский TWebBrowser так чтобы он был классом, но не тянул за собой VCL? Тогда можно будет заставить его обычным способом реализовывать нужный интерфейс. От функционала коловского TControl я в принципе готов отказаться, т.к. не требуется в данный момент, и в обозримом будущем тоже.
Vladimir Kladov (2007-06-26 16:08:00) [11]У вас под D6 компилируется? Сегодня OLERE поправлял, не хотело. Пришлось бубном его, бубном (KOLComObj). Обновлю сегодня.
SPeller_work (2007-06-26 11:56:00) [12]QueryInterface тоже нет. Похоже это делается через ControlInterface.QueryInterface.
homm (2007-06-26 11:45:00) [13]> И еще, где в ActiveKOL аналог GetInterface?
Я в интерфесах не очень разбирался, но QueryInterface это не оно?
SPeller_work (2007-06-26 11:36:00) [14]И еще, где в ActiveKOL аналог GetInterface?
SPeller_work (2007-06-26 11:20:00) [15]Вроде можно получить нужный интерфейс от самого webbrowser-а, и через него манипулировать, но что-то не могу понять, как это делать.
SPeller_work (2007-06-26 11:17:00) [16]Пример на kol? буду благодарен на pravdin a farpost.com
(_a_ заменить на собачку)
vpbar (2007-06-26 11:06:00) [17]Прошу прощения, не под тем именем добавил (SPeller_work (26.06.07 11:05) [2] - это я)
vpbar (2007-06-26 11:05:00) [18]Проще всего именно так как в VCL - TDocHostUIHandler = class(Tobject, IUnknown, IDispatch, IDocHostUIHandler) и реализовываешь все интрерфейсы.
Ибо object никаких интерфейсов не понимает.
В KOL не получится реализовывать IDocHostUIHandler у наследника TKOLWebBrowser ибо TKOLWebBrowser - не class.
Вообщем если нужно могу дать рабочий пример, там правда менюшки IE скрываются , но тоже через IDocHostUIHandler.
SPeller_work (2007-06-26 11:05:00) [19]Проще всего именно так как в VCL - TDocHostUIHandler = class(Tobject, IUnknown, IDispatch, IDocHostUIHandler) и реализовываешь все интрерфейсы.
Ибо object никаких интерфейсов не понимает.
В KOL не получится реализовывать IDocHostUIHandler у наследника TKOLWebBrowser ибо TKOLWebBrowser - не class.
Вообщем если нужно могу дать рабочий пример, там правда менюшки IE скрываются , но тоже через IDocHostUIHandler.
SPeller_work (2007-06-26 09:29:00) [20]конструкция TMyWebBrowser = object(TWebBrowser, IDocHostUIHandler) компилится, и даже ругается на отсутсвие реализаций методов интерфейса, но не работает.