<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Delphi блог Димаса &#187; crystalbit</title>
	<atom:link href="http://parsers.info/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://parsers.info</link>
	<description>Delphi блог Димаса: программирование на delphi, парсеры, статьи, размышления</description>
	<lastBuildDate>Mon, 06 Sep 2010 19:33:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Контролируем перемещение формы</title>
		<link>http://parsers.info/2010/09/kontroliruem-peremeshhenie-formy/</link>
		<comments>http://parsers.info/2010/09/kontroliruem-peremeshhenie-formy/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 17:44:53 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[delphi]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[работа с окнами]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=703</guid>
		<description><![CDATA[Сегодня начну пост с того, что недавно пришлось восстановить блог с бэкапа не первой свежести. Связано это с тем, что хостинг прогорел, а я был в области и не успел сделать бэкап. Пропали некоторые последние комментарии и один пост, про то, что блог теперь уже не dofollow, но все комментарии, сделанные до того поста, остались [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: right;"><em>Сегодня начну пост с того, что недавно пришлось восстановить блог с бэкапа не первой свежести. Связано это с тем, что хостинг прогорел, а я был в области и не успел сделать бэкап.</em></p>
<p style="text-align: right;"><em>Пропали некоторые последние комментарии и один пост, про то, что блог теперь уже не dofollow, но все комментарии, сделанные до того поста, остались dofollow.</em></p>
<p style="text-align: right;"><em>Плюс хочу выразить благодарность пользователю Alex, который обратил внимание на мелочность и ненужность некоторых заметок. Исправимся <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
<p style="text-align: left;">
<p style="text-align: left;">Вполне может оказаться необходимым контролировать перемещение формы пользователем &#8211; будь то некоторая стыковка к границам экрана или необходимость запретить перемещать форму.</p>
<p style="text-align: left;">Мы сперва лезем в Events, видим, что события OnMove нету.</p>
<p style="text-align: left;"><span id="more-703"></span>Итак, существует два события: WM_MOVING и WM_MOVE. Первое передаётся окну, когда его перетаскивают, а второе, когда уже переместили. В принципе, в windows xp и выше (а может ещё и чуть раньше) при перемещении окна курсором оно сразу меняет позицию (в отличие от windows 95, например, там мы перемещали контур окна), WM_MOVE возникает достаточно много раз, поэтому не вижу особого смысла его использовать.</p>
<p>Для примера поставим Label1 на форму. Теперь в раздел private типа TForm1 напишем:</p>
<pre class="delphi">procedure WMMoving (var msg: TWMMoving); message WM_MOVING;</pre>
<p>Это значит, что процедура, которую мы сечас напишем, будет выполняться каждый раз, когда форма перемещается.</p>
<pre class="delphi">procedure TForm1.WMMoving (var msg: TWMMoving);
begin
  Label1.Caption:=IntToStr(msg.DragRect.Left)+';'+IntToStr(msg.DragRect.Top);
end;</pre>
<p>Можно проверить, при перемещении формы в Label1 меняются её координаты.</p>
<p>Хочу добавить, что это заметка, которая не претендует на журнальную статью, но я решил об этом написать, так как передо мной встал вопрос, отражённый в заголовке. Буду и дальше писать конкретно и по теме блога <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>(с) crystalbit, <a href="http://parsers.info">http://parsers.info</a></p>
<p>Вопрос восстановления файлов &#8211; важный вопрос. Если бы всё было так просто, я не потерял бы бд блога, которая сгорела вместе с хостингом (к слову, похоже на то, что каталог с базами специально отформатировали). Программ есть много (та же <a href="http://getrecuva.ru/">Recuva</a>), но они не всегда могут помочь.</p>

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://parsers.info/2009/04/rabotaem-s-oknami-animatewindow-i-flashwindow/" title="Работаем с окнами. AnimateWindow и FlashWindow. (30 Апрель 2009)">Работаем с окнами. AnimateWindow и FlashWindow.</a> (0)</li>
	<li><a href="http://parsers.info/2009/04/rabotaem-s-oknami-i-obektami-chast-4-funkcii-i-procedury/" title="Работаем с окнами и объектами. Часть 4. Функции и процедуры. (29 Апрель 2009)">Работаем с окнами и объектами. Часть 4. Функции и процедуры.</a> (0)</li>
	<li><a href="http://parsers.info/2009/04/rabotaem-s-oknami-i-obektami-chast-3-poisk-obektov/" title="Работаем с окнами и объектами. Часть 3. Поиск объектов. (24 Апрель 2009)">Работаем с окнами и объектами. Часть 3. Поиск объектов.</a> (0)</li>
	<li><a href="http://parsers.info/2009/04/rabotaem-s-oknami-i-obektami-chast-2/" title="Работаем с окнами и объектами. Часть 2 (22 Апрель 2009)">Работаем с окнами и объектами. Часть 2</a> (0)</li>
	<li><a href="http://parsers.info/2009/04/rabotaem-s-oknami-i-obektami-delphi-api-chast-1/" title="Работаем с окнами и объектами. Delphi. Api. Часть 1 (20 Апрель 2009)">Работаем с окнами и объектами. Delphi. Api. Часть 1</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/09/kontroliruem-peremeshhenie-formy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Про сороковую симфонию Моцарта</title>
		<link>http://parsers.info/2010/06/pro-sorokovuyu-simfoniyu-mocarta/</link>
		<comments>http://parsers.info/2010/06/pro-sorokovuyu-simfoniyu-mocarta/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 12:24:34 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[delphi]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[внутренний динамик]]></category>
		<category><![CDATA[звуки]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=676</guid>
		<description><![CDATA[Итак, ребятки, чуть больше года назад, выложил я свою наработку &#8211; сороковую симфонию Моцарта из внутреннего динамика. Программа просто запускалась и звучала. Звучала, как надо. В те времена я ничего не понимал в нотах (и в таких сферах жизни, как работа водителя в Казахстане, к слову, тоже ничего не понимал, как и сейчас). С тех [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, ребятки, чуть больше года назад, выложил я свою наработку &#8211; <a href="http://parsers.info/2009/05/sorokovaya-simfoniya-mocarta-iz-vnutrennego-dinamika/">сороковую симфонию Моцарта из внутреннего динамика</a>.<br />
Программа просто запускалась и звучала. Звучала, как надо.<br />
<span id="more-676"></span><br />
В те времена я ничего не понимал в нотах (и в таких сферах жизни, как <a href="http://rabota.slando.kz/kazakhstan/5924_1.html">работа водителя в Казахстане</a>, к слову, тоже ничего не понимал, как и сейчас). С тех пор научился играть на гитаре, немного развил отсутствующие слух и голос.</p>
<p>Так вот, уже позже, 23 ноября того года, я написал статью (пост, заметку) с алгоритмом работы программы. Но, мало чего понимая в нотной грамоте, допустил пару ошибок.</p>
<p>Сейчас исправил, кое-чем дополнил и заново привлекаю внимание к той статье.<br />
<a href="http://parsers.info/2009/11/mocart-iz-vnutrennego-dinamika-sorokovaya-simfoniya-i-delphi-part-1/">Моцарт из внутреннего динамика. Сороковая симфония и delphi. Часть 1.</a><br />
<a href="http://parsers.info/2009/12/mocart-iz-vnutrennego-dinamika-sorokovaya-simfoniya-delphi-part-2/">Моцарт из внутреннего динамика. Сороковая симфония и delphi. Часть 2.</a></p>
<p>Спасибо за внимание</p>

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://parsers.info/2009/05/sorokovaya-simfoniya-mocarta-iz-vnutrennego-dinamika/" title="Сороковая симфония Моцарта из внутреннего динамика. (30 Май 2009)">Сороковая симфония Моцарта из внутреннего динамика.</a> (15)</li>
	<li><a href="http://parsers.info/2009/12/mocart-iz-vnutrennego-dinamika-sorokovaya-simfoniya-delphi-part-2/" title="Моцарт из внутреннего динамика. Сороковая симфония и delphi. Часть 2. (3 Декабрь 2009)">Моцарт из внутреннего динамика. Сороковая симфония и delphi. Часть 2.</a> (0)</li>
	<li><a href="http://parsers.info/2009/11/mocart-iz-vnutrennego-dinamika-sorokovaya-simfoniya-i-delphi-part-1/" title="Моцарт из внутреннего динамика. Сороковая симфония и delphi. Часть 1. (23 Ноябрь 2009)">Моцарт из внутреннего динамика. Сороковая симфония и delphi. Часть 1.</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/06/pro-sorokovuyu-simfoniyu-mocarta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ClipFill</title>
		<link>http://parsers.info/2010/05/clipfill/</link>
		<comments>http://parsers.info/2010/05/clipfill/#comments</comments>
		<pubDate>Sun, 02 May 2010 17:35:19 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[delphi]]></category>
		<category><![CDATA[Софт]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=655</guid>
		<description><![CDATA[Написал нехитрую программку для заполнения форм и прочего из буфера обмена. Принцип очень простой: Открываем, редактируем список из строк и оставляем поверх всех окон. Изначально выделена первая строчка, она находится уже в буфере обмена. Нажимая Shift-Insert, мы можем это, очевидно, куда-либо вставить. Программа перехватывает нажатие Shift-Insert и, когды ты уже отпустил, копирует в буфер следующее [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://parsers.info/wp-content/uploads/2010/05/clipfill.png"><img class="alignleft size-full wp-image-656" title="Программа ClipFill" src="http://parsers.info/wp-content/uploads/2010/05/clipfill.png" alt="" width="163" height="323" /></a>Написал нехитрую программку для заполнения форм и прочего из буфера обмена. Принцип очень простой:</p>
<p>Открываем, редактируем список из строк и оставляем поверх всех окон. Изначально выделена первая строчка, она находится уже в буфере обмена. Нажимая Shift-Insert, мы можем это, очевидно, куда-либо вставить.</p>
<p>Программа перехватывает нажатие Shift-Insert и, когды ты уже отпустил, копирует в буфер следующее значение.</p>
<p>То есть, с достаточной подготовкой, можно быстро заполнять формы, нажимая Shift-Ins, Tab, &#8230;</p>
<p>При закрытии программы ClipFill список сохраняется.</p>
<p>Под катом программа, исходник и вопрос к читателям.<span id="more-655"></span>Программа ClipFill достаточно сырая, писал на коленке для одного сайта (lockerz, заказал с помощью неё термос <img src='http://parsers.info/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ).</p>
<p>Вопрос: какие комбинации клавиш сделать для того, чтобы вернуть в буфер предыдущее значение и вернуться к первому?</p>
<p>Автор crystalbit, <a href="http://parsers.info">http://parsers.info</a></p>
<p>При копировании поста прямую ссылку оставлять обязательно.</p>
<p>Скачать ClipFill: <a href="http://parsers.info/pub/clipfill/clipfill.exe">программа</a>, <a href="http://parsers.info/pub/clipfill/clipfill.rar">исходник</a></p>

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li>Нет похожих записей.</li>
	</ul>

]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/05/clipfill/feed/</wfw:commentRss>
		<slash:comments>71</slash:comments>
		</item>
		<item>
		<title>Работаем только с некоторыми компонентами</title>
		<link>http://parsers.info/2010/04/rabotaem-tolko-s-nekotorymi-komponentami/</link>
		<comments>http://parsers.info/2010/04/rabotaem-tolko-s-nekotorymi-komponentami/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 15:26:45 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[delphi]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[компоненты]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=650</guid>
		<description><![CDATA[Привет! В одной из предыдущих статей мы перечисляли все компоненты определённого типа на форме, мы могли присвоить им одно и то же свойство, получить их содержание и так далее. А что если, например, у нас на форме штук 20 TPanel, и нам нужно у пяти из них поменять высоту? Передо мной сейчас как раз и [...]]]></description>
			<content:encoded><![CDATA[<p>Привет! В <a href="http://parsers.info/2009/12/perechislenie-vsex-komponentov-na-forme/">одной из предыдущих статей</a> мы перечисляли все компоненты определённого типа на форме, мы могли присвоить им одно и то же свойство, получить их содержание и так далее.</p>
<p>А что если, например, у нас на форме штук 20 TPanel, и нам нужно у пяти из них поменять высоту?<br />
Передо мной сейчас как раз и встала такая задача.<br />
<span id="more-650"></span><br />
Всё очень просто:</p>
<ul>
<li>Выделяем нужные компоненты (в данном случае TPanel).</li>
<li>Ставим свойство Tag отличное от нуля &#8211; по нему мы поймём, что этот компонент &#8211; нам нужный</li>
<li>И вот мой код:
<pre name="code" class="delphi">
var
  i: integer;
begin
  for i:=0 to ComponentCount-1 do
    if Components[i].Tag=1 then
      (Components[i] as TControl).Height:=Panel3.Height div 6;
end;
</pre>
</ul>
<p>В общем, всё аналогично той статье, но теперь мы используем <strong>свойство Tag</strong> компонента, чтобы отделить его от общей массы, а не тип.</p>
<p>Между делом замечу, что у меня последние два апа тиц держится на уровне полтинника, а я на него не потратил ни копейки (не считая кое-каких услуг после последнего апдейта). Можно вручную пытаться получить ссылки, а можно и заказать <a href="http://netpeak.ua/articles/about_seo_service/">seo</a> оптимизацию.</p>

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li>Нет похожих записей.</li>
	</ul>

]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/04/rabotaem-tolko-s-nekotorymi-komponentami/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Парсим даты апдейтов с главной pr-cy</title>
		<link>http://parsers.info/2010/04/parsim-daty-apdejtov-s-glavnoj-pr-cy/</link>
		<comments>http://parsers.info/2010/04/parsim-daty-apdejtov-s-glavnoj-pr-cy/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 11:10:38 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[delphi]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[парсинг]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=633</guid>
		<description><![CDATA[Привет! Давно не писал Как известно на главной странице pr-cy.ru есть даты обновлений тИЦ, pr и яндекс выдачи. Я, как и многие, часто захожу туда, дабы проверить, не обновилось ли что-нибудь. Сегодня напишем небольшую программу-пример, показывающую, как получить эти даты.1) Сперва заходим на сайт, видим: Три даты. Чтож, ТЗ есть. Теперь смотрим исходный код фрагмента: [...]]]></description>
			<content:encoded><![CDATA[<p>Привет! Давно не писал <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Как известно на главной странице pr-cy.ru есть даты обновлений тИЦ, pr и яндекс выдачи. Я, как и многие, часто захожу туда, дабы проверить, не обновилось ли что-нибудь.<br />
Сегодня напишем небольшую программу-пример, показывающую, как получить эти даты.<span id="more-633"></span>1) Сперва заходим на сайт, видим:</p>
<p><a href="http://parsers.info/wp-content/uploads/2010/04/ups1.png"><img class="alignleft size-full wp-image-634" title="Даты апдейтов тИЦ, pagerank и выдачи" src="http://parsers.info/wp-content/uploads/2010/04/ups1.png" alt="Даты апдейтов тИЦ, pagerank и выдачи" width="174" height="102" /></a>Три даты. Чтож, ТЗ есть.</p>
<p>Теперь смотрим исходный код фрагмента:</p>
<pre name="code" class="html">&lt;p&gt;&lt;span class="blue"&gt;G&lt;/span&gt;&lt;span class="red"&gt;o&lt;/span&gt;&lt;span class="yellow"&gt;o&lt;/span&gt;&lt;span class="blue"&gt;g&lt;/span&gt;&lt;span class="red"&gt;le&lt;/span&gt; &lt;span class="lar"&gt;PR&lt;/span&gt;&lt;span class="date"&gt;&lt;acronym title="11 д. назад"&gt;03.04.2010&lt;/acronym&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="red"&gt;Я&lt;/span&gt;&lt;b&gt;ндекс&lt;/b&gt; &lt;span class="ar"&gt;тИЦ&lt;/span&gt;&lt;span class="date"&gt;&lt;acronym title="6 д. назад"&gt;08.04.2010&lt;/acronym&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p-last"&gt;&lt;span class="ar"&gt;выдача&lt;/span&gt;&lt;span class="date"&gt;&lt;b&gt;13.04.2010&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
</pre>
<p>Достаточно примечательный фрагмент.</p>
<p>Итак, создадим новую программу, поставим кнопку и надпись (Button1 и Label1).<br />
Для получения страницы мы будем использовать библиотеку Synapse, поэтому подключим модуль httpsend.</p>
<p>В процедуре-обработчике нажания на кнопку пропишем:</p>
<pre name="code" class="delphi">procedure TForm1.Button1Click(Sender: TObject);
var
  vres: TStringList;
begin
  vres:=TStringList.Create;
  if HttpGetText('http://pr-cy.ru', vres) then begin
    // мы успешно получили код страницы pr-cy, дальше будем писать сюда
  end else begin
    ShowMessage('error getting pr-cy!');
  end;
  vres.Free;
end;
</pre>
<p>Теперь введём переменные scy, spr, syv: string; и константу <strong>cpr = &#8216;&lt;span class=&raquo;lar&raquo;&gt;PR&lt;/span&gt;&#8217;;</strong> &#8211; по ней мы будем ориентироваться.</p>
<p>Строки с датами найдём так:</p>
<pre name="code" class="delphi">
    i:=0;
    Repeat
      if Pos(cpr, vres.Strings[i])&lt;&gt;0 then break;
      i:=i+1;
    until 1=0;
    spr:=vres.Strings[i];
    scy:=vres.Strings[i+1];
    syv:=vres.Strings[i+2];
</pre>
<p>Выделим в каждой строке span с помощью функций delete, pos и posex (strutils):</p>
<pre name="code" class="delphi">
    i:=Pos('&lt;span class="date"&gt;', spr);
    Delete(spr, 1, PosEx('"&gt;', spr, i+1)+1);
    i:=Pos('&lt;span class="date"&gt;', scy);
    Delete(scy, 1, PosEx('"&gt;', scy, i+1)+1);
    i:=Pos('&lt;span class="date"&gt;', syv);
    Delete(syv, 1, PosEx('"&gt;', syv, i+1)+1);
</pre>
<p>Ещё немного попарсим:</p>
<pre name="code" class="delphi">
    i:=Pos('&lt;span class="date"&gt;', spr);
    Delete(spr, 1, PosEx('"&gt;', spr, i+1)+1);
    i:=Pos('&lt;span class="date"&gt;', scy);
    Delete(scy, 1, PosEx('"&gt;', scy, i+1)+1);
    i:=Pos('&lt;span class="date"&gt;', syv);
    Delete(syv, 1, PosEx('"&gt;', syv, i+1)+1);
    repeat
      i:=Pos('&lt;', spr);
      if i=0 then break;
      Delete(spr, i, PosEx('&gt;', spr, i));
    until 1=0;
    repeat
      i:=Pos('&lt;', scy);
      if i=0 then break;
      Delete(scy, i, PosEx('&gt;', scy, i));
    until 1=0;
    repeat
      i:=Pos('&lt;', syv);
      if i=0 then break;
      Delete(syv, i, PosEx('&gt;', syv, i));
    until 1=0;
    spr:=StringReplace(spr, '&gt;', '', [rfReplaceAll]);
    scy:=StringReplace(scy, '&gt;', '', [rfReplaceAll]);
    syv:=StringReplace(syv, '&gt;', '', [rfReplaceAll]);
    spr:=StringReplace(spr, ' ', '', [rfReplaceAll]);
    scy:=StringReplace(scy, ' ', '', [rfReplaceAll]);
    syv:=StringReplace(syv, ' ', '', [rfReplaceAll]);
</pre>
<p>И можно вывести результат:</p>
<pre name="code" class="delphi">
    Label1.Caption:='pr: '+spr+#13#10+'тИЦ: '+scy+#13#10+'Выдача: '+syv;
</pre>
<p>Вот и вся арифметика. Скачать проект с парсингом дат можно <a href="http://parsers.info/pub/prdate.rar">по этой ссылке</a>.<br />
Также советую готовую программу от Борисова Сергея &#8211; <a href="http://www.techweek.ru/search-monitor-beta-versiya/">Search Monitor</a>, спасибо, что обратили на неё внимание <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Давно я не появлялся <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Меня просто очень сильно мотивировали написать пост <a href="http://www.freeoboi.ru/">обои для рабочего стола</a>. Они бесплатные <img src='http://parsers.info/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://parsers.info/2010/01/postrochnyj-parsing/" title="Построчный парсинг (22 Январь 2010)">Построчный парсинг</a> (23)</li>
	<li><a href="http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/" title="Парсим csv и tsv файлы в delphi (12 Январь 2010)">Парсим csv и tsv файлы в delphi</a> (4)</li>
	<li><a href="http://parsers.info/2009/05/kolichestvo-podstrok-v-stroke/" title="Количество подстрок в строке. (21 Май 2009)">Количество подстрок в строке.</a> (3)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/04/parsim-daty-apdejtov-s-glavnoj-pr-cy/feed/</wfw:commentRss>
		<slash:comments>79</slash:comments>
		</item>
		<item>
		<title>Приведение типов в delphi применительно к объектам</title>
		<link>http://parsers.info/2010/02/privedenie-tipov-v-delphi-primenitelno-k-obektam/</link>
		<comments>http://parsers.info/2010/02/privedenie-tipov-v-delphi-primenitelno-k-obektam/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 11:38:06 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[delphi]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[типы]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=604</guid>
		<description><![CDATA[Приветствую. В завершение цикла заметок про объект Sender и операторы as и is хотелось бы затронуть и конструкцию тип(переменная). Далее поговорим про различия с объект as тип. В посте о Sender: TObject я рассмотрел использование объекта Sender, который передаётся процедуре-обработчику. Приведение и проверку типа объекта с помощью as и is я также рассмотрел в своё [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://parsers.info/wp-content/uploads/2010/02/type.png" alt="Приведение типов в delphi" title="Приведение типов в delphi" width="366" height="221" class="alignleft size-full wp-image-605" /><br />
Приветствую. В завершение цикла заметок про объект Sender и операторы as и is хотелось бы затронуть и конструкцию <strong>тип(переменная)</strong>. Далее поговорим про различия с <strong>объект as тип</strong>.<br />
<span id="more-604"></span><br />
В посте о <a href="http://parsers.info/2009/12/parametr-sender-v-obrabotchikax-sobytij-event-handlers-na-delphi/">Sender: TObject</a> я рассмотрел использование объекта Sender, который передаётся процедуре-обработчику.<br />
<a href="http://parsers.info/2009/12/operatory-as-i-is-delphi/">Приведение и проверку типа объекта с помощью as и is</a> я также рассмотрел в своё время, а сегодня поговорим о подобной конструкции:</p>
<pre name="code" class="delphi">
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Sender is TButton then
    TButton(Sender).Caption:='pressed';
end;
</pre>
<p>Такое приведение Sender к TButton считается стандартным. Однако многие люди считают это плохим тоном, перешедшим из <em>C</em>. Напомню, в <em>C</em> мы пишем <em>(тип) переменная</em>.</p>
<p>И ещё напомню, в прошлых постах мы рассматривали <strong>(Sender as TButton).Caption</strong>. Так в чём же разница?</p>
<h3>Оператор as</h3>
<p>Поговорим сначала про него. Такой способ применим только к объектам, да и к интерфейсам. Разрешено приведение к классу-родителю, проверка происходит в runtime, а в случае неверной подборки типов происходит исключение <strong>invalid class typecast</strong>. Впрочем, если мы вооружимся проверкой с помощью <a href="http://parsers.info/2009/12/operatory-as-i-is-delphi/">оператора is</a>, это не будет для нас проблемой.</p>
<h3>Стандартное, жёсткое приведение</h3>
<p>Здесь в runtime ничего не проверяется, исключений типа &laquo;invalid class typecast&raquo; не возникает. Всё происходит уже при компилировании.</p>
<pre name="code" class="delphi">
    TEdit(Button1).Text:='pressed';
</pre>
<p>Это ужасно, но это сработает. Можно сказать, что в этом случае мы твёрдо говорим компилятору, что уверены, что это за тип, не стоит проверять. В то время как в операторе as, как сказано выше, предусмотрена такая проверка. Но мы же всё равно проверяем тип с помощью оператора is, зачем нам лишние действия?<br />
Поэтому я склоняюсь к использованию таких конструкций:</p>
<pre name="code" class="delphi">
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Sender is TButton then
    TButton(Button1).Caption:='pressed';
end;
</pre>
<p>Мы говорим компилятору, что объект типа TButton, мы уверены, так как только что проверили.</p>
<p>Ну и напоследок добавлю, что такое приведение типов работает и с обычными переменными, в отличие от оператора as. Но это уже совсем другая история <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>&#8211; <em><a href="http://parsers.info">crystalbit</a></em></p>
<p>Теперь по поводу обмена постовыми. C радостью обменяюсь с блогом, так или иначе связанным с программированием, <em>с адекватными интересными постами</em>. Вчера один человек стучал в аську, я не успел ему ответить, а теперь найти номер не могу. В общем, если напишешь пост, связанный с программированием, то с радостью обменяюсь, а так нет желания.</p>
<p>PS Картинка к посту из msdn <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://parsers.info/2009/05/obxodimsya-bez-sysutils-stroka-chislo/" title="Обходимся без SysUtils. Строка <-> число (5 Май 2009)">Обходимся без SysUtils. Строка <-> число</a> (5)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/02/privedenie-tipov-v-delphi-primenitelno-k-obektam/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>Свежий взгляд на блог, мысли и планы</title>
		<link>http://parsers.info/2010/02/svezhij-vzglyad-na-blog-mysli-i-plany/</link>
		<comments>http://parsers.info/2010/02/svezhij-vzglyad-na-blog-mysli-i-plany/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 16:33:27 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[блог]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=595</guid>
		<description><![CDATA[crystalbit (18:53:02 16/02/2010) полмесяца в блог не писал faza02 (18:53:25 16/02/2010) дата) Действительно, учёба навалилась, время отнимает. Да и мотивация писать тоже страдает. Сегодня хочу поговорить о том, что я запланировал, и оглянуться назад, посмотреть на то, что уже было сделано. Итак, 25 декабря я сменил дизайн блога. Взял одну тему из буржунета, перевёл, изменил [...]]]></description>
			<content:encoded><![CDATA[<div style="font:italic 12px tahoma;text-align:right;">crystalbit (18:53:02 16/02/2010)<br />
полмесяца в блог не писал<br />
faza02 (18:53:25 16/02/2010)<br />
дата)</div>
<p>Действительно, учёба навалилась, время отнимает. Да и мотивация писать тоже страдает. Сегодня хочу поговорить о том, что я запланировал, и оглянуться назад, посмотреть на то, что уже было сделано.<br />
<span id="more-595"></span><br />
Итак, 25 декабря я <a href="http://parsers.info/2009/12/novyj-dizajn/">сменил дизайн</a> блога. Взял одну тему из буржунета, перевёл, изменил под себя многие мелочи. Во многом помогли читатели, я вами очень дорожу, спасибо!<br />
Если есть еще адекватные мысли (а не те, что только ради ссылки) по поводу дизайна, буду очень рад выслушать <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Теперь конкретно по тематике блога, что же запланировано? Оглашаю весь список:</p>
<ol>
<li>Написать про свой метод парсинга кое-чего, пока не расскажу <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  В том числе очень хочется обсудить его</li>
<li><a href="http://parsers.info/2010/01/pagerank-dcu-modul-dlya-opredeleniya-pagerank-na-delphi/">Модуль pagerank</a> &#8211; сделать версии для delphi 2009 и 2010, и, может быть, даже под сам linux <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><a href="http://parsers.info/2010/01/pagerank-dcu-modul-dlya-opredeleniya-pagerank-na-delphi/">Модуль pagerank</a> &#8211; сделать dll. Сделать-то сделал, да опять какие-то непонятки с delphi 2010, будем решать эту проблему</li>
<li>Написать маленький пост в продолжение серии as-is-sender в delphi. Это я точно напишу, скоро <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><strong>Обязательно</strong> затрону асинхронные сокеты! Уже начал писать, спасибо читателям за мотивацию</li>
<li>Сделать некий индекс самых интересных тематических постов на отдельной странице</li>
</ol>
<p>Как видишь, план есть. &laquo;Всё идёт по плану&raquo;, &#8211; пою я каждый раз, когда пишу очередной пост на <a href="http://parsers.info">delphi блог</a>. Ну и на гитарке подыгрываю <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>А вот сейчас, когда я уже раскрыл все свои коварные замыслы, хочу обратить твой взор к старым статьям, написанным тогда, когда у <a href="http://parsers.info">блога</a> было <a href="http://lurkmore.ru/3,5_анонимуса" rel="nofollow">три с половиной</a> читателя.</p>
<ol>
<li>Вот <a href="http://parsers.info/2009/03/reshaem-sudoku-na-delphi-7-statejka/">таким образом</a> моя программа решает судоку. Статейке скоро год исполнится. Это, можно сказать, первое, что я конкретно так расписал, что принесло большую пользу блогу.</li>
<li>А <a href="http://parsers.info/2009/04/prostejshij-3d-dvig-sredstvami-delphi-tor/">таким образом</a> я на обычном TImage нарисовал объёмный тор (читай бублик). Помни, математика &#8211; сила!</li>
<li>А ещё мою программу когда-то опубликовали в журнале хакер. Откопали где-то и опубликовали. Программу считаю не очень удачной, поэтому это совсем другая история, зато очень мотивирует</li>
</ol>
<p>По поводу этих двух статей &#8211; этично ли их в соцсети типа грабра отправлять? Как-никак, годовалой давности, зато, думаю, заинтересуют кого-нибудь <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Как ты знаешь, самый лучший <strong>постовой</strong> &#8211; тематический, поэтому не обойди вниманием и <a href="http://www.vikeng.info/" title="Создание сайтов, программирование на PHP и MySQL, CMS Drupal">заметки Web-программиста</a> <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Я дал знать о себе, я тут, я не уходил, я не переставал писать! А так, просто немного отдохнул&#8230;<br />
<em>&#8211; crystalbit</em></p>

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://parsers.info/2009/11/ya-zdes/" title="Я здесь! (19 Ноябрь 2009)">Я здесь!</a> (1)</li>
	<li><a href="http://parsers.info/2009/12/kak-ya-delal-blog-dofollow/" title="Как я делал свой блог dofollow блогом (18 Декабрь 2009)">Как я делал свой блог dofollow блогом</a> (86)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/02/svezhij-vzglyad-na-blog-mysli-i-plany/feed/</wfw:commentRss>
		<slash:comments>116</slash:comments>
		</item>
		<item>
		<title>pagerank.dcu &#8211; модуль для определения pagerank на delphi</title>
		<link>http://parsers.info/2010/01/pagerank-dcu-modul-dlya-opredeleniya-pagerank-na-delphi/</link>
		<comments>http://parsers.info/2010/01/pagerank-dcu-modul-dlya-opredeleniya-pagerank-na-delphi/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 16:52:53 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[SEO, SMO]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[модуль]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=584</guid>
		<description><![CDATA[Модуль для определения google pagerank на delphi. Сам модуль и описание дальше. Привет! Мне однажды потребовалось определить тИЦ и pagerank в одной программе на delphi. Полез в интернет, посмотрел, как происходит определение. Вот для тИЦ проблем нет &#8211; нужно всего лишь подставить адрес нужного сайта в запрос и пропарсить xml результат. С pagerank ситуация другая: [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://parsers.info/wp-content/uploads/2010/01/pr.gif" alt="pagerank.dcu - модуль для определения pagerank на delphi" title="pagerank.dcu - модуль для определения pagerank на delphi" width="150" height="200" class="alignleft size-full wp-image-585" /> Модуль для определения google pagerank на delphi. Сам модуль и описание дальше.<br />
<span id="more-584"></span><br />
Привет! Мне однажды потребовалось определить тИЦ и pagerank в одной программе на delphi. Полез в интернет, посмотрел, как происходит определение. Вот для тИЦ проблем нет &#8211; нужно всего лишь подставить адрес нужного сайта в запрос и пропарсить xml результат. С pagerank ситуация другая: google не хочет, чтобы каждый мог определить pr в своей программе <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Помимо адреса проверяемого сайта нужно передать контрольную сумму, которую нужно рассчитать. Думаю, это сделано против массовых проверок.<br />
Порывшись в интернете, нашел работающий php-скрипт без копирайта (и 10 неработающих <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ), перевёл на delphi пересчёт контрольной суммы, добавил немного winsock&#8217;а и, вуаля, получился работающий модуль расчёта pagerank для delphi.</p>
<p>В модуле всего две функции:</p>
<ol>
<li><strong>function GetPR(host: string; var res: integer): integer;</strong><br />
Всё очень просто, передаём нужный нам адрес сайта и числовую переменную. Функция GetPR возвращает значение google pagerank от 0 до 10. В переменную res записывается ответ сервера, 200 в случае успеха. Если в res 0, значит ошибка загрузки, код можно узнать с помощью WSAGetLastError. Сайт можно писать как с <strong>http://</strong>, так и без. Впрочем, на правильность этот параметр проверяй сам, так как в случае написания в этот параметр какой-нибудь другой строки, функция вернёт 0, а ответ от сервера будет 403.<br />
Пример использования:</p>
<pre name="code" class="delphi">
program prparsers;

uses pagerank, winsock;

{$apptype console}

var
  res, pr: integer;

begin
  pr:=GetPR('parsers.info', res);
  if res=200 then
    writeln('pr: ', pr)
  else if res=0 then
    writeln('socket error #', WSAGetLastError)
  else
    writeln('error, HTTP ', res);
  readln;
end.
</pre>
</li>
<li><strong>function GetCheckSum(url: string): string;</strong><br />
Просто возвращает контрольную сумму. Это если хочешь сам составить запрос и парсить ответ.
</li>
</ol>
<p>Модуль для определения pagerank написан на чистом winapi и занимает меньше 3,5Кб. Сокет синхронный, при желании можно использовать в потоке.</p>
<p>Ссылка:<br />
<a href="http://parsers.info/pub/pr_all.rar">Скачать модуль pagerank.dcu и прилагающиеся файлы</a><br />
Буду рад, если тебе пригодится, а также благодарен, если упомянешь старину Димаса <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
(c) crystalbit, <a href="http://parsers.info">http://parsers.info</a></p>
<p>И да, буду рад обменяться постовыми с незаброшенными блогами по программированию <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://parsers.info/2009/04/modul-crt-dlya-delphi-2/" title="Модуль crt для delphi. (6 Апрель 2009)">Модуль crt для delphi.</a> (0)</li>
	<li><a href="http://parsers.info/2008/10/modul-crt-dlya-delphi/" title="Модуль crt для delphi (24 Октябрь 2008)">Модуль crt для delphi</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/01/pagerank-dcu-modul-dlya-opredeleniya-pagerank-na-delphi/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>WinSock: Получение хоста по адресу</title>
		<link>http://parsers.info/2010/01/winsock-poluchenie-xosta-po-adresu/</link>
		<comments>http://parsers.info/2010/01/winsock-poluchenie-xosta-po-adresu/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 18:56:02 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[delphi]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[winsock]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=572</guid>
		<description><![CDATA[В недавнем примере мы делали http-запрос с помощью синхронного сокета. Мы обращались к конкретному серверу, зная его ip. Непорядок, сегодня займёмся определением ip-адреса по доменному имени, по адресу сайта. MSDN по крайней мере предлагает нам две функции для таких операций. Первая &#8211; функция gethostbyname, вторая &#8211; функция getaddrinfo. Microsoft рекомендует использовать getaddrinfo, учитывая при том, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://parsers.info/wp-content/uploads/2010/01/conv.jpg" alt="WinSock: Получение хоста по адресу" title="WinSock: Получение хоста по адресу" width="200" height="101" class="alignleft size-full wp-image-577" />В недавнем примере мы делали <a href="http://parsers.info/2010/01/winsock-http-zapros-s-pomoshhyu-blokiruyushhego-soketa/">http-запрос с помощью синхронного сокета</a>. Мы обращались к конкретному серверу, зная его ip. Непорядок, сегодня займёмся определением ip-адреса по доменному имени, по адресу сайта.<br />
<span id="more-572"></span><br />
MSDN по крайней мере предлагает нам две функции для таких операций. Первая &#8211; <strong>функция gethostbyname</strong>, вторая &#8211; <strong>функция getaddrinfo</strong>. Microsoft рекомендует использовать getaddrinfo, учитывая при том, что она появилась в winsock 2. Радует и то, что функция не зависит от протокола (будь то IPv4 или IPv6).</p>
<h3>Структура addrinfo</h3>
<p>Специальная структура для функции getaddrinfo. Объявим так:</p>
<pre name="code" class="delphi">
  paddrinfo = ^addrinfo;
  addrinfo = packed record
    ai_flags, ai_family, ai_sockettype, ai_protocol: integer;
    ai_addrlen: integer;
    ai_canonname: pchar;
    ai_addr: psockaddr;
    ai_next: paddrinfo;
  end;
</pre>
<p>И сразу пару переменных:</p>
<pre name="code" class="delphi">
var
  aiHints: addrinfo;
  aiRes: paddrinfo;
</pre>
<p>Переменную aiHints заполним и передадим функции, таким образом мы укажем, что хотим получить в переменную aiRes, указатель на которую также передадим.<br />
Теперь по частям:<br />
<strong>ai_flags</strong> нам не пригодится, есть желание &#8211; читай на msdn.<br />
<strong>ai_family</strong>, <strong>ai_sockettype</strong>, <strong>ai_protocol</strong> &#8211; это, думаю, знакомо. Семейство адресов (<strong>AF_INET</strong> мы указываем для IPv4, <strong>AF_INET6</strong> для IPv6, также есть константы для netbios, инфракрасного порта и bluetooth адаптера), тип сокета (<strong>SOCK_STREAM</strong> для TCP протокола) и протокол (<strong>IPPROTO_TCP</strong>).<br />
<strong>ai_addr</strong> &#8211; надеюсь, знакомая тебе структура типа sockaddr, а точнее указатель на неё. Здесь будет тот ip-адрес, который мы стремимся получить. Указатель именно на такую структуру мы передаём функции Connect, про которую можешь прочитать в предыдущем посте о том, <a href="http://parsers.info/2010/01/winsock-http-zapros-s-pomoshhyu-blokiruyushhego-soketa/">как провести http-запрос на сокетах</a>. <strong>ai_addrlen</strong> &#8211; размер полученной структуры ai_addr.<br />
<strong>ai_canonname</strong> &#8211; &laquo;a canonical name for the host&raquo;. У меня оно оказалось пустым.<br />
Теперь про <strong>ai_next</strong>. &laquo;The getaddrinfo function aggregates all responses if more than one namespace provider returns information,&raquo; говорит msdn. То есть, если нам нужны другие варианты, а в данном случае они нам вряд ли нужны, то мы ходим по структурам, использую указатель ai_next, пока не наткнёмся на nil.</p>
<h3>Функция getaddrinfo</h3>
<p>Вот и нужная нам функция. Получение хоста может быть с помощью DNS (Domain Name System), файла hosts или других механизмов &#8211; функция не настолько низкоуровневая, то есть выдерживает все стандартные приоритеты. В стандартном модуле winsock я её не обнаружил, поэтому её нужно объявить:</p>
<pre name="code" class="delphi">
function getaddrinfo(nodename, servname: PChar; hints: paddrinfo; var res: paddrinfo): integer;
  stdcall; external 'ws2_32.dll';
</pre>
<p><strong>nodename</strong> &#8211; сюда пишем &#8216;parsers.info&#8217;, то есть доменное имя. <strong>servname</strong> &#8211; согласно msdn, название сервиса или номер порта. Подойдёт как &#8217;80&#8242;, так и nil.<br />
<strong>hints</strong> &#8211; наша структура aiHints. &laquo;Наставления&raquo; функции, мы указываем то, что желаем получить.<br />
<strong>res</strong> &#8211; указатель на структуру addrinfo, в которой вдруг окажется результат.<br />
Функция getaddrinfo в случае успешного выполнения возвращает 0, иначе &#8211; код ошибки. Например, 11001 &#8211; host not found.</p>
<h3>Практика</h3>
<p>Естественно, сначала нужно инициализировать winsock, про функцию WSAStartup я писал опять же <a href="http://parsers.info/2010/01/winsock-http-zapros-s-pomoshhyu-blokiruyushhego-soketa/">здесь</a>.</p>
<pre name="code" class="delphi">
  FillChar(aiHints, sizeOf(aiHints), 0);
  aiHints.ai_family:=AF_INET;
  aiHints.ai_sockettype:=SOCK_STREAM;
  aiHints.ai_protocol:=IPPROTO_TCP;
  if getaddrinfo('parsers.info', nil, @aiHints, aiRes)=0 then
    writeln(ord(aiRes.ai_addr.sin_addr.S_un_b.s_b1),'.',
            ord(aiRes.ai_addr.sin_addr.S_un_b.s_b2),'.',
            ord(aiRes.ai_addr.sin_addr.S_un_b.s_b3),'.',
            ord(aiRes.ai_addr.sin_addr.S_un_b.s_b4))
  else
    writeln('socket error ', WSAGetLastError);
</pre>
<p>Этот нехитрый код выводит ip-адрес моего блога.</p>
<p>Вроде всё, кроме ссылки на скачивание <a href="http://parsers.info/pub/getaddrinfo.dpr">работающего исходника-примера</a>.</p>
<p>А тем временем Сан Саныч в своем блоге пытается <a href="http://typedef.ru">облегчить жизнь программиста</a>.</p>
<p>P.S. По поводу дальнейшего развития блога &#8211; планирую еще несколько постов про некоторые теоретические и практические аспекты winsock, также выложу один интересный модуль, над которым сейчас работаю. И, конечно, отчётно-обзорный пост про то, что было сделано, и про то, что планируется. Скучно не будет <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Постовой: про запросы в интернет ты узнал, теперь узнай и про <a href="http://webjunk.ru">заработок в интернет</a></p>

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://parsers.info/2010/01/winsock-http-zapros-s-pomoshhyu-blokiruyushhego-soketa/" title="WinSock: HTTP-запрос с помощью блокирующего сокета (12 Январь 2010)">WinSock: HTTP-запрос с помощью блокирующего сокета</a> (15)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/01/winsock-poluchenie-xosta-po-adresu/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Числовой TEdit с использованием WinApi.</title>
		<link>http://parsers.info/2010/01/chislovoj-tedit-s-ispolzovaniem-winapi/</link>
		<comments>http://parsers.info/2010/01/chislovoj-tedit-s-ispolzovaniem-winapi/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 19:30:45 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[delphi]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=563</guid>
		<description><![CDATA[Необходимо, чтобы в TEdit пользователь мог ввести только цифры? Я часто встречаю различные решения данной задачи, которые в основном сводятся к обработке события OnKeyPress. Сегодня рассмотрим кардинально другой подход &#8211; изменение стиля TEdit с помощью WinApi. Итак, как же чаще всего фильтруют? Этот способ я даже встречал в каких-то официальных исходниках-примерах от borland. Суть метода [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://parsers.info/wp-content/uploads/2010/01/znaki1.jpg" alt="Цифровой TEdit" title="Числовой TEdit с использованием WinApi." width="266" height="180" class="alignleft size-full wp-image-565" />Необходимо, чтобы в TEdit пользователь мог ввести только цифры? Я часто встречаю различные решения данной задачи, которые в основном сводятся к обработке события <strong>OnKeyPress</strong>. Сегодня рассмотрим кардинально другой подход &#8211; изменение стиля TEdit с помощью WinApi.<br />
<span id="more-563"></span></p>
<p>Итак, как же чаще всего фильтруют? Этот способ я даже встречал в каких-то официальных исходниках-примерах от borland.<br />
Суть метода состоит в том, чтобы обрабатывать событие <strong>OnKeyPress</strong>, проверять параметр <strong>Key</strong>, передаваемый обработчику. Это char, да. И если этот char &#8211; не разрешенный символ для ввода и не #8 (backspace, про него не стоит забывать), то установить тот же Key в #0. Таким образом, некавайные символы не получится ввести.<br />
Вот из из множества возможных вариантов реализации:</p>
<pre name="code" clas="delphi">
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not(Key in ['0'..'9', #8]) then Key:=#0;
end;
</pre>
<p>Здесь нам помогает оператор <strong>in</strong>, который проверяет наличие символа в указанном нами массиве (от нуля до девятки и backspace). С другим набором символов это, может быть, и наиболее правильный способ, но фильтрация ввода чисел в самом TEdit уже предусмотрена, нам надо только изменить его стиль, о чём далее.</p>
<p>Константы, начинающиеся на <strong>WS_</strong> (от window style) являют собой константы стилей для объектов. Обязательно указываются при создании окон через различные winapi-функции. Наш TEdit <strong>WS_CHILD</strong> и <strong>WS_VISIBLE</strong> &#8211; дочерний и видимый. Также есть специальные константы только для Edit&#8217;ов, они начинаются на <strong>ES_</strong>. ES_NUMBER &#8211; нужный нам стиль. Подробнее про стили напишу когда-нибудь на <a href="http://parsers.info">блоге</a> <img src='http://parsers.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Для изменения стилей в 32-хбитных windows была <strong>функция SetWindowLong</strong>, для совместимости с 64-хбитными была введена <strong>api функция SetWindowLongPtr</strong>.</p>
<pre name="code" clas="delphi">
  SetWindowLongPtr(Edit1.Handle, GWL_STYLE, WS_CHILD or WS_VISIBLE or ES_NUMBER);
</pre>
<p>Если приведённый ниже код написать в FormCreate, то пользователь ничего не сможет ввести, кроме цифр, что и требовалось.<br />
Да, функция SetWindowLongPtr, в отличие от SetWindowLong, отсутствует в delphi седьмой версии и ниже, если используешь, то надо импортировать из user32.dll.</p>
<p>Постовой:<br />
<a href="http://dmitko.ru">dmitko.ru</a>: Блог о python, django, javascript и многом другом.</p>
<p>(c) Всегда ваш <a href="http://parsers.info">crystalbit</a></p>

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li>Нет похожих записей.</li>
	</ul>

]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/01/chislovoj-tedit-s-ispolzovaniem-winapi/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>
