Форум: "Основная";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];
ВнизCOM наследование. Найти похожие ветки
← →
Balu (2002-08-22 16:18) [0]Мастера, может кто подскажет примером, как организовать вызов методов предка в интерфейсах если у меня есть наследник от моего же интерфеса. Если непонятно объяснил, Sorry :-(
← →
Ученик (2002-08-22 16:41) [1]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;
← →
Balu (2002-08-22 17:09) [2]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 17:13) [3]TVidSporta = class(TDirectory, IVidSporta)
← →
Balu (2002-08-22 17:29) [4]Компиляция прошла, УРА.
При использовани
Var
V: OleVariant;
begin
V := CreateOleObject("MyLibrary.VidSporta");
Получаем ERROR: "Invalid class typecast"
← →
Ученик (2002-08-22 17:33) [5]>Balu © (22.08.02 17:29)
А если V : Variant;
← →
Balu (2002-08-22 17:38) [6]>Ученик © (22.08.02 17:33)
Error аналогично Balu © (22.08.02 17:29)
:)
← →
Balu (2002-08-22 17:41) [7]Я понимаю, что удаленным Debug занимаемся, пока, хотелось бы на эту тематику доку найти, а то как слепой котёнок. :(
Не могу найти ничеко в литературе и статьях
← →
Romkin (2002-08-22 17:52) [8]www.techvanguards.com
← →
Ученик (2002-08-22 18:23) [9]>Balu © (22.08.02 17:41)
К сожалению, повторить не удается, перерегистрацию пробовали ? или заново создать библиотеку, если конечно не много написано.
← →
Balu (2002-08-22 20:28) [10]Разобрался :). Огромное спасибо 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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c