Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2016, 23:56   #11
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Чо вы орёте? Кругом люди спят!

С одной стороны обработчик события - это свойство-метод. Его задумывает автор класса, а создаёт и присваивает ссылку - пользователь этого класса. Никто не запрещает вызывать обработчик (как метод) откуда хочешь, передавая внутрь него подходящие параметры. Имхо, это иногда бывает удобно, а в других случаях - приводит к путанице и брейнфакингу.

Лично я использую такую возможность только в несерьёзных работах, ибо тупо лень писать нечто для обхода этого безобразия, ведь не все обработчики имеют тип TNotifyEvent, и могут принимать любые входные/выходные параметры и даже быть функциями, а не процедурами. Например, чтобы вручную вызвать обработчик события Application.OnIdle, нужно заводить дополнительную переменную boolean, чтобы подставлять её в вызов в качестве параметра по ссылке (var), что неудобно и пудрит мозг.

Параметр Sender позволяет однозначно идентифицировать объект, вызвавший событие, если этого захотел автор этого объекта. Также он может быть равным nil.

Ну и в заключение, копипаст из первого попавшегося проекта - один обработчик для разных событий разных объектов и компонентов.

Код:
procedure TFormMain.ActionExecute(Sender: TObject);
begin
  case TComponent(Sender).Tag of
    0: Close();
    1: if ActionProcess.Enabled and ShowMoveWarning() and not ProcessFiles()
         then MessageBox(Handle, PChar('Ошибка или прервано.'),
                         PChar('Ошибка'), MB_OK + MB_ICONERROR);
    10: AddFiles();
    12: DeleteSelectedFiles();
    15: ListView.SelectAll();
    40: PanelTop.Visible:= not PanelTop.Visible;
    41: SetDestFolder();

    200: AboutDialog.Execute();
    LIST_UPDATER_TAG: ListView.Invalidate();
  end;
end;
Этот обработчик присвоен не только событиям TAction.OnExecute, но и подходящим событиям (OnClick, OnDblClick и т.п.) визуальных компонентов на форме.

Это не всё, что я хотел тут написать. Просто задолбался.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.03.2016, 00:57   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну ActionExecute это таки более осмысленно, чем BitBtn1Click для всего подряд.

Цитата:
Имхо, это иногда бывает удобно, а в других случаях - приводит к путанице и брейнфакингу.

Лично я использую такую возможность только в несерьёзных работах, ибо тупо лень писать нечто для обхода этого безобразиям
Да, я примерно о том же (только случаи когда создание нормальной процедуры сильно сложнее по-моему как-то редко встречаются), а предыдущий оратор зачем-то пытался приучить новичка использовать это как наилучшее решение, и в совсем уж неподходящих ситуациях


Цитата:
Это не всё, что я хотел тут написать.
пишиещё
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 22.03.2016 в 01:03.
Alex11223 вне форума Ответить с цитированием
Старый 28.03.2016, 22:24   #13
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

использовать событийный метод имеет смысл лишь для ОДНОКЛАССОВЫХ объектов. Т.е. если это Button1Click(Sender:TObject), то вероятнее всего код, написанный внутри тела метода, будет относиться целиком к кнопке, при условии что Sender вообще там задействован Глупо было бы получить AV на строчке TButton(Sender).Caption := 'текст' при вызове Button1Click(Edit1). Оба оратора правы по-своему. Использовать можно все, главное делать это правильно.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров в хранимой процедуре Maxjuvefan БД в Delphi 7 17.09.2015 14:09
createthread и передача параметра процедуре fucil Win Api 9 19.01.2012 19:19
[Delphi] Передача параметров процедуре Язь Помощь студентам 0 09.12.2011 17:38
Передача процедуре статического массива cod48 Общие вопросы Delphi 1 24.08.2010 21:07
Передача параметра процедуре FormCreate Grandistok Общие вопросы Delphi 3 24.04.2010 15:42