Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Технологии
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.03.2019, 01:57
snegok snegok вне форума
Прохожий
 
Регистрация: 09.11.2015
Сообщения: 2
Версия Delphi: Delphi XE8
Репутация: 10
По умолчанию Как получить типы интерфейсов хранящихся в TInterfaceList

уточняю формулировку темы
Как получить типы интерфейсов хранящихся в TInterfaceList

Хочу хранить в одном списке TInterfaceList два типа интерфейсов ILine и IBlock
наполнить InterfaceList ими удается, а вот получить их и распознать какой
интерфейс у того или иного элемента не получается

имею такую структуру кода...
Код:
unit Interfaces;

  IData = interface
  end;
  ILine = interface(IData)
  end;
  IBlock = interface(IData)
  end;
  IProgramm = interface
    function  Get(Index: Integer): IData;
    procedure Put(Index: Integer; const Item: IData);
    property  Items[Index: Integer]: IData read Get write Put; default;
  end;
Код:
unit Objects;
  
  TLine = class(TInterfaceList, ILine)
  end;
  TBlock = class(TInterfaceList, IBlock)
  end;
  TProgramm = class(TInterfaceList, IProg)
    function  Get(Index: Integer): IData;
    procedure Put(Index: Integer; const Item: IData);
    property  Items[Index: Integer]: IData read Get write Put; default;
	function  Add(const Item: IData): Integer;
  end;
  
  Programm: TProgramm;
  Block: IBlock;
  Line: ILine;
  
  // Programm наполняется интерфейсами создаваемых объектов
  ...
  Programm.Add(Block);
  ...
  Programm.Add(Block);
  ...
  Programm.Add(Line);
  ...
  Programm.Add(Line);
  
  // теперь пытаюсь получать объекты
  for i:=0 to Programm.Count-1 do begin
	// вот в этом месте, когда Items[i] = TBlock($....) as IData
	// возвращает True, т.е. считает что объект поддерживает ILine
	// а я жду что он должен поддерживать только IBlock
	if Supports(Programm.Items[i], ILine, Line) then
Supports возвращает True когда Items[i] в отладчике отображается как "TBlock($....) as IData"
Понятно, что я что то делаю не так, но как мне узнать какой текущий итем, ILine или IBlock?

Последний раз редактировалось snegok, 31.03.2019 в 10:31.
Ответить с цитированием
  #2  
Старый 31.03.2019, 10:33
snegok snegok вне форума
Прохожий
 
Регистрация: 09.11.2015
Сообщения: 2
Версия Delphi: Delphi XE8
Репутация: 10
По умолчанию

причём находясь в "unit Objects" я могу получать тип объекта под интерфейсом таким образом:
Код:
CurrData: IData;
CurrBlock: IBlock;
CurrLine: ILine;
for i:=0 to Programm.Count-1 do begin
    // получить интерфейс из TInterfaceList
    CurrData := Programm.Items[i];

    // получить интерфейс ILine
    if CurrData is TLine then
      CurrLine := ILine(CurrData)

    // получить интерфейс IBlock
    else if CurrData is TBlock then
      CurrBlock := IBlock(CurrData);
    ...
но что делать если я нахожусь в другом юните (не в unit Objects),
там не будет видно объектов, а только их интерфейсы.
как различать их ?
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter