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

Вниз

Как узнать имя события в Run Time   Найти похожие ветки 

 
ancot   (2007-10-19 15:09) [0]

Всем доброго дня!
Подскажите есть ли возможность узнать имя события в Run Time при наступлении этого события.
Например: для Button методам OnClick и OnExit назначен один итотже обработчик  NotifyEvent.
как различить события в процедуре TForm.NotifyEvent(Sender: TObject) ?


 
Palladin ©   (2007-10-19 15:18) [1]

да в общем то, AFIAK, никак... разве что через глубокий анализ стека (через попу грубо говоря)...

да и не нужно это... для этого и придумана возможность повешать два разных обработчика на два разных события...


 
Сергей М. ©   (2007-10-19 15:20) [2]

А зачем понадобились эти имена ?


 
ancot   (2007-10-19 15:32) [3]

делаю дизайнер форм.
в рабочем режиме всем контролам на форме назначается один и тот же обработчик наприме для
MouseDown, MouseUp -> MouseEvent
KeyDown, KeyUp -> KeyEvent

OnClick, OnChange, OnExit, OnEnter и т.д. -> NotifyEvent

знать имя события необходимо чтобы выполнить скрипт соотв. этому событию и контролу (контрол конечно есть-sender).
Хотелось зделать универсально чтобы не плодить к каждому событию свой обработчик.


 
ancot   (2007-10-19 15:34) [4]

дельфийский стэк вызовов както видит...


 
Reindeer Moss Eater ©   (2007-10-19 15:35) [5]

А обработчик во время написания не знает чей он орабочик?


 
ancot   (2007-10-19 15:40) [6]

форма в целом грузится из файла.
в момент загрузки контролов в зависимости от типа события (TNotifyEvent,TMouseEvent, TKeyPressEvent, TKeyPressEvent)  подключается соответствующий обработчик

if SameText(pi.PropType^.Name, "TNotifyEvent") then
begin
  p := Form.MethodAddress("NotifyEvent");
  if Assigned(p) then
  begin
     mtd.Code := p;
     mtd.Data := Form;
     SetMethodProp(AComponent, pi.Name, mtd);


 
ancot   (2007-10-19 15:46) [7]

Описаный выше участок кода загрузки формы можно упростить если тип события будет совподать с именем обработчика. но все равно придется назначать обработчик для каждого имени события.


 
Anatoly Podgoretsky ©   (2007-10-19 19:17) [8]

> ancot  (19.10.2007 15:46:07)  [7]

Назначить каждому событию свой обработчик с таким кодом

begin
  CommonCode(Name, другие параметы);
end;

procedure .CommonCode(Name: string, другие параметы);
begin
end;


 
Юрий Зотов ©   (2007-10-19 19:58) [9]

Берем Sender.
Формируем список его событий типа TNotifyEvent.
Находим, какому из них назначен выполняемый обработчик.
Берем имя этого события.


 
Ins ©   (2007-10-19 20:02) [10]


> Находим, какому из них назначен выполняемый обработчик.

Обоим :)


 
Palladin ©   (2007-10-19 20:06) [11]


> Юрий Зотов ©   (19.10.07 19:58) [9]

да да :) именно обоим :) а находим первый попавшийся


 
Однокамушкин   (2007-10-21 16:27) [12]


> ancot   (19.10.07 15:34) [4]
> дельфийский стэк вызовов както видит...

Видит он потому, что в программу включается отладочная информация... выключите соответствующую опцию компилятора, и он тоже не увидит



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
2-1197975866
Indigo
2007-12-18 14:04
2008.01.20
Замена в файле 3 больших букв на аналогичные маленькие


2-1198155687
Stepper
2007-12-20 16:01
2008.01.20
Как в Delphi указать путь компиляции проекта? Типа: С:/Executable


2-1198135098
LexXL
2007-12-20 10:18
2008.01.20
независимое окно


15-1197727186
turbouser
2007-12-15 16:59
2008.01.20
Хоккей


9-1165965583
Vladimir1984
2006-12-13 02:19
2008.01.20
Как выставить на поверхности Карты высот числовые зачения?