<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3096192</guid>
        <pubDate>Wed, 14 Mar 2012 21:10:11 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3096192</link>
        <description><![CDATA[--Ins--: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3096113'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T21:40:35+04:00">14.03.12, 17:40</time></span><div class='quote '>Это просто &quot;затычка&quot; для редких ситуаций, когда обработка производится не в методе класса, а в обычной процедуре и соот-но &quot;некуда пристроить&quot; оработчик.</div></div><br>
<br>
Частный, общий, редкий, частый - от этого грязность не зависит :) Ты сам дал выше правильное определение грязности<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3096113'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T17:40:35+00:00">14.03.12, 17:40</time></span><div class='quote '>А накосячить из-за собственной забывчивости или тупости можно где-угодно (например, с теми же нетипированными var-параметрами или переполнением буфера), и приводить это может действительно к трудновыявляемым багам, а не к явному AV как в случае с nil-указателем.</div></div><br>
<br>
Если я накосячу из-за того, что попытаюсь сделать что-то нелегальное сам - вина будет моя. Если же я, выполнив совершенно легальную и безобидную операцию (обращение к Self внутри метода), получу косяк - тут извините прокляну того, кто мне такую свинью подложил - и буду прав.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3096113'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T17:40:35+00:00">14.03.12, 17:40</time></span><div class='quote '>К тому же против забывчивости есть хорошее средство - не лениться писать комментарии, особенно при наличии каких-то ограничений в использовании.</div></div><br>
<br>
У Фаулера это первое правило обнаружение говнокода - если где-то стоит/хочется написать комментарий, без которого поведение кода не очевидно. И я с этим утверждением категорически согласен :) <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3096113'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T17:40:35+00:00">14.03.12, 17:40</time></span><div class='quote '>PS: Разумеется я ни в коей мере не агитирую за использование подобных трюков, но думаю, что в FAQ заметка об их существовании не помешает - разумеется с предупреждением об отказе от ответственности за причиненный ущерб</div></div><br>
<br>
Я думаю что с примерно такой фразы лучше и начинать. А еще лучше - и заканчивать :D Хотя я раньше сам любил такие всяческие грязненькие штучки и хаки - правда скорее из спортивного интереса, нежели из практического :yes: <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3096113'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T17:40:35+00:00">14.03.12, 17:40</time></span><div class='quote '>Проблемы 21 века - это чрезмерное потребление &quot;ресурсов&quot;, приводящее к ожирению и мировым кризисам, а также искуственно насаждаемое отупление масс, приучаемых к ЕГЭ и шаблонному мышлению</div></div><br>
<br>
Интересное замечание, но и с ним можно поспорить... Ну, скажем, пожалуй ожирение лучше чем недоедание, а экономические циклы с периодически случающимися кризисами, сопровождающиеся падением доходов населения с 2500 евро до 2000 евро - лучше чем &quot;министерство изобилия увеличивает недельную норму потребление шоколада до 30 грамм&quot;... Я думаю понятно к чему я клоню ;) Проблемы 21-го века они ступенькой выше проблем 20-го, т.е. подразумевают что они уже решены и теперь можно двигаться дальше. Применительно к сабжу - никакой проблемы в современных условиях наличие лишней VMT не создает. В смысле <strong class='tag-b'>вообще</strong> никакой<br>
<br>
PS: ну не такой уж и оффтоп :D]]></description>
        <author>--Ins--</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3096113</guid>
        <pubDate>Wed, 14 Mar 2012 17:40:35 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3096113</link>
        <description><![CDATA[leo: :offtop:<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095933'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>&#045;&#045;Ins&#045;&#045; &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T12:07:41+00:00">14.03.12, 12:07</time></span><div class='quote '>Нет, он грязен тем, что ...</div></div><br>
Не надо обобщать, т.к. в данном случае речь идет об особом случае: и способ с классовым методом и способ с nil-указателем НЕ предназначены для обращения к полям объекта и тем более к виртуальным методам. Это просто &quot;затычка&quot; для редких ситуаций, когда обработка производится не в методе класса, а в обычной процедуре и соот-но &quot;некуда пристроить&quot; оработчик. А накосячить из-за собственной забывчивости или тупости можно где-угодно (например, с теми же нетипированными var-параметрами или переполнением буфера), и приводить это может действительно к трудновыявляемым багам, а не к явному AV как в случае с nil-указателем. К тому же против забывчивости есть хорошее средство - не лениться писать комментарии, особенно при наличии каких-то ограничений в использовании.<br>
PS: Разумеется я ни в коей мере не агитирую за использование подобных трюков, но думаю, что в FAQ заметка об их существовании не помешает - разумеется с предупреждением об отказе от ответственности за причиненный ущерб :)<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095933'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>&#045;&#045;Ins&#045;&#045; &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T12:07:41+00:00">14.03.12, 12:07</time></span><div class='quote '>ОМГ, тоже мне проблема в 21-м веке  </div></div><br>
Проблемы 21 века - это чрезмерное потребление &quot;ресурсов&quot;, приводящее к ожирению и мировым кризисам, а также искуственно насаждаемое отупление масс, приучаемых к ЕГЭ и шаблонному мышлению :D<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3096012'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T13:20:17+00:00">14.03.12, 13:20</time></span><div class='quote '>Для классовых же методов компилятор не даст &quot;выстрелить себе в ногу&quot;.</div></div><br>
Ага, только если мы рассуждаем о забывчивости на грани бездумности, то с таким же успехом можно забыть написать приставку class :D</span>]]></description>
        <author>leo</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3096012</guid>
        <pubDate>Wed, 14 Mar 2012 13:20:17 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3096012</link>
        <description><![CDATA[Fr0sT: Метод leo более опасен, т.к. можно ненароком забыться и обратиться к полю объекта. Для классовых же методов компилятор не даст &quot;выстрелить себе в ногу&quot;.<br>
Кроме того, обкатал этот метод в своих приложениях - выяснилась ещё одна приятная особенность: если добавить классовых переменных, можно на халяву получить синглтон :) <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2012-03-14T14:12:29+00:00">14.03.12, 14:12</time></span></span><br>
А эту мешанину простая функция/метод/ссылка заменили бы уж одними ссылками (reference). Для простеньких методов удобно, когда код внутри другой подпрограммы, а если хочется выделять, то ради бога - вызывай внутри reference хоть процедуру, хоть метод]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095933</guid>
        <pubDate>Wed, 14 Mar 2012 12:07:41 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095933</link>
        <description><![CDATA[--Ins--: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095928'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T12:02:22+00:00">14.03.12, 12:02</time></span><div class='quote '>А мой-то чем грязен, только тем, что непонятен &quot;непосвященным&quot;?  Грязный этот тот, который либо использует недокументированные возможности, либо может привести к непредсказуемым ошибкам из-за отключения проверки типов, передачи какого-то мусора и т.п. В данном же случае вполне &quot;законно&quot; вместо Self передается nil, что вполне допустимо, если этот параметр в обработчике не используется, а если используется, то получим вполне предсказуемый AccessViоlation</div></div><br>
<br>
Нет, он грязен тем, что работает только благодаря некоторым особенностям &quot;подкапотного&quot; механизма, и приведет к багу при первом же явном или неявном (вызов виртуального/динамического метода например) обращении к Self. Нельзя вызывать методы для невалидных ссылок, даже несмотря на то, что очень хочется и кажется что можно. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095928'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T12:02:22+00:00">14.03.12, 12:02</time></span><div class='quote '>о, боже, что на это скажет --Ins--</div></div><br>
<br>
Инсу интереснее и кажется более оправданным случай, когда наоборот ;) <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2012-03-14T12:10:45+00:00">14.03.12, 12:10</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095928'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T12:02:22+00:00">14.03.12, 12:02</time></span><div class='quote '>и тем самым засорять код лишней VMT</div></div><br>
<br>
ОМГ, тоже мне проблема в 21-м веке :wall:]]></description>
        <author>--Ins--</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095928</guid>
        <pubDate>Wed, 14 Mar 2012 12:02:22 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095928</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095886'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>&#045;&#045;Ins&#045;&#045; &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T11:01:44+00:00">14.03.12, 11:01</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095863'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T10:42:23+00:00">14.03.12, 10:42</time></span><div class='quote '>--Ins--, ну, мой метод вовсе не грязен :)</div></div><br>
