Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
ВнизВызов процедуры для динамического объекта Найти похожие ветки
← →
neXOR (2005-02-14 02:41) [0]Есть форма , которая создается динамически На ней создается Button
Пытаюсь обработать события как Button1.onClick:="процедура обработки"; все прекрасно работает Но если я создаю окно в какой то
процедуре, а обработчик onClick где-то снаружи происходит ошибка
Я так понимаю нужно передать обработчик как параметр Но не совсем понимаю как
← →
Cobalt © (2005-02-14 03:06) [1]Обработчик - это метод какого-то класса. Как правило - формы.
И если в этом обработчике обращяться к самой форме или её свойствам в тот момент, когда она ещё или уже не существует - то, вполне естевственно, будет ошибка обращения к несуществующему объекту (Access Violation).
А если ошибка на этапе компиляции - компилятор не может найти метод - тогда при передаче метода надо явно указывать тип обработчика (например, TNotifyEvent).
← →
neXOR (2005-02-14 03:27) [2]Ошибка именно на этапе компилляциии и именно такая
Можно поподробнее
← →
begin...end © (2005-02-14 09:06) [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
← →
icWasya © (2005-02-14 10:13) [4]>>Замечу, что если необходимо сделать обработчиком не метод >>объекта, как в приведённом примере, а именно обычную процедуру, то это тоже можно сделать, хотя и сложнее:
только для TNotifyEvent процедура должна быть описана так:
// Процедура
procedure MyEventHandler(Self:TObject;Sender:TObject);
begin
// Нужные действия
end;
← →
Александр Иванов © (2005-02-14 10:16) [5]icWasya © (14.02.05 10:13) [4]
Unit
Classes
type TNotifyEvent = procedure (Sender: TObject) of object;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.039 c