Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.16.29.209] |
|
Сообщ.
#1
,
|
|
|
Делаю свой компонент класса TComponent. В published секции записал так:
private fSynMemo:TSynMemo; ...... published property SynMemo: TSynMemo read fSynMemo write fSynMemo; Можно ли мне в своём компоненте, получив ссылку на TSynMemo компонент через свойство SynMemo, переопределить его событие OnClick? пробовал так: protected procedure OnClicks(Sender: TObject); procedure Txxx.OnClicks(Sender: TObject); begin showmessage('dd'); end; //в процедуре Create своего компонента указываю fSynMemo.OnClick:=OnClicks; при работе с компонентом и при клике на SynMemo на форме - ничего не происходит **************************** выявил что при проверке на доступность fSynMemo показывает что он nil... в Create процедуре моего компонента |
Сообщ.
#2
,
|
|
|
Цитата Алексей @ выявил что при проверке на доступность fSynMemo показывает что он nil... в Create процедуре моего компонента Так присваивать ссылку в любом случае нужно. Добавлено Где-то должно быть fSynMemo := |
Сообщ.
#3
,
|
|
|
короче разобрался. Сообщение showmessage('dd'); появляется, но я присвоил fSynMemo.OnClick:=OnClicks; после создания компонента (с помощью constructor Create;) в другой процедуре.
Цитата Где-то должно быть fSynMemo := я присваиваю этот компонент полю в своём компоненте в дизайн-тайме (выпадающий список в Object Inspector). Как мне можно назначить необходимые переопределения событий (fSynMemo.OnClick:=OnClicks;) при старте приложения (где в дизайн-тайме указал в моём компоненте ссылку на SynMemo)? Добавлено ладно, сделаю через ещё одну функцию при обращении к компоненту. Добавлено Тогда ещё один вопрос. А как не перекрыть событие OnClick, а дополнить его? |
Сообщ.
#4
,
|
|
|
Цитата Алексей @ Тогда ещё один вопрос. А как не перекрыть событие OnClick, а дополнить его? Сохранить у себя в отдельном поле? Вызывать сначала своё а затем сохранённое. |
Сообщ.
#5
,
|
|
|
эмм....у меня вызывается сообщение showmessage('dd') при клике на компонент SynMemo на форме. Значит я его событие перехватил. Это то, что нужно. Но если я укажу в самом свойстве OnClick компонента SynMemo какой-либо код, то он не исполняется, так как мой перехват события перекрывает исполнение события компонента-источника. Как мне исполнять не только свой код в перехваченном событии, но и код в событии SynMemo?
|
Сообщ.
#6
,
|
|
|
Цитата Алексей @ Как мне исполнять не только свой код в перехваченном событии, но и код в событии SynMemo? Сейчас прилинкую файл 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. Добавлено Вот простейши примерчик Сомое главное это передать "пользователю" свой кучочек радости //регистрация типа события TMyClick = procedure(Sender: TObject) of object; //... //Объявления события оно у тебя будет в Design time на вкладке EVENTS OnMyClick :TMyClick read fonCLick write fonCLick; ///.... //Непоссредственно передаем управление if Assigned(fOnClick) then OnMyClick(Self); Добавлено и убери myadvcheckbox из списка юнитов Я его случайно прописал! Прикреплённый файлforum.rar (7.48 Кбайт, скачиваний: 136) |
Сообщ.
#7
,
|
|
|
Создайте метод присвоение SynMemo и назначайте событие в нём
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; |