Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизКак создать обрабочик для события. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.027 c