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

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

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> TNotifyEvent и его глюк , Указатели на методы объекта
    В каких случаях бывает ошибка в этой конструкции:
    ExpandedWrap disabled
      if Assigned(FOnEvent) then FOnEvent;

    Ошибка вылазит на последнем оп FOnEvent и процедуру не запускает :'(
      ExpandedWrap disabled
        if Assigned(FOnEvent) then FOnEvent;

      Вообще, если мы работаем с TNotifyEvent, следует писать так:
      ExpandedWrap disabled
        if Assigned(FOnEvent) then FOnEvent(Self);
      Сообщение отредактировано: Rrader -
        Ясно что надо писать так:
        ExpandedWrap disabled
          if Assigned(FOnEvent) then FOnEvent(Self);

        Компилятор по-другому не схавает.
        Ошибка выскакивает здесь:
        ExpandedWrap disabled
          FOnEvent(Self);

        Может кусок кода побольше надо показать?
        Эта конструкция находится в
        ExpandedWrap disabled
          FTimer.OnTimer:=FTimerOnTimer;
          procedure TMyObject.FTimerOnTimer(Sender: TObject);
          begin
          if {...} then if Assigned(FOnEvent) then FOnEvent(Self);
          end;

        не из-за этого?
          Глядя на эту конструкцию нельзя назвать её ошибочной. Что находится на месте комментария?
            s-mike, ты меня удивляешь. Как можно сделать Free для метода объекта? Ведь FOnEvent, это поле типа метод объекта.

            Что же касается непосредственно вопроса, так любой Exception возникший внутри метода присвоенного полю FOnEvent, будет выглядеть именно так, как описал fateflex.
            Сообщение отредактировано: Петрович -
              Цитата Петрович @
              s-mike, ты меня удивляешь. Как можно сделать Free для метода объекта? Ведь FOnEvent, это поле типа метод объекта.

              Да, Петрович, сглупил. Невнимательно прочитал вопрос, а с ответом поспешил. :wall: :wall: :wall:

              Добавлено
              Цитата fateflex @
              Ошибка выскакивает здесь:

              FOnEvent(Self);

              Как это удалось определить, если
              Цитата Rrader @
              if Assigned(FOnEvent) then FOnEvent;

              написано в одну строчку?
                В методе присвоенном FOnEvent нету ошибки, наверно где-то ещё снаружи.
                  Тогда такой вопрос, а когдя возникает данная ошибка при выполнении программы?
                    Попробуй такое:
                    Замени свое:
                    ExpandedWrap disabled
                      FTimer.OnTimer:=FTimerOnTimer;
                      procedure TMyObject.FTimerOnTimer(Sender: TObject);
                      begin
                      if {...} then if Assigned(FOnEvent) then FOnEvent(Self);
                      end;

                    на:
                    ExpandedWrap disabled
                      FTimer.OnTimer:=FTimerOnTimer;
                      procedure TMyObject.FTimerOnTimer(Sender: TObject);
                      begin
                        try
                          if {...} then
                            try
                              if Assigned(FOnEvent) then
                                try
                                  FOnEvent(Self);
                                except
                                  ShowMessage('3');
                                end;
                            except
                              ShowMessage('2');
                            end;
                        except
                          ShowMessage('1');
                        end;
                      end;

                    И посмотри что "скажет".
                      Кстати, ошибка может быть именно уже в самом обработчике, и выглядеть в таком случае может как именно ошибка компонента. Посмотри CallStack в отладчике при возникновении исключения...
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0329 ]   [ 16 queries used ]   [ Generated: 28.03.24, 15:03 GMT ]