![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов процедуры для динамического объекта [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).