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

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

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Как скрыть published property , в компоненте наследнике
    Собственно сабж. Наследую от TDBGrid требуеться скрыть некоторые его свойства, чтобы он их в инспекторе объектов не отображал. Например свойство DataSource. Как это сделать??? Ещё вопрос: как для невизуальных компонентов обработать двойной клик для кинутого на форму компонента???
      Цитата Demon_ @
      Собственно сабж.


      Понизить видимость свойств и методов нельзя.
      Можно только переопределить их. Например, установить фиксированное значение и R/O.

      Цитата Demon_ @
      Ещё вопрос: как для невизуальных компонентов обработать двойной клик для кинутого на форму компонента???


      Невизуальные компоненты потому и называются невизуальными, что не имеют подобных свойств.
        Демо
        1) А как их переопределить??? Что то я пытался - ругаеться, пробывал и override и overload.

        Цитата
        Невизуальные компоненты потому и называются невизуальными, что не имеют подобных свойств.

        Не согласен, простой пример, создай приложение и кинь на него компонент TTable (вкладка BDE) и потом сделай двойной щелчёк по компоненту... Вот и мне надо что то подобное.
          Перенести в private :)
            Цитата Demon_ @
            Не согласен, простой пример, создай приложение и кинь на него компонент TTable (вкладка BDE) и потом сделай двойной щелчёк по компоненту... Вот и мне надо что то подобное.


            Это никак не относится к видимости объекта в Runtime.
            Про DesignTime не было разговора.

            А про редактор свойств... Ну начни с класса TPropertyEditor - почитай.
            А лучше купи книгу по созданию компонент.
              Чтобы свойство не редактировать в дизайнере (убрать из инспектора), нобходимо зарегистрировать для этого свойства редактор NIL
              ExpandedWrap disabled
                RegisterPropertyEditor(TypeInfo(TTypeProperty), TTypeComponent,'NameProperty',nil);

              Для компонента (не только визуального) двойнок клик вызывает редактор компонента (первый пункт меню). Если такого нет, то генерится первое событие.

              ExpandedWrap disabled
                TMyComponentEditor = class(TComponentEditor)
                  function GetVerb(Index: integer): string; override;
                  function GetVerbCount: integer; override;
                  procedure ExecuteVerb(Index: integer); override;
                end;
                 
                function TMyComponentEditor.GetVerb(Index: integer): string;
                begin // текст для пункта меню
                  case Index of
                    0: Result := 'MyEditor';
                  else Result := inherited GetVerb(Index);
                  end;{case}
                end;
                 
                function TMyComponentEditor.GetVerbCount: integer;
                begin // количество пунктов меню
                  Result := inherited GetVerbCount + 1;
                end;
                procedure TMyComponentEditor.ExecuteVerb(Index: integer);
                begin // действия, при выборе пункта
                  case Index of
                    0: ;// MyActions
                  else inherited ExecuteVerb(Index);
                  end;{case}
                end;
                Цитата DimaBr @
                function TMyComponentEditor.GetVerb(Index: integer): string;
                begin // текст для пункта меню
                case Index of
                0: Result := 'MyEditor';
                else Result := inherited GetVerb(Index - 1);
                end;{case}
                end;

                function TMyComponentEditor.GetVerbCount: integer;
                begin // количество пунктов меню
                Result := inherited GetVerbCount + 1;
                end;
                procedure TMyComponentEditor.ExecuteVerb(Index: integer);
                begin // действия, при выборе пункта
                case Index of
                0: ;// MyActions
                else inherited ExecuteVerb(Index - 1);
                end;{case}
                end;
                  Читаю статью FAQ по переходу на Delphi
                  http://faqs.org.ru/progr/pascal/del_migr.htm :
                  Цитата
                  Это половина того, что нам необходимо знать для осознания того,
                  что такое Event. Вторая требуемая половина -- это понятие Property(свойство). Как гласит старинный принцип ООП, все действия с полями объекта должны осуществляться только через методы этого объекта.Property -- практическое воплощение этого принципа. Стандартное описание свойства (Property):
                  property MyValue:Integer read GetValue write PutValue;
                  определяет, что чтение целочисленной (Integer) величины MyValue будет осуществляться через функцию
                  function GetValue:Integer;
                  а запись -- будет производится процедурой
                  procedure PutValue(Value:Integer);
                  Разумеется функция GetValue и процедура PutValue должны быть описаны как методы того же класса. После подобного описания свойства MyValue, команда MyObject.MyValue:=10; вызовет процедуру PutValue с параметром 10. Разумеется, переданное процедуре значение желательно сохранять,поэтому стандартный вид процедуры PutValue:
                  procedure TMyObject.PutValue(Value:Integer);
                  begin FValue:=Value;
                  {Любые дополнительные действия} end;
                  где FValue -- поле класса TMyObject, определенное, как правило в private секции (чтобы быть недоступной "пользователю"). Аналогичные действия происходят и при обращении ResultValue:=MyObject.MyValue.
                  Соответственно, функция GetValue описывается как
                  function TMyObject.GetValue:Integer;
                  Почему употребляется строка присваивания MyObject.MyValue:=10;? Автор подразумевает, что свойство MyValue не находится в разделе privat и его можно изменять таким прямым способом?
                  Откуда нарисовалась буква F у слова Value?
                  Сообщение отредактировано: malor -
                    обычно геттер и сеттер(GetValue/PutValue) описываются в private-секции(изредка в protected) класса, а само свойство в public/published секции...
                    в результате, программисту и спользующему класс доступно только свойство

                    FValue это внутреннее поле класса которое модифицируется/читается с помощью методов GetValue/PutValue
                    возможно также следующее описание свойства:
                    ExpandedWrap disabled
                      property MyValue:Integer read GetValue write FValue;

                    и
                    ExpandedWrap disabled
                      property MyValue:Integer read FValue write PutValue;
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


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