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

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

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
Страницы: (5) « Первая ... 2 3 [4] 5  все  ( Перейти к последнему сообщению )  
> Проблема с компонентом со свойствами-множествами и редактором свойств , Проблема с созданием компонента со свойствами-множествами и редактором свойств. Пустые поля свойств.
    Цитата SkAndriy @
    Но есть одно но - не все поля почемуто обнуляются. Что в этом коде еще не соответствует?

    если выходить из того что у тебя идет обявления
    property Property3: Double index 2 read GetDataElement write FProperty3;
    То результатом выхода данных является то что возвращает GetDataElement а что ты там пересчитываешь это уже только ты знаешь. посмотри логику. в большей степени вероятности там и кроется то что параметры не обнуляется.


    Цитата SkAndriy @
    property DoChange : TNotifyEvent read FOnDoChange write FOnDoChange;

    И что ты этим написал? зачем ты переименовал свойство? разве я об этом писал? И где метод о котором я писал?

    Цитата SkAndriy @
    И еще вопрос нужен ли в коде компонента код:

    Assigned(Value) применяется к ссылкам. ты не сможешь его применить к простому типу. У простых типов можно только сравнивать на значение.
    например в этом случае можно написать

    ExpandedWrap disabled
      procedure SetMyEnum(Value : TMyEnumType);
      begin
        if Value <> FMyEnum then
    А вот применять ли подобную конструкцию или нет решать тебе. Но таким образом можно отсечь нежелательные реакции компонента на ввод данных которые и так внесены в свойство
      Цитата ViktorXP @
      И что ты этим написал? зачем ты переименовал свойство? разве я об этом писал? И где метод о котором я писал?


      Я не понял этого. Можно конкретнее. Спасибо
        Если так, например для FMyOptions:

        ExpandedWrap disabled
          TMyComponent = class(TComponent)
           
          TDoChangeMyOptionsEvent = procedure(Sender : Tobject; Index : Integer) of Object;
           
          private
            FOnDoChangeMyOptions: TDoChangeMyOptionsEvent;
          publishin
            procedure OnDoChangeMyOptions(Sender : Tobject; Index : Integer);
           
          protected;
            property DoChangeMyOptions : TDoChangeMyOptionsEvent read FOnDoChangeMyOptions write FOnDoChangeMyOptions;
          ............
          end;
           
          implementation
           
          procedure TMyComponent.OnDoChangeMyOptions(Sender : Tobject; Index : Integer);
          begin
          if Assigned (FOnDoChangeMyOptions) then FOnDoChangeMyOptions(Self);
          end;
           
          procedure TMyComponent.SetMyOptions(Value : Integer);
          begin
            if FMyOptions = Value then Exit;
            FMyOptions := Value;
            Property1 := 0;
            Property2 := 0;
            Property3 := 0;
            OnDoChangeMyOptions(Self, Value);
          end;


        А для TMyEnumType по аналогии. Или как то иначе.

        будет верно?

        Спасибо
          уже лучше только расстановка негласных правил не верна. да и секции размещения перепутаны.

          Цитата SkAndriy @
          property DoChangeMyOptions : TDoChangeMyOptionsEvent read FOnDoChangeMyOptions write FOnDoChangeMyOptions;
          переименовываем обратно в On
          ExpandedWrap disabled
            property OnChangeMyOptions : TOnChangeMyOptionsEvent read FOnChangeMyOptions write FOnChangeMyOptions;


          тогда метод
          Цитата SkAndriy @
          ExpandedWrap disabled
            procedure OnDoChangeMyOptions(Sender : Tobject; Index : Integer)
          соответственно в Do
          ExpandedWrap disabled
            procedure DoChangeMyOptions(Sender : Tobject; Index : Integer);


          для метода DoChangeMyOptions не нужен первый параметр Sender. он его и так знает.
          посему обявление можно подправить как:
          ExpandedWrap disabled
            procedure DoChangeMyOptions(Index : Integer);


          а вот в теле метода у тебя ошибка
          ExpandedWrap disabled
            FOnDoChangeMyOptions(Self);

          сама переменная FOnDoChangeMyOptions является типом TDoChangeMyOptionsEvent у которого два параметра. так почему ты передаеш только одно?

          посему дописываем второй параметр (+ предшествующие изминения)

          ExpandedWrap disabled
            procedure TMyComponent.DoChangeMyOptions(Index : Integer);
            begin
              if Assigned (FDoChangeMyOptions) then FOnDoChangeMyOptions(Self, Index);
            end;




          также у тебя синтаксическая ошибка publishin. правильнее published

          а теперь о секциях размещения:
          само свойство ты спрятал в протекции. посему никто этого свойства не увидет кроме компонента который будет наследоватся от этого. А вот реакцию (DoChangeMyOptions) ты на оборот показал всем (даже дизайнеру свойств. хотя он этого и не оценит. так как он показывает только свойства)
          вывод: меняй местами.
          Сообщение отредактировано: ViktorXP -
            Вот код, но где-то ошибка, а где не могу понять.

            Спасибо
            Сообщение отредактировано: SkAndriy -
              Вот код, но где-то ошибка, а где не могу понять.

              Спасибо

              Прикреплённый файлПрикреплённый файлUnit2.zip (1,15 Кбайт, скачиваний: 132)
                Цитата
                ExpandedWrap disabled
                  procedure Assign(Source: TPersistent); reintroduce;
                Но если мне не изменяет память то в 33 сообщении говорится об обратном

                насчет
                Цитата
                inherited Assign (Source);
                leo говорил в 41 посте.

                ну и ошибка логическая
                ExpandedWrap disabled
                  procedure TMyComponent.SetMyOptions(Value : Integer);
                  begin
                    ....
                    OnChangeMyOptions(Self, Value);
                  end;
                Метод DoChangeMyOptions не просто так создавался. Тут вызвать нужно именно его. потому что если свойство не присвоить то OnChangeMyOptions будет равна nil.
                посему вызов nil(self, value) приведет к ошибке.
                  Спасибо. все предыдущие ошибки исправил, процедуру события тоже. Все вызывается. А если просто применить стандартное событие OnChange на что в этом компоненте оно будет реагировать?
                    И например, его прописать так:

                    ExpandedWrap disabled
                      property MyEnumProp: TMyEnumType read FMyEnum write SetMyEnum;
                       
                      procedure TMyComponent.SetMyEnum(Value: TMyEnumType);
                      begin
                        if(FMyEnum <> Value) then begin
                          FMyEnum:=Value;
                          Changed;
                        end;
                      end;
                       
                      procedure TMyComponent.Changed;
                      begin
                        if Assigned(FOnChange) then FOnChange(Self);
                      end;


                    На какие изменения или какие события я в таком случае могу обработать в realtime?
                    Спасибо
                    Сообщение отредактировано: SkAndriy -
                      А что ты имеешь ввиду под словом стандартное? OnChange это просто название. тип TNotifeEvent это просто тип. это все ни к чему не привязано. а реагировать оно будет так как ты это напишешь.

                      пс. логика событий не зависит от имени.

                      Добавлено
                      Цитата SkAndriy @
                      На какие изменения или какие события я в таком случае могу обработать в realtime?

                      так ты ведь сам написал
                      ExpandedWrap disabled
                          if(FMyEnum <> Value) then begin
                            FMyEnum:=Value;
                            Changed;
                          end;
                      Ответь на вопрос. при каких ситуациях будет вызвана процедура Changed? и ты получишь ответ на свой вопрос.
                        Тогда по логикне вещей получается если прописать процедуру onChanged в процедуре procedure TMyComponent.SetMyEnum(Value: TMyEnumType) в realtime она будет реагировать на изменения свойства MyEnumProp класса TMyEnumType? А как она должна быть и в каих секциях прописана в самом TMyComponent = class(TComponent)? Спасибо
                          Цитата SkAndriy @
                          в каих секциях прописана
                          private - доступны переменные/методы/свойства только самому компоненту и ни кому более. (для свойств не используется)
                          protected - доступны переменные/методы/свойства только компоненту и его потомкам
                          public - достопны переменные/методы/свойства всем желающим.
                          published - тоже что и public + свойства видимы в инспекторе (используется исключительно для свойств. на все другое компилятор выдает предупреждение)

                          тебе определенно нужно книжку взять и почитать насчет ООП.
                            Я это знаю, я имел ввиду иное:

                            достаточно прописать просто в published OnChange, а если ему дописать параметры, например OnChange(Sender:Objects; Index:Integer)? тогда надо объявлять как в предыдущем рассматриваемом случае?

                            Спасибо
                              Цитата SkAndriy @
                              тогда надо объявлять как в предыдущем рассматриваемом случае?

                              Что ты под этом имеешь ввиду? если нужнен ли в таком случае метод Do..xxx.. то да. он нужен в любом случаи.
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0518 ]   [ 18 queries used ]   [ Generated: 1.05.24, 20:37 GMT ]