Конференция "Компоненты" » Запрет дочерних компонентов
 
  • DevilDevil (15.12.07 16:53) [0]
    В теме сабжа смысла передать не удалось, попробую объяснить в описании.

    У меня есть класс-потомок
    TDataModule

    . Я хочу, чтобы на нём можно было размещать компоненты только типа
    TMyComponent

    .

    Что я делаю...

    Переопределяю метод
    Notification

    , если
    AComponent

    не того класса, я вызываю
    Exception

    .

    На практике чужой компонент не добавляется и вызывает Exception, однако при дальнейшей компиляции вызываются какие-то внутренние ошибки.

    Вопрос... как корректно запрещать добавлять "ненужные" компоненты?

    Заранее спасибо.
  • Kolan © (15.12.07 16:54) [1]
    Покажи код.

    А зачем эксепшн? Сообщение нельзя?
  • Джо © (15.12.07 18:13) [2]
    Что-то я, видно, не совсем сабдж понял? Или что-то в таком роде:

    type
     TDataModule2 = class(TDataModule)
     protected
       procedure Notification(AComponent: TComponent;
         Operation: TOperation); override;
     public
     end;
    ...

    procedure TDataModule2.Notification(AComponent: TComponent;
     Operation: TOperation);
    begin
     inherited;

     if (AComponent <> Self) and (Operation = opInsert) then
     begin
       if not (AComponent is TXXX) then
         raise Exception.Create('Only TXXX can be placed here');
     end;
    end;



    ?
  • DevilDevil (15.12.07 20:06) [3]
    > Kolan ©   (15.12.07 16:54) [1]

    сообщение - не выход; нужно чтобы компонент не добавлялся.

    > Джо ©   (15.12.07 18:13) [2]

    ооо! спасибо, помогло!

    главное отличие этого кода от моего состоит в том, что
    inherited

    я вызывал только в удачном случае. Ещё раз спасибо! тема закрыта.
  • Юрий Зотов © (16.12.07 13:32) [4]
    Зачем перекрывать Notification, если специально для сабжа существует ValidateInsert? Его и надо перекрывать.
  • Kolan © (17.12.07 14:44) [5]
    > Переопределяю метод Notification, если AComponent не того
    > класса, я вызываю Exception.


    > procedure TDataModule2.Notification(AComponent: TComponent;
    >
    > Operation: TOperation);
    > begin
    > inherited;
    >
    > if (AComponent <> Self) and (Operation = opInsert) then
    > begin
    >   if not (AComponent is TXXX) then
    >     raise Exception.Create('Only TXXX can be placed here')
    > ;
    > end;
    > end;



    > ооо! спасибо, помогло!


    Не пойму где отличие сабжа от кода Джо, по моему просто 1 к 1 написано сос слов, в чем проблемма была?
  • {RASkov} © (17.12.07 17:18) [6]
    > [5] Kolan ©   (17.12.07 14:44)

    В [3] же он "нарисовал" в чем была его ошибка :) inherited - "не в то время и не в том месте")
 
Конференция "Компоненты" » Запрет дочерних компонентов
Есть новые Нет новых   [134463   +60][b:0][p:0.001]