<?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; Кодинг</title>
	<atom:link href="http://parsers.info/cat/koding/feed/" rel="self" type="application/rss+xml" />
	<link>http://parsers.info</link>
	<description>Delphi, программы, парсеры, статьи, исходники</description>
	<lastBuildDate>Wed, 07 Jul 2010 11:27: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/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>
]]></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>
]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/05/clipfill/feed/</wfw:commentRss>
		<slash:comments>48</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>
]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/04/rabotaem-tolko-s-nekotorymi-komponentami/feed/</wfw:commentRss>
		<slash:comments>16</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>
]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/04/parsim-daty-apdejtov-s-glavnoj-pr-cy/feed/</wfw:commentRss>
		<slash:comments>68</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>
]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/02/privedenie-tipov-v-delphi-primenitelno-k-obektam/feed/</wfw:commentRss>
		<slash:comments>35</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>
]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/01/pagerank-dcu-modul-dlya-opredeleniya-pagerank-na-delphi/feed/</wfw:commentRss>
		<slash:comments>46</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>
]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/01/winsock-poluchenie-xosta-po-adresu/feed/</wfw:commentRss>
		<slash:comments>17</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>
]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/01/chislovoj-tedit-s-ispolzovaniem-winapi/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Построчный парсинг</title>
		<link>http://parsers.info/2010/01/postrochnyj-parsing/</link>
		<comments>http://parsers.info/2010/01/postrochnyj-parsing/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 13:14:45 +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=556</guid>
		<description><![CDATA[Привет. Сегодня хочу рассмотреть построчную работу с файлом. Использовать будем стандартный паскалевский ввод/вывод: writeln и readln. Например, перед нами задача: убрать от одного до десяти первых символов в каждой строке. Кстати, передо мной эта задача вчера реально встала, и я написал программу за 5 минут. Теперь и мы с тобой рассмотрим процесс написания. Итак, сегодня [...]]]></description>
			<content:encoded><![CDATA[<p>Привет. Сегодня хочу рассмотреть построчную работу с файлом. Использовать будем стандартный паскалевский ввод/вывод: writeln и readln.<br />
Например, перед нами задача: убрать от одного до десяти первых символов в каждой строке. Кстати, передо мной эта задача вчера реально встала, и я написал программу за 5 минут. Теперь и мы с тобой рассмотрим процесс написания.<br />
<span id="more-556"></span><br />
Итак, сегодня будем писать со всеми прелестями delphi, читай с формой. Соорудим форму, поставим Edit1 и Edit2. Поставим OpenDialog1 и SaveDialog1, да и две кнопки для выбора файла в придачу.<br />
Как это всё связать, думаю тебе известно. Но на всякий случай:</p>
<pre name="code" class="delphi">
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    Edit1.Text:=OpenDialog1.FileName;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  if SaveDialog1.Execute then
    Edit2.Text:=SaveDialog1.FileName;
end;
</pre>
<p>Переназывать компоненты не станем.</p>
<p>Теперь нам нужно сделать выбор количества &#8211; от 1 до 10 символов (на выбор). Для этого я решил поставить TrackBar и Label так, что при изменении значения TrackBar менялось значение Label (от 1 до 10).</p>
<p>Вот так выглядит моя форма:<br />
<img src="http://parsers.info/wp-content/uploads/2010/01/form1.jpg" alt="Form1" title="Посточный парсинг" class="aligncenter size-full wp-image-557" /></p>
<p>Теперь непосредственно <strong>парсинг</strong>:</p>
<pre name="code" class="delphi">
procedure TForm1.SpeedButton3Click(Sender: TObject);
var
  f, o: TextFile;
  s: string;
  c: integer;
begin
  c:=TrackBar1.Position;
  if not FileExists(Edit1.Text) then begin
    ShowMessage('file not found');
    Exit;
  end;
  AssignFile(f, Edit1.Text);
  AssignFile(o, Edit1.Text);
  Reset(f); Rewrite(o);
  repeat
    Readln(f, s);
    Delete(s, 1, c);
    Writeln(o, s);
  until Eof(f);
  CloseFile(f); CloseFile(o);
  ShowMessage('ready!');
end;
</pre>
<p>Как видишь, мы объявили две переменные <strong>типа TextFile</strong>, строку, которую используем как буфер, и переменную c, в которую записываем количество символов, указанное в TrackBar1.<br />
Теперь теоретическая часть.</p>
<h3>Работа с текстовыми файлами</h3>
<p>Чтобы связать переменную <strong>типа TextFile</strong> (или просто <strong>text</strong>) с конкретным файлом, мы используем <strong>процедуру AssignFile</strong> (аналог в паскале &#8211; <strong>assign</strong>). Первый параметр &#8211; переменная типа <strong>TextFile</strong> (частный случай <strong>file</strong>), вторая &#8211; адрес файла.<br />
Теперь мы хотим определиться, что же мы собираемся делать с файлом: читать из него, или писать в него? Если читать, надо использовать <strong>процедуру Reset</strong> с единственным параметром &#8211; нашей переменной типа TextFile.<br />
А если мы планируем писать в файл, нам нужна похожая <strong>процедура Rewrite</strong>. Но учти, что она стирает файл полностью, тем самым мы будем писать с чистого листа. Если файла нет, то она его создаст. Есть также <strong>процедура Append</strong>, которая открывает на запись, но не стирает, то есть мы можем дописывать в конец файла.<br />
Также следует сказать про <strong>функцию Eof</strong>, которой мы также передаём TextFile. Она возвращает True только тогда, когда мы своим чтением достигли конца файла. Тем самым для построчного парсинга идеально подходит цикл repeat until.<br />
Построчный ввод и вывод: нет ничего проще! <strong>ReadLn</strong> &#8211; читаем строчку, <strong>WriteLn</strong> &#8211; пишем. Естественно, для соответственно открытых файлов.<br />
<strong>Процедура CloseFile</strong> закрывает файл, открытый нами с помощью Reset, Rewrite или Append. Однако наша переменная всё еще связано с адресом файла, и мы можем заново открыть на ввод/вывод без использования такого же AssignFile.</p>
<h3>Процедура Delete</h3>
<p><strong>Процедура Delete</strong> удаляет из строки её часть. Синтаксис:</p>
<pre name="code" class="delphi">
procedure Delete(var S: string; Index, Count: integer);</pre>
<p>Передаём процедуре строку, место, с которого начинать удаление (Index), и количество символов для удаления.</p>
<p>Ну вот и всё на сегодня, скачать проект можешь по <a href="http://parsers.info/pub/22.01.10/someparser.rar">ссылке</a>.</p>
<p>И, конечно, постовой. Если ты вдруг захотел прочитать про деньги, SEO и раскрутку, то заходи на <a href="http://iZombie.ru">блог iZombie.ru</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/01/postrochnyj-parsing/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Изменение размеров буфера консольного окна</title>
		<link>http://parsers.info/2010/01/getconsolescreenbufferinfo-setconsolescreenbuffersize/</link>
		<comments>http://parsers.info/2010/01/getconsolescreenbufferinfo-setconsolescreenbuffersize/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 17:20:32 +0000</pubDate>
		<dc:creator>crystalbit</dc:creator>
				<category><![CDATA[delphi]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[Статьи]]></category>
		<category><![CDATA[winapi]]></category>

		<guid isPermaLink="false">http://parsers.info/?p=541</guid>
		<description><![CDATA[Привет! Это второй пост, который был потерян когда-то в июле в связи с переездом на другой хостинг. Речь пойдёт о так называемом Screen Buffer. Консольное окно само по себе имеет определенные размеры, обычно 24 на 80 символов. Также справа есть полоса прокрутки, с помощью неё можно увидеть то, что вышло за рамки экрана, так как [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://parsers.info/wp-content/uploads/2010/01/cmd.png" alt="SetConsoleScreenBufferSize: изменение размеров буфера консольного окна" title="Изменение размеров буфера консольного окна" width="182" height="286" class="alignleft size-full wp-image-543" />Привет! Это второй пост, который был потерян когда-то в июле в связи с переездом на другой хостинг.<br />
Речь пойдёт о так называемом <strong>Screen Buffer</strong>.<br />
Консольное окно само по себе имеет определенные размеры, обычно 24 на 80 символов.<br />
<span id="more-541"></span><br />
Также справа есть полоса прокрутки, с помощью неё можно увидеть то, что вышло за рамки экрана, так как когда мы всё пишем и пишем, например с помощью <em>процедуры writeln</em>, доходим до строки номер 24 и пишем дальше, то всё сдвигается. Или когда с помощью <strong>api функции SetConsoleCursorPosition</strong> или через <em>GotoXY</em> из <a href="http://parsers.info/2009/04/modul-crt-dlya-delphi-2/">модуля crt для delphi </a>ставим курсор на место, расположенное ниже досягаемого нами пространства.<br />
Всё, что можно увидеть с помощью прокрутки, и есть Screen Buffer.</p>
<p>Чтобы поменять его размеры, нужно познакомиться с ним поближе.</p>
<h3>Что нам о нём известно?</h3>
<p>Его размеры можно получить с помощью api функции <strong>GetConsoleScreenBufferInfo</strong>, вот её синтаксис:</p>
<pre name="code" class="delphi">function GetConsoleScreenBufferInfo(hConsoleOutput: THandle; var lpConsoleScreenBufferInfo: TConsoleScreenBufferInfo): BOOL;</pre>
<p>По порядку:<br />
<strong>hConsoleOutput: THandle</strong> &#8211; handle вывода консольного окна, его нам вернёт api функция <strong>GetStdHandle</strong> с параметром <strong>STD_OUTPUT_HANDLE</strong>;<br />
<strong>lpConsoleScreenBufferInfo: TConsoleScreenBufferInfo</strong> &#8211; сюда передаём объект типа TConsoleScreenBufferInfo</p>
<p>Структура <strong>CONSOLE_SCREEN_BUFFER_INFO</strong>, она же TConsoleScreenBufferInfo, она же _CONSOLE_SCREEN_BUFFER_INFO:</p>
<pre name="code" class="delphi">
  _CONSOLE_SCREEN_BUFFER_INFO = packed record
    dwSize: TCoord;
    dwCursorPosition: TCoord;
    wAttributes: Word;
    srWindow: TSmallRect;
    dwMaximumWindowSize: TCoord;
  end;
</pre>
<p>Функция GetConsoleScreenBufferInfo её нам заполнила, что мы получили:<br />
<strong>dwSize: TCoord</strong> &#8211; размер буфера, вот он! (по умолчанию 80 на 300 символов)<br />
<strong>dwCursorPosition: TCoord</strong> &#8211; положение курсора, тоже полезно, вполне заменит паскалевские <strong>WhereX</strong> и <strong>WhereY</strong>, они также реализованы в моём <a href="http://parsers.info/2009/04/modul-crt-dlya-delphi-2/">модуле crt</a><br />
<strong>wAttributes: Word</strong> &#8211; не экспериментировал с этим, вроде цвета<br />
<strong>srWindow: TSmallRect</strong> &#8211; тоже не экспериментировал, по msdn это координаты окна, уточни какого и напиши в комментарии, ок?<br />
<strong>dwMaximumWindowSize: TCoord</strong> &#8211; максимальный размер буфера, в символах, естественно.</p>
<h3>Меняем размер Screen Buffer</h3>
<p>Ну и кульминация, <strong>функция SetConsoleScreenBufferSize</strong>:</p>
<pre name="code" class="delphi">SetConsoleScreenBufferSize(hConsoleOutput: THandle; dwSize: TCoord): BOOL;</pre>
<p>Передаём тот же handle вывода, и структуру TCoord с нужным нам размером.</p>
<h3>Как же без примера?</h3>
<pre name="code" class="delphi">
const
  NewSize: TCoord = (x: 80; y: 10000);

...
  SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), NewSize);
</pre>
<p>Здесь размер буфера окна стал 80 на 10000.</p>
<p><em>Постовой:</em><br />
А тем временем Zdez Bil Ya в своём <a href="http://avtuh.ru">добром-добром блоге</a> пишет про delphi и пароли в qip.</p>
]]></content:encoded>
			<wfw:commentRss>http://parsers.info/2010/01/getconsolescreenbufferinfo-setconsolescreenbuffersize/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
