Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
10-1084352475
nick_
2004-05-12 13:01
2005.02.27
Проблема с Access Permissions DComCnfg


4-1103190765
Atomic2004
2004-12-16 12:52
2005.02.27
сообщения Net send


14-1106910087
Aleksandr
2005-01-28 14:01
2005.02.27
Проблема с принтером в сети....


14-1107463276
Kerk
2005-02-03 23:41
2005.02.27
Серьезный вопрос


1-1108385585
ST
2005-02-14 15:53
2005.02.27
Сервисы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский