![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по стандартному обработчику Edit - Change
вопрос © (2005-02-28 18:32:00)Господа, мне надо сделать свой компонент, причем надо изменить стандартный обработчик Change. Если я переопределяю обработчик предка, то этот обработчик выполняется в процессе проектирования компонента. Причем, если в этом обработчике я работаю с какими-либо свойствами компонента, то при расположении уже готового компонента на форму он выдает ошибку: "Access voilation at address 00000000. Read of address 00000000" и не появляетя.
unit SEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TSEdit = class(TEdit)
private
{ Private declarations }
protected
procedure Change;override;
constructor Create(TOwner:TComponent);override;
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure TSEdit.Change;
begin
showmessage('Hello');//âîò ýòî âûïîëíÿåòñÿ ïðè ïðîåêòèðîâàíèè
inherited Change;
end;
procedure Register;
begin
RegisterComponents('Samples', [TSEdit]);
end;
constructor TSEdit.Create(TOwner:TComponent);
begin
self.text:='000';//ïðè äîáàâëåíèè ýòîãî âîçíèêàåò îøèáêà
inherited Create(TOwner);
end;
end.
clickmaker (2005-02-28 19:35:00) [1]
> GuAV © (28.02.05 19:07) [7]
ну вот примерно как ты и показал
procedure TSEdit.Change;
begin
if csDesigning in ComponentState then Exit;
GuAV (2005-02-28 19:07:00) [2]if csDesigning in ComponentState then
showmessage('Hello');//
clickmaker © (28.02.05 19:02) [6]
Заблокируй его на это время
Кого ?
clickmaker (2005-02-28 19:02:00) [3]
> вопрос (28.02.05 19:00) [4]
> 2 clickmaker
> Ты не понял
я-то понял, а вот ты - похоже, нет :)
Ты в конструкторе сразу ставишь свойство текст - отсюда и ивент.
Заблокируй его на это время - и все дела
Smithson (2005-02-28 19:01:00) [4]у компонента есть поле ComponentState, так вот при проектировании в нем стоит флаг csDesigning. Проверяй его в OnChange.
вопрос (2005-02-28 19:00:00) [5]2 clickmaker
Ты не понял:
1) Берешь компонент с палитры
2) Кладешь на форму
3) ShowMessage тут же срабатывает
Cеки, прога не работает!!!
ShowMessage тут же срабатывает!!!!!!!!!!!!!!!
Напрашивается вопрос: WHY??????????????????
И как это исправить???
clickmaker (2005-02-28 18:55:00) [6]
> Как бы сделать так, чтобы он не срабатывал до запуска программы?
а с трех раз не догадаться? :)
вопрос (2005-02-28 18:50:00) [7]2 clickmaker
>ставишь свойство, не создав объект. Поменяй местами строчки
Да, спасибо. Ошибка "Access voilation at address 00000000. Read of address 00000000" больше не возникает, но всё равно при размещении компонента на форме (т.е. ещё до трансляции) запускается обработчик события Onchange у этого компонента. Как бы сделать так, чтобы он не срабатывал до запускапрограммы?
clickmaker (2005-02-28 18:36:00) [8]
> constructor TSEdit.Create(TOwner:TComponent);
> begin
> self.text:='000';//ïðè äîáàâëåíèè ýòîãî âîçíèêàåò îøèáêà
> inherited Create(TOwner);
> end;
ставишь свойство, не создав объект. Поменяй местами строчки