Выяснить наследование

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Выяснить наследование

Сообщение sign »

Есть один объект

Код: Выделить всё

TPanelBase = class(TPanel) 

И несколько наследуемых

Код: Выделить всё

  TPanelLeft = class(TPanelBase)

  TPanelMain = class(TPanelBase)

  TPanelEnd = class(TPanelBase)   


В обработчике мне нужно выловить только те компоненты формы, которые от TPanelBase.
Как непосредственно проверить, это ясно

Код: Выделить всё

procedure TStart.TabSheet1Show(Sender: TObject);
var i: Integer;
begin
  // Нарисовать схему
  if Sender is TTabSheet then
    for i := 0 to TTabSheet(Sender).ComponentCount-1 do begin
      if (TTabSheet(Sender).Components[i] is TPanelLeft) or
         (TTabSheet(Sender).Components[i] is TPanelMain) or
         (TTabSheet(Sender).Components[i] is TPanelEnd) then begin
...
      end;
    end;
end;

А есть ли способ, чтобы проверить компонент, что он от базового типа?
В данном случае от TPanelBase.
Чтобы обойтись одной проверкой?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

А

Код: Выделить всё

If Components[i] Is TPanelBase Then Profit;

не работает?
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Щас проверю...

Добавлено спустя 2 минуты 5 секунд:
Ну дак и работает!
Аватара пользователя
Inferno
новенький
Сообщения: 78
Зарегистрирован: 20.03.2009 13:40:20
Откуда: Тюмень

Сообщение Inferno »

вроде бы так было if Components[i].InheritsFrom(TPanelBase) then ....
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Не, так не работает.
Вот что сработало

Код: Выделить всё

 if TTabSheet(Sender).Components[i] is TPanelBase then ...

Вызываются все наследуемые.

Добавлено спустя 4 минуты 36 секунд:
Тьфу, блин, вы меня с панталыку сбили.
Конечно, и ваш пример работает, только правильно его записать нужно

Код: Выделить всё

for i := 0 to TTabSheet(Sender).ComponentCount-1 do begin
      if TTabSheet(Sender).Components[i].InheritsFrom(TPanelBase) then begin 
Ответить