Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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;
App.Documents
- возващает nil.

Заранее благодарю.


Набережных С.   (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  можно ожидать от именно такойреализации данной ф-ции ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо