Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отличить переменную на TObject от перменной IInterface


Priest ©   (2006-08-16 10:47:00) 

Есть код

 IMy = interface(IInterface)
   ['{5CA75D2E-30DC-4D3F-BDA5-F3790849A160}']
 end;

TMyComponent = class(TComponent, IMy)
end

Создан метод

procedure MyProcedure(My:IMy);
begin
end;

Я хочу проверить в методе MyProcedure является ли My переменной типа TMyComponent. Можно ли сделать такое?


Priest   (2006-08-16 11:22:00) [1]

>>MBo
Это я сам запутался :(


MBo   (2006-08-16 11:15:00) [2]

>Получается что у  O есть таблица с реализованными интерфейсами и я вижу какие реализованы........А у I такой таблицы нет....Вот тепреь нужно как то проверить :)

Ничего не понял...
Таблица интерфейсов есть у объекта. У интерфейса ее, естественно, нет. Чего проверять-то???


Priest   (2006-08-16 11:12:00) [3]

Да. Я не прав :(


Сергей М.   (2006-08-16 11:11:00) [4]


> получается что я передал переченную типа TMyComponent


А фактически в MyProcedure() попадет не компонент, а интерфейс.
Интерфейс же "безлик".
Так что придется выкручиваться, например, как в [4].


Priest   (2006-08-16 11:05:00) [5]

>>нет, ты передал интерфейс, приведение типа выполнится автоматически
Экспериментирую с кодом

O := TMyComponent.Create(nil);
I:=O;
PIT:=O.GetInterfaceTable;
for j:=0 to PIT.EntryCount-1 do
 WriteLn(GUIDToString(PIT.Entries[j].IID));

Получается что у  O есть таблица с реализованными интерфейсами и я вижу какие реализованы........А у I такой таблицы нет....Вот тепреь нужно как то проверить :)


MBo   (2006-08-16 10:57:00) [6]

А, вот ты о чем...

>И получается что я передал переченную типа TMyComponent

нет, ты передал интерфейс, приведение типа выполнится автоматически


MBo   (2006-08-16 10:56:00) [7]

IMy = interface(IInterface)
  ['{5CA75D2E-30DC-4D3F-BDA5-F3790849A160}']
  function ObjRef: TObject;
end;

TMyComponent = class(TComponent, IMy)
  function ObjRef: TObject;
end;

function TMyComponent.ObjRef: TObject;
begin
 Result := Self;
end;


Priest   (2006-08-16 10:54:00) [8]

Я могу написать так
var
MyC:TMyComponent;
begin
MyC:=TMyComponent.Create(nil);
MyProcedure(MyC);

И получается что я передал переченную типа TMyComponent. Как мне это отличить?


Сергей М.   (2006-08-16 10:49:00) [9]


> является ли My переменной типа TMyComponent


И проверять тут нечего - My неявляется переменной типа TMyComponent.


Наверх

Титульная страница Поиск, карта сайта Написать письмо