Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

не работает динамически созданный обработчик   Найти похожие ветки 

 
begin...end ©   (2005-11-26 21:38) [40]

> sniknik ©   (26.11.05 20:37) [39]

> как ни странно да. понимаю. ;)

Тогда мне совершенно непонятно, к чему и о чём был последний абзац в [36].

> self у нас nil. и почему бы это? не потому ли что дату не
> заполнили?

Да, именно поэтому.

> почему? не потому ли что у нас переменная Sender образно
> говоря стала "ио" Self-a?

Да, именно поэтому.

> и что скажи сто тогда неверно в
> >> это потому что поле Data в примере не определено (nil)

Подход неверен, понимаете? Описывая регулярную процедуру, код которой предполагается использовать в качестве кода метода-события OnClick, с одним параметром, Вы теряете один параметр! Т-е-р-я-е-т-е! Вы сами зачем-то назначаете Data (Self), чтобы использовать потом его как Sender, и игнорируете автоматически передающийся при возбуждении события параметр -- "настоящий" Sender. Неужели непонятно?


 
sniknik ©   (2005-11-26 23:14) [41]

>> как ни странно да. понимаю. ;)
> Тогда мне совершенно непонятно, к чему и о чём был последний абзац в [36].
зачем говорю что без заполниения даты не обойтись? странно, вроде выяснили, что без нее действительно не обойтись.

>> self у нас nil. и почему бы это? не потому ли что дату не
>> заполнили?
> Да, именно поэтому.
и зачем было отрицать?

> Неужели непонятно?
конечно непонятно. без обяснений что имеется в виду
а это
>> это потому что поле Data в примере не определено (nil)
> Неверно.
без обьяснений, воспринимается однозначно, как необязательность даты к заполнению, что гораздо более грубая ошибка, чем простая потеря значения ненужного в общемто в данном случае параметра.

т.е. надо было не отрицать, что заполнение даты неверно, а дополнить, что кроме этого еще описание процедуры надо поправить, если нужны все параметры. (в принципе это только если предполагаются вызовы вида Button1.OnClick(Button4);) подход обьяснить.
а то я ему про фому, он про ерему...

ты сам то понимаеш, что своим заявлением ты просто... как бы это сказать, "потряс до глубины души", вроде того (офигел просто), и доказывал я только то что ее всетаки необходимо заполнять... то что ты связываеш "неверность" с параметром  (на который никакого намека) я понял только в [38] по абзатцу с "Человек пытается по Sender"у определить, какая кнопка нажата." когда "ваше величество" всетаки соблагоизволило опустится до обьяснений, что оно считает неверным.
и как видиш следующий же пост, все разьясил. вроде бы... нет?


 
Германн ©   (2005-11-27 02:46) [42]

А я всё равно не понимаю, для чего нужно кому-то реально сие извращение!


 
begin...end ©   (2005-11-27 10:12) [43]

> sniknik ©   (26.11.05 23:14) [41]

> зачем говорю что без заполниения даты не обойтись?

Нет, я не про это. Вы приводите описание типа TNotifyEvent и говорите, что там нет явно указанного параметра Self вначале, в то время как я говорил о том, что Self нужно явно указывать для обычной процедуры, а не для метода. Это говорит о том, что Вы видите не всю разницу между procedure и procedure of object.

> странно, вроде выяснили, что без нее действительно не обойтись.

Без неё можно обойтись. Если правильно описать процедуру, код которой будет использоваться как код обработчика события, и если внутри неё нет необходимости пользоваться параметром Self.

> простая потеря значения ненужного в общемто в данном случае
> параметра
.

LOL. 3 раза. Пол-ветки талдычим, как определить, какая кнопка нажата, а сейчас выясняется, что параметр, по которому это следует определять, не нужен.

Вот пример "обычного" назначения обработчика:

type
 TMyForm = class(TForm)
   ...
   procedure ClickEventHandler(Sender: TObject);
 end;

procedure TMyForm.ClickEventHandler(Sender: TObject);
begin
 ShowMessage((Sender as TComponent).Name);
end;

Button.OnClick := ClickEventHandler


Параметр Sender приходит сюда из самой кнопки -- из метода Click. Кнопка сама вызывает назначенный обработчик и передаёт в него указатель на себя -- это и есть Sender.

