Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Как создать обрабочик для события.   Найти похожие ветки 

 
rainy day   (2004-04-01 14:14) [0]

Здраствуйте, уважаемые. У меня появилась такая проблема:
Класс описывается на основе TMemo
(type ***=class(TMemo)
   [процедуры]

end;   )

Экземпляр класса я создаю из программы. Мне необходимы обработчики для некоторых событий, которыми обладает родительский класс (Tmemo)/ Например для Change.
Я не знаю как это сделать.
Я пробовал добавить описание процедуры [класс].[объект]Change в описание класса и в код - не получается.

Forever rain.


 
Digitman ©   (2004-04-01 14:21) [1]


> Я пробовал


а мы тут догадываться должны, что ты там в действительности пробовал


 
rainy day   (2004-04-01 14:26) [2]

Вот так описан класс//

type Tfield=class(TMEMO)
 public
  procedure Normal();
  function syntextest():boolean;
  procedure properties();
  procedure BuildCommandList(out CountCommandList:Word;out COuntConsist:word; out commandList:TypCommandlist; out CommandInfo:TypCommandInfo);
  function NomerBuKV(s:string):Byte;
  procedure Select(index:integer);
  procedure txtFieldChange(Sender: TObject);
 private
end;

Вот эта процедура не является обработчиком события (потому,что не меняется при изменении содержимого объекта). Почему не знаю.

Как сделать, чтобы она таковым стала или как сделать по другому.

Так понятнее?


 
Algol   (2004-04-01 14:31) [3]

Добавь метод  
procedure Change;override;
И в нем делай обработку события.


 
Digitman ©   (2004-04-01 14:39) [4]


> Мне необходимы обработчики для некоторых событий, которыми
> обладает родительский класс


ты его уже задекларировал в методе txtFieldChange()

в любом месте, например, в конструкторе просто назначь свой обработчик

OnChange := txtFieldChange;


 
LAMER100   (2004-04-01 14:43) [5]

в published надо прописать propery OnChange


 
rainy day   (2004-04-01 14:49) [6]

Спасибо за ответы!
Премного благодарен.


 
noname   (2004-04-01 15:00) [7]

Называние метода класса каким-бы то ни было именем в общем случае (не учитывая полиморфизма) не приведет к автоматическому вызову этого метода в экземпляре класса. Метод должен быть вызван явно (в Вашем коде или в унаследованном коде).
Либо используйте полиморфизм (в случае наследования класса) и переопределяйте унаследованные методы; либо привязывайте обработчики событий - в случае инкапсуляции объекта в классе; или при наследовании назначайте самому объекту свои же обрабочики (это в худшем случае), но делать это настоятельно не рекомендуется (лучше посмотрите код предка, определите, в каком методе вызывается обработчик события и переопределите этот метод).

Примеры:

Полиморфизм (см. [3]):
type
 TMyMemo = class(TMemo)  
   ...
   procedure Change; override;
   ...
 end;


Назначение обработчиков событий:
type
 TMyMemo = class(TCustomControl)
 private
   m_Memo: TMemo;
   procedure OnMemoChange(a_Sender: TObject);
 public
   constructor Create(a_Owner: TComponent);
 end;

implementation

procedure TMyMemo.OnMemoChange(a_Sender: TObject);
begin
 // делаем что-то
end;

constructor TMyMemo.Create(a_Owner: Tcomponent);
begin
 inherited Create(a_Owner);
 m_Memo := TMemo.Create(Self);
 m_Memo.Parent := Self;
 m_Memo.OnChange := OnMemoChange;
 ...
end;


Не забудьте, что в случае, если инкапсулированный объект унаследован не от TComponent (или в качестве Owner"а передан nil), Вам необходимо удалить его в деструкторе инкапсулирующего класса.



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
14-1080097484
Думкин
2004-03-24 06:04
2004.04.18
С днем рождения! 24 марта.


14-1080541211
Layner
2004-03-29 10:20
2004.04.18
Кто смотрит "Момент истины" в 20.00 по ТВЦ???


1-1080536318
race1
2004-03-29 08:58
2004.04.18
findnextprinterchangenotification


14-1080119346
DEN75
2004-03-24 12:09
2004.04.18
передача звука по сети


7-1077205347
TankMan
2004-02-19 18:42
2004.04.18
Можно вопрос по WMessages...