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

Вниз

Вопрос по стандартному обработчику Edit - Change   Найти похожие ветки 

 
вопрос   (2005-02-28 18:32) [0]

Господа, мне надо сделать свой компонент, причем надо изменить стандартный обработчик 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 18:36) [1]


> constructor TSEdit.Create(TOwner:TComponent);
> begin
>  self.text:="000";//ïðè äîáàâëåíèè ýòîãî âîçíèêàåò îøèáêà
>  inherited Create(TOwner);
> end;

ставишь свойство, не создав объект. Поменяй местами строчки


 
вопрос   (2005-02-28 18:50) [2]

2 clickmaker
>ставишь свойство, не создав объект. Поменяй местами строчки
Да, спасибо. Ошибка "Access voilation at address 00000000. Read of address 00000000" больше не возникает, но всё равно при размещении компонента на форме (т.е. ещё до трансляции) запускается обработчик события Onchange у этого компонента. Как бы сделать так, чтобы он не срабатывал до запуска программы?


 
clickmaker ©   (2005-02-28 18:55) [3]


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

а с трех раз не догадаться? :)


 
вопрос   (2005-02-28 19:00) [4]

2 clickmaker
Ты не понял:
1) Берешь компонент с палитры
2) Кладешь на форму
3) ShowMessage тут же срабатывает
    Cеки, прога не работает!!!
       ShowMessage тут же срабатывает!!!!!!!!!!!!!!!

Напрашивается вопрос: WHY??????????????????
И как это исправить???


 
Smithson   (2005-02-28 19:01) [5]

у компонента есть поле ComponentState, так вот при проектировании в нем стоит флаг csDesigning. Проверяй его в OnChange.


 
clickmaker ©   (2005-02-28 19:02) [6]


> вопрос   (28.02.05 19:00) [4]
> 2 clickmaker
> Ты не понял

я-то понял, а вот ты - похоже, нет :)
Ты в конструкторе сразу ставишь свойство текст - отсюда и ивент.
Заблокируй его на это время - и все дела


 
GuAV ©   (2005-02-28 19:07) [7]

if csDesigning in ComponentState then
showmessage("Hello");//

clickmaker ©   (28.02.05 19:02) [6]
Заблокируй его на это время

Кого ?


 
clickmaker ©   (2005-02-28 19:35) [8]


> GuAV ©   (28.02.05 19:07) [7]

ну вот примерно как ты и показал
procedure TSEdit.Change;
begin
 if csDesigning in ComponentState then Exit;



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

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

Наверх




Память: 0.49 MB
Время: 0.037 c
1-1109687582
Cosinus
2005-03-01 17:33
2005.03.13
Как в ScrollBar запретить моргание ползунка?


1-1109262876
AlexanderVas
2005-02-24 19:34
2005.03.13
Можно ли поменять тип записи во время исполнения программы


9-1102539334
Domowoi
2004-12-08 23:55
2005.03.13
Загруз в PowerDraw


14-1108713903
07BB:080Dh
2005-02-18 11:05
2005.03.13
Пить или не пить. за и против ?


14-1108883719
AlterEgo of WondeRu
2005-02-20 10:15
2005.03.13
Вчера попытался посмотреть ДОМ2...