Теперь вернёмся к нашему случаю (варианту, который Вы считаете правильным):

procedure ClickEventHandler(Sender: TObject);
begin
 ShowMessage((Sender as TComponent).Name)
end;

var
 M: TMethod;
begin
 M.Code := @ClickEventHandler;
 M.Data := Button;
end;

Button.OnClick := TNotifyEvent(M)


Теперь скажите -- Вам понятно, что здесь Sender -- это содержимое Data, а не тот параметр, который приходит из кнопки (как в предыдущем примере)? И почему Вы игнорируете параметр, который даёт кнопка?

Пусть есть несколько кнопок, которым надо назначить одинаковый обработчик. Зачем нужно перед присваиванием каждой кнопке настраивать на неё поле Data, когда можно ничего не настраивать, а просто описать обработчик правильно, и для определения нажатой кнопки использовать предназначенный для этого параметр?

P.S. И всё же, в чём отличие вызова P от M:

var
 P: procedure;
 M: procedure of object;
begin
 P := ...;
 M := ...;
 P;  // вызов процедуры
 M; // вызов метода
end


?


 
Набережных С. ©   (2005-11-27 10:55) [44]


> begin...end ©   (27.11.05 10:12) [43]


> P.S. И всё же, в чём отличие вызова P от M: ...

Это вопрос риторический,  или нужен ответ?

Видимо риторический, поскольку в [43] все верно сказано, объявление procedure() of Object компилятор воспринимает как procedure(Self: TObject) , автоматически подставляя Self из TMethod.Data. В принципе, в некоторых случаяхопустить Self в регулярной процедуре не так уж страшно... но смысла так делать я тоже как-то не улавливаю:))


 
begin...end ©   (2005-11-27 11:00) [45]

> Набережных С. ©   (27.11.05 10:55) [44]

> Это вопрос риторический,  или нужен ответ?

Вопрос адресован автору [41]. Ответ нужен. Чтобы было понятно, о чём и как говорить дальше.


 
Набережных С. ©   (2005-11-27 11:14) [46]


> begin...end ©   (27.11.05 11:00) [45]

Вопросов больше не имею:)


 
sniknik ©   (2005-11-27 11:54) [47]

> Вопрос адресован автору [41]. Ответ нужен. Чтобы было понятно, о чём и как говорить дальше.
о чем дальше? в чем ты хочеш меня убедить?

и почему сам не отвечаеш на то почему считаеш что заполнение даты не нужно вовсе? ведь именно это я тебе пытался донести а не то что в каком параметре приходит.
но видимо не доносится...

> Теперь вернёмся к нашему случаю (варианту, который Вы считаете правильным):
конечно считаю. он более правильный чем ваш! у вас хоть и два параметра но один из них nil, при незаполнении дата.
у меня один просто прячется, у вас один как "бомба недотрога" (причем именно тот который и предлагается использовать).

предпочитаю вообше ничего не получить чем получить AV при обращении к одному из них.
(вернее мне это пофигу потому как сам подобного изврата делать никогда не буду, а там где это правильно делать там все автоматом)

вообще мне непонятно почему я стал "ответчиком", ваш "проступок"  гораздо серьезнее а вы почемуто считаете себя вправе "экзаменовать" меня.
т.е. пока не скажете почему вы считаете что незаполнение Data - верно. дальнейшие выяснения прекращаю.
"Чтобы было понятно, о чём и как говорить дальше."


 
begin...end ©   (2005-11-27 12:40) [48]

> sniknik ©   (27.11.05 11:54) [47]

> у меня один просто прячется, у вас один как "бомба недотрога"
> (причем именно тот который и предлагается использовать).

Что за бред?

procedure ClickEventHandler(Self, Sender: TObject);
begin
 ShowMessage((Sender as TComponent).Name)
end;

var
 M: TMethod;
begin
 M.Code := @ClickEventHandler;
 Button.OnClick := TNotifyEvent(M)
end;


AV не видно.

> вы почемуто считаете себя вправе "экзаменовать" меня

Я не экзаменую, а спрашиваю. А Вы не отвечаете. Почему-то.

> почему вы считаете что незаполнение Data - верно

