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

Вниз

Как проверить реализацию интерфейса и привести к нему?   Найти похожие ветки 

 
Kolan ©   (2007-11-09 10:26) [0]

Здравствуйте,
 проведите лик. без. плз. :)

Итак есть два потомка двух разных классов.

TStructureTreeView = class(TTreeView)
 private
   FBlockID: Integer;
   FGroupID: Integer;
 public
   property BlockID: Integer read FBlockID write FBlockID;
   property GroupID: Integer read FGroupID write FGroupID;
 end;


TCustomStructureIDLabel = class(TCustomStructureLabel)
 private
   FBlockID: Integer;
   FGroupID: Integer;
 public
   property BlockID: Integer read FBlockID write FBlockID;
   property GroupID: Integer read FGroupID write FGroupID;
 end;


Изменить предков нельзя.

Мне надо пройтись в цикле и найти все объекты його и 2ого классов. Так как предки у них разные, то ессно приходится написать две похожие операции:

function TCardDataView.FindStructureTreeView(GroupID: Integer;
 LookForInComponent: TComponent): TStructureTreeView;
var
 I: Integer;
begin
 Result := nil;
 if Assigned(LookForInComponent) then
 begin
   for I := 0 to LookForInComponent.ComponentCount — 1 do
     if (LookForInComponent.Components[I] is TStructureTreeView) then
       if TStructureTreeView(LookForInComponent.Components[I]).GroupID = GroupID then
       begin
         Result := TStructureTreeView(LookForInComponent.Components[I]);
         Exit;
       end;
 end;


function TCardDataView.FindGroupNameLabel(GroupID: Integer;
 LookForInComponent: TComponent): TGroupNameLabel;
var
 I: Integer;
begin
 Result := nil;
 if Assigned(LookForInComponent) then
 begin
   for I := 0 to LookForInComponent.ComponentCount — 1 do
     if (LookForInComponent.Components[I] is TGroupNameLabel) then
       if TGroupNameLabel(LookForInComponent.Components[I]).GroupID = GroupID then
       begin
         Result := TGroupNameLabel(LookForInComponent.Components[I]);
         Exit;
       end;
 end;
end;


Как видно разница только в приведении типов.

IMyInt = interface
 property BlockID: Integer read FBlockID write FBlockID;
 property GroupID: Integer read FGroupID write FGroupID;
end;

(*)Описание интерфейса схемотичное, должнобыть понятно, имхо.

Вот если бы сделать так, чтобы оба собжевых класса реализовывали интерфейс IMyInt.
 И тут вопрос №1: Что надо перекрыть, чтобы любой класс(а не потомок TInterfacedObject) мог реализоввывать интерфейс?

Затем можнобыло бы сделать 1 процедуру типа:
if (LookForInComponent.Components[I] is IMyInt) then
       if IMyInt(LookForInComponent.Components[I]).GroupID = GroupID then


Только ессно так не получится. А как надо?


 
Джо ©   (2007-11-09 10:29) [1]

> Что надо перекрыть, чтобы любой класс(а не потомок TInterfacedObject)
> мог реализоввывать интерфейс?

Определить три метода
   function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
   function _AddRef: Integer; stdcall;
   function _Release: Integer; stdcall;


 
Kolan ©   (2007-11-09 10:30) [2]

> Определить три метода

И скопипастиьть их из TInterfacedObject, так?


 
Ega23 ©   (2007-11-09 10:34) [3]


> И скопипастиьть их из TInterfacedObject, так?


Это уж как тебе надо. Лично я внутри _AddRef и _Release счётчик сылок в -1 держу, если не хочу, чтобы объект автоматом разрушилсо.


 
Kolan ©   (2007-11-09 10:59) [4]

> Это уж как тебе надо.

Ок, с этим всё понятно. Как теперь пройтись по списочку, узнать поддерживатеся ли интерфейс и если да, то обратиться к объекту через этот интерфейс?


 
Джо ©   (2007-11-09 11:06) [5]

if Obj.GetInterface(IMyIntf,Intf) then


 
Ega23 ©   (2007-11-09 11:07) [6]

var
 imi : IMyInterface;

