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

Вниз

Вызов процедуры для динамического объекта   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
1-1108017660
ivc_andr
2005-02-10 09:41
2005.02.27
Название приложения в MessageBox


1-1108349796
alena.svt
2005-02-14 05:56
2005.02.27
Code Explorer


3-1106838076
}|{yk
2005-01-27 18:01
2005.02.27
SQLite. Никто не пробовал?


10-1084352475
nick_
2004-05-12 13:01
2005.02.27
Проблема с Access Permissions DComCnfg


14-1107368351
Луарвик
2005-02-02 21:19
2005.02.27
Вышел трейлер фильма BloodRayne