Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.023 c
7-1075994955
Александр из Минска
2004-02-05 18:29
2004.04.18
Проблема с ShellExecute(..., PChar( mailto:..... ), ...)


1-1080828616
Alex_B
2004-04-01 18:10
2004.04.18
Подскажите пожалуйста новичку каким компонетом в Delphi


1-1080636305
Фикус
2004-03-30 12:45
2004.04.18
Вопрос по Excel


9-1065961007
Larrel
2003-10-12 16:16
2004.04.18
2D Isometric Engine для RPG


1-1081002685
ss300
2004-04-03 18:31
2004.04.18
Install Shield




   Наверх