Посмотрите код выше, и подумайте, почему Data не заполняется, а код работает. Причём единожды подготовленный TMethod можно назначить куче кнопок, ничего при этом не меняя. И он всё равно будет нормально работать.


 
sniknik ©   (2005-11-27 13:20) [49]


> Что за бред?
>
> procedure ClickEventHandler(Self, Sender: TObject);
> begin
>  ShowMessage((Sender as TComponent).Name)
> end;
>
> var
>  M: TMethod;
> begin
>  M.Code := @ClickEventHandler;
>  Button.OnClick := TNotifyEvent(M)
> end;
>
> AV не видно.


борьба за Self ради чего была? ради получения данных из правильного места, так? т.е. из Self -а кнопки, а не из Sender-а которого можно поменять вызвав к примеру непосредственно Button1.OnClick(Button4);
борешся за одно, а в примере сам используеш Sender (реального, не переименованого как в первом варианте)

> Я не экзаменую, а спрашиваю. А Вы не отвечаете. Почему-то.
спрашивают значит хотят чтото узнать, я часто отвечаю только поэтому.

> почему Data не заполняется, а код работает.
потому что Sender-а передают непосредственно при вызове метода.


 
begin...end ©   (2005-11-27 13:30) [50]

> sniknik ©   (27.11.05 13:20) [49]

> борьба за Self ради чего была? ради получения данных из
> правильного места, так?

Вообще ничего не понял.

> спрашивают значит хотят чтото узнать, я часто отвечаю только
> поэтому.

Так ведь и я спрашиваю не просто так, а для того, чтобы что-то узнать.

> потому что Sender-а передают непосредственно при вызове
> метода.

Где? Ещё раз: бросьте на форму кнопку, напишите код из [48] и нажмите кнопку. Код работает. То же можете повторить для нескольких кнопок. Где в коде [48] "Sender-а передают непосредственно при вызове метода"?


 
sniknik ©   (2005-11-27 13:52) [51]

> Где в коде [48] "Sender-а передают непосредственно при вызове метода"?
вызови для своего примера

Button1.OnClick(Button2);
Button1.OnClick(Button3);
Button1.OnClick(Button4);
Button1.OnClick(Button5);
Button1.OnClick(Button6);
Button1.OnClick(Button7);

работает событие кнопки 1, а что показывает?


 
sniknik ©   (2005-11-27 13:53) [52]

и попробуй получи что за кнопка работает на самом деле. те. прочитай Self.


 
begin...end ©   (2005-11-27 14:33) [53]

> sniknik ©   (27.11.05 13:52) [51]

Показывать будет, естественно, Button2, Button3 и т.д. Так же, как если бы OnClick был вызван в случае, когда ClickEventHandler является методом (т.е. как в первом примере кода из [43]). Вообще, назначьте кнопке обработчик обычным образом (в design-time), и вызовите OnClick с каким-нибудь параметром. Будет та же самая картина, что и в [48]. И что?

Вы так и не ответили, где в коде [48] "Sender-a передают непосредственно при вызове метода".

> sniknik ©   (27.11.05 13:53) [52]

А зачем мне его читать? Я же ничего не положил в Data -- значит, Self недействителен. Вот я к нему и не обращаюсь. Да и ClickEventHandler -- регулярная процедура, а не метод. Поэтому не совсем понятно, зачем внутри неё обращаться к Self"у.


 
sniknik ©   (2005-11-27 15:15) [54]

> Поэтому не совсем понятно, зачем внутри неё обращаться к Self"у.
чтобы узнать
vasek ©   (26.11.05 03:48) [26]
....
> т.е не понятно какая кнопочка нажата...
какая. не переданное кемто, а именно чей обьект работает. в вашем варианте, будет путаница.

> Вы так и не ответили, где в коде [48] "Sender-a передают непосредственно при вызове метода".
например
procedure TControl.Click;
begin
 { Call OnClick if assigned and not equal to associated action"s OnExecute.
   If associated action"s OnExecute assigned then call it, otherwise, call
   OnClick. }
 if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
   FOnClick(Self)
 else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
   ActionLink.Execute(Self)
 else if Assigned(FOnClick) then
   FOnClick(Self);
