Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1198055878
Kolan
2007-12-19 12:17
2008.01.27
Delphi не ищет в подпапках SearchPath.


2-1198778448
art36
2007-12-27 21:00
2008.01.27
Как реализовать процесс вставки данных в браузер? Точнее...


2-1198472251
mikola
2007-12-24 07:57
2008.01.27
индикатор загрузки отправки


2-1199220887
DmT
2008-01-01 23:54
2008.01.27
Как получить доступ на чтение к переменной из другого юнита?


15-1198146970
Alkid
2007-12-20 13:36
2008.01.27
PIF-файл





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