Форум: "KOL";
Текущий архив: 2008.01.27;
Скачать: [xml.tar.bz2];
ВнизРеализация интерфейсов Найти похожие ветки
← →
SPeller_work (2007-06-26 04:52) [0]Всем снова привет. Если я совсем глупые вопросы задаю - пожалуйста ткните носом, буду рад. Проблема такая: есть портированный в KOL TWebBrowser = object(TOleCtl). Нужно чтобы он реализовывал, кроме всего прочего, еще и интерфейс IDocHostUIHandler. В VCL можно было просто написать TCustomizedWebBrowser = class(TWebBrowser, IDocHostUIHandler), а как сотворить подобное в KOL? Нужно настраивать внешний вид и поведение браузера через метод IDocHostUIHandler.GetHostInfo, который должен вызываться системой. Как воплотить это в жизнь - не могу понять. Прошу помощи.
← →
SPeller_work (2007-06-26 09:29) [1]конструкция TMyWebBrowser = object(TWebBrowser, IDocHostUIHandler) компилится, и даже ругается на отсутсвие реализаций методов интерфейса, но не работает.
← →
SPeller_work (2007-06-26 11:05) [2]Проще всего именно так как в VCL - TDocHostUIHandler = class(Tobject, IUnknown, IDispatch, IDocHostUIHandler) и реализовываешь все интрерфейсы.
Ибо object никаких интерфейсов не понимает.
В KOL не получится реализовывать IDocHostUIHandler у наследника TKOLWebBrowser ибо TKOLWebBrowser - не class.
Вообщем если нужно могу дать рабочий пример, там правда менюшки IE скрываются , но тоже через IDocHostUIHandler.
← →
vpbar (2007-06-26 11:05) [3]Проще всего именно так как в VCL - TDocHostUIHandler = class(Tobject, IUnknown, IDispatch, IDocHostUIHandler) и реализовываешь все интрерфейсы.
Ибо object никаких интерфейсов не понимает.
В KOL не получится реализовывать IDocHostUIHandler у наследника TKOLWebBrowser ибо TKOLWebBrowser - не class.
Вообщем если нужно могу дать рабочий пример, там правда менюшки IE скрываются , но тоже через IDocHostUIHandler.
← →
vpbar (2007-06-26 11:06) [4]Прошу прощения, не под тем именем добавил (SPeller_work (26.06.07 11:05) [2] - это я)
← →
SPeller_work (2007-06-26 11:17) [5]Пример на kol? буду благодарен на pravdin a farpost.com
(_a_ заменить на собачку)
← →
SPeller_work (2007-06-26 11:20) [6]Вроде можно получить нужный интерфейс от самого webbrowser-а, и через него манипулировать, но что-то не могу понять, как это делать.
← →
SPeller_work (2007-06-26 11:36) [7]И еще, где в ActiveKOL аналог GetInterface?
← →
homm © (2007-06-26 11:45) [8]> И еще, где в ActiveKOL аналог GetInterface?
Я в интерфесах не очень разбирался, но QueryInterface это не оно?
← →
SPeller_work (2007-06-26 11:56) [9]QueryInterface тоже нет. Похоже это делается через ControlInterface.QueryInterface.
← →
Vladimir Kladov (2007-06-26 16:08) [10]У вас под D6 компилируется? Сегодня OLERE поправлял, не хотело. Пришлось бубном его, бубном (KOLComObj). Обновлю сегодня.
← →
SPeller © (2007-06-26 16:53) [11]Под 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 я в принципе готов отказаться, т.к. не требуется в данный момент, и в обозримом будущем тоже.
← →
vpbar (2007-06-26 18:17) [12]>> SPeller © (26.06.07 16:53) [11]
>> От функционала коловского TControl я в принципе готов отказаться
а зачем вам тогда вообще КОЛ использовать?
>>Кстати, а можно переписать коловский TWebBrowser так чтобы он был классом,
В смысле классом? Это чтоб Class() вместо Object() - то можно. В простейшем случае просто заменой Object на Class в объявлении.
← →
SPeller © (2007-06-27 03:37) [13]
> а зачем вам тогда вообще КОЛ использовать?
Имеется ввиду что для компонента браузера не требуется.
> В простейшем случае просто заменой Object на Class в объявлении
он наследуется от объекта, в этом вся сложность. а у меня еще флеш )
← →
SPeller_work (2007-06-27 05:55) [14]Я поборол! :))
Изменения коснулись модуля 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_work (2007-06-27 05:58) [15]Забыл оформить. В методе TOleCtl.Init строки
if (assigned(OnGetIntfClass)) then
intfClass := OnGetIntfClass();
else
intfClass := TOleCtlIntf;
тоже добавлены, забыл комменты приписать перед постингом.
Думаю, это можно добавить в дистрибутив, потому что многим наверное еще захочется внедрять реализации интерфейсов в разные актив-икс компоненты.
← →
SPeller_work (2007-06-27 13:01) [16]Нашел тут еще очень хороший VCL-пример на rsdn.ru, который успешно был адаптирован под КОЛ. Радуюсь :) С небольшими модификациями ActiveKOL реализовал уже вызов из скриптов хтмл-странички функции в своей программе. Основное сделал. Если Владимиру интересно - могу выслать свой ActiveKOL, и пример использования.
← →
homm © (2007-06-27 13:04) [17]Я думаю не тольео Владимиру интересно :)
← →
Vladimir Kladov (2007-06-27 16:52) [18]Так присылайте. Долго ли обновить, коли уже написано.
← →
SPeller_work (2007-06-28 05:45) [19]мыло - то что в ссылке с ником?
← →
SPeller_work (2007-06-28 08:39) [20]вобщем не стал ждать: http://speller.narod.ru/files/other/ActiveKOL.rar
Из неучтенных изменений - добавлен виртуальный конструктор в TOleCtlIntf чтобы в потомке можно было его перекрывать и выполнять какие-либо действия при создании класса. Пример потом выложу.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2008.01.27;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c