<?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=366987&amp;view=findpost&amp;p=3251215</guid>
        <pubDate>Mon, 17 Dec 2012 14:35:56 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3251215</link>
        <description><![CDATA[Fr0sT: <strong class='tag-b'>Rouse_</strong>, готово.]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3251211</guid>
        <pubDate>Mon, 17 Dec 2012 14:17:00 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3251211</link>
        <description><![CDATA[Rouse_: <strong class='tag-b'>Fr0sT</strong> в итоге что, в первом посте у тебя финальная версия кода? <br>
Если нет - то приведи в порядок, перед НГ будем причесывать раздел и переносить все в FAQ, поэтому желательно чтобы все было готово.]]></description>
        <author>Rouse_</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3238425</guid>
        <pubDate>Sat, 17 Nov 2012 10:48:37 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3238425</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=366987&view=findpost&p=3237032'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-11-14T06:38:25+00:00">14.11.12, 06:38</time></span><div class='quote '>О&#33; А я всё кумекал, в чем разница и почему нельзя просто сделать одну функцию для обоих случаев</div></div><br>
В качестве open array параметра, можно передавать не только [...] - конструктор массива &quot;на лету&quot;, но и любой массив, совместимый по типу элементов (динамический, статический или выделенный в куче по GetMem), а также одну переменную типа элемента массива (которая рассматривается как массив длины 1). Причем для статических и выделенных по GetMem массивов, во-первых, не обязательна индексация от 0 (хотя внутри функции open array по любому индексируется с 0), во-вторых, можно передавать не весь массив, а произвольное число первых элементов с помощью псевдофункции Slice(массив,Count), которая на этапе компиляции просто заменяет значение передаваемого теневого параметра High(Arr) на Count.<br>
Ну и разумеется, во всех этих случаях при объявлении параметра-массива как const в функцию просто передается указатель на исходный массив и значение High=Count-1]]></description>
        <author>leo</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3237032</guid>
        <pubDate>Wed, 14 Nov 2012 06:38:25 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3237032</link>
        <description><![CDATA[Fr0sT: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=366987&view=findpost&p=3236913'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-11-13T16:55:33+00:00">13.11.12, 16:55</time></span><div class='quote '>Нет, в обоих случаях массив передается непосредственно по указателю, и разница лишь в том, что при Arr:TStringArray ничего доп-но не передается и High(Arr) определяется внутри функции по теневому заголовку Arr (вызовом _DinArrayHigh), а в случае с open array _DinArrayHigh(Arr) вызывается до вызова функции и передается в нее в виде доп.теневого параметра, а внутри функции High(Arr) просто берет это значение из параметра (в данном случае из регистра EDX)</div></div><br>
О&#33; А я всё кумекал, в чем разница и почему нельзя просто сделать одну функцию для обоих случаев. Спасибо&#33;]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236913</guid>
        <pubDate>Tue, 13 Nov 2012 16:55:33 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236913</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=366987&view=findpost&p=3236546'><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-11-12T20:29:38+00:00">12.11.12, 20:29</time></span><div class='quote '>Только вроде как в рантайм преобразование будет</div></div><br>
Нет, в обоих случаях массив передается непосредственно по указателю, и разница лишь в том, что при Arr:TStringArray ничего доп-но не передается и High(Arr) определяется внутри функции по теневому заголовку Arr (вызовом _DinArrayHigh), а в случае с open array _DinArrayHigh(Arr) вызывается до вызова функции и передается в нее в виде доп.теневого параметра, а внутри функции High(Arr) просто берет это значение из параметра (в данном случае из регистра EDX).]]></description>
        <author>leo</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236546</guid>
        <pubDate>Mon, 12 Nov 2012 20:29:38 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236546</link>
        <description><![CDATA[--Ins--: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=366987&view=findpost&p=3236407'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-11-12T15:37:45+00:00">12.11.12, 15:37</time></span><div class='quote '>В таком случае вариант с параметром Arr:TStrArray является вроде как излишним&#092;масло-масляным, т.к. дин.массив можно передавать вместо открытого массива</div></div><br>
<br>
Только вроде как в рантайм преобразование будет, если память не подводит, так что можно второй вариант оставить]]></description>
        <author>--Ins--</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236407</guid>
        <pubDate>Mon, 12 Nov 2012 15:37:45 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236407</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=366987&view=findpost&p=3229500'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-11-01T09:58:12+00:00">01.11.12, 09:58</time></span><div class='quote '>* Добавил Join с параметром типа array of string - код полностью аналогичен, но позволяет задавать параметр-массив прямо в коде без использования вспомогательной StrArray</div></div><br>
