Главная страница
    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.46 MB
Время: 0.037 c
14-1107197925
rts111
2005-01-31 21:58
2005.02.27
Генератор корней


3-1106688163
MakedoneZ
2005-01-26 00:22
2005.02.27
Про компонент DBGrid и тип данных Boolean.


11-1082998899
Вудзрш5.01
2004-04-26 21:01
2005.02.27
завтра утром прогу сдавать а проблема возникла там где ее ни кто


1-1108037715
VladRaven
2005-02-10 15:15
2005.02.27
Perform(WM_NEXTDLGCTL, 0, 0) = следующий а как = предыдущий.?


1-1108228433
BDenis
2005-02-12 20:13
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский