![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OLE automation
Алексей Петухов © (2006-01-11 14:13:00)Здравствуйте, уважаемые Мастера.
Подскажите, как вернуть ссылку на объект?
Делаю так:
PFRSrv_TLB.pas:
1. СоздалActiveX Library,Automftion Object.
2.CoClass - "Application", Interface "_Application"(включил вCoClass "Application").
3. Добавил интерфейс"Documents".В нём есть функцияCount.
4. Затем в"_Application"добавил свойство"Documents"типа" struct tag Documents *",параметр"prop"типа"Documents **".
5. В итоге имеем функцию :
function TApplication.Get_Documents: Documents;
begin
end;
теперь код:
App:=CreateComObject(PFRSrv_TLB.CLASS_Application)as PFRSrv_TLB._Application;- возващает nil.
App.Documents
Заранее благодарю.
Набережных С. (2006-01-11 21:21:00) [1]Скорее всего, в данном случае достаточно будет реализовать IDocuments в том же объекте, который реализует IApplication. Такое вот подозрение:))
> 1. Interface - это не класс как таковой?
Нет. Интерфейс - это структура, полями которой являются указатели на методы, т. е. она содержит поля процедурного типа. Интерфейс можно представить таким псевдокодом:
TAddRef = function(...
TRelease = function(..
TQueryInterface = function(...
IUnknown = record
AddRef: TAddRef;
Release: TRelease;
QueryInterface: TQuertyInterface;
end;
TMyMethod1 = function(Param: TSomeType1): HResult;
TMyMethod2 = function(Param: TSomeType2): HResult;
IMyInterface = packed record
BaseInterface: IUnknown;
MyMethod1: TMyMethod1;
MyMethod2: TMyMethod2
end;
Это достаточно грубое представление, на самом деле интерфейсная переменная "устроена" чуть иначе, она указатель на указатель, но это уже несущественные в данном случае детали. Важно то, что интерфейс - это просто "декларация о намерениях".
Когда в классе реализуется какой-то интерфейс, то это означает, что в составе класса есть такая структура, заполненная указателями на методы этого класса. Так что в создании экземпляра интерфейса никакого смысла нет, да и не возможно. Чтобы использовать интерфейс, он должен быть реализован каким-то классом.
Сразу скажу, что для практической работы этого описания совершенно недостаточно, без чтения книг и документации не обойтись.
Алексей Петухов (2006-01-11 19:19:00) [2]Немного недопонял.
1. Interface - это не класс как таковой?
2. Если в Documents будут создаваться документы по требованию пользователся (Documents.items[i]). То этот объект надо создать заранее при конструировании Application?
3. В чем различия класса/объекта и интерфейса?
Digitman (2006-01-11 18:30:00) [3]
> т.е. объект Documents надо еще создать?
Ну а как же иначе ?
Обращение к св-ву объекта предполагает существование этого объекта !
> А он не создается при созданни интерфейса Application автоматом?
С какого перепугу ?
За это ты сам ответственен.
Ты можешь создать его в любой удобный тебе момент - при конструировании объекта Application или прямо в теле метода Get_Documents .. Все зависит от конечной логики использования этого объекта ..
> как тогда создать объек типа interface?
никак.
тобой д.б. создан объект класса-наследника , например, TInterfacedObject, который реализует интерфейс Documents
Алексей Петухов (2006-01-11 18:23:00) [4]т.е. объект Documents надо еще создать?
хммм
А он не создается при созданни интерфейса Application автоматом?
А как тогда создать объек типа interface?
Алексей Петухов (2006-01-11 18:20:00) [5]Ну к примеру мне нужно ужнать колличество документов:
App.Documents.Count
Дело в том что у меня нет омыта работы сActiveXиинтерфейсамисобственного изоговления. Может поэтому и небыл понят?
Спасибо за преренос в "новички" :-)
Digitman (2006-01-11 18:19:00) [6]
> Что написать в теле функции после Result:= ?
Result := Create/GetSomeDocumentsObject as Documents;
Алексей Петухов (2006-01-11 18:14:00) [7]Да....
Вы что думаете я контуженный?
Может быть не совсем корректно задан вопрос....
Вопрос:
как вернуть ссылку на объектDocuments?
еще точнее: Что написать в теле функции послеResult:=?
Digitman (2006-01-11 14:21:00) [8]
> имеем функцию :
> function TApplication.Get_Documents: Documents;
> begin
> end;
> App.Documents - возващает nil.
а что иное кроме nil можно ожидать от именно такойреализации данной ф-ции ?