Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.02;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
14-3592
msalex
2002-08-03 20:24
2002.09.02
декомпилтор Delphi?


3-3248
Dino Ray
2002-08-12 01:03
2002.09.02
IDX поля типа CHAR?


1-3449
ЮРИЙ_К
2002-08-20 13:42
2002.09.02
Отловить фокус мышки на кнопке заголовка rxDBGrid


1-3358
andrey_pst
2002-08-22 07:53
2002.09.02
Маска файлов в OpenDialog.


1-3422
MikeZ
2002-08-22 16:52
2002.09.02
Как получить список запущеных exe-шников? Не окон, а файлов.