|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Как получить типы интерфейсов хранящихся в 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 Понятно, что я что то делаю не так, но как мне узнать какой текущий итем, ILine или IBlock? Последний раз редактировалось snegok, 31.03.2019 в 10:31. |
#2
|
|||
|
|||
причём находясь в "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); ... там не будет видно объектов, а только их интерфейсы. как различать их ? |