Ну по сравнению с методом leo в целом да :)</div></div><br>
<br>
А мой-то чем грязен, только тем, что непонятен &quot;непосвященным&quot;? ;) Грязный этот тот, который либо использует недокументированные возможности, либо может привести к непредсказуемым ошибкам из-за отключения проверки типов, передачи какого-то мусора и т.п. В данном же случае вполне &quot;законно&quot; вместо Self передается nil, что вполне допустимо, если этот параметр в обработчике не используется, а если используется, то получим вполне предсказуемый AccessViоlation ;)<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095742'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T07:34:29+00:00">14.03.12, 07:34</time></span><div class='quote '>О, вот это тоже крутой метод, не знал&#33; </div></div><br>
Для кого &quot;крутой&quot;, а для кого &quot;грязный&quot; :) Была уже как-то подобная тема (может и не одна), там же (вроде как) рассматривался и вариант использования в качестве обработчика TNotifyEvent и обычной процедуры (о, боже, что на это скажет --Ins-- ;) )<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TNotifyProc = procedure(ProcParam:pointer; Sender:TObject);register;</div><div class="code_line">&nbsp;</div><div class="code_line">function NotifyProcAsEvent(Proc:TNotifyProc; ProcParam:pointer = nil):TNotifyEvent;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;with TMethod(Result) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Code:=@Proc;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Data:=ProcParam;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">//--- example ---</div><div class="code_line">procedure ThreadTerminate(ProcParam:pointer; Sender:TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;... //можно использовать ProcParam, если в него было что-то передано</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">MyThread.OnTerminate:=NotifyProcAsEvent(ThreadTerminate, nil); //можно что-то передать через ProcParam</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Плюсы: не нужно объявлять класс (и тем самым засорять код лишней VMT ;) ), можно передать любой доп.параметр, можно использовать вложенную&#092;локальную функцию при условии, что компилятор разрешит это сделать (D3 вообще не разрешал, D7 разрешает, если ф-я не обращается к локальным переменным и параметрам вышестоящей функции).]]></description>
        <author>leo</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095901</guid>
        <pubDate>Wed, 14 Mar 2012 11:16:53 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095901</link>
        <description><![CDATA[--Ins--: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095895'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T11:08:57+00:00">14.03.12, 11:08</time></span><div class='quote '>Это всё дело вкуса и каждого конкретного случая.</div></div><br>
<br>
Скорее конкретного случая, чем вкуса. Для проектика который пишется за 2-3 дня и больше к его коду ты никогда не вернешься - так может и незачем действительно &quot;разводить огород&quot; - тут на размышление &quot;а как бы лучше сделать&quot; потратишь больше времени, чем если просто взять и сделать не задумываясь как-нибудь. Но в более сложном случае - лучше потратить чуть больше времени на декомпозицию, реализовать все в коде строго в соответствии с получившейся в результате декомпозиции моделью, и потом экономить множество времени уже на стадии сопровождения и расширения кода. И вкус тут ни причем <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2012-03-14T11:37:57+00:00">14.03.12, 11:37</time></span></span><br>
PS: Кстати, лично мне более интересен случай как наоборот - там где требуется процедура/функция использовать метод. А то всякие TList.Sort в этом случае портят малину &lt;_&lt;]]></description>
        <author>--Ins--</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095895</guid>
        <pubDate>Wed, 14 Mar 2012 11:08:57 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095895</link>
        <description><![CDATA[Fr0sT: Это всё дело вкуса и каждого конкретного случая. Главное - чтоб была возможность выбора ;) В моём случае оказалось, что городить огород ради пары обработчиков, использующих только Sender - нецелесообразно, вот я и пошел другим путем. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2012-03-14T11:14:07+00:00">14.03.12, 11:14</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095886'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>&#045;&#045;Ins&#045;&#045; &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T11:01:44+00:00">14.03.12, 11:01</time></span><div class='quote '>В форму - совершенно нелепо. А в какой-нибудь объект-менеджер соединений</div></div><br>
Это лепо, если сокетов много, а обработчики будут еще и на кучу других событий. Тогда уже не зазорно и класс-наследник сделать, либо действительно менеджер коннектов с внутренними методами и обработчиками. Однако в более простых случаях легче прилепить парочку автономных обработчиков и не создавать <a class='tag-url' href='http://www.phppatterns.com/docs/design/hello_world_in_patterns' target='_blank'>Hello world на основе паттернов</a>]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095886</guid>
        <pubDate>Wed, 14 Mar 2012 11:01:44 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095886</link>
        <description><![CDATA[--Ins--: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095863'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T10:42:23+00:00">14.03.12, 10:42</time></span><div class='quote '>--Ins--, ну, мой метод вовсе не грязен</div></div><br>
<br>
Ну по сравнению с методом leo в целом да :) <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095863'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T10:42:23+00:00">14.03.12, 10:42</time></span><div class='quote '>Во-первых, ну и что? Гибрид так гибрид. Глобальные переменные и самостоятельные функции тоже уже не ООП, и кого это волнует.</div></div><br>
<br>
Для функции расчета синуса/косинуса делать ее методом какого-либо класса действительно смысла нет. Но в случае отправитель-получатель (события) - так как-то сам собой объект напрашивается. Я имею в виду не в коде объект, а в абстрактной модели, описывающей поведение твоей системы. И вовсе необязательно это должна быть форма, а скорее даже наоборот - если источник события не ее собственные компоненты - то это скорее всего моветон. Для чего делать именно так (отвечая на вопрос &quot;ну и что?&quot;) - для проведения декомпозиции, выработки хорошего стиля, грамотного подхода - всего того, что позволит максимально гибко решать в том числе и более сложные задачи проектирования, расширяемые и защищенные от багов и простые и понятные при описании принципов, в этих решениях реализованных.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095863'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T10:42:23+00:00">14.03.12, 10:42</time></span><div class='quote '>Во-вторых, объекта может не быть чисто по структурным соображениям: к примеру, если есть сокет, у которого по OnConnect посылается запрос на сервер - то засовывать обработчик OnConnect в форму совершенно нелепо.</div></div><br>
<br>
В форму - совершенно нелепо. А в какой-нибудь объект-менеджер соединений - так это называется не разведение сущностей, а <a class='tag-url' href='http://ru.wikipedia.org/wiki/Декомпозиция' target='_blank'>декомпозиция</a> ;)]]></description>
        <author>--Ins--</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095863</guid>
        <pubDate>Wed, 14 Mar 2012 10:42:23 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095863</link>
        <description><![CDATA[Fr0sT: <strong class='tag-b'>--Ins--</strong>, ну, мой метод вовсе не грязен :) Кто ж виноват, что нет возможности просто и без запарок назначить обработчик, не засовывая его в класс.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095805'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>&#045;&#045;Ins&#045;&#045; &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T09:17:19+00:00">14.03.12, 09:17</time></span><div class='quote '>если в некой системе существует объект, генерирующий события, то странно что в этой системе нет места объекту, который по логике должен их обрабатывать - это уже не ООП, а какой-то гибрид</div></div><br>
Во-первых, ну и что? Гибрид так гибрид. Глобальные переменные и самостоятельные функции тоже уже не ООП, и кого это волнует.<br>
Во-вторых, объекта может не быть чисто по структурным соображениям: к примеру, если есть сокет, у которого по OnConnect посылается запрос на сервер - то засовывать обработчик OnConnect в форму совершенно нелепо. Создавать экземпляр класса, который служит исключительно хранилищем обработчиков? Зачем плодить сущности, если можно обойтись без них.]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095805</guid>
        <pubDate>Wed, 14 Mar 2012 09:17:19 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095805</link>
        <description><![CDATA[--Ins--: Лучше все-таки завести объект и назначить обработчиком обычный instance-метод, чем связываться с грязными приемчиками. Управление временем жизни такого объекта не такая уж и проблема, тем более что это управление может быть не ручным, а автоматическим. Да и вообще, я считаю, что если в некой системе существует объект, генерирующий события, то странно что в этой системе нет места объекту, который по логике должен их обрабатывать - это уже не ООП, а какой-то гибрид.]]></description>
        <author>--Ins--</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095760</guid>
        <pubDate>Wed, 14 Mar 2012 08:01:51 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095760</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095742'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T07:34:29+00:00">14.03.12, 07:34</time></span><div class='quote '>Хм, да, действительно, даже в D7 есть</div></div><br>