try
 imi := Object as IMyInterface;
except
 Не поддерживает
end;


:)


 
Kolan ©   (2007-11-09 11:42) [7]

> if Obj.GetInterface(IMyIntf,Intf) then


Так да?

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 MyInt: IMyInt;
begin
 if Form1.GetInterface(IMyInt, MyInt) then
   MyInt.Test;
end;


 
Kolan ©   (2007-11-09 11:46) [8]

Гы, так вот зачем нужен GUID в интерфейсе :) Раньше не блыо в нём необходимости&#133


 
b z   (2007-11-09 11:49) [9]


> Ega23 ©   (09.11.07 11:07) [6]

так в except никогда не попадет» Джо:» Попадет.
С диагнозом "Interface not supported".


 
Джо ©   (2007-11-09 11:49) [10]

> [7] Kolan ©   (09.11.07 11:42)
> > if Obj.GetInterface(IMyIntf,Intf) then
>
>
> Так да?
>
> procedure TForm1.BitBtn1Click(Sender: TObject);
> var
> MyInt: IMyInt;
> begin
> if Form1.GetInterface(IMyInt, MyInt) then
>   MyInt.Test;
> end;

Ага.


 
Kolan ©   (2007-11-09 11:51) [11]

А все наследники TComponent же поддерживают интерфейсы так?


 
Slym ©   (2007-11-09 11:52) [12]

зачем IInterface реализовывать?
IMyInt = interface
["{96A80746-A018-4CBE-B029-F3A464545006}"]
 function GetBlockID:Integer;
 procedure SetBlockID(const Lalue:integer);
 function GetGroupID:Integer;
 procedure SetGroupID(const Lalue:integer);
 property BlockID: Integer read GetBlockID write SetBlockID;
 property GroupID: Integer read GetGroupID write SetGroupID;
end;

а потом if LookForInComponent.Components[I].GetInterface(IMyInt,obj) then
 obj.GroupID:= GroupID;


 
Kolan ©   (2007-11-09 11:54) [13]

> зачем IInterface реализовывать?

Вопрос не понял.
ЗЫ Именно так как вы написали и хочу сделать. В к чему вопрос?


 
Джо ©   (2007-11-09 11:55) [14]

> [11] Kolan ©   (09.11.07 11:51)
> А все наследники TComponent же поддерживают интерфейсы так?

Да, у всех наследников TComponent уже реализована троица
   function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
   function _AddRef: Integer; stdcall;
   function _Release: Integer; stdcall;
Или я вопроса не понял?


 
Kolan ©   (2007-11-09 12:07) [15]

> Или я вопроса не понял?

Понял понял. Сенкс. Разобрался.


 
Ega23 ©   (2007-11-09 12:15) [16]


> Понял понял. Сенкс. Разобрался.


Смотри с ними, аккуратнее.
Когда счётчик ссылок станет равным нулю, объект грохнется автоматически.


 
Kolan ©   (2007-11-09 12:26) [17]

> Когда счётчик ссылок станет равным нулю, объект грохнется
> автоматически.

Ну я знаю. Не с интерфейсами я работал, просто обычно выстраивал свою иерархию от TInterfacedObject.


 
jack128_   (2007-11-09 14:03) [18]


> Когда счётчик ссылок станет равным нулю, объект грохнется
> автоматически.

Для компоненттов - это не верно...


 
Ega23 ©   (2007-11-09 14:07) [19]


> Для компоненттов - это не верно...


Я не знаю, надо в реализацию посмотреть.



Страницы: 1 вся ветка

Текущий архив: 2007.12.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
6-1175239084
Xerx
2007-03-30 11:18
2007.12.02
Альтернатива NetSessionDel


2-1194634607
Dmitry_177
2007-11-09 21:56
2007.12.02
отловить клавишу Delete


2-1194357802
pasha_golub
2007-11-06 17:03
2007.12.02
Ошибка при вызове SHFileOperation после ForceDirectories


11-1178473386
Dmitry___
2007-05-06 21:43
2007.12.02
KOLProject - Build := TRUE


15-1193828749
Vadiiim
2007-10-31 14:05
2007.12.02
Preview форматов в Windows