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

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

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Отловить изменение цвета
    Сделал свой небольшой и первый компонент
    Все ок, все работает но на форме не меняется Цвет компонента при смене цвета слева в свойствах. Перелопатил кучу компонентов - в одних property Colo:Tcolor в других сообщения CM_ но и там и там все работает
    ExpandedWrap disabled
      type
       
        TColors = class(TPersistent)
       
        private
          FBgColor, FFillColor,FborderColor: TColor;
        protected
          Parent: TGraphicControl;
          procedure SetBgColor(col: TColor);
          procedure SetFillColor(col: TColor);
          procedure SetBorderColor(col: TColor);
        public
          constructor Create;
        published
          property bgColor: TColor read FBgColor write FBgColor default clBtnFace;
          property FillColor: TColor read FFillColor write FFillColor default clSkyBlue;
          property BorderColor: TColor read FBorderColor write FBorderColor default clGray;
       
        end;
       
       
        TCircleProgress = class(TGraphicControl)
       
       
        private
          FFont:TFont;
          FMin: Integer;
          FMax: Integer;
          FColors: TColors;
          FPosition: Integer;
          function GetPosition: Integer;
          procedure SetMin(Value: Integer);
          procedure SetMax(Value: Integer);
          function  GetMin:integer;
          function  GetMax:integer;
          procedure SetPosition(Value: Integer);
          procedure settings;
          procedure SetParams(AMin, AMax: Integer);
       
          { Private declarations }
        protected
          { Protected declarations }
          procedure Paint;override;
       
        public
          procedure Repaint;override;
          constructor Create(AOwner: TComponent); override;
          destructor Destroy; override;
       
          { Public declarations }
        published
          property Font:TFont read FFont write FFont;
          property Colors: TColors read FColors write FColors;
          property Min: Integer read GetMin write SetMin default 0;
          property Max: Integer read GetMax write SetMax default 100;
          property Position: Integer read GetPosition write SetPosition default 0;
          { Published declarations }
       
        end;


    и
    ExpandedWrap disabled
      constructor TColors.Create;
      begin
        inherited;
        FBgColor:=clBtnFace;
        FFillColor:=clSkyBlue;
        FBorderColor:=clGray;
      end;
       
      constructor TCircleProgress.Create(AOwner: TComponent);
      begin
        inherited Create(AOwner);
        FColors:=TColors.Create;
        FColors.Parent:=(Self as TGraphicControl);
        Ffont:=TFont.Create;
        FFont.Name:='Lucida Console';
        FFont.Size:=10;
        FFont.Style:=[fsBold];
       
        Width := 50;
        Height := 50;
        FMin := 0;
        FMax := 100;
        settings;
        FPosition:=Fmin;
      end;
       
      procedure TColors.SetBorderColor(col: TColor);
      begin
        FBorderColor:=col;
        (Parent as TCircleProgress).Repaint;
      end;


    Компонент - круглый прогрессбар, как часы
    Что куда добавить, чтобы отрисовка происходила при смене свойств? и 2 вопрос. При содании я делаю FBgColor:=clBtnFace;
    тогда для чего property bgColor: ..... default clBtnFace; ? если не сделать присваивание - все черное... Что-то по созданию компонентов вообще информации не много нашел %(
    Сообщение отредактировано: Wraith -
      Цитата Wraith @
      тогда для чего property bgColor: ..... default clBtnFace; ?

      для того чтобы класс знал какое значение (в данном случае цвет) использовать, если пользователь специально не определил значения для соответствующих свойств ... помимо этого значение принимается в случае, если пользователь присвает некорретные данные для данного свойства ...

      Цитата Wraith @
      если не сделать присваивание - все черное...

      это объясняется просто, т.к. до присваивания у тебя незаданы значения используемых цветов то выбирается первый доступный системе цвет #000000 (константа clBlack), который сообственно черный ... кроме того если требуется определять цвета при создании твоего компонента это можно провести напрямую в его конструкторе манипулируя свойствами создаваемого подкласса TColors ...
        Вот так
        ExpandedWrap disabled
            TColors = class(TPersistent)
             //...
            private
              FBgColor, FFillColor,FborderColor: TColor;
            protected
                Procedure SetColor(Avalue:TColor);//Наш код
             //...
            published
              property bgColor: TColor read FBgColor write {наша вставка}SetColor default clBtnFace;
            end;


        Потом в коде

        ExpandedWrap disabled
          //Наш код
          procedure TColors.SetColor(Avalue: TColor);
          begin
           //Тут отрабатываешь код изменения цвета.
           // то есть событие
           FBgColor:=Avalue;
           
          end;
        Сообщение отредактировано: aster_x -
          Аха про default понятно
          ээ.. спасибо.... собственно я так делал, но ничего не менялось... странна %)

          вот если кому интересно, он конечно кривоват, но вдруг кому пригодится %)

          http://rapidshare.com/files/357994844/CircleProgress.zip.html
          http://ifolder.ru/16661940
            Цитата Wraith @
            При содании я делаю FBgColor:=clBtnFace;
            тогда для чего property bgColor: ..... default clBtnFace; ? если не сделать присваивание - все черное...

            Все правильно. Указание default само по себе не устанавливает значения св-ва, а лишь указывает на то, что если в дизайне св-во равно дефолтному, то его не нужно сохранять в dfm и соотв-но не нужно восстанавливать из dfm при загрузке формы. Поэтому все отличные от 0 дефолтные значения должны явно задаваться в конструкторе компонента

            Добавлено
            Цитата andrew.virus @
            это объясняется просто, т.к. до присваивания у тебя незаданы значения используемых цветов то выбирается первый доступный системе цвет #000000 (константа clBlack), который сообственно черный ...

            :no: Никто никакие доступные цвета не выбирает. Просто конструктор TObject по умолчанию зануляет все поля объекта и соотв-но FBgColor = 0 = clBlack
              Компонент использует GDI+, как же его посмотреть обычному пользователю ?
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


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