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

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

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Перехват события компонента
    Делаю свой компонент класса TComponent. В published секции записал так:
    ExpandedWrap disabled
      private
            fSynMemo:TSynMemo;
      ......
      published
           property SynMemo: TSynMemo read fSynMemo write fSynMemo;

    Можно ли мне в своём компоненте, получив ссылку на TSynMemo компонент через свойство SynMemo, переопределить его событие OnClick?

    пробовал так:
    ExpandedWrap disabled
      protected
          procedure OnClicks(Sender: TObject);
       
      procedure Txxx.OnClicks(Sender: TObject);
      begin
          showmessage('dd');
      end;
       
      //в процедуре Create своего компонента указываю fSynMemo.OnClick:=OnClicks;


    при работе с компонентом и при клике на SynMemo на форме - ничего не происходит

    ****************************
    выявил что при проверке на доступность fSynMemo показывает что он nil... в Create процедуре моего компонента
    Сообщение отредактировано: Алексей -
      Цитата Алексей @
      выявил что при проверке на доступность fSynMemo показывает что он nil... в Create процедуре моего компонента


      Так присваивать ссылку в любом случае нужно.

      Добавлено
      Где-то должно быть fSynMemo :=
        короче разобрался. Сообщение showmessage('dd'); появляется, но я присвоил fSynMemo.OnClick:=OnClicks; после создания компонента (с помощью constructor Create;) в другой процедуре.

        Цитата
        Где-то должно быть fSynMemo :=

        я присваиваю этот компонент полю в своём компоненте в дизайн-тайме (выпадающий список в Object Inspector).

        Как мне можно назначить необходимые переопределения событий (fSynMemo.OnClick:=OnClicks;) при старте приложения (где в дизайн-тайме указал в моём компоненте ссылку на SynMemo)?

        Добавлено
        ладно, сделаю через ещё одну функцию при обращении к компоненту. :)

        Добавлено
        Тогда ещё один вопрос. А как не перекрыть событие OnClick, а дополнить его?
        Сообщение отредактировано: Алексей -
          Цитата Алексей @
          Тогда ещё один вопрос. А как не перекрыть событие OnClick, а дополнить его?


          Сохранить у себя в отдельном поле? Вызывать сначала своё а затем сохранённое.
            эмм....у меня вызывается сообщение showmessage('dd') при клике на компонент SynMemo на форме. Значит я его событие перехватил. Это то, что нужно. Но если я укажу в самом свойстве OnClick компонента SynMemo какой-либо код, то он не исполняется, так как мой перехват события перекрывает исполнение события компонента-источника. Как мне исполнять не только свой код в перехваченном событии, но и код в событии SynMemo?
              Цитата Алексей @
              Как мне исполнять не только свой код в перехваченном событии, но и код в событии SynMemo?


              Сейчас прилинкую файл

              ExpandedWrap disabled
                unit Unit1;
                 
                interface
                 
                uses
                  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                  Dialogs, StdCtrls, myadvcheckbox, AppEvnts;
                 
                type
                 
                 
                  TForm1 = class(TForm)
                    myAdvCheckBox1: TmyAdvCheckBox;
                    ApplicationEvents1: TApplicationEvents;
                    procedure FormCreate(Sender: TObject);
                  private
                  PROCEDURE MYBBCLICK(Sender: TObject);
                    { Private declarations }
                  public
                    { Public declarations }
                  end;
                 
                 
                 
                 
                 
                  TMyClick = procedure(Sender: TObject) of object;
                 
                  MyComp = class(TWinControl)
                 private
                  fonCLick :TMyClick;
                  Procedure OnClick(var Message: TMessage); message  WM_LBUTTONDOWN;
                 
                  Public
                 
                  property
                  OnMyClick :TMyClick read fonCLick write fonCLick;
                  end;
                 
                var
                  Form1: TForm1;
                 
                implementation
                 
                {$R *.dfm}
                 
                { MyComp }
                 
                procedure MyComp.OnClick(var Message: TMessage);
                begin
                  if Assigned(fOnClick) then OnMyClick(Self);
                end;
                 
                PROCEDURE TForm1.MYBBCLICK(Sender: TObject);
                begin
                ShowMessage('dsadsa');
                end;
                 
                procedure TForm1.FormCreate(Sender: TObject);
                var m : MyComp;
                begin
                m:=MyComp.create(self);
                m.parent:=self;
                m.SetBounds(10,10,500,500);
                m.OnMyClick:= myBBclick;
                end;
                 
                end.


              Добавлено
              Вот простейши примерчик

              Сомое главное это передать "пользователю"
              свой кучочек радости
              ExpandedWrap disabled
                 
                //регистрация типа события
                  TMyClick = procedure(Sender: TObject) of object;
                //...
                //Объявления события оно у тебя будет в Design time на вкладке EVENTS
                   OnMyClick :TMyClick read fonCLick write fonCLick;
                 
                ///....
                //Непоссредственно передаем управление
                 if Assigned(fOnClick) then OnMyClick(Self);


              Добавлено
              и убери
              myadvcheckbox из списка юнитов
              Я его случайно прописал!
              Сообщение отредактировано: aster_x -

              Прикреплённый файлПрикреплённый файлforum.rar (7.48 Кбайт, скачиваний: 136)
                Создайте метод присвоение SynMemo и назначайте событие в нём
                ExpandedWrap disabled
                  property SynMemo: TSynMemo read fSynMemo write SetSynMemo;
                   
                   
                  procedure TMyComp.SetSynMemo(const Value: TSynMemo);
                  begin
                    if fSynMemo = Value then Exit;
                    if Assigned(fSynMemo) then
                      if fSynMemo.OnClick = TMyComp.SynMemoClick then fSynMemo.OnClick = nil;
                    fSynMemo := Value;
                    if Assigned(fSynMemo) then fSynMemo.OnClick := SynMemoClick;
                  end;
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


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