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

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

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Скрытие события компонента в Design-timw
    В конструкторе я переопределяю процедуры событий OnClick, OnMouseMove, OnMouseLeave.
    Свойство Cursor в Инспекторе Объектов скрыть получилось.
    Хотелось бы так скрыть вышеуказанные эвенты.
    Собственно проблема в том, что когда разработчик определяет событие в Design-time, событие моего компонента перекрывается и не срабатывает, а работает только событие определенное в design-time.

    ExpandedWrap disabled
      unit URLLabel;
       
      interface
       
      uses
        SysUtils, Classes, Controls, StdCtrls, Graphics, Dialogs, DesignIntf;
       
      type
        TURLLabel = class(TLabel)
        private
          { Private declarations }
          FUnderlineUrl: boolean;
          FColorURL: TColor;
          FColorURLOnMouse: TColor;
          procedure SetUnderlineURL(Value:boolean);
          procedure SetColorURLOnMouse(Value:TColor);
          procedure SetColorURL(Value:TColor);
       
        protected
          { Protected declarations }
       
        public
          { Public declarations }
          constructor Create(AOwner: TComponent); override;
          destructor Destroy; override;
          {события}
          procedure URLOnClick(Sender: TObject);
          procedure URLOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
          procedure URLOnMouseLeave(Sender: TObject);
        published
          { Published declarations }
          //property Cursor:integer read FDummy;
          property UnderlineURL: boolean read FUnderlineURL write SetUnderlineURL;
          property ColorURL:TColor read FColorURL write SetColorURL;
          property ColorURLOnMouse:TColor read FColorURLOnMouse write SetColorURLOnMouse;
        end;
       
      procedure Register;
       
      implementation
       
      //{$R IconFileName.dcr}
       
      procedure Register;
      begin
        RegisterComponents('Samples', [TURLLabel]);
        RegisterPropertyEditor(TypeInfo(TCursor), TURLLabel, 'Cursor', nil);  // скрываем свойство компонента в Инспекторе Объектов
      end;
       
      constructor TURLLabel.Create(AOwner: TComponent);
      begin
        inherited;
        FColorURL:=$00FF0000;
        FColorURLOnMouse:=$007C0089;
        Font.Color:=FColorURL;
        FUnderLineURL:=true;
        Cursor:=crHandPoint;
        OnMouseMove:=URLOnMouseMove;
        OnMouseLeave:=URLOnMouseLeave;
        OnClick:=URLOnClick;
      end;
       
      destructor TURLLabel.Destroy;
      begin
        inherited;
      end;
       
      procedure TURLLabel.SetColorURL(Value:TColor);
      begin
        if FColorUrl<>Value then
        begin
          FColorURL:=Value;
          Font.Color:=FColorURL;
          invalidate;
        end;
      end;
       
      procedure TURLLabel.SetUnderlineURL(Value:boolean);
      begin
        if Value=true then
        begin
          FUnderLineURL:=Value;
          Font.Style:=[fsUnderline];
          Invalidate;
        end
        else
          begin
            FUnderLineURL:=Value;
            Font.Style:=[];
            Invalidate;
          end;
      end;
       
      procedure TURLLabel.SetColorURLOnMouse(Value:TColor);
      begin
        if FColorUrlOnMouse<>Value then
        begin
          FColorURLOnMouse:=Value;
        end;
      end;
       
      procedure TURlLabel.URLOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
      // двигаем мышью над контролом
      begin
        inherited;
        Font.Color:=FColorURLOnMouse;
      end;
       
      procedure TURLLabel.URLOnClick(Sender: TObject);
      begin
        inherited;
        ShowMessage(Caption);
      end;
       
      procedure TURLLabel.URLOnMouseLeave(Sender: TObject);
      // убираем мышь из границ контрола
      begin
        inherited;
        Font.Color:=FColorURL;
      end;
       
      end.
      перекрой метод Loaded и в нем изменяй OnClick... не забудь после себя, выполнить которые там уже были

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

        ExpandedWrap disabled
          TMyControl = class(TControl)
            protected
              procedure Click; override;
              procedure MouseMove(Shift: TShiftState; X, Y: Integer);override;
          end;
           
           
          procedure TMyControl.Click;
          begin
          // делаем свои действия, а потом вызываем родительский метод, который и обрабатывает событие пользователя (можем не вызывать, тогда OnClick вообще не сработает)
            inherited Click;
          end;
           
          procedure MouseMove(Shift: TShiftState; X, Y: Integer);
          begin
          // делаем свои действия
            inherited MouseMove(Shift, X, Y);
          end;


        Добавлено
        Если вам нужно скрыть свойство, унаследуйтесь от Custom-предка и не публикуйте событие.
        Если нет Custom-предка, скрыть событие в инспекторе можно зарегистрировав NIL-редактор для этого свойства, но в Run-Time свойство всё равно будет доступно.
          DimaBr, компилятор выдает, что MouseLeave не найден в базовом классе, но мне это событие нужно. А ведь OnMouseLeave в Tlabel есть.
          Что делать?
          Сообщение отредактировано: TechnoMag -
            Цитата TechnoMag @
            А ведь OnMouseLeave в Tlabel есть.

            Это один из немногих случаев, когда событие вызывается напрямую из обработчика сообщения CMMouseLeave, который и нужно переопределить:
            ExpandedWrap disabled
                TUrlLabel = class(TLabel)
                private
                ...
                  procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
                ...
                end;
               
              procedure TUrlLabel.CMMouseLeave(var Message: TMessage);
              begin
                inherited;
                ... //доп.действия
              end;
              Всем спасибо!
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0312 ]   [ 15 queries used ]   [ Generated: 16.05.24, 00:42 GMT ]