На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Узнать, что объекта уже нет , на который ссылается свойство
    Например:
    ExpandedWrap disabled
      private
        FListBox:TListBox; // "ссылаемся" на ListBox
      ...
      published
        property ListBox:TListBox read FListBox;
      ....

    Теперь ставим компонент, тестим. кладем на форму парочку ListBox`ов, затем начинаем их выбирать в property ListBox компонента - все прекрасно :D. Но вот, оставив, "заполненое" свойство, щелкаем по ListBoх`у, нажимаем Del. ListBox удаляется, как ему и положено, но если компонент имел ссылку на только что удаленный ListBox, то среда подвисает, если обратиться к компоненту, например, просто выделить его. Пишет как всегда
    Цитата
    Access Violation at address .... in rtlВерсияDelphi0.bpl
    .

    т к объект не создаются в компоненте, а выбирается из существующих, поэтому я явно его не удаляю нигде....


    И как с этом чудом бороться?
      Стандартный метод - переопределяем Notification:
      ExpandedWrap disabled
        private
          FListBox:TListBox; // "ссылаемся" на ListBox
        ...
        protected
            procedure Notification(AComponent: TComponent; Operation: TOperation); override;
        ...
        published
          property ListBox:TListBox read FListBox;
        ....
         
        implementation
        ...
        procedure TMyControl.Notification(AComponent: TComponent;
          Operation: TOperation);
        begin
          inherited Notification(AComponent, Operation);
         
          if (Operation = opRemove) then
          begin
            if (AComponent = FListBox) then
              FListBox := nil;
          end;
        end;
        Цитата s-mike @
        if (AComponent = FListBox) then
        FListBox := nil;

        Может, заменить на
        AComponent:=nil
        ?
          Цитата Miscђka @

          Может, заменить на
          AComponent:=nil
          ?

          А что это даст?
            Погоди, я немного не догоняю после вчерашнего. Надо разобраться.
            AComponent:=nil в данном случае это не то же самое, что FListBox:=nil. Т.е. если я обнуляю AComponent, обнуляется ли при этом FListBox?
              Цитата Miscђka @
              Т.е. если я обнуляю AComponent, обнуляется ли при этом FListBox?

              Miscђka, удивляешь. AComponent, FListBox - ссылки на компоненты. Обниление одной ссылки не означает обниление другой. Тем более, что они могут быть не равны. Notification вызывается Owner'ом при добавлении/освобождении компонента.
                Цитата s-mike @
                Стандартный метод - переопределяем Notification:

                Спасибо, не знал....
                  Цитата s-mike @
                  Miscђka, удивляешь

                  перепил вчера, - у друга сын родился.
                  Не сообразил сразу, как передается переменная AComponent.
                    SPrograMMer

                    Кстати, та толстая книжка, что лежит в коробке вместе с дисками дельфи как раз и объясняет
                    многие вещи, в том числе для чего нужно переопределять Notification. Но у этой книжки два недостатка:
                    1. Она во многом повторяет хелп.
                    2. Она на англ. языке.
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0290 ]   [ 16 queries used ]   [ Generated: 25.04.24, 08:32 GMT ]