В таком случае вариант с параметром Arr:TStrArray является вроде как излишним&#092;масло-масляным, т.к. дин.массив можно передавать вместо открытого массива]]></description>
        <author>leo</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236248</guid>
        <pubDate>Mon, 12 Nov 2012 12:44:15 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236248</link>
        <description><![CDATA[Fr0sT: <strong class='tag-b'>jack128</strong>, хм, а что, в нём нет такой функции? Интересная идея, погляжу]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236244</guid>
        <pubDate>Mon, 12 Nov 2012 12:33:39 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236244</link>
        <description><![CDATA[jack128: TStringBuilder в D2009 есть?? Если есть, то в Join - он так и просится.]]></description>
        <author>jack128</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236168</guid>
        <pubDate>Mon, 12 Nov 2012 10:26:31 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236168</link>
        <description><![CDATA[Fr0sT: * Тип TStrArray теперь является алиасом Types.TStringDynArray по совету jack128. Более стильный TArray&lt;string&gt;, к сожалению, глючит в качестве параметра.<br>* Добавил Join с параметром типа array of string - код полностью аналогичен, но позволяет задавать параметр-массив прямо в коде без использования вспомогательной StrArray]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236075</guid>
        <pubDate>Mon, 12 Nov 2012 07:21:47 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236075</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=366987&view=findpost&p=3236061'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-11-12T06:48:44+00:00">12.11.12, 06:48</time></span><div class='quote '>Лучше аргументируй столь категоричное высказывание.</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">unit Unit1;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TStrArray1 = array of string;</div><div class="code_line">&nbsp;</div><div class="code_line">funciton f1(): TStrArray1;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><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">unit Unit2;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TStrArray2 = array of string;</div><div class="code_line">&nbsp;</div><div class="code_line">function f2(arr: TStrArray2): TStrArray2;</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">unit Unit3;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TStrArray3 = array of string;</div><div class="code_line">&nbsp;</div><div class="code_line">function f3(arr: TStrArray3): TStrArray3;</div></ol></div></div></div></div><br>
<br>
разработчик каждого нового модуля считает себя самым умными и объявляет новый тип для массива строк.<br>
<br>
в результате я вместо того, чтобы просто написать f3(f2(f1)) <br>
<br>
вынужден либо unsafe type cast&#39;ом заниматься, либо писать пачку преобразователей TStrArray1 -&gt; TStrArray2 -&gt; TStrArray3.]]></description>
        <author>jack128</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236061</guid>
        <pubDate>Mon, 12 Nov 2012 06:48:44 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3236061</link>
        <description><![CDATA[Fr0sT: Не стреляйте, дяденька&#33; :)<br>Лучше аргументируй столь категоричное высказывание.]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3235895</guid>
        <pubDate>Sun, 11 Nov 2012 17:07:35 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3235895</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=366987&view=findpost&p=3229500'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-11-01T09:58:12+00:00">01.11.12, 09:58</time></span><div class='quote '>type<br>
  TStrArray = array of string;</div></div><br>
за такое - растрел на месте полагается.<br>
Либо TArray&lt;string&gt; должен быть если &gt;=Delphi2009 юзаешь, либо Types.TStringDynArray если раньше.]]></description>
        <author>jack128</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3230387</guid>
        <pubDate>Fri, 02 Nov 2012 10:14:08 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3230387</link>
        <description><![CDATA[--Ins--: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=366987&view=findpost&p=3230341'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-11-02T09:46:14+00:00">02.11.12, 09:46</time></span><div class='quote '>Жалко, что предыдущей темы не осталось - там было в точности то же самое, причем с твоим же участием</div></div><br>
<br>
Серьезно? :D Я уже и не помню. Ну тогда ладно]]></description>
        <author>--Ins--</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3230341</guid>
        <pubDate>Fri, 02 Nov 2012 09:46:14 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3230341</link>
        <description><![CDATA[Fr0sT: Жалко, что предыдущей темы не осталось - там было в точности то же самое, причем с твоим же участием :)<br><br>Мне лично удобно, очень часто юзаю эти функции для кратковременных задач.]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3230255</guid>
        <pubDate>Fri, 02 Nov 2012 08:45:42 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3230255</link>
        <description><![CDATA[--Ins--: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=366987&view=findpost&p=3230152'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2012-11-02T06:54:17+00:00">02.11.12, 06:54</time></span><div class='quote '>--Ins--, тем, что TStrings надо удалять.</div></div><br>
<br>
Ну, сомнительный недостаток, имхо. По мне так массивы - крайне неудобная вещь, практически нигде их не использую, заменяя контейнерными классами. Особенно с учетом того, что в интерфейсах VCL именно они и используются, что позволяет их использовать &quot;как есть&quot;, а вот массивы почти всегда нужно вручную обрабатывать и преобразовывать к какому-либо виду. Не говоря уже о том, что контейнерные классы по сравнению с массивами поддерживают ряд дополнительных возможностей]]></description>
        <author>--Ins--</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3230152</guid>
        <pubDate>Fri, 02 Nov 2012 06:54:17 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3230152</link>
        <description><![CDATA[Fr0sT: <strong class='tag-b'>--Ins--</strong>, тем, что TStrings надо удалять.]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3229918</guid>
        <pubDate>Thu, 01 Nov 2012 18:28:52 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3229918</link>
        <description><![CDATA[--Ins--: <strong class='tag-b'>Fr0sT</strong>, а чем не устроила стандартная ExtractStrings? И зачем выходные данные в виде массива? TStrings всяко удобнее, особенно тем, что повсеместно используется в VCL - можно сразу подставлять в него TMemo.Lines или TComboBox.Items и так длаее]]></description>
        <author>--Ins--</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3229500</guid>
        <pubDate>Thu, 01 Nov 2012 09:58:12 +0000</pubDate>
        <title>Функции Split, Join, GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=366987&amp;view=findpost&amp;p=3229500</link>
        <description><![CDATA[Fr0sT: <strong class='tag-b'><span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-size' data-value='14' style='font-size:14pt;'>Функции Split, Join, GetElement</span></span></strong><br>
<br>
<strong class='tag-b'>Апдейт <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=348552' target='_blank'>этой</a> темы - т.к. отредактировать тот пост нет возможности, а исходная тема удалена.</strong><br>
<br>
Набор функций для работы со строками, содержащими списки элементов с разделителями. Аналог одноименных функций из JS, PHP. Разделитель может быть любой длины.<br>
<br>
<span class="tag-color tag-color-named" data-value="green" style="color: green"><strong class='tag-b'>Проверено в Delphi 2009-10, но должно работать и в более старых версиях</strong></span><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">uses StrUtils; // для PosEx</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;// Разделитель по умолчанию для Split, Join, GetElement</div><div class="code_line">&nbsp;&nbsp;DefListDelim = &#39;;&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">...</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;// Алиас типа вместо нового объявления - в целях совместимости.</div><div class="code_line">&nbsp;&nbsp;// Можно было бы юзать TArray&#60;string&#62;, но он глючит при использовании в параметрах</div><div class="code_line">&nbsp;&nbsp;// (i := Low(arr) - пишет Incompatible types)</div><div class="code_line">&nbsp;&nbsp;TStrArray = Types.TStringDynArray;</div><div class="code_line">&nbsp;</div><div class="code_line">...</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function Split(const Str: string; Delim: string = DefListDelim; AllowEmpty: Boolean = True): TStrArray;</div><div class="code_line">&nbsp;&nbsp;function GetElement(const Str: string; ElemIdx: Integer; Delim: string = DefListDelim): string;</div><div class="code_line">&nbsp;&nbsp;function Join(const Arr: array of string; Delim: string = DefListDelim; AllowEmpty: Boolean = True): string; </div><div class="code_line">&nbsp;</div><div class="code_line">...</div><div class="code_line">&nbsp;</div><div class="code_line">// Расщепление строки Str на массив элементов.</div><div class="code_line">// &nbsp; Str - исходная строка</div><div class="code_line">// &nbsp; Delim - разделитель элементов в строке (может насчитывать сколько угодно символов)</div><div class="code_line">// &nbsp; AllowEmpty - добавлять ли в массив пустые элементы (&#39;elem1;elem2;;elem3&#39;).</div><div class="code_line">// &nbsp; &nbsp; Потребуется, если исходная строка представляет собой неоднородный список</div><div class="code_line">// &nbsp; &nbsp; с фиксированными индексами элементов</div><div class="code_line">// Пример:</div><div class="code_line">// &nbsp; HTMLlines := Split(HTMLPageSource, #13#10, False)</div><div class="code_line">// &nbsp; BananaProperties := Split(&#39;banana;yellow;;Africa&#39;, &#39;;&#39;, True)</div><div class="code_line">function Split(const Str: string; Delim: string; AllowEmpty: Boolean): TStrArray;</div><div class="code_line">var CurrDelim, NextDelim, CurrIdx: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Str = &#39;&#39; then begin SetLength(Result, 0); Exit; end;</div><div class="code_line">&nbsp;&nbsp;CurrDelim := 1; CurrIdx := 0; SetLength(Result, 16);</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;if CurrIdx = Length(Result) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetLength(Result, CurrIdx + 16); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// проверяем наполненность массива и расширяем при необходимости</div><div class="code_line">&nbsp;&nbsp; &nbsp;NextDelim := PosEx(Delim, Str, CurrDelim); &nbsp; &nbsp; &nbsp; &nbsp;// позиция следующего разделителя</div><div class="code_line">&nbsp;&nbsp; &nbsp;if NextDelim = 0 then NextDelim := Length(Str)+1; // строка кончилась</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result[CurrIdx] := Copy(Str, CurrDelim, NextDelim - CurrDelim);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CurrDelim := NextDelim + Length(Delim);</div><div class="code_line">&nbsp;&nbsp; &nbsp;// если элемент непуст или же пустые допустимы - увеличиваем индекс</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (Result[CurrIdx] &#60;&#62; &#39;&#39;) or AllowEmpty</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;then Inc(CurrIdx)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else Continue;</div><div class="code_line">&nbsp;&nbsp;until CurrDelim &#62; Length(Str);</div><div class="code_line">&nbsp;&nbsp;SetLength(Result, CurrIdx); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// обрезаем массив</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// Получение 0-based элемента из строки с разделителями</div><div class="code_line">// &nbsp; Str - исходная строка</div><div class="code_line">// &nbsp; ElemIdx - индекс элемента, от 0 до ...</div><div class="code_line">// &nbsp; Delim - разделитель элементов в строке (может насчитывать сколько угодно символов)</div><div class="code_line">// Пример:</div><div class="code_line">// &nbsp; value := GetElement(&#39;GeneralSettings.SomeIniOption = 123&#39;, 1, &#39; = &#39;);</div><div class="code_line">function GetElement(const Str: string; ElemIdx: Integer; Delim: string): string;</div><div class="code_line">var CurrDelim, NextDelim, Idx: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := &#39;&#39;; CurrDelim := 1;</div><div class="code_line">&nbsp;&nbsp;// ElemIdx раз ищем символ разделителя в строке</div><div class="code_line">&nbsp;&nbsp;for Idx := 1 to ElemIdx do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;CurrDelim := PosEx(Delim, Str, CurrDelim);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if CurrDelim = 0 then Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Inc(CurrDelim, Length(Delim)); // теперь здесь индекс первого символа следующего элемента</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;NextDelim := PosEx(Delim, Str, CurrDelim); // ищем конечный разделитель</div><div class="code_line">&nbsp;&nbsp;if NextDelim = 0 then NextDelim := Length(Str) + 1;</div><div class="code_line">&nbsp;&nbsp;Result := Copy(Str, CurrDelim, NextDelim-CurrDelim);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// Объединение всех строк из массива в одну с разделителями (обратно Split)</div><div class="code_line">// &nbsp; Arr - массив строк</div><div class="code_line">// &nbsp; Delim - разделитель элементов в строке (может насчитывать сколько угодно символов,</div><div class="code_line">// &nbsp; &nbsp; (!) в том числе и ни одного (!) )</div><div class="code_line">// &nbsp; AllowEmpty - добавлять ли в строку пустые элементы</div><div class="code_line">// &nbsp; &nbsp; Потребуется, если итоговая строка должна представлять собой неоднородный список</div><div class="code_line">// &nbsp; &nbsp; с фиксированными индексами элементов</div><div class="code_line">// Пример:</div><div class="code_line">// &nbsp; FruitList := Join([&#39;apples&#39;, &#39;bananas&#39;, &#39;grape&#39;], &#39;; &#39;)</div><div class="code_line">// &nbsp; BananaProperties := Join([Banana.Name, Banana.Color, &#39;&#39;, Banana.Country], &#39;;&#39;, True)</div><div class="code_line">// &nbsp; ReJoin := Join(Split(&#39;one;two;three&#39;), &#39;|&#39;);</div><div class="code_line">function Join(const Arr: array of string; Delim: string; AllowEmpty: Boolean): string;</div><div class="code_line">var i: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;for i := Low(Arr) to High(Arr) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (Arr[i] = &#39;&#39;) and not AllowEmpty then Continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Result = &#39;&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;then Result := Arr[i]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else Result := Result + Delim + Arr[i];</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>12.11</strong><br>
* Тип TStrArray теперь является алиасом Types.TStringDynArray по совету jack128. Более стильный TArray&lt;string&gt;, к сожалению, глючит в качестве параметра.<br>
* Добавил Join с параметром типа array of string - код полностью аналогичен, но позволяет задавать параметр-массив прямо в коде без использования вспомогательной StrArray<br>
<br>
<strong class='tag-b'>17.12</strong><br>
* Убраны StrArray и Join с параметром TStrArray: Join с параметром array of string работает и с переменными типа TStrArray]]></description>
        <author>Fr0sT</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      </channel>
      </rss>
	