<?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=414445&amp;view=findpost&amp;p=3794587</guid>
        <pubDate>Wed, 03 Apr 2019 07:58:28 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794587</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794579'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2019-04-03T10:31:48+03:00">03.04.19, 07:31</time></span><div class='quote '>Voice. От созданных</div></div><br>
Э-э-э, я думал мы про Enumerable шарповский уже говорим.<br>
<br>
По поводу Voice - никто не хотел отдельно от <s class='tag-s'>объектов</s>интерфейсов хранить методы. Хотелось неявное преобразование из метода интерфейса к анонимной функции, как это сделано с методами объекта.]]></description>
        <author>jack128</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794579</guid>
        <pubDate>Wed, 03 Apr 2019 07:31:48 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794579</link>
        <description><![CDATA[Fr0sT: Voice. От созданных]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794518</guid>
        <pubDate>Tue, 02 Apr 2019 16:44:01 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794518</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794494'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2019-04-02T12:49:26+00:00">02.04.19, 12:49</time></span><div class='quote '>А зачем, собственно, сохранять методы в отрыве от объектов?</div></div><br>
Какие методы от каких объектов?]]></description>
        <author>jack128</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794494</guid>
        <pubDate>Tue, 02 Apr 2019 12:49:26 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794494</link>
        <description><![CDATA[Fr0sT: А зачем, собственно, сохранять методы в отрыве от объектов?]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794493</guid>
        <pubDate>Tue, 02 Apr 2019 12:42:22 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794493</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794448'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Cfon &#064; <time class="tag-quote__quoted-time" datetime="2019-04-01T18:25:09+00:00">01.04.19, 18:25</time></span><div class='quote '>Функционал енумератора Spring4D смотрел.. пока туман :D<br>
Доков нет плохо, как я понял там Select аналог Map? </div></div><br>
А все нашел примеры, это шарповый LINQ Enumerable один в один :D <br>
<a class='tag-url' href='https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable?view=netframework-4.7.2' target='_blank'><em class='tag-i'>https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable?view=netframework-4.7.2</em></a><br>
Скомуниздили из линка энумератор спринги :D]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794478</guid>
        <pubDate>Tue, 02 Apr 2019 08:19:59 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794478</link>
        <description><![CDATA[Cfon: Варик на Spring4D :D <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">uses Spring.Collections;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;var voices := TArray&#60;IVoice&#62;.Create(TDog.Create, TCat.Create, TDog.Create);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;var funcs := TEnumerable.Select&#60;IVoice, TFunc&#60;string&#62;&#62;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;TCollections.CreateList&#60;IVoice&#62;(voices),</div><div class="code_line">&nbsp;&nbsp; &nbsp;function (v: IVoice): TFunc&#60;string&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result:= function: string</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := v.Voice;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// test</div><div class="code_line">&nbsp;&nbsp;for var fn in funcs do Writeln(fn());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Readln;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794448</guid>
        <pubDate>Mon, 01 Apr 2019 18:25:09 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794448</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794393'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>jack128 &#064; <time class="tag-quote__quoted-time" datetime="2019-03-31T19:12:30+00:00">31.03.19, 19:12</time></span><div class='quote '><a class='tag-url' href='https://bitbucket.org/sglienke/spring4d/src/a12ccfbd5ef3f3e17502aa307b5b695439bdc5b4/Source/Base/Collections/Spring.Collections.Enumerable.pas?at=master&fileviewer=file-view-default' target='_blank'>Вот</a>, полюбопытствуй.</div></div><br>
Я ее давно скачал, чтобы в перспективе поюзать DI container :D.<br>
Функционал енумератора Spring4D смотрел.. пока туман :D<br>
Доков нет плохо, как я понял там Select аналог Map? <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794422'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2019-04-01T11:57:20+00:00">01.04.19, 11:57</time></span><div class='quote '>Вообще насчет адресов методов и прочего, вот как вариант</div></div><br>
Что то мудрено, через анонимку то изичи :D]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794422</guid>
        <pubDate>Mon, 01 Apr 2019 11:57:20 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794422</link>
        <description><![CDATA[Fr0sT: Вообще насчет адресов методов и прочего, вот как вариант<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">var</div><div class="code_line">&nbsp;&nbsp;voices: TArray&#60;IVoice&#62;;</div><div class="code_line">&nbsp;&nbsp;m: TMethod;</div><div class="code_line">&nbsp;&nbsp;ob: TObject;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;ob := voices[0] as TAnimal;</div><div class="code_line">&nbsp;&nbsp;m.Data := (ob);</div><div class="code_line">&nbsp;&nbsp;m.Code := (ob).MethodAddress(&#39;Voice&#39;);</div><div class="code_line">&nbsp;&nbsp;memLog.Lines.Add(TFuncOfObj&#60;string&#62;(m)());</div></ol></div></div></div></div><br>
<br>
TMethod самодостаточный (содержит как адрес метода, так и адрес самого объекта).<br>
Единственное, что у меня почему-то MethodAddress возвращает nil даже со включенным RTTI, хотя нигде нет упоминаний, что этой функции вообще требуются какие-то условия. Вот тут инфа с примерами <a class='tag-url' href='https://stackoverflow.com/questions/4186458/delphi-call-a-function-whose-name-is-stored-in-a-string' target='_blank'>https://stackoverflow.com/questions/4186458...red-in-a-string</a>]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794393</guid>
        <pubDate>Sun, 31 Mar 2019 19:12:30 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794393</link>
        <description><![CDATA[jack128: <a class='tag-url' href='https://bitbucket.org/sglienke/spring4d/src/a12ccfbd5ef3f3e17502aa307b5b695439bdc5b4/Source/Base/Collections/Spring.Collections.Enumerable.pas?at=master&fileviewer=file-view-default' target='_blank'>Вот</a>, полюбопытствуй.]]></description>
        <author>jack128</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794390</guid>
        <pubDate>Sun, 31 Mar 2019 18:32:57 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794390</link>
        <description><![CDATA[Cfon: А теперь хардкор :D <br>
Предлагаю вашему вниманию версию примера с функцией Reduce. Добавляем поддержку Reduce к нашему TArrayHelper. Что делает Reduce? Она обрабатывает исходный массив и сводит (reduce) к другому типу потенциально любому типу&#33; Давайте посмотрим как это выглядит:<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;TForEachProc&#60;T&#62; = reference to procedure (Value: T; Index: Integer);</div><div class="code_line">&nbsp;&nbsp;TMapProc&#60;T, R&#62; = reference to function (Value: T; Index: Integer): R; </div><div class="code_line">&nbsp;&nbsp;TReduceProc&#60;T, R&#62; = reference to function (Accumulator: R; Value: T): R;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TArrayHelper = class helper for TArray</div><div class="code_line">&nbsp;&nbsp; &nbsp;class procedure ForEach&#60;T&#62;(const Values: array of T; AProc: TForEachProc&#60;T&#62;); static;</div><div class="code_line">&nbsp;&nbsp; &nbsp;class function Map&#60;T, R&#62;(const Values: array of T; AProc: TMapProc&#60;T, R&#62;): TArray&#60;R&#62;; static; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;class function Reduce&#60;T, R&#62;(const Values: array of T; AProc: TReduceProc&#60;T, R&#62;; InitValue: R): R; static;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TArrayHelper }</div><div class="code_line">&nbsp;</div><div class="code_line">....</div><div class="code_line">&nbsp;</div><div class="code_line">class function TArrayHelper.Reduce&#60;T, R&#62;(const Values: array of T;</div><div class="code_line">&nbsp;&nbsp;AProc: TReduceProc&#60;T, R&#62;; InitValue: R): R;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := InitValue;</div><div class="code_line">&nbsp;&nbsp;for var I := 0 to High(Values) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := AProc(Result, Values[i]);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;var voices:= TArray&#60;IVoice&#62;.Create(TDog.Create, TCat.Create, TDog.Create);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;var funcs := TArray.Reduce&#60;IVoice, TArray&#60;TFunc&#60;string&#62;&#62;&#62;(voices,</div><div class="code_line">&nbsp;&nbsp; &nbsp;function (accum: TArray&#60;TFunc&#60;string&#62;&#62;; value: IVoice): TArray&#60;TFunc&#60;string&#62;&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result:= accum + [function: string</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := value.Voice</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end, []);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// test</div><div class="code_line">&nbsp;&nbsp;for var fn in funcs do Writeln(fn());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Readln;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
Результат тот же, но пришлось моск изрядно напрячь, код явно не для слабонервных :D <br>
Хотя для хакселистов он покажется простым  :jokingly: <br>
Понятно что данную задачу Map решает проще, но сам по себе Reduce пригодиться во многих других задачах где Map будет бессилен. А Reduce это такой швейцарски нож решит любую задачу.]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794361</guid>
        <pubDate>Sun, 31 Mar 2019 11:57:38 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794361</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794360'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>jack128 &#064; <time class="tag-quote__quoted-time" datetime="2019-03-31T11:47:58+00:00">31.03.19, 11:47</time></span><div class='quote '>Забьем пока на тип массива, хотя бы с типом элемента массива разобраться бы.<br>
<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">var voices:= [TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">voices[0].Free; // компилируется ??</div><div class="code_line">voices[1]._AddRef(); // компилируется?</div><div class="code_line">var x := voices[1000]; // компилируется ?</div></ol></div></div></div></div></div></div><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">voices[0].Free; // компилируется ?? &nbsp;да &nbsp;</div><div class="code_line">voices[1]._AddRef(); // компилируется? нет [dcc32 Error]: E2003 Undeclared identifier: &#39;_AddRef&#39;</div><div class="code_line">var x := voices[1000]; // компилируется ? да</div></ol></div></div></div></div><br>
все кроме второго компиляца и без рантайм ошибок.<br>
<br>
Если посмотреть на список Code Insight для voices[i], то он напоминает TObject, но если я передаю voices в процедуру:<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">procedure Test(A: TArray&#60;TObject&#62;);</div><div class="code_line">begin</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;var voices:=[TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">&nbsp;&nbsp;Test(voices);</div><div class="code_line">end;</div><div class="code_line">// [dcc32 Error]: E2010 Incompatible types: &#39;System.TArray&#60;System.TObject&#62;&#39; and &#39;Dynamic array&#39;</div></ol></div></div></div></div><br>
Ради интереса посмотрел в простом цикле<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">&nbsp;&nbsp;var voices:=[TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">&nbsp;&nbsp;for var I := 0 to High(voices) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(voices[i].ClassName);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">// Output:</div><div class="code_line">// TDog</div><div class="code_line">// TCat</div><div class="code_line">// TDog</div></ol></div></div></div></div><br>
Пробую привести к IVoice ошибка пишет что voice[i] - TObject  :lool: <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">&nbsp;&nbsp;var voices:=[TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">&nbsp;&nbsp;for var I := 0 to High(voices) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(IVoice(voices[i]).Voice);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;// [dcc32 Error]: E2010 Incompatible types: &#39;IVoice&#39; and &#39;TObject&#39;</div></ol></div></div></div></div><br>
<br>
Прокатило если определить открытый массив TObject  :D <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">procedure Test(A: array of TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;for var I := 0 to High(A) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(A[i].ClassName);</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">begin</div><div class="code_line">&nbsp;&nbsp;Test(voices);</div><div class="code_line">// Output:</div><div class="code_line">// TDog</div><div class="code_line">// TCat</div><div class="code_line">// TDog</div><div class="code_line">end.</div></ol></div></div></div></div><br>
Какие выводы? voices это array of TObject  :huh:]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794360</guid>
        <pubDate>Sun, 31 Mar 2019 11:47:58 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794360</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794359'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Cfon &#064; <time class="tag-quote__quoted-time" datetime="2019-03-31T10:48:58+00:00">31.03.19, 10:48</time></span><div class='quote '>Где нить описана логика вывода типа массива? Термин &quot;dynamic array constant&quot; не разу не слышал.<br>
<br>
Вот тут я нашел про них <br>
<a class='tag-url' href='http://rvelthuis.de/articles/articles-openarr.html' target='_blank'>http://rvelthuis.de/articles/articles-openarr.html</a><br>
</div></div><br>
в примере из статьи как раз все понятно, там явно указан тип переменной:<br>
<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">var</div><div class="code_line">&nbsp;&nbsp;MyDynArray: array of Integer; // безымянный дин массив интов</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;MyDynArray := [17, 325, 11];</div></ol></div></div></div></div><br>
<br>
В твоем случае ж случае тип переменной как то выводится компилятором, вот мне и интересно как.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794359'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Cfon &#064; <time class="tag-quote__quoted-time" datetime="2019-03-31T10:48:58+00:00">31.03.19, 10:48</time></span><div class='quote '>типом voices является dynamic array constants</div></div><br>
Забьем пока на тип массива, хотя бы с типом элемента массива разобраться бы.<br>
<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">var voices:= [TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">voices[0].Free; // компилируется ??</div><div class="code_line">voices[1]._AddRef(); // компилируется?</div><div class="code_line">var x := voices[1000]; // компилируется ?</div></ol></div></div></div></div>]]></description>
        <author>jack128</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794359</guid>
        <pubDate>Sun, 31 Mar 2019 10:48:58 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794359</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794356'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>jack128 &#064; <time class="tag-quote__quoted-time" datetime="2019-03-31T09:32:28+00:00">31.03.19, 09:32</time></span><div class='quote '>У меня нету Rio, не могу проверить. Сразу возникает вопрос, какой тип у переменной voices? TArray&lt;TVarRec&gt;? TArray&lt;TObject&gt;? TArray&lt;IVoice&gt; ? </div></div><br>
Ни один из приведенных :huh:, типом voices является dynamic array constants или я хз какой он там на самом деле  :jokingly: (в переводе по гугл транслейту :D это константы динамического массива )<br>
Если я пишу следущее то ошибка компиляции<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">var voices:= [TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">&nbsp;</div><div class="code_line">var funcs := TArray.Map&#60;IVoice, TFunc&#60;string&#62;&#62;(voices, //&#60;-- вот на эту строчку</div><div class="code_line">&nbsp;&nbsp; &nbsp;function (v: IVoice; i: integer): TFunc&#60;string&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;..</div><div class="code_line">&nbsp;&nbsp; &nbsp;end);</div><div class="code_line">// [dcc32 Error]: E2010 Incompatible types: &#39;array of IVoice&#39; and &#39;Dynamic array&#39;</div></ol></div></div></div></div> <br>
Что тут &#39;array of IVoice&#39; а что &#39;Dynamic array&#39; я хз :D <br>
по идее voices это &#39;Dynamic array&#39;, а параметр функции это &#39;array of IVoice&#39;<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794356'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>jack128 &#064; <time class="tag-quote__quoted-time" datetime="2019-03-31T09:32:28+00:00">31.03.19, 09:32</time></span><div class='quote '>Где нить описана логика вывода типа массива? Термин &quot;dynamic array constant&quot; не разу не слышал.</div></div><br>
Вот тут я нашел про них <br>
<a class='tag-url' href='http://rvelthuis.de/articles/articles-openarr.html' target='_blank'>http://rvelthuis.de/articles/articles-openarr.html</a><br>
<br>
Да еще забыл упомянуть про конструкторы открытого массива (open array constructor) они напоминают форму dynamic array constants, но передаются сразу как параметры функции, моем случае будет так<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">var funcs := TArray.Map&#60;IVoice, TFunc&#60;string&#62;&#62;([TDog.Create, TCat.Create, TDog.Create], //&#60;-- open array constructor</div><div class="code_line">&nbsp;&nbsp; &nbsp;function (v: IVoice; i: integer): TFunc&#60;string&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;....</div><div class="code_line">&nbsp;&nbsp; &nbsp;end);</div></ol></div></div></div></div><br>
В такой форме код компилица. <br>
А не стоп, не только как параметр функции, но и вот тут вроде как тоже open array constructor  :D:<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">var voices: TArray&#60;IVoice&#62; := [TDog.Create, TCat.Create, TDog.Create]; //&#60;-- open array constructor</div></ol></div></div></div></div><br>
<br>
Самое не понятное для меня было следущее:<br>
Я поначалу не сразу просек про параметр открытый массив (open array parameter)<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">class function TArrayHelper.Map&#60;T, R&#62;(const Values: array of T; //&#60;-- open array parameter</div><div class="code_line">&nbsp;&nbsp;AProc: TMapProc&#60;T, R&#62;): TArray&#60;R&#62;;</div><div class="code_line">...</div></ol></div></div></div></div><br>
я думал что это одно и тоже что и <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">class function TArrayHelper.Map&#60;T, R&#62;(const Values: TArray&#60;T&#62;; //&#60;-- dynamic array parameter</div><div class="code_line">&nbsp;&nbsp;AProc: TMapProc&#60;T, R&#62;): TArray&#60;R&#62;;</div><div class="code_line">...</div></ol></div></div></div></div><br>
поскольку TArray&lt;T&gt; описан как<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 TArray&#60;T&#62; = array of T</div></ol></div></div></div></div><br>
но приведенный выше пример является динамич. массивом, а не открытым массивом. Разница их в том как я уже писал выше в открытый массив можно передать и статич.массив и динамич.массив и конструктор открытого массива&#33; Ой *бать замутили  :lool:, а в дин.массив естесно кроме динамик нельзя ничего передать. Уфф вроде разобрался :D]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794356</guid>
        <pubDate>Sun, 31 Mar 2019 09:32:28 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794356</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794353'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Cfon &#064; <time class="tag-quote__quoted-time" datetime="2019-03-31T07:49:46+00:00">31.03.19, 07:49</time></span><div class='quote '>У меня же по коду идет ни тот ни другой   <br>
Какой? На новых делфи (не знаю с какой точно версии), но в Рио можно делать такую шутку:<br>
<br>
var voices:= [TDog.Create, TCat.Create, TDog.Create];<br>
<br>
это объявление динамического массива констант (dynamic array constant)</div></div><br>
<br>
У меня нету Rio, не могу проверить. Сразу возникает вопрос, какой тип у переменной voices? TArray&lt;TVarRec&gt;? TArray&lt;TObject&gt;? TArray&lt;IVoice&gt; ? Где нить описана логика вывода типа массива? Термин &quot;dynamic array constant&quot; не разу не слышал.]]></description>
        <author>jack128</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794353</guid>
        <pubDate>Sun, 31 Mar 2019 07:49:46 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794353</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794347'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>jack128 &#064; <time class="tag-quote__quoted-time" datetime="2019-03-30T21:04:30+00:00">30.03.19, 21:04</time></span><div class='quote '>по поводу inline variables <a class='tag-url' href='https://en.delphipraxis.net/topic/605-generic-dictionary-and-an-inline-variable-bug-or-misuse/' target='_blank'>вот</a></div></div><br>
На апдейтовом делфи рио, приведеный там код с TDictionary пашет.<br>
<br>
По моему примеру я немного ошибся с терминологией по массивам уже больно запутано в делфи :D<br>
Ща сек все разберу по полочкам...<br>
<br>
Итак давайте разберем их на моем примере. Есть статические и динамческие массивы:<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;TVoices = array [1..3] of IVoice;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;// dynamic array</div><div class="code_line">&nbsp;&nbsp;var voices:= TArray&#60;IVoice&#62;.Create(TDog.Create, TCat.Create, TDog.Create);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// static array</div><div class="code_line">&nbsp;&nbsp;var voices: TVoices;</div><div class="code_line">&nbsp;&nbsp;voices[1] := TDog.Create;</div><div class="code_line">&nbsp;&nbsp;voices[2] := TCat.Create;</div><div class="code_line">&nbsp;&nbsp;voices[3] := TDog.Create;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;....</div></ol></div></div></div></div><br>
а также есть так называемые открытые массивы, они существуют только как параметры, например array of T в функции Map:<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">class function TArrayHelper.Map&#60;T, R&#62;(const Values: array of T; //&#60;-- open array parameter</div><div class="code_line">&nbsp;&nbsp;AProc: TMapProc&#60;T, R&#62;): TArray&#60;R&#62;;</div></ol></div></div></div></div><br>
в него можно передать как статик так и динамик массив<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">var funcs := TArray.Map&#60;IVoice, TFunc&#60;string&#62;&#62;(voices, //&#60;-- dynamic or static array</div><div class="code_line">.....</div></ol></div></div></div></div><br>
У меня же по коду идет ни тот ни другой  :D <br>
Какой? На новых делфи (не знаю с какой точно версии), но в Рио можно делать такую шутку:<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">var voices:= [TDog.Create, TCat.Create, TDog.Create];</div></ol></div></div></div></div><br>
это объявление динамического массива констант (dynamic array constant), не путайте с array of const. array of const - это особый тип открытого массива, который задается как параметр функции, пример тому знаменитая функция Format  :D <br>
Так вот я передаю динамический массив констант voices в функцию Map, которая ждет либо динамический либо статический массив, наш же имеет другой тип&#33; Чтобы решить траблу можно сделать как я привел выше в примере, т.е указать явно тип переменой и уже потом инициализировть массив <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">var voices: TArray&#60;IVoice&#62; := [TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">...</div></ol></div></div></div></div><br>
или сразу создать динамич. массив через TArray&lt;T&gt;.Create<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">var voices:= TArray&#60;IVoice&#62;.Create(TDog.Create, TCat.Create, TDog.Create);</div><div class="code_line">...</div></ol></div></div></div></div>]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794347</guid>
        <pubDate>Sat, 30 Mar 2019 21:04:30 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794347</link>
        <description><![CDATA[jack128: по поводу inline variables <a class='tag-url' href='https://en.delphipraxis.net/topic/605-generic-dictionary-and-an-inline-variable-bug-or-misuse/' target='_blank'>вот</a>]]></description>
        <author>jack128</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794345</guid>
        <pubDate>Sat, 30 Mar 2019 19:32:27 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794345</link>
        <description><![CDATA[Cfon: Улучшаем предыдущий код, убираем выделение памяти для массива funcs&#33;  :D <br>
Для этого допишем TArrayHelper, а именно создадим функцию Map и заменим в коде ForEach на Map.<br>
Кто не в теме функциональной парадигмы поясню: Map получает на входе исходный массив а возвращает другой массив, попутно выполняя какие либо преобразования исходного массива.<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;TForEachProc&#60;T&#62; = reference to procedure (Value: T; Index: Integer);</div><div class="code_line">&nbsp;&nbsp;TMapProc&#60;T, R&#62; = reference to function (Value: T; Index: Integer): R; &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TArrayHelper = class helper for TArray</div><div class="code_line">&nbsp;&nbsp; &nbsp;class procedure ForEach&#60;T&#62;(const Values: array of T; AProc: TForEachProc&#60;T&#62;); static;</div><div class="code_line">&nbsp;&nbsp; &nbsp;class function Map&#60;T, R&#62;(const Values: array of T; AProc: TMapProc&#60;T, R&#62;): TArray&#60;R&#62;; static; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TArrayHelper }</div><div class="code_line">&nbsp;</div><div class="code_line">.....</div><div class="code_line">&nbsp;</div><div class="code_line">class function TArrayHelper.Map&#60;T, R&#62;(const Values: array of T;</div><div class="code_line">&nbsp;&nbsp;AProc: TMapProc&#60;T, R&#62;): TArray&#60;R&#62;;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result:= [];</div><div class="code_line">&nbsp;&nbsp;for var I := 0 to High(Values) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result:= Result + [AProc(Values[i], i)];</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;var voices: TArray&#60;IVoice&#62; := [TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;var funcs := TArray.Map&#60;IVoice, TFunc&#60;string&#62;&#62;(voices,</div><div class="code_line">&nbsp;&nbsp; &nbsp;function (v: IVoice; i: integer): TFunc&#60;string&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result:= function: string</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := v.Voice;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// test</div><div class="code_line">&nbsp;&nbsp;for var fn in funcs do Writeln(fn());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Readln;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
В итоге никаких тебе явных выделений памяти и циклов.<br>
Обращаю внимание что при объявлении переменная funcs не указан её тип, тут работает выведение типов, а вот при объявление voices требуется указать тип ибо тут выведеный тип не подходит, поскольку нам надо TArray&lt;IVoice&gt;, а компилятор нам предлагает array of const, что делать? укажем вручную :D<br>
ПС. в мапе я заюзал конкатенацию массивов, но можно и через SetLength.]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794314</guid>
        <pubDate>Sat, 30 Mar 2019 12:08:42 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794314</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794205'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2019-03-29T07:25:32+00:00">29.03.19, 07:25</time></span><div class='quote '><div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><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">funcs[i]:= voices[i].Voice; &nbsp;//&#60;--- это вызов, а надо сохранить адрес функции</div></ol></div></div></div></div></div></div><br>
Эээ, а так разве не то, что требуется?<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">funcs[i]:= @voices[i].Voice;</div></ol></div></div></div></div></div></div><br>
Ошибка [dcc32 Error] : E2036 Variable required<br>
<br>
Ну да фиг с ним :D <br>
Продолжаю улучшения скрываем цикл for, функциональщина так и прет  :D <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;TForEachProc&#60;T&#62; = reference to procedure (Value: T; Index: Integer);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TArrayHelper = class helper for TArray</div><div class="code_line">&nbsp;&nbsp; &nbsp;class procedure ForEach&#60;T&#62;(const Values: array of T; AProc: TForEachProc&#60;T&#62;); static;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TArrayHelper }</div><div class="code_line">&nbsp;</div><div class="code_line">class procedure TArrayHelper.ForEach&#60;T&#62;(const Values: array of T; AProc: TForEachProc&#60;T&#62;);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;for var I := 0 to High(Values) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;AProc(Values[I], I);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;voices: TArray&#60;IVoice&#62;;</div><div class="code_line">&nbsp;&nbsp;funcs: TArray&#60;TFunc&#60;string&#62;&#62;;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;voices:= [TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">&nbsp;&nbsp;SetLength(funcs, Length(voices));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TArray.ForEach&#60;IVoice&#62;(voices, procedure (elem: IVoice; i: integer)</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;funcs[i]:= function: string</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result:= elem.Voice;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// тест</div><div class="code_line">&nbsp;&nbsp;for var i := 0 to High(funcs) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(funcs[i]());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Readln;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
ПС. обратите внимание тут iife уже не требуется поскольку наши операторы заключены в анонимку.]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794303</guid>
        <pubDate>Sat, 30 Mar 2019 10:30:25 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794303</link>
        <description><![CDATA[jack128: Нет. Чтобы взять адрес функции, справа от оператора @ должна быть функция, а Voices[I].voice - это метод интерфейса. в Дельфи нет возможности взять его адрес.<br>
upd: встроенной возможности.]]></description>
        <author>jack128</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794276</guid>
        <pubDate>Fri, 29 Mar 2019 14:16:51 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794276</link>
        <description><![CDATA[Fr0sT: Ну ему нужен адрес функции - он берется вот так.]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794257</guid>
        <pubDate>Fri, 29 Mar 2019 12:15:47 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794257</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794205'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2019-03-29T07:25:32+00:00">29.03.19, 07:25</time></span><div class='quote '>Эээ, а так разве не то, что требуется?<br>
funcs[i]:= @voices[i].Voice;</div></div><br>
так - это то что даже не компилится]]></description>
        <author>jack128</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794205</guid>
        <pubDate>Fri, 29 Mar 2019 07:25:32 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794205</link>
        <description><![CDATA[Fr0sT: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><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">funcs[i]:= voices[i].Voice; &nbsp;//&#60;--- это вызов, а надо сохранить адрес функции</div></ol></div></div></div></div></div></div><br>
Эээ, а так разве не то, что требуется?<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">funcs[i]:= @voices[i].Voice;</div></ol></div></div></div></div>]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794126</guid>
        <pubDate>Thu, 28 Mar 2019 11:06:47 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794126</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794106'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Cfon &#064; <time class="tag-quote__quoted-time" datetime="2019-03-28T08:11:03+00:00">28.03.19, 08:11</time></span><div class='quote '>Я поспешил с выводами переменная i не удалятся, замыкание есть, но все 3 вызова в цикле захватывают одну и туже i и итоге при обращении у массиву функций идет обращение по индексу i=3 что ведет к эксепшену обращение за пределы массива.</div></div><br>
<br>
по идее - это тоже касяк. То есть, если мы объявили i в var блоке функции - то такое поведение логично, а если мы объявили i в цикле, то захвачено должно на каждой итерации - отдельное значение.<br>
<br>
Вообще смешно это, абракадабра заимствует многое из C# при этом повторяя их же ошибки. В шарпе изначально было такое же поведение, но несколько лет назад они фиксанули это и теперь захват значения в лямбду происходит как будто у нас на каждой итерации новая переменная i с новым значением (как c let в js)]]></description>
        <author>jack128</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794106</guid>
        <pubDate>Thu, 28 Mar 2019 08:11:03 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794106</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794092'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>jack128 &#064; <time class="tag-quote__quoted-time" datetime="2019-03-28T05:24:39+00:00">28.03.19, 05:24</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794045'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Cfon &#064; <time class="tag-quote__quoted-time" datetime="2019-03-27T12:46:36+00:00">27.03.19, 12:46</time></span><div class='quote '>Мои эксперементы с ней показали что она удалятся после цикла  <br>
В итоге если не создать вручную локалку мы имеем эксепшен при доступе к массиву funcs.</div></div><br>
Тикет <a class='tag-url' href='https://quality.embarcadero.com/' target='_blank'>qc</a> создал надеюсь? Я б проголосовал.</div></div><br>
Упс, пардон ми  :D <br>
Я поспешил с выводами переменная i не удалятся, замыкание есть, но все 3 вызова в цикле захватывают одну и туже i и итоге при обращении у массиву функций идет обращение по индексу i=3 что ведет к эксепшену обращение за пределы массива. Похожая ситуация есть в JS тока там var i определенная в цикле имеет глобальную область действия, а в Delphi она локальная. Короче тут все без косяков, это просто фича цикла for и анонимок. Переменные захватываются по ссылке, а не по значению, чтобы решить траблу надо заюзать iife создавая на каждой итерации новую локалку. В JS ввели let для определения локальной переменной, как она работает я не разбрал, кажись анонимки захватывают ее по значению точно не помню, потому в JS можно решить это так :)<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">for (let i=0; i &#60; voices.length; i++) </div><div class="code_line">// iife не надо ибо захват i по значению &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp;funcs.push( function () { </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return voices[i].Voice;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div>]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794092</guid>
        <pubDate>Thu, 28 Mar 2019 05:24:39 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794092</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3794045'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Cfon &#064; <time class="tag-quote__quoted-time" datetime="2019-03-27T12:46:36+00:00">27.03.19, 12:46</time></span><div class='quote '>Мои эксперементы с ней показали что она удалятся после цикла  <br>
В итоге если не создать вручную локалку мы имеем эксепшен при доступе к массиву funcs.</div></div><br>
Тикет <a class='tag-url' href='https://quality.embarcadero.com/' target='_blank'>qc</a> создал надеюсь? Я б проголосовал.]]></description>
        <author>jack128</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794045</guid>
        <pubDate>Wed, 27 Mar 2019 12:46:36 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794045</link>
        <description><![CDATA[Cfon: <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">for var I := 0 to High(voices) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;(procedure (i: integer) &nbsp;//&#60;--- iife</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;funcs[i]:= function: string //&#60;--- anonimous function</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := voices[i].Voice;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end)(i);</div></ol></div></div></div></div><br>
Отдельно хочу пояснить про iife (самовызываемая функция) во втором цикле for, она создает локальную область видимости. Зачем? Затем чтобы анонимная функция сохранила переменную i в ней&#33;<br>
Я хз почему, но анонимка не замыкает локальную переменную i цикла for&#33; Мои эксперементы с ней показали что она удалятся  после цикла :whistle: <br>
В итоге если не создать вручную локалку мы имеем эксепшен при доступе к массиву funcs. Наверно очередной косяк Эмбаркадэро  :wacko:<br>
<br>
А вот на JS найди отличия :D <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">for (var i=0; i &#60; voices.length; i++) </div><div class="code_line">&nbsp;&nbsp; &nbsp;(function (i) { //&#60;--- iife</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;funcs.push( function () { //&#60;--- anonimous function</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return voices[i].Voice;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;})(i);</div></ol></div></div></div></div>]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794042</guid>
        <pubDate>Wed, 27 Mar 2019 10:58:27 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3794042</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414445&view=findpost&p=3793988'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2019-03-26T17:00:44+00:00">26.03.19, 17:00</time></span><div class='quote '><strong class='tag-b'>Cfon</strong><br>
Это косяк эмбаркодеров. Они толком не за документировали и как следствие толком не закодировали.</div></div><br>
Решил их косяк через анонимку :D <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">begin</div><div class="code_line">&nbsp;&nbsp;voices:= [TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">&nbsp;&nbsp;SetLength(funcs, Length(voices));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for I := 0 to High(voices) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;(procedure (i: integer) &nbsp;//&#60;--- iife </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;funcs[i]:= function: string //&#60;--- anonimous function</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := voices[i].Voice;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end)(i);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for I := 0 to High(funcs) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(funcs[i]());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Readln;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
<br>
в JS стиле  :D <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">begin</div><div class="code_line">&nbsp;&nbsp;var voices: TArray&#60;IVoice&#62;:= [TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">&nbsp;&nbsp;var funcs: TArray&#60;TFunc&#60;string&#62;&#62;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SetLength(funcs, Length(voices));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for var I := 0 to High(voices) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;(procedure (i: integer) </div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;funcs[i]:= function: string</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := voices[i].Voice;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end)(i);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for var I := 0 to High(funcs) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(funcs[i]());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Readln;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
похоже тока в JS не надо указывать типы  :D<br>
да и память не надо в ручную выделять :D<br>
<br>
ПС. Меня за уши теперь от Делфи не отянуть :lool:<br>
Формочки набиваются на раз два + код паскаля простой, легко читаемый, это просто мечта прогера :D]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3793988</guid>
        <pubDate>Tue, 26 Mar 2019 17:00:44 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3793988</link>
        <description><![CDATA[Pavia: <strong class='tag-b'>Cfon</strong><br>
Это косяк эмбаркодеров. Они толком не за документировали и как следствие толком не закодировали.]]></description>
        <author>Pavia</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3793984</guid>
        <pubDate>Tue, 26 Mar 2019 16:36:34 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3793984</link>
        <description><![CDATA[Cfon: А вот если убрать интерфейс IVoice и заюзать абстрактный класс TAnimal то все пашет, адреса сохраняются&#33;  :wall: <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;TAnimal = class abstract</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;FName: string;</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Voice: string; virtual; abstract;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property Name: string read FName write FName;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TDog = class(TAnimal)</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Voice: string; override;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TCat = class(TAnimal)</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Voice: string; override;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TDog }</div><div class="code_line">&nbsp;</div><div class="code_line">function TDog.Voice: string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result:= &#39;Arf-Arf!&#39;;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TCat }</div><div class="code_line">&nbsp;</div><div class="code_line">function TCat.Voice: string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result:= &#39;Meow-Meow!&#39;;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;animals: TArray&#60;TAnimal&#62;;</div><div class="code_line">&nbsp;&nbsp;funcs: TArray&#60;TFunc&#60;string&#62;&#62;;</div><div class="code_line">&nbsp;&nbsp;I: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;animals:= [TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">&nbsp;&nbsp;SetLength(funcs, Length(animals));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for I := 0 to High(animals) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;funcs[i]:= animals[i].Voice; //&#60;--- а вот так все пучком!</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// тест</div><div class="code_line">&nbsp;&nbsp;for I := 0 to High(funcs) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(funcs[i]());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Readln;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
Я в непонятках   :wall:<br>
Где я не доучил Объект Паскаль?  :wacko: <br>
Кстати учу по книжке моего кента Марко Кента :lool:]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3793975</guid>
        <pubDate>Tue, 26 Mar 2019 13:00:03 +0000</pubDate>
        <title>Непонятки</title>
        <link>https://forum.sources.ru/index.php?showtopic=414445&amp;view=findpost&amp;p=3793975</link>
        <description><![CDATA[Cfon: Туплю&#33; :whistle:  <br>
непойму как сохранить адреса виртуальных фунций. Выбрасывает ошибку &#39;Incompatible types: &#39;System.SysUtils.TFunc&lt;System.TFunc&lt;System.string&gt;&#39; and &#39;string&#39;&#39;  <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;IVoice = interface</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Voice: string;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TAnimal = class abstract (TInterfacedObject)</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;FName: string;</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;property Name: string read FName write FName;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TDog = class(TAnimal, IVoice)</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Voice: string;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TCat = class(TAnimal, IVoice)</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Voice: string;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TDog }</div><div class="code_line">&nbsp;</div><div class="code_line">function TDog.Voice: string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result:= &#39;Arf-Arf!&#39;;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TCat }</div><div class="code_line">&nbsp;</div><div class="code_line">function TCat.Voice: string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result:= &#39;Meow-Meow!&#39;;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;voices: TArray&#60;IVoice&#62;;</div><div class="code_line">&nbsp;&nbsp;funcs: TArray&#60;TFunc&#60;string&#62;&#62;;</div><div class="code_line">&nbsp;&nbsp;I: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;voices:= [TDog.Create, TCat.Create, TDog.Create];</div><div class="code_line">&nbsp;&nbsp;SetLength(funcs, Length(voices));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for I := 0 to High(voices) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;funcs[i]:= voices[i].Voice; &nbsp;//&#60;--- это вызов, а надо сохранить адрес функции &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;Readln;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
Хелп плз&#33;  :whistle:]]></description>
        <author>Cfon</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	