Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.055 c
2-1194371274
Nucer
2007-11-06 20:47
2007.12.02
Сервер TCP, потоки


15-1193861017
Kick
2007-10-31 23:03
2007.12.02
Как прописать путь


11-1176540781
Vladimir Kladov
2007-04-14 12:53
2007.12.02
Обсуждение замечаний и предложений.


2-1194439289
novill
2007-11-07 15:41
2007.12.02
Как задать цвет выводимых символов в консольном приложении?


8-1170501964
Совсем новичок
2007-02-03 14:26
2007.12.02
Оперделить угол поворота





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский