Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.27;
Скачать: CL | DM;

Вниз

Реализация интерфейсов   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2008.01.27;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
4-1182844547
Shakesbeer
2007-06-26 11:55
2008.01.27
Определить, запущен ли exe, не составляя список процессов.


2-1198917596
Dana
2007-12-29 11:39
2008.01.27
Ограничение на ввод в строки DBGrid


1-1193207699
Unknown user
2007-10-24 10:34
2008.01.27
Как заставить TCustomWinSocket не генерить исключения?


15-1198163457
oldman
2007-12-20 18:10
2008.01.27
Разве так нельзя создавать образ диска?


2-1198772246
Ega
2007-12-27 19:17
2008.01.27
Как прочесть текстовый файл в widestring?