end;
все пользоваельские евенты так вызываются, из собственно события, проверка на определенность и вызов, то что сдесь Self там стало Sender. просто совпало так, порождаются то(и вызваются) всетаки они самими обьектами. но ничего не мешает и самому этот вызов сделать и тогда как говорил уже ты получиш не то какая кнопка отработала а то что тебе передадут.


 
begin...end ©   (2005-11-27 15:25) [55]

> sniknik ©   (27.11.05 15:15) [54]

> > т.е не понятно какая кнопочка нажата...
> какая. не переданное кемто, а именно чей обьект работает.
> в вашем варианте, будет путаница.

Не будет никакой путаницы. Sender -- это объект, который инициировал событие. Событие может инициироваться самой кнопкой (если просто нажать на неё) -- тогда она и будет Sender"ом, либо вручную -- тогда Sender"ом будет тот объект, который я указал при ручном вызове.

> но ничего не мешает и самому этот вызов сделать и тогда
> как говорил уже ты получиш не то какая кнопка отработала
> а то что тебе передадут.

Конечно. Повторю: так же, как и при обычном назначении обработчика:

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage((Sender as TComponent).Name)
end;

Button1Click(Form1)


И я не вижу в этом ничего страшного. Мой вариант работает так, как и обычный способ, а Ваш -- нет.


 
begin...end ©   (2005-11-27 15:30) [56]

> sniknik ©   (27.11.05 15:15) [54]

> > какая кнопочка нажата...

Вот именно. "Какая кнопочка нажата". Кнопочки у автора нажимаются, а не OnClick для них вручную вызывается.


 
sniknik ©   (2005-11-27 16:59) [57]

ну, если буквально, это не мой способ, мой был ответ почему при обращении ошибка вылетает. вылетала потому что в том виде он обращался к self который был не заполнен.
а по хорошему надо и то и то делать. (если бы не Data была не нужна то и борланд бы ее не заполнял, а так мало ли кто на self обьекта закладывается)


 
begin...end ©   (2005-11-27 18:22) [58]

> sniknik ©   (27.11.05 16:59) [57]

> ну, если буквально, это не мой способ

ОК, не Ваш. А тот, который Вы считаете правильным.

Или Вы уже не считаете его правильным? Если считаете -- то скажите, почему (я так и не понял, зачем Sender подменять чем-то своим), и почему он лучше моего (см. [47]). Если нет -- признайте, что ошибались.

> а по хорошему надо и то и то делать

По хорошему, надо делать только то, что надо. Предполагается внутри процедуры обращаться к Self -- значит, Data заполнять надо. Нет -- значит, нет.


 
sniknik ©   (2005-11-27 20:25) [59]

>  Нет -- значит, нет.
давай так. если не надо то и борланд не заполняет там где не надо, "расскрутим" операцию в обратку. любое пользовательское событие онклик/онкрейт/... любое слеланое нормально, борландом в дизайнере... ну без извратов.

найдеш такое, да согласен не надо.

например oncreate
procedure TForm1.Button1Click(Sender: TObject);
var Method: TMethod;
begin
 TNotifyEvent(Method):= Form1.onCreate;
 if Assigned(Method.Data) then Label1.Caption:= TComponent(Method.Data).Name;
end;
заполнено.
onDestroy
заполнено. и т.д.

любой метод любого компонента, до первого глюка (незаполнено).


 
begin...end ©   (2005-11-27 20:56) [60]

> sniknik ©   (27.11.05 20:25) [59]

Опять передёргиваем? Ну-ну.

Создаваемые в дизайнере обработчики -- это методы объекта (формы). В методе мы вправе пользоваться Self, поэтому недопустимо, чтобы он был равен nil.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.074 c
4-1128670772
Stanislav
2005-10-07 11:39
2005.12.11
как использовать CreateThread


2-1132643044
Juice
2005-11-22 10:04
2005.12.11
Как закрыть форму из ее же метода ?


2-1132129042
MakNik
2005-11-16 11:17
2005.12.11
dxDBGrid


4-1129090176
Smertb
2005-10-12 08:09
2005.12.11
hook


8-1120604738
ronyn
2005-07-06 03:05
2005.12.11
Загрузка файла в проигрыватель при открытии(файла)





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