Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов процедуры для динамического объекта [D7, WinXP]


neXOR ©   (2005-02-14 02:41:00) 

Есть форма , которая создается динамически На ней создается Button
Пытаюсь обработать события как Button1.onClick:='процедура обработки'; все прекрасно работает Но если я создаю окно в какой то
процедуре, а обработчик onClick где-то снаружи происходит ошибка
Я так понимаю нужно передать обработчик как параметр Но не совсем понимаю как


Александр Иванов   (2005-02-14 10:16:00) [1]

icWasya ©   (14.02.05 10:13) [4]
Unit

Classes

type TNotifyEvent = procedure (Sender: TObject) of object;


icWasya   (2005-02-14 10:13:00) [2]

>>Замечу, что если необходимо сделать обработчиком не метод >>объекта, как в приведённом примере, а именно обычную процедуру, то это тоже можно сделать, хотя и сложнее:

только для TNotifyEventпроцедура должна быть описана так:

// Процедура
procedure MyEventHandler(Self:TObject;Sender:TObject);
begin
// Нужные действия
end;


begin...end   (2005-02-14 09:06:00) [3]

> neXOR   (14.02.05 3:27) [2]

Как уже сказали, обработчиком может быть метод какого-нибудь (неважно, какого) объекта. Объявите этот метод и назначьте его в качестве обработчика.

interface

type
 // Это класс, внутри которого будет метод - например, форма
 TMyClass = class(...)
   ...
 private
   // А вот и сам метод
   procedure MyEventHandler(Sender: TObject);
   ...
 public
   ...
 end;

implementation

// Реализация метода
procedure TMyClass.MyEventHandler(Sender: TObject);
begin
 // Нужные действия
 Beep
end;

var
 MyClass: TMyClass;

...

begin
 ...
 // Теперь где-то в коде назначаем метод в качестве обработчика.
 // Переменная Button1 должна быть видна здесь,
 // а экземпляр TMyClass должен быть уже создан
 Button1.OnClick := MyClass.MyEventHandler
 ...
end


Замечу, что если необходимо сделать обработчиком не методобъекта, как в приведённом примере, а именно обычную процедуру, то это тоже можно сделать, хотя и сложнее:

// Процедура
procedure MyEventHandler;
begin
 // Нужные действия
end;

var
 // Обработчик
 Handler: TNotifyEvent;

begin
 // Подготавливаем Handler и назначаем его кнопке
 TMethod(Handler).Code := @MyEventHandler;
 TMethod(Handler).Data := Button1;
 Button1.OnClick := Handler
end


neXOR   (2005-02-14 03:27:00) [4]

Ошибка именно на этапе компилляциии и именно такая
Можно поподробнее


Cobalt   (2005-02-14 03:06:00) [5]

Обработчик - это метод какого-то класса. Как правило - формы.
И если в этом обработчике обращяться к самой форме или её свойствам в тот момент, когда она ещёили ужене существует - то, вполне естевственно, будет ошибка обращения к несуществующему объекту (Access Violation).
А если ошибка на этапе компиляции - компилятор не может найти метод - тогда при передаче метода надо явно указывать тип обработчика (например, TNotifyEvent).


Наверх

Титульная страница Поиск, карта сайта Написать письмо