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

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

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Как псоздать метод до выполнения некоторой функции в компонете. , Как правильно создать метод до выполнения некоторой функции (TOnBeforeMyEvent) в компонете.
    Доброе утро!

    Необходимо создать метод до выполнения некоторой функции, например MyCalcFunction, в компоненте.
    Задача метода, если параметр IsOccurred есть True, то функция MyCalcFunction работает и проводит вычисления, а если False, то фукция возвращает False.
    Но данная конструкция не работает.
    Подскажите почему и где ошибка?

    Создал такую конструкцию, код ниже:

    ExpandedWrap disabled
      TOnBeforeMyEvent = procedure(Sender : Tobject; IsOccurred : Boolean) of Object;
      private
       FEventIsOccurred : Boolean;
       FOnBeforeMyEvent : TOnBeforeMyEvent;
      public
      function MyCalcFunction(const A, B : Integer): Boolean;
      procedure DoBeforeMyEvent(Sender : TObject; IsOccurred : Boolean);
      published
      property OnBeforeMyEvent : TOnBeforeMyEvent read FOnBeforeMyEvent write FOnBeforeMyEvent;
       
      procedure TMyComponent.DoBeforeMyEvent(Sender : Tobject; Index : IsOccurred : Boolean);
      begin
        if Assigned (FOnBeforeMyEvent) then FOnBeforeMyEvent(Self, IsOccurred);
      end;
       
      function TMyComponent.MyCalcFunction(const A, B : Integer): Boolean;
      begin
         Result := False;
         DoBeforeMyEvent(self, FEventIsOccurred);
         if not FEventIsOccurred then
           Exit;
         if A > B then
            Result := True;
      end;


    код в программе:

    ExpandedWrap disabled
      procedure TForm1.MyComponent1BeforeMyEvent(Sender: TObject; IsOccurred: Boolean);
      begin
        IsOccurred := True; // или False
      end;


    Если нужна для этого функция типа:
    TOnBeforeMyEvent = function(????????): Boolean of Object;
    Можно небольшой пример как правильно прописать метод как функцию.
    В интернете по данному вопросу ничего не нашел.
    Все только о процедурах-событиях.

    Спасибо.
      ExpandedWrap disabled
        или
        TOnBeforeMyEvent = procedure(Sender : Tobject; var IsOccurred : Boolean) of Object; //!!!!!!!! var
        или
        TOnBeforeMyEvent = function(Sender : Tobject):Boolean of Object;

      PS: Когда ты, наконец за матчасть возьмешься ?! Элементарных вещей не знаешь, а берешься сразу за компонены, да еще и с TAboutForm ;)
        1.
        С TAboutForm я разобрался и работает прекрасно.
        Спасибо.

        2.
        Матчасть тоже изучаю, но ведь форум создан тоже и для того, чтобы чему-то научиться у профессионалов.
        Зачем же так раздраженно отвечать.
        Я же не прошу писать за меня код, а только проверить код на ошибки.
        Спасибо, что их нашли и указали.

        Спасибо.
          Еще - если параметр IsOccurred используется только в этой функции, то незачем под него отводить спец.поле FEventIsOccurred - можно юзать просто локальную переменную
          ExpandedWrap disabled
            function TMyComponent.DoBeforeMyEvent:Boolean;
            begin
              Result:=true;
              if Assigned (FOnBeforeMyEvent) then FOnBeforeMyEvent(Self, Result);
            end;
            function TMyComponent.MyCalcFunction(const A, B : Integer): Boolean;
            begin
              if DoBeforeMyEvent then
                Result:=A > B
              else
                Result:=false;
            end;
            Кстати конструкции

            ExpandedWrap disabled
              или
              TOnBeforeMyEvent = procedure(Sender : Tobject; var IsOccurred : Boolean) of Object; //!!!!!!!! var
              или
              TOnBeforeMyEvent = function(Sender : Tobject):Boolean of Object;


            не дают желаемого результата решения задачи.
            Может еще кто-то подскажет в чем проблема?

            Спасибо.
              Цитата SkAndriy @
              Может еще кто-то подскажет в чем проблема?

              В том, что в твоем варианте DoBeforeMyEvent ес-но также должно быть var IsOccurred : Boolean
              PS: Для этого матчасть и нужна, чтобы не наступать на одни и те же грабли по 100 раз, соотв-но не задавать одних и тех же вопросов в разных вариациях и не раздражать таким образом "мировую общественность" ;)
              Сообщение отредактировано: leo -
                код компонента:

                ExpandedWrap disabled
                  TOnBeforeMyEvent = function(Sender : TObject; var IsOccurred : Boolean): Boolean of Object;
                  TMyComponent = class(TComponent)
                  private
                  FEventIsOccurred : Boolean;
                  FOnBeforeMyEvent : TOnBeforeMyEvent;
                  public
                  function DoBeforeMyEvent(): Boolean;
                  published
                  property OnBeforeMyEvent : TOnBeforeMyEvent read FOnBeforeMyEvent write FOnBeforeMyEvent;
                   
                  function TMyComponent.DoBeforeMyEvent(): Boolean;
                  begin
                    Result := True;
                    if Assigned (FOnBeforeMyEvent) then FOnBeforeMyEvent(Self, Result);
                  end;
                   
                  function TMyComponent.MyCalcFunction(const A, B : Integer): Boolean;
                  begin
                    if DoBeforeMyEvent then
                      Result:=A > B
                    else
                      Result:=false;
                  end;


                в программе:

                ExpandedWrap disabled
                  procedure TForm1.MyComponent1BeforeMyEvent(Sender: TObject; IsOccurred: Boolean);
                  begin
                    IsOccurred := True; // или False
                  end;


                Событие не работает.
                В чем проблема?

                спасибо.
                  В какой момент должно сработать событие ? Как вы создаете компонент и как назначаете событие ? Где код ?
                    Событие сработало. Спасибо.
                      Цитата SkAndriy @
                      ExpandedWrap disabled
                        TOnBeforeMyEvent = function(Sender : TObject; var IsOccurred : Boolean): Boolean of Object;

                      "Масло масляное" - и function и var, достаточно чего-то одного...
                        Вы считает, что и так правильно:

                        ExpandedWrap disabled
                          TOnBeforeMyEvent = function(Sender : TObject; var IsOccurred : Boolean): Boolean of Object;


                        и так

                        ExpandedWrap disabled
                          TOnBeforeMyEvent = function(Sender : TObject; IsOccurred : Boolean): Boolean of Object;


                        Но, несколькими постами ранее мне было строго указано, что без var нельзя, это ошибка.

                        И еще небольшой вопрос:

                        как по умолчанию присвоить IsOccurred, например False?

                        так код не срабатывает:
                        ExpandedWrap disabled
                          TOnBeforeMyEvent = function(Sender : TObject; IsOccurred : Boolean=False): Boolean of Object;


                        извините, решение нашел, изменив Result к False:

                        ExpandedWrap disabled
                          function TMyComponent.DoBeforeMyEvent:Boolean;
                          begin
                            Result:=False;
                            if Assigned (FOnBeforeMyEvent) then FOnBeforeMyEvent(Self, Result);
                          end;


                        Спасибо
                        Сообщение отредактировано: SkAndriy -
                          Цитата SkAndriy @
                          Но, несколькими постами ранее мне было строго указано, что без var нельзя, это ошибка

                          "Смотрим в книгу, видим фигу" ? Где ты в #5 увидел "и так, и так" ?! В случае процедуры передается var-параметр, а в случае функции нужно просто возвращать Result = true или false и соотв-но никакой параметр IsOccurred в ней вообше не нужен. А делать и var, и function - это просто запутывать и "напрягать" пользователя, который будет писать обработчик, чесать репу "что тут к чему" и вспоминать тебя недобрым словом ;)
                          Сообщение отредактировано: leo -
                            спасибо за ответ.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


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