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

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

COM наследование. [D5, D6, NT4, Win2k, WinXP]


Balu ©   (2002-08-22 16:18:00) 

Мастера, может кто подскажет примером, как организовать вызов методов предка в интерфейсах если у меня есть наследник от моего же интерфеса. Если непонятно объяснил, Sorry :-(


Balu   (2002-08-22 20:28:00) [1]

Разобрался :). Огромное спасибо Romkinза ссылку http://www.techvanguards.com/com
Кому интересно вот решение:
type
TVidSporta = class(TAutoObject, IVidSporta, IDirectory)
ADOConnections: TADOConnection;
protected
procedure SetConnection(var Connection: OleVariant); safecall;

function Get_GetRecordSet(const OrderStr: WideString): OleVariant; safecall;
// Добавляем
protected
FInnerDirectory : IDirectory;
function GetInnerDirectory : IDirectory;
property InnerDirectory : IDirectory read GetInnerDirectory implements IDirectory;

end;
function TVidSporta.GetInnerDirectory : IDirectory;
begin
if (FInnerDirectory = NIL) then
FInnerDirectory := CreateComObject (Class_Directory) as IDirectory;
Result := FInnerDirectory;
end;
И вызываем предка
procedure TVidSporta.SetConnection(var Connection: OleVariant); safecall;
Var
Directory: IDirectory;
begin
Directory := GetInnerDirectory;
Directory.SetConnection(Connection);
end;


Ученик   (2002-08-22 18:23:00) [2]

>Balu © (22.08.02 17:41)
К сожалению, повторить не удается, перерегистрацию пробовали ? или заново создать библиотеку, если конечно не много написано.


Romkin   (2002-08-22 17:52:00) [3]

www.techvanguards.com


Balu   (2002-08-22 17:41:00) [4]

Я понимаю, что удаленным Debug занимаемся, пока, хотелось бы на эту тематику доку найти, а то как слепой котёнок. :(

Не могу найти ничеко в литературе и статьях


Balu   (2002-08-22 17:38:00) [5]

>Ученик © (22.08.02 17:33)
Error аналогично Balu © (22.08.02 17:29)
:)


Ученик   (2002-08-22 17:33:00) [6]

>Balu © (22.08.02 17:29)
А если V : Variant;


Balu   (2002-08-22 17:29:00) [7]

Компиляция прошла, УРА.
При использовани
Var
V: OleVariant;
begin
V := CreateOleObject("MyLibrary.VidSporta");

Получаем ERROR: "Invalid class typecast"


Ученик   (2002-08-22 17:13:00) [8]

TVidSporta = class(TDirectory, IVidSporta)


Balu   (2002-08-22 17:09:00) [9]

To Ученик
Что то не получается.

IDirectory = interface(IDispatch)
["{FA5CD531-5A43-4B3E-85BB-6B5F778381EC}"]
procedure SetConnection(var Connection: OleVariant); safecall;
end;

IVidSporta = interface(IDirectory)
["{D5CB788E-30DD-4958-A9D5-5096557773B8}"]
function Get_GetRecordSet(const OrderStr: WideString; out Value: OleVariant): HResult; stdcall;
function NewRecord: HResult; stdcall;
function DelRecord: HResult; stdcall;
end;
//------------------------------------------------------
TDirectory = class(TAutoObject, IDirectory)
procedure SetConnection(var Connection: OleVariant); safecall;
end;
TVidSporta = class(TAutoObject, IVidSporta)

// Вот тут и ругается что нужно иметь SetConnection

// procedure SetConnection(var Connection: OleVariant); safecall;

function Get_GetRecordSet(const OrderStr: WideString;
out Value: OleVariant): HResult; stdcall;
function DelRecord: HResult; stdcall;
function NewRecord: HResult; stdcall;
end;

Если снять коментарий с SetConnection, то всё нормально, но как потом вызвать этот SetConnection предка из потомка?


Ученик   (2002-08-22 16:41:00) [10]

type
IA = interface
procedure A;
end;

TA = class(TInterfacedObject, IA)
procedure A;
end;

IB = interface(IA)
procedure B;
end;

TB = class(TA, IB)
procedure B;
end;

procedure TB.B;
begin
A
end;



Наверх

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