![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;