Даже в D3 есть ;), ведь у TObject практически все методы - классовые]]></description>
        <author>leo</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095742</guid>
        <pubDate>Wed, 14 Mar 2012 07:34:29 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095742</link>
        <description><![CDATA[Fr0sT: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095736'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T07:21:31+00:00">14.03.12, 07:21</time></span><div class='quote '>Во-первых, методы класса существовали с незапамятных времен</div></div><br>
Хм, да, действительно, даже в D7 есть. Значит, это я только в 2009-ых до них добрался))<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095736'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T07:21:31+00:00">14.03.12, 07:21</time></span><div class='quote '>MyThread.OnTerminate:=TEventHandler(nil).ThreadTerminate;</div></div><br>
О, вот это тоже крутой метод, не знал&#33;]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095736</guid>
        <pubDate>Wed, 14 Mar 2012 07:21:31 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095736</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=353098&view=findpost&p=3095717'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-03-14T07:02:02+00:00">14.03.12, 07:02</time></span><div class='quote '>Выход появился с введением в D2009 методов класса.</div></div><br>
?&#33;<br>
Во-первых, методы класса существовали с незапамятных времен. Во-вторых, если в методе не используется Self, то создавать реальный объект вызовом Create совершенно не обязательно - можно юзать nil или через реальную переменную или просто приведением типа:<br>
MyThread.OnTerminate:=TEventHandler(nil).ThreadTerminate;]]></description>
        <author>leo</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095717</guid>
        <pubDate>Wed, 14 Mar 2012 07:02:02 +0000</pubDate>
        <title>Обработчики событий без объекта</title>
        <link>https://forum.sources.ru/index.php?showtopic=353098&amp;view=findpost&amp;p=3095717</link>
        <description><![CDATA[Fr0sT: Все обработчики событий OnXXX имеют тип метода объекта (procedure / function of object). Однако не всегда есть объект, куда можно запихнуть эти обработчики. Что же делать? Заводить объект (и значит, писать Create и Free) только из-за этого?<br>
Выход <s class='tag-s'>появился с введением в D2009</s> есть с применением методов класса. Они совместимы с методами объекта, а значит, пригодны для использования в качестве обработчиков.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TEventHandler = class</div><div class="code_line">&nbsp;&nbsp; &nbsp;class procedure ThreadTerminate(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">class procedure TEventHandler.ThreadTerminate(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">...</div><div class="code_line">&nbsp;</div><div class="code_line">SomeThread.OnTerminate := TEventHandler.ThreadTerminate;</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2012-03-14T07:07:52+00:00">14.03.12, 07:07</time></span></span><br>
Таким образом можно собрать все обработчики в логическую кучку и избежать необходимости создания отдельного объекта. Только надо не забыть не использовать в методах Self - для class методов он указывает непосредственно на сам класс, а не на экземпляр класса (объект), что в нашем случае практически бесполезно.<br>
Кроме того, доступ из этих методов будет только к другим class методам и полям.<br>
<br>
<strong class='tag-b'>См. также шаманский метод leo в следующем посте.</strong>]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      </channel>
      </rss>
	