Главная страница
    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.053 c
1-1108385585
ST
2005-02-14 15:53
2005.02.27
Сервисы


1-1107966737
juice
2005-02-09 19:32
2005.02.27
Глобальная переменная


1-1108441307
Steve
2005-02-15 07:21
2005.02.27
TImageList - как можно из одного рисунка вырезать много мелких?


1-1108475251
BFG9k
2005-02-15 16:47
2005.02.27
Как найти место ошибки по адресу?


14-1106667413
ali_tash
2005-01-25 18:36
2005.02.27
как заставить windows использовать файл подкачки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский