![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
уточняю формулировку темы
Как получить типы интерфейсов хранящихся в 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);
...там не будет видно объектов, а только их интерфейсы. как различать их ? |