<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5451681982052498183</id><updated>2024-12-19T13:26:53.932+10:00</updated><category term="Delphi for Win32"/><category term="Delphi 2009"/><category term="Разное"/><category term="Delphi for .NET"/><category term="Программы"/><category term="Delphi for PHP"/><category term="Блог"/><category term="ИТ-мероприятия"/><category term="Интернет"/><category term="Ошибки"/><category term="Microsoft"/><category term="Windows Vista"/><category term="Размышления"/><category term="FIBPlus"/><category term="XML"/><category term="ДВ"/><category term="ASP.NET"/><category term="Tips"/><category term="UAC"/><category term="Windows 7"/><category term="3G"/><category term="Delphi Prism"/><category term="WSDL"/><category term="Web Services"/><category term="Книги"/><category term="Компоненты"/><category term="Курсоры"/><category term="Ресурсы"/><title type='text'>Delphi Development</title><subtitle type='html'>Блог о программировании в Delphi</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>62</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-8377564417881808953</id><published>2009-05-17T01:09:00.006+11:00</published><updated>2014-04-30T00:06:17.977+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="UAC"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows 7"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Vista"/><title type='text'>UAC для разработчика 2</title><content type='html'>  &lt;!-- 9a3d19d2 --&gt; 
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Сегодня наконец-то нашел решение проблемы с повышением привилегий для приложения в runtime, которую я озвучивал в одном из своих &lt;a href=&quot;http://deldev.blogspot.com/2009/01/uac.html&quot;&gt;предыдущих постов&lt;/a&gt;. Решение крылось в создании специального COM объекта, который будет содержать весь привилегированный код, требующий повышенных привилегий. &lt;br /&gt;
Не буду полностью рассказывать эту возможность, поскольку это все уже описано в блоге &lt;a href=&quot;http://mda-delphi.blogspot.com/&quot;&gt;Alexander Bozhko Bold&amp;amp;ECO blog&lt;/a&gt;&lt;br /&gt;
Цикл статей посвященный UAC:&lt;br /&gt;
&lt;a href=&quot;http://mda-delphi.blogspot.com/2009/02/vista-uac-delphi-1.html&quot;&gt;Использование Vista UAC в Delphi: Часть 1&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://mda-delphi.blogspot.com/2009/02/vista-uac-delphi-2.html&quot;&gt;Использование Vista UAC в Delphi: Часть 2&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://mda-delphi.blogspot.com/2009/03/vista-uac-delphi-3.html&quot;&gt;Использование Vista UAC в Delphi: Часть 3&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;По всей видимости эти же методы будут работать и в Windows 7 - поскольку Microsoft обещает практически полную совместимость с программами, разработанными для Vista.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/8377564417881808953/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/05/uac-dlja-razrabotchika-2.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/8377564417881808953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/8377564417881808953'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/05/uac-dlja-razrabotchika-2.html' title='UAC для разработчика 2'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-8737842262038400288</id><published>2009-05-14T21:49:00.004+11:00</published><updated>2009-05-14T23:34:56.369+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Программы"/><category scheme="http://www.blogger.com/atom/ns#" term="Размышления"/><category scheme="http://www.blogger.com/atom/ns#" term="Разное"/><title type='text'>Borland утонул</title><content type='html'>&lt;p&gt;Для многих это уже не новость, но о &lt;a href=&quot;http://deldev.blogspot.com/2008/11/blog-post_28.html&quot;&gt;качестве моего Интернета&lt;/a&gt; уже можно слагать легенды - поэтому пишу пока работает, а со стороны выглядит, что притормаживаю. :)&lt;br /&gt;&lt;p&gt;Итак, Borland окончательно утонул. Как мне кажется, основной причиной стало то, что он в свое время отвернулся от того - что и было его именем - от инструментов для программистов и углубился в жизненный цикл. И вот - пожалуйста: &lt;blockquote&gt;По заключенному 6 мая соглашению, Micro Focus купит Borland из расчета один доллар за акцию. Это на 25% выше стоимости ценных бумаг Borland по итогам торгов во вторник, когда за каждую акцию компании давали 80 центов. Средний же курс ценных бумаг Borland за последние 30 дней составил 60 центов. &lt;/blockquote&gt;&lt;p&gt;Но, тем не менее, последние его решения можно только поприветствовать. Утонув сам - не утащил за собой все наиболее значимые проекты, которые удалось спасти. &lt;p&gt;Первой ласточкой уходящего Borland&#39;a стала СУБД Interbase - после открытия исходных кодов которой на свет появился проект &lt;a href=&quot;http://ru.wikipedia.org/wiki/Firebird&quot;&gt;Firebird&lt;/a&gt;.&lt;span class=&quot;fullpost&quot;&gt; &lt;p&gt;Затем было выделение отдельно средств разработки и передача их компании &lt;a href=&quot;http://www.embarcadero.com/&quot;&gt;Embarcadero&lt;/a&gt; - опять же во спасение. (Это было как раз год назад - &lt;a href=&quot;http://deldev.blogspot.com/2008/05/codegear.html&quot;&gt;я писал об этом&lt;/a&gt;) И только после того как все эти телодвижения были совершены - Borland спокойненько прекратил свое существование. Причем бесславно. Будем надеяться новые хозяева смогут вернуть к жизни эти продукты и они снова будут столь популярны и востребованы. Но их уже будут знать под другим именем ...&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/8737842262038400288/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/05/borland-utonul.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/8737842262038400288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/8737842262038400288'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/05/borland-utonul.html' title='Borland утонул'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-5723477353001284602</id><published>2009-05-12T23:00:00.002+11:00</published><updated>2009-05-12T23:44:57.148+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Блог"/><category scheme="http://www.blogger.com/atom/ns#" term="Интернет"/><category scheme="http://www.blogger.com/atom/ns#" term="Разное"/><title type='text'>Субботник на блоге</title><content type='html'>&lt;p&gt;После небольшого перерыва в месяц (отпуска?) заглянул на собственный блог и ужаснулся. Чертовски долго грузится, плюс ко всему ошибки со скриптами везде. Поэтому перво-наперво решил навести &quot;порядок&quot; - своего рода майский субботник :).&lt;br /&gt;&lt;p&gt;Первое - тормоза. Из-за чего? Конечно же из-за скриптов. Дело в том, что пока я отдыхал - бесславно помер сервис feedmates (ссылку не привожу - помер ведь). Виджет, установленный на блоге пытался обратиться и ждал ... ждал ... ждал... пока не наступал таймаут соединения. Естественно страничка все это время не прорисовывалась. Все, убрал его.&lt;/p&gt;&lt;p&gt;Вместо этого добавил список рекомендуемых постов после каждой заметки - думаю пригодится новым посетителям. :)&lt;/p&gt;&lt;p&gt;&lt;img style=&quot;TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 341px; DISPLAY: block; HEIGHT: 200px; CURSOR: hand&quot; id=&quot;BLOGGER_PHOTO_ID_5334912589248941826&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_ivVlcyiYXyLj2lrnnZUqh05imAej9IX_W8B3tO7ENwVUCLVuvEfbzJLmRO8DEDA-YF0pQjw4b0MfWLufAr-JbZfIzOQaD5cSw6K5JKsQZ8qCwKVZPUjoOZDMp4gBBgiQJraoRkKLCZ1f/s400/recomended.gif&quot; /&gt;&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;p&gt;С этой фичей пришлось повозиться немного. Основное описание процесса создания этого хака можно почитать &lt;a href=&quot;http://www.techieblogger.com/2008/06/related-posts-widget-for-blogger-with_25.html&quot;&gt;здесь&lt;/a&gt; (англ.) но оно не ко всем шаблонам подходит, особенно к нестандартным. Так что приходится ковыряться в каждом отдельном случае. Впрочем, автор обещал помочь тем у кого возникнут проблемы.&lt;/p&gt;&lt;p&gt;Но это еще не все! Меня ждал ещё один не очень приятный сюрприз - исходный код в постах перестал подсвечиваться. Синтаксис исходного кода у меня подсвечивается с помошью скрипта, способом описанном на блоге &lt;a href=&quot;http://blogohelp.blogspot.com/2008/08/bloggercom.html&quot;&gt;BlogoHelp&lt;/a&gt;. Там не мудрствуя лукаво предлагается грузить скрипт сразу с ресурса &lt;a href=&quot;http://softwaremaniacs.org/soft/highlight/&quot;&gt;авторов&lt;/a&gt;. Но авторы - тоже люди, и не стали терпеть такую наглость и просто убрали скрипт в другое место. Не став наглеть дальше - закачал скрипт к себе на хостинг и все заработало как и прежде.&lt;/p&gt;&lt;p&gt;Решил поменять иконку блога. Особо не отличаясь оригинальностью, поставил стандартную иконку приложения написанного на Delphi. Кстати, для размещения favicon.ico я воспользовался &lt;a href=&quot;http://www.iconj.com/&quot;&gt;сервисом для генерации и хостинга favicon&lt;/a&gt; (да-да есть и такое - чего только не придумают для блоггеров). Там ничего сложного, кому надо - разберется, если возникнут проблемы - пишите в комментарии, постараюсь помочь.&lt;/p&gt;&lt;p&gt;Пока решил на этом остановиться, но улучшения на этом не заканчиваются - многое ещё предстоит сделать.&lt;/p&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/5723477353001284602/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/05/subbotnik-na-bloge.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/5723477353001284602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/5723477353001284602'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/05/subbotnik-na-bloge.html' title='Субботник на блоге'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_ivVlcyiYXyLj2lrnnZUqh05imAej9IX_W8B3tO7ENwVUCLVuvEfbzJLmRO8DEDA-YF0pQjw4b0MfWLufAr-JbZfIzOQaD5cSw6K5JKsQZ8qCwKVZPUjoOZDMp4gBBgiQJraoRkKLCZ1f/s72-c/recomended.gif" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-3420426581345644799</id><published>2009-04-11T01:37:00.014+11:00</published><updated>2009-04-11T02:34:49.421+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Services"/><category scheme="http://www.blogger.com/atom/ns#" term="WSDL"/><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><category scheme="http://www.blogger.com/atom/ns#" term="Ошибки"/><title type='text'>Простой пример клиента для WebService</title><content type='html'>&lt;p&gt;Одному моему коллеге понадобилось написать небольшого клиента для сервера контента системы электронного документооборота. Собственно сам сервер контента реализован в виде WEB-сервиса, предоставляющего некоторые функции для доступа к документам. Что он только не пробовал и ClientSocket и TCPConnection и HTTPRIO. Но на самом деле все достаточно просто, и не нужно изобретать велосипед :)&lt;br /&gt;&lt;p&gt;Сразу же оговорюсь , что данный пост не претендует на полноту изложения данной темы, здесь я просто хочу показать в каком направлении следует «копать» и покажу как обойти один подводный камень, на который можно наткнуться при создании клиента для WEB-сервисов.&lt;br /&gt;&lt;p&gt;Итак, приступим … У нас есть некоторый WEB-сервис, предоставляющий некоторые функции. Пусть это будет некоторый ASP.NET WebService запущенный на соседней машине с именем Athlon, URI данного WEB-сервиса выглядит следующим образом: http://athlon/test/service.asmx . Набрав данный URI в браузере получаем тестовую страничку, сгенерированную IIS для проверки работоспособности WEB-сервиса:&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSnN2JfyqZW5lY4u95Q_DLRS_xIt0jZZVOh9qgJDxWBSOCXpCp3todfCKz9iyAa3uyj8UUUr323jIBfMvWlElB6VM7STaY1N1faGfP5GbFxN41wRvU3XdF_NO0XpQig3UITwGsVOOJMMAi/s1600-h/webservice1.jpg&quot;&gt;&lt;img style=&quot;TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 311px; DISPLAY: block; HEIGHT: 320px; CURSOR: hand&quot; id=&quot;BLOGGER_PHOTO_ID_5323074532878739650&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSnN2JfyqZW5lY4u95Q_DLRS_xIt0jZZVOh9qgJDxWBSOCXpCp3todfCKz9iyAa3uyj8UUUr323jIBfMvWlElB6VM7STaY1N1faGfP5GbFxN41wRvU3XdF_NO0XpQig3UITwGsVOOJMMAi/s320/webservice1.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Из тестовой страницы видно, что WEB-сервис поддерживает одну единственную процедуру с именем HelloWorld. Попробуем ее вызвать из клиентского приложения на Delphi. Естественно создадим новый проект, сохраним куда-нибудь по-удобнее, и займемся самым интересным – автоматической генерацией кода для доступа к WEB-сервису. Для этого в среде Delphi есть специальный мастер который вызвается следующей командой: File -&gt; New -&gt; Other … -&gt; WebServices -&gt; WSDL Importer:&lt;/p&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjorQGJTCXoIkTqZVOY7Fz9sezjIE4vaU4zKat4TvWGVhTCAfQLOCbrAB09PWBx70gfdRRZpSzgL9DlkdNA9XJrSzeRvTcpozWrC39d-ET1QvW2xHD-5uoGSUms6mxK9nWzZ8pALnNdiS-9/s1600-h/webservice2.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 238px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjorQGJTCXoIkTqZVOY7Fz9sezjIE4vaU4zKat4TvWGVhTCAfQLOCbrAB09PWBx70gfdRRZpSzgL9DlkdNA9XJrSzeRvTcpozWrC39d-ET1QvW2xHD-5uoGSUms6mxK9nWzZ8pALnNdiS-9/s320/webservice2.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5323075236098829986&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;В мастер вводится один единственный параметр – это URI нашего WEB-сервиса:&lt;/p&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKym1-R6w9RK0FNG0f8hxwAl5BmZg4CDAr7wpos5u6KBJsywegwpKxpBVekcwfF-b97NK6cfLa2VywouzdXj3Ds1fGfnjsnpL2KWnbVpoEG0ZUjw3CIifAnl9Rpy5fSzVGK7W2JX9Rmv-s/s1600-h/webservice3.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 222px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKym1-R6w9RK0FNG0f8hxwAl5BmZg4CDAr7wpos5u6KBJsywegwpKxpBVekcwfF-b97NK6cfLa2VywouzdXj3Ds1fGfnjsnpL2KWnbVpoEG0ZUjw3CIifAnl9Rpy5fSzVGK7W2JX9Rmv-s/s320/webservice3.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5323076062740185506&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Но при попытке перейти на следующий шаг мастера появится сообщение об ошибке, примерно следующего содержания, толком ничего не говорящего:&lt;/P&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9fV4T91W0w7KZ8Vhf8jh6Dnh38f8Z92RxMHSgNJnMuqCgM5Owww5lUaC2op3Gx1A-33lc8dW8E8cf_6Qg46xOrlwaxPFbqKxdvu8bpXpl0FrehL-QxDKlB-tSVzTq1KB-qfNQPgNg1TZU/s1600-h/webservice4.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 79px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9fV4T91W0w7KZ8Vhf8jh6Dnh38f8Z92RxMHSgNJnMuqCgM5Owww5lUaC2op3Gx1A-33lc8dW8E8cf_6Qg46xOrlwaxPFbqKxdvu8bpXpl0FrehL-QxDKlB-tSVzTq1KB-qfNQPgNg1TZU/s320/webservice4.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5323076638482243746&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Давайте разберемся, что это такое и почему это происходит. Еще раз наберем URI WEB-сервиса в строке адреса браузера – на экране отобразится тестовая страничка. Тоже самое происходит когда по данному URI обращается мастер – в соответствии с протоколом SOAP он ждет XML описания WEB-сервиса, а ему вместо этого выдают обычную html-страницу. Именно по этому он вываливается с ошибкой невразумительного содержания, поскольку пытается разобрать html  и ему это не удается и он сообщает на каких именно тэгах разметки он  вы вывалился. Чтобы этого не происходило, мы должны явно указать WEB-сервису, что мы ждем от него WSDL описание сервиса. Делается это очень просто, просто добавляется параметр ?WSDL в URI WEB-сервиса:&lt;/P&gt; &lt;br /&gt;&lt;p&gt;&lt;blockquote&gt;http://athlon/test/service.asmx?WSDL&lt;/blockquote&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0gZfOHrsx5XP_kh77jC7SlxG64nm6N_8teHlzl_Tpu1WlH5SelwOYMw0nWwETrPjBFOgH7vu_ebfVQZA22YGNffi7fS6xUFQy96myLYbIGNlNiZdP0SVfddWX5L2zGPCQTvaek0JyohM8/s1600-h/webservice5.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 222px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0gZfOHrsx5XP_kh77jC7SlxG64nm6N_8teHlzl_Tpu1WlH5SelwOYMw0nWwETrPjBFOgH7vu_ebfVQZA22YGNffi7fS6xUFQy96myLYbIGNlNiZdP0SVfddWX5L2zGPCQTvaek0JyohM8/s320/webservice5.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5323077293565105698&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Теперь мастер получает именно те данные, которые ожидает и генерация кода происходит без ошибок:&lt;/p&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj430IO7N_SU4hu-EqGF_jdUtyUHgQWMjeNbhQ6inmro_5mTndd11UU7mGDid_ANZoakcKUrIYrGe3DjXCIgboIab0O_HAyUE4GvICx1heSvHIYltPQtiW2VluHFmJ6wsReh5xqcCEmeoj8/s1600-h/webservice6.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 222px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj430IO7N_SU4hu-EqGF_jdUtyUHgQWMjeNbhQ6inmro_5mTndd11UU7mGDid_ANZoakcKUrIYrGe3DjXCIgboIab0O_HAyUE4GvICx1heSvHIYltPQtiW2VluHFmJ6wsReh5xqcCEmeoj8/s320/webservice6.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5323078303017029074&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;В результате сгенерировался довольно большой код, ключевой фрагмент которого выглядит так:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;delphi&quot;&gt;  ServiceSoap = interface(IInvokable)&lt;br /&gt;  [&#39;{77573149-9C57-FA51-F11F-EFD527C91BD9}&#39;]&lt;br /&gt;    function  HelloWorld: string; stdcall;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;function GetServiceSoap(UseWSDL: Boolean=System.False; Addr: string=&#39;&#39;; HTTPRIO: THTTPRIO = nil): ServiceSoap;&lt;/code&gt;&lt;/Pre&gt;&lt;br /&gt;&lt;p&gt;Здесь объявляется интерфейс нашего WEB-сервиса и функция для получения этого интерфейса, именно с ними мы и будем дальше работать. Просто для примера вызовем в обаботчике события OnClick для кнопки процедуру и выведем сообщение с результатом&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;delphi&quot;&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  ws: ServiceSoap;&lt;br /&gt;begin&lt;br /&gt;  // получаем интерфейс&lt;br /&gt;  ws := GetServiceSoap();&lt;br /&gt;  // вызываем процедуру сервиса&lt;br /&gt;  with ws do&lt;br /&gt;    ShowMessage(HelloWorld);&lt;br /&gt;end;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Вот собственно и все - клиент для WEB-сервиса готов. На его создание потрачено совсем немного времени и написано совсем небольшое количество кода.&lt;/p&gt;&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/3420426581345644799/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/04/webservice.html#comment-form' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/3420426581345644799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/3420426581345644799'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/04/webservice.html' title='Простой пример клиента для WebService'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSnN2JfyqZW5lY4u95Q_DLRS_xIt0jZZVOh9qgJDxWBSOCXpCp3todfCKz9iyAa3uyj8UUUr323jIBfMvWlElB6VM7STaY1N1faGfP5GbFxN41wRvU3XdF_NO0XpQig3UITwGsVOOJMMAi/s72-c/webservice1.jpg" height="72" width="72"/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-4700681158918552060</id><published>2009-02-09T02:27:00.005+10:00</published><updated>2009-02-09T02:43:51.019+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows 7"/><title type='text'>Windows 7 и Delphi</title><content type='html'>&lt;p&gt;Поддавшись случившейся не так давно в Интернете истерии по поводу выхода первой публичной беты Windows 7, скачал себе 64-разрядную версию и на некоторое время пропал в ней. :) Это было мое первое знакомство с 64-разрядной операционной системой (не говоря уже о Windows 7), хотя мой компьютер уже давным-давно поддерживает их. Все установилось и заработало на удивление гладко, за исключением дурацкого 3G модема от билайна (обыкновенный GPRS-модем от мегафона даже нисколечко не сопротивлялся). Возможно, Microsoft более серьезно подошла к разработке своей новой операционки, а возможно рассказы о проблемах 64-битных систем оказали такими же «сказками на ночь», как и большинство сказок про Vista. Мне почему-то кажется что второе. :)&lt;br /&gt;&lt;P&gt;Но это не очередной хвалебный пост в пользу Microsoft, так что на этом закругляюсь. Остановлюсь только на работе Delphi в Windows 7. Delphi 2009 устанавливается и работает без проблем – так как ей и положено. Про Delphi 7 пока ничего толком сказать не могу, поскольку еще не устанавливал ее, но мне кажется, что также проблем не будет.&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;p&gt;Удивительно, но весь негатив сопутствующий появлению Windows Vista, превратился в позитивные настроения всей «экосистемы» (как это называет Microsoft) перед выходом Windows 7. Это касается Delphi-сообщества, вот например Daniel Wischnewski уже создал &lt;a href=&quot;http://www.gumpi.com/Blog/2009/01/20/Alpha1OfWindows7ControlsForDelphi.aspx&quot;&gt;прототип нескольких компонентов&lt;/a&gt;, позволяющих уже сейчас добавлять в приложения поддержку новых возможностей Windows 7 (в первую очередь визуальных). &lt;br /&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiirRqsGqVoJYuGnVbGvj98l4PiHud1sRs7BOBtQPK7Umi9BWeEYKNKntGtIwqfV9-5JDjj3nqA0HG18jybIc4Onj5QhPpsNGKJ35uD_-PxutHOD-yo5SdUZzL1aegyHKuuwJnp9NPmKGOr/s1600-h/win7support.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 395px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiirRqsGqVoJYuGnVbGvj98l4PiHud1sRs7BOBtQPK7Umi9BWeEYKNKntGtIwqfV9-5JDjj3nqA0HG18jybIc4Onj5QhPpsNGKJ35uD_-PxutHOD-yo5SdUZzL1aegyHKuuwJnp9NPmKGOr/s400/win7support.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5300465485168134802&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Естественно, что все эти новые возможности будут работать только в Windows 7. И еще важное замечание. Хотя у компонентов и присутствует инсталлятор, он просто копирует необходимые файлы, устанавливать их придется вручную.&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1_OZrTahbF7Kdj4I-I0IcktvtQ1KC90r8vQ0phZzLFwwpKFNu8BL7NsYGOihb7RCB1qlKN-kFSAzma7DwbBQ528u2ZBG41VeOVTUMUWiSkZY8SjtK9PeWL01bfYeRD2jcoWkfg_Hk9bB6/s1600-h/win7components.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 253px; height: 253px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1_OZrTahbF7Kdj4I-I0IcktvtQ1KC90r8vQ0phZzLFwwpKFNu8BL7NsYGOihb7RCB1qlKN-kFSAzma7DwbBQ528u2ZBG41VeOVTUMUWiSkZY8SjtK9PeWL01bfYeRD2jcoWkfg_Hk9bB6/s400/win7components.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5300467219672810754&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/4700681158918552060/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/02/windows-7-delphi.html#comment-form' title='Комментарии: 25'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/4700681158918552060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/4700681158918552060'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/02/windows-7-delphi.html' title='Windows 7 и Delphi'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiirRqsGqVoJYuGnVbGvj98l4PiHud1sRs7BOBtQPK7Umi9BWeEYKNKntGtIwqfV9-5JDjj3nqA0HG18jybIc4Onj5QhPpsNGKJ35uD_-PxutHOD-yo5SdUZzL1aegyHKuuwJnp9NPmKGOr/s72-c/win7support.png" height="72" width="72"/><thr:total>25</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-214399125540155464</id><published>2009-01-31T04:02:00.007+10:00</published><updated>2009-02-01T23:07:16.133+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="UAC"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Vista"/><title type='text'>UAC для разработчика</title><content type='html'>&lt;p&gt;UAC (&lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/aa905330.aspx&quot;&gt;User account control&lt;/a&gt;) впервые появился в Windows Vista, и сразу же, не заслуженно, получил отрицательную репутацию, а в Интернете появилось полным полно статей как его отключить. Доходит даже до откровенного маразма, что эту функцию ставят как основной недостаток этой операционной системы. Не буду здесь подробно на нем останавливаться, скажу лишь, что у меня он включен по умолчанию, и я нахожу его очень даже полезным для себя, тем более что в Windows 7 он был значительно переработан, хотя на вкус и цвет – все фломастеры разные.&lt;br /&gt;&lt;p&gt;Хотим мы этого или нет UAC есть в операционной системе, и будет дальше, а разработчик программного обеспечения должен учитывать все возможные конфигурации системы, в том числе и с включенным UAC.&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;p&gt;Несмотря на то, что UAC обладает некоторой &quot;интеллектуальностью&quot; и при запуске может определить нужно ли приложению увеличение привилегий или нет – возможности его ограничены, и он не всегда корректно работает, что приводит к тихому (или не всегда к тихому) «помиранию» запущенной программы, которой необходимы права администратора, но которые ей никто не дал. Поэтому перед разработчиком стоит задача явно указать необходимый уровень привилегий для своего приложения. Делается это через все тот же файл-манифест приложения, который появился в Windows XP и который используется для отрисовки интерфейса &quot;в стиле XP&quot;.&lt;br /&gt;&lt;p&gt;Для явного указания необходимого уровня привилегий используется раздел Security:&lt;br /&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;security&amp;gt;&lt;br /&gt;  &amp;lt;requestedprivileges&amp;gt;&lt;br /&gt;    &amp;lt;requestedexecutionlevel level=&quot;requireAdministrator&quot;&amp;gt;&lt;br /&gt;  &amp;lt;/requestedprivileges&amp;gt;&lt;br /&gt;&amp;lt;/security&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Полностью файл-манифест приложения может выглядеть, например следующим образом:&lt;br /&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot; ?&amp;gt;&lt;br /&gt;&amp;lt;assembly xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot; manifestVersion=&quot;1.0&quot;&amp;gt;&lt;br /&gt; &amp;lt;assemblyIdentity version=&quot;1.0.0.0&quot; processorArchitecture=&quot;*&quot; &lt;br /&gt;  name=&quot;UAC_Elevation_Prompt&quot; type=&quot;win32&quot; /&amp;gt;&lt;br /&gt; &amp;lt;trustInfo xmlns=&quot;urn:schemas-microsoft-com:asm.v3&quot;&amp;gt;&lt;br /&gt;  &amp;lt;security&amp;gt;&lt;br /&gt;&amp;lt;requestedPrivileges&amp;gt;&lt;br /&gt;&amp;lt;requestedExecutionLevel level=&quot;requireAdministrator&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/requestedPrivileges&amp;gt;&lt;br /&gt;&amp;lt;/security&amp;gt;&lt;br /&gt;&amp;lt;/trustInfo&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;dependentAssembly&amp;gt;&lt;br /&gt;&amp;lt;assemblyIdentity type=&quot;win32&quot; &lt;br /&gt;  name=&quot;Microsoft.Windows.Common-Controls&quot; version=&quot;6.0.0.0&quot; &lt;br /&gt;  publicKeyToken=&quot;6595b64144ccf1df&quot; language=&quot;*&quot; processorArchitecture=&quot;*&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/dependentAssembly&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/assembly&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Данный манифест необходимо включить в ресурсы приложения, процедура достаточно простая и аналогичная той, которую я описывал для работы с курсорами &lt;a href=&quot;http://deldev.blogspot.com/2008/12/delphi.html&quot;&gt;тут&lt;/a&gt; и &lt;a href=&quot;http://deldev.blogspot.com/2009/01/delphi-2009_12.html&quot;&gt;тут&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;После включения манифеста и сборки проекта при запуске приложения появится окно UAС, запрашивающее необходимые привилегии – теперь приложение уже не помрет молча.&lt;br /&gt;&lt;p&gt;Но не все так просто в Delphi 2009. По каким-то своим, никому не известным причинам, разработчики решили добавлять манифест во все проекты по умолчанию. С одной стороны – довольно удобно, но с другой получается наоборот больше работы. Вот, например, так же по умолчанию в ресурсы добавляется иконка приложения и информация о версии. Это не плохо – потому, что существуют инструменты для их быстрого и безболезненного изменения. А манифест – не очень хорошо, мягко говоря, потому как он жестко задан в файле WindowsXP.res в наиболее общей форме и не учитывает специфики конкретного приложения, и нет инструментов для его изменения.&lt;br /&gt;&lt;p&gt;Так вот, при попытке добавления описанного выше манифеста в проект Delphi 2009 получаем предупреждение компилятора о дублировании ресурсов и наш манифест не включается в приложение. Можно перейти в исходный код проекта и убрать директиву компилятора {$R *.res}, но в этом случае мы лишимся иконки приложения и информации о версии. Можно убрать файл WindowsXP.res куда подальше, чтобы Delphi его не нашла – но это тоже неудачный способ выхода из положения – поскольку нарушается работа VCL.&lt;br /&gt;&lt;p&gt;Пока я не нашел способа грамотно подменить манифест приложения, так же остается открытым вопрос повышения привилегий во время выполнения программы, поскольку приложению могут понадобится права администратора только для выполнения какой либо одной операции, которая еще и не всегда используется и нет смысла его постоянно гонять под админом.&lt;br /&gt;&lt;p&gt;Оригинальный способ для решения проблем использован в файловом менеджере &lt;a href=&quot;http://www.ghisler.com/&quot;&gt;Total Commander&lt;/a&gt; – для выполнения операций требующих повышения привилегий используется отдельное приложение TCADMIN.EXE, которому передается команда в случае невозможности выполнения операции с правами текущего пользователя.&lt;br /&gt;&lt;p&gt;Интересно, а как еще можно организовать повышение привилегий в Runtime и решить проблемы с манифестом в Delphi 2009?&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/214399125540155464/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/uac.html#comment-form' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/214399125540155464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/214399125540155464'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/uac.html' title='UAC для разработчика'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-2614291745291676275</id><published>2009-01-24T04:14:00.006+10:00</published><updated>2009-01-24T04:52:28.767+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="FIBPlus"/><title type='text'>Установка FIBPlus на Delphi 2009 Trial</title><content type='html'>&lt;p&gt;Установка обновленных компонентов FIBPlus, о релизе которых я &lt;a href=&quot;http://deldev.blogspot.com/2009/01/fibplus-delphic-builder-2009.html&quot;&gt;писал ранее&lt;/a&gt;, не обошлась без пляски с бубном.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Началось все с того, что инсталлятор не смог корректно установить компоненты на пробную версию Delphi 2009. В результате я получил оошибку:&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;!!! Unsucessfuly compile package FibPlus2009.dpk!!!&lt;/blockquote&gt;&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;p&gt;Открыв лог-файл, созданный в результате установки, я обнаружил истинную причину:&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;Generate DCC32 config file: C:\Program Files\Devrace\FIBPlus_Unicode\7.0.1076\sources\dcc32.cfg&lt;br /&gt;Initial directory = C:\Program Files\Devrace\FIBPlus_Unicode\7.0.1076\sources\&lt;br /&gt;Command Line = &quot;C:\Program Files\CodeGear\RAD Studio\6.0\bin\dcc32.exe&quot; FibPlus2009.dpk&lt;br /&gt;&lt;br /&gt;Command line tools are not supported in the trial version.&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Замечательно! Ну ладно, всегда можно скомпилировать и установить пакеты через IDE Delphi. Но эта попытка тоже не увенчалась успехом. Компилятор отказался найти файлы библиотеки FIBPlus, не смотря на то что при установке было указано добавить все пути в нужное место. Даже после того как я прописал все необходимые пути (Tools-&gt;Options-&gt;Library Win32), один из пакетов (FIBDBMidas2009.dpk) все равно наотрез отказался компилироваться. Но зато другие компоненты и мастеры установились и наконец-то заработали. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;width: 248px; height: 325px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Av-J_RZ4jQ5fMePanY0Idz9VUdJzh52gvBB9iQcVrWZhsC7kx0d0DfezAdVCcRynjHUGw6qF7RG449kkvgjNAhSsFdqKeNKJ3S57XrSxRUel5dGu3S1I7UY4mor99zPgLiskQX6Hja5T/s400/fibplus.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5294561279474479282&quot; /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Интересный момент: готовилась к выходу именно новая версия компонентов FIBPlus с индексом 7.0, но что-то изменило планы разработчиков. :) В пользу этой версии говорит инсталлятор и файл readme.txt с описанием нововведений:&lt;br /&gt;&lt;blockquote&gt;7.1076&lt;br /&gt;1. Уникодные поля теперь могут маппироваться не на TFIBWideStringField  а на &lt;br /&gt;   TFIBStringField&lt;br /&gt;2  Добавлено свойство TFIBXSQLVAR.AsAnsiString: AnsiString ;&lt;br /&gt;&lt;br /&gt;7.1019&lt;br /&gt;1. В скриптере ошибка при обработке содержимого блоб-полей&lt;br /&gt;2. Ошибка при работе строковых полей не являющихся FIBStringField&lt;br /&gt;3. Подключен быстрый Locate&lt;br /&gt;4. Восстановлена работоспособность IB_Services&lt;br /&gt;5. Восстановлена работоспособность SQLEditor &lt;br /&gt;6. Добавлен обработчик pFIBDataSet.OnLockSQLText. Позволяет заменить генерацию лок-сиквела своей.&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;и версия в Object Inspector :)&lt;br /&gt;&lt;p&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;width: 276px; height: 140px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjttv-FnjxxAWEj6K4XgkOtQo-CwxsNkZOTka8H-A2VvfxcoWhLy5J_H3cpzFp1R1rZYEUKG94XC24TjQgiOGGHGIaYL6zy-RTYITjPPtQvP0PMD8yjubRjTfkd2e08AR_nkQx3pZF1lFYF/s400/fibplus2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5294563288532960674&quot; /&gt;&lt;br /&gt;&lt;p&gt;Ну как же так! Проверять программы надо перед релизом! ;-)&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/2614291745291676275/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/fibplus-delphi-2009-trial.html#comment-form' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/2614291745291676275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/2614291745291676275'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/fibplus-delphi-2009-trial.html' title='Установка FIBPlus на Delphi 2009 Trial'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Av-J_RZ4jQ5fMePanY0Idz9VUdJzh52gvBB9iQcVrWZhsC7kx0d0DfezAdVCcRynjHUGw6qF7RG449kkvgjNAhSsFdqKeNKJ3S57XrSxRUel5dGu3S1I7UY4mor99zPgLiskQX6Hja5T/s72-c/fibplus.png" height="72" width="72"/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-4646690263758038470</id><published>2009-01-23T13:32:00.001+10:00</published><updated>2009-01-23T13:38:04.162+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="FIBPlus"/><title type='text'>Вышло обновление FIBPlus для Delphi/C++ Builder 2009</title><content type='html'>&lt;p&gt;Без преувеличения можно сказать, что событие, которого ждали многие Delphi-программисты (и я в том числе) наконец-то свершилось! Не прошло и пол года (или прошло? :)) как &lt;a href=&quot;http://www.devrace.com/ru/fibplus/news/4980.php&quot;&gt;вышла обновленная версия&lt;/a&gt; библиотеки компонентов для доступа к Firebird и Interbase – &lt;a href=&quot;http://www.devrace.com/ru/fibplus/download/&quot;&gt;FIBPlus&lt;/a&gt;. Номер версии компонентов остался прежним – 6.9.5 поскольку единственное нововведение – это поддержка Delphi 2009, и эта версия не может быть установлена на более ранние версии Delphi. По сути – это те же самые компоненты только для Delphi 2009.&lt;br /&gt;&lt;p&gt;Теперь многие проекты, основанные на этой библиотеке, могут быть переведены на Delphi 2009, что не может не радовать. А то я уже стал задумываться об использовании стандартных IBX и хорошо, что до этого не дошло. :)&lt;br /&gt;&lt;p&gt;Единственное, что омрачает это приятное известие – это то, что разработчики &lt;span style=&quot;font-weight:bold;&quot;&gt;тянули-тянули&lt;/span&gt; с выходом библиотеки, и у многих уже закончилась годовая подписка на обновления. У меня она закончилась буквально меньше месяца назад, что вдвойне обидно. &lt;br /&gt;&lt;p&gt;А еще иногда проскакивает мысль, что задержка с выходом компонентов делалась намеренно, но оставим это на совести разработчиков, а догадки – при себе.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/4646690263758038470/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/fibplus-delphic-builder-2009.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/4646690263758038470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/4646690263758038470'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/fibplus-delphic-builder-2009.html' title='Вышло обновление FIBPlus для Delphi/C++ Builder 2009'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-3483486388732726624</id><published>2009-01-20T20:32:00.004+10:00</published><updated>2009-01-21T00:13:25.495+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for .NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi Prism"/><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><title type='text'>Delphi Prism - первое знакомство</title><content type='html'>&lt;p&gt;Пару дней назад кое-как руки дошли и до нового продукта - Delphi Prism. (Что-то отставать я стал от технологий :)). Буду наверстывать.&lt;br /&gt;&lt;p&gt;Первое что бросается в глаза - разработчики &lt;s&gt;обленились&lt;/s&gt; не стали возиться с собственной IDE и воспользовались бесплатным готовым решением компании Microsoft - &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/vsx2008/products/bb933751.aspx&quot;&gt;оболочкой Microsoft Visual Studio&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;Собственно, как и обещали разработчики - Delphi Prism совершает скачок &lt;s&gt;из феодализма в коммунизм&lt;/s&gt; из .NET 1.1 в .NET 3.5. И первым подключенным по умолчанию модулем является System.Linq. На эту возможность я и решил сегодня посмотреть в первую очередь.&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;p&gt;Для первого теста я выбрал LINQ to XML - решил посмотреть как будет выглядеть работа с XML файлами здесь. Файл и задачу выбрал такую же что и в моем предыдущем посте про &lt;a href=&quot;http://deldev.blogspot.com/2009/01/xml.html&quot;&gt;работу с XML в Delphi&lt;/a&gt;. И по аналогии с C# быстро набросал код программы.&lt;br /&gt;&lt;p&gt;Первое, что бросилось в глаза - синтаксис LINQ немного отличается, так например меня ввело в ступор сообщение об ошибке на операторе &lt;span style=&quot;font-style:italic;&quot;&gt;orderby&lt;/span&gt;, оказывается тут он пишется как &lt;span style=&quot;font-style:italic;&quot;&gt;order by&lt;/span&gt;. Так же по привычке объявил переменные перед блоком &lt;span style=&quot;font-style:italic;&quot;&gt;begin ... end&lt;/span&gt;; что тут являлось ошибкой. :)&lt;br /&gt;&lt;p&gt;В конце-концов у меня получился следующий код:&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;delphi&quot;&gt;&lt;br /&gt;namespace ConsoleApplication1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  System.Linq,&lt;br /&gt;  System.Xml,&lt;br /&gt;  System.Xml.Linq;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  ConsoleApp = class&lt;br /&gt;  public&lt;br /&gt;    class method Main;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;class method ConsoleApp.Main;&lt;br /&gt;begin&lt;br /&gt;  var  ComputersFile: System.Xml.Linq.XElement;&lt;br /&gt;  ComputersFile := XElement.Load(&#39;test.xml&#39;);&lt;br /&gt;  var Elements := from el in ComputersFile.Descendants() &lt;br /&gt;                where el.Name = &#39;DisplayName&#39;&lt;br /&gt;                order by el.Value&lt;br /&gt;                select el;&lt;br /&gt;  &lt;br /&gt;  for e in Elements do&lt;br /&gt;    Console.WriteLine(e.value);&lt;br /&gt;  &lt;br /&gt;  Console.Read;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Такую же программу я написал и на C# и решил их сравнить. Первое - размеры файлов были разные. Файл написанный с помощью Delphi Prism был больше. Мне это показалось странным - решил выяснить. Оказалось все просто: Delphi по умолчанию даже к консольному приложению, по каким-то своим личным соображениям добавляет иконку по умолчанию, удалив ее - размеры файлов стали одинаковы.&lt;br /&gt;&lt;p&gt;Еще не поленился дизассемблировать обе версии программы. IL-код их оказался совершенно разным, как собственно я и предполагал, сам не знаю что я надеялся там увидеть :) Не стал дальше копать и на этом решил пока остановиться.&lt;br /&gt;&lt;p&gt; В общем, первое впечатление осталось приятное - надо бы найти время по плотнее сесть поразбираться, но катастрофически ни на что не хватает времени.&lt;br /&gt;&lt;p&gt;Кстати в поставку Delphi Prism входят провайдеры для доступа к базам данных Interbase и Blackfish SQL, что позволяет писать управляемый код для работы с этими базами данных. Интересно, а как Delphi Prism интегрируется с Visual Studio? Будут ли доступны эти провайдеры при написании кода на C#? Но это уже материал для следующей заметки...&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/3483486388732726624/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/delphi-prism.html#comment-form' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/3483486388732726624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/3483486388732726624'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/delphi-prism.html' title='Delphi Prism - первое знакомство'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-4448278786986251327</id><published>2009-01-19T01:05:00.000+10:00</published><updated>2009-01-19T01:05:15.572+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for .NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><title type='text'>Осторожно! Помощники класса!</title><content type='html'>&lt;p&gt;В продолжение темы &lt;a href=&quot;http://delphist.ru/poleznoe-primenenie-xelperov/&quot;&gt;помощников классов&lt;/a&gt; и &lt;a href=&quot;http://deldev.blogspot.com/2009/01/blog-post_18.html&quot;&gt;записей&lt;/a&gt;. Я провел небольшое исследование в результате которого выяснилось несколько неприятных моментов применения хелперов. На первый взгляд все прекрасно! Мы можем взять и дополнить любой класс практически любым функционалом. Но не все так радужно. &lt;br /&gt;&lt;p&gt;Самая большая обнаруженная мной проблема состоит в том, что для класса может существовать только &lt;span style=&quot;font-weight:bold;font-style:italic;&quot;&gt;ОДИН&lt;/span&gt; хелпер. Для иллюстрации этого создадим один небольшой проект, содержащий один класс и два хелпера к нему, и посмотрим, что же у нас получилось.&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;delphi&quot;&gt;program Project1;&lt;br /&gt;&lt;br /&gt;{$APPTYPE CONSOLE}&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  SysUtils;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TSomeObject = class&lt;br /&gt;    function X: integer;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TSomeObjectHelper = class helper for TSomeObject&lt;br /&gt;    function y: integer;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TSomeObjectHelper2 = class helper for TSomeObject&lt;br /&gt;    function z: integer;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;{ TSomeObjectHelper }&lt;br /&gt;&lt;br /&gt;function TSomeObjectHelper.y: integer;&lt;br /&gt;begin&lt;br /&gt;  result := 1;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TSomeObject }&lt;br /&gt;&lt;br /&gt;function TSomeObject.X: integer;&lt;br /&gt;begin&lt;br /&gt;  result := 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TSomeObjectHelper2 }&lt;br /&gt;&lt;br /&gt;function TSomeObjectHelper2.z: integer;&lt;br /&gt;begin&lt;br /&gt;  result := 2;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    with TSomeObject.Create do&lt;br /&gt;    begin&lt;br /&gt;      writeln(z);&lt;br /&gt;      writeln(y);&lt;br /&gt;    end;&lt;br /&gt;    readln;&lt;br /&gt;  except&lt;br /&gt;    on E:Exception do&lt;br /&gt;      Writeln(E.Classname, &#39;: &#39;, E.Message);&lt;br /&gt;  end;&lt;br /&gt;end.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Мы получим ошибку компиляции. Потому что компилятор, видит только один хелпер - &lt;span style=&quot;font-weight:bold;font-style:italic;&quot;&gt;TSomeClassHelper2&lt;/span&gt;. Если закомнтировать его описание и реализацию, то компилятор увидит второй хелпер.&lt;br /&gt;&lt;p&gt;К чему это может привести? Это может привести к трудноуловимым ошибкам, особенно в больших проектах, разрабатываемых не одним разработчиком. Или, как вариант, представим такую ситуацию: в какой нибудь библиотеке - например FIBPlus или DevExpress вдруг используют хелперы, вы снова добавили хелпер уже в своем коде. Компилятор увидел ВАШ хелпер, а исконный хелпер разработчиков - нет, и все - проект уже не скомпилируется. Ситуация еще больше усугубится если у библиотеки закрыты исходные коды.&lt;br /&gt;&lt;p&gt;Поэтому, применять хелперы следует с большой осторожностью, 100 раз подумав.&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/4448278786986251327/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/blog-post_19.html#comment-form' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/4448278786986251327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/4448278786986251327'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/blog-post_19.html' title='Осторожно! Помощники класса!'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-5825277549716059581</id><published>2009-01-18T19:38:00.006+10:00</published><updated>2009-01-18T20:14:36.778+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="Tips"/><title type='text'>Помощники записей</title><content type='html'>&lt;p&gt;Сегодня, разбираясь с проектом, который я пытаюсь перевести на Delphi 2009, натолкнулся на одну забавную недокументированную возможность. Наряду с помощниками классов (&lt;a href=&quot;http://delphist.ru/poleznoe-primenenie-xelperov/&quot;&gt;Class Helpers&lt;/a&gt;) введенными в последних версиях Delphi, разработчику доступны и помощники записей!&lt;br /&gt;&lt;p&gt;Стоит сразу отметить, что данная возможность не поддерживается редактором кода и Code Insight. Так в редакторе код подчеркивается красным, а в Code Insight добавленное недоступно.&lt;br /&gt;&lt;p&gt;НО, &lt;span style=&quot;font-style:italic;&quot;&gt;с точки зрения компилятора&lt;/span&gt;, следующий код абсолютно рабочий:&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;delphi&quot;&gt;type&lt;br /&gt;  TRectHelper = record helper for TRect&lt;br /&gt;    function Width: integer;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;{ TRectHelper }&lt;br /&gt;&lt;br /&gt;function TRectHelper.Width: integer;&lt;br /&gt;begin&lt;br /&gt;  Result := Self.Right - Self.Left;&lt;br /&gt;end;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Использовать новый метод можно, например, следующим образом:&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;delphi&quot;&gt;var&lt;br /&gt;  p: TRect;&lt;br /&gt;begin&lt;br /&gt;  p.Top := 0;&lt;br /&gt;  p.Left := 0;&lt;br /&gt;  p.Bottom := 12;&lt;br /&gt;  p.Right := 12;&lt;br /&gt;  ShowMessage(inttostr(p.width));&lt;br /&gt;end;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Не знаю, на сколько эта возможность может быть востребована, но она есть.&lt;br /&gt;&lt;p&gt;P.S. К слову сказать, что Class Helpers разработчики не рекомендуют использовать постоянно, а про Record Helpers  они и вообще умолчали. :)&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/5825277549716059581/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/blog-post_18.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/5825277549716059581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/5825277549716059581'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/blog-post_18.html' title='Помощники записей'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-1317202550379115589</id><published>2009-01-17T01:42:00.003+10:00</published><updated>2009-01-17T02:01:35.778+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="Tips"/><category scheme="http://www.blogger.com/atom/ns#" term="Компоненты"/><title type='text'>Неизвестные возможности стандартных компонентов</title><content type='html'>&lt;p&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Одной строкой&lt;/span&gt;: Сегодня &lt;a href=&quot;http://vingrad.ru/blogs/bose/&quot;&gt;Bose&lt;/a&gt; сделал уникальное открытие. Оказывается, что стандартный TDbGrid умеет рисовать многострочные заголовки с группировкой. Подробнее можно прочитать и посмотреть в &lt;a href=&quot;http://vingrad.ru/blogs/bose/a-standartnyiy-dbgrid-ne-tak-to-i-prost/&quot;&gt;его блоге&lt;/a&gt;. &lt;br /&gt;&lt;p&gt;Что самое смешное, что данная возможность не является недокументированной, по крайней мере в справке Delphi 2009 можно найти информацию о ней, но кто бы читал эту самую справку. :)</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/1317202550379115589/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/blog-post_17.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/1317202550379115589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/1317202550379115589'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/blog-post_17.html' title='Неизвестные возможности стандартных компонентов'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-6690498614839551716</id><published>2009-01-16T22:21:00.004+10:00</published><updated>2010-04-02T01:27:55.128+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="Книги"/><title type='text'>5 книг по Delphi которые следует прочитать</title><content type='html'>&lt;p&gt;Все мы когда-то только начинали и учились программировать. Кто-то сидел и сам разбирался со всеми возможными проблемами, кто- сразу лез на форум и пачками создавал темы вроде &quot;АААААА! пАмАгИтЕ!&quot;. Но так или иначе все начинали с азов, которые описаны в литературе. (Хотя не все из второй категории :)).&lt;br /&gt;&lt;p&gt;Далее приведу небольшой ТОП5 книг которые помогли мне избежать многих вопросов, некоторые из них я перечитывал в разной последовательности и несколько раз.&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;p&gt;Перво-наперво, из разряда &quot;книги для начинающих&quot; - это &lt;span style=&quot;FONT-STYLE: italic; FONT-WEIGHT: bold&quot;&gt;Стив Тейксейра, Ксавье Пачеко. Delphi 5, Руководство разработчика&lt;/span&gt;. В двух томах. - Очень удачная, на мой взгляд, книга все грамотно и понятно написано, начальные сведения я черпал именно из нее.&lt;br /&gt;&lt;p&gt;Еще одна очень хорошая книга, на этот раз отечественного автора - &lt;span style=&quot;FONT-STYLE: italic; FONT-WEIGHT: bold&quot;&gt;Архангельский А.Я. Программирование Delphi 5.&lt;/span&gt; - Достаточно объемная книга, в которой есть практически все, что нужно начинающему.&lt;br /&gt;&lt;p&gt;Небольшое отступление. Во всех приводимых книгах в основном описываются довольно старые версии Delphi, но это не так важно, поскольку в них описываются именно основы - так необходимые начинающему. А про все новомодные добавления в виде хелперов и анонимных методов на начальном этапе знать попросту вредно. Когда будет опыт - с ними разобраться не составит труда, и литература не понадобится.&lt;br /&gt;&lt;p&gt;Продолжу импровизированный TOP книг.&lt;br /&gt;&lt;p&gt;На начальном этапе также полезно будет почитать книгу &lt;span style=&quot;FONT-STYLE: italic; FONT-WEIGHT: bold&quot;&gt;Рода Стивенса - Delphi. Готовые алгоритмы.&lt;/span&gt; В ней рассматривается создание и эффективное использование алгоритмов для работы со стеками, списками, очередями - вещами хоть и не всегда применяемыми при реальном программировании, но знание которых очень полезно.&lt;br /&gt;&lt;p&gt;В переходном этапе - когда уже и не новичек, но все же еще чего то не хватает, я нашел для себя книгу &lt;span style=&quot;FONT-STYLE: italic; FONT-WEIGHT: bold&quot;&gt;П.Дарахвелидзе Е.Маркова. Программирование в Delphi 7&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Ну и самая лучшее оставил на последок. Самой лучшей книгой я считаю книгу &lt;span style=&quot;FONT-STYLE: italic; FONT-WEIGHT: bold&quot;&gt;&lt;a href=&quot;http://blog.marcocantu.com/&quot;&gt;Марко Кэнту&lt;/a&gt; - Программирование в Delphi 7 для профессионалов&lt;/span&gt;. В которой рассматриваются практически все темы, связанные с программированием в Delphi.&lt;br /&gt;&lt;p&gt;Это книги из серии &quot;то что читать &lt;span style=&quot;FONT-STYLE: italic; FONT-WEIGHT: bold&quot;&gt;полезно&lt;/span&gt;&quot;, но существует еще целый пласт книг на которых недобросовестные авторы просто делают деньги. Я их не осуждаю - каждый зарабатывает так как считает так как считает нужным, но читать я их не советую. В эту категорию для меня попадает довольно большое количество книг начиная от всевозможных &quot;Библий&quot; и &quot;освой за 5-10-15 минут&quot; и заканчивая чьими-то глазами. Поскольку в этих книгах довольно часто отражается не истинное положение вещей, а видение автора, причем не всегда правильное.&lt;br /&gt;&lt;p&gt;В прошлом году разгорелся даже довольно большой спор по поводу одной &quot;статьи&quot; одного такого автора на блоге &lt;a href=&quot;http://delphist.ru/nikogda-tak-ne-delajte/&quot;&gt;Delphist.ru&lt;/a&gt;. Я абсолютно согласен с aktuba, в одной из приведенных мной книг даже подробно описано ПОЧЕМУ так делать нельзя, но принять участие в споре не смог, поскольку комментарии не добавлялись. Но вроде бы сейчас эта ошибка исправлена.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/6690498614839551716/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/5-delphi.html#comment-form' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/6690498614839551716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/6690498614839551716'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/5-delphi.html' title='5 книг по Delphi которые следует прочитать'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-5714060203172204274</id><published>2009-01-14T19:18:00.003+10:00</published><updated>2009-01-14T20:11:15.820+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><title type='text'>Работа с XML</title><content type='html'>&lt;p&gt;Несмотря на то, что тема работы с XML в Delphi довольно широко обсуждалась в Интернете, вопросы на эту тему довольно часто возникают на всевозможных форумах. &lt;br /&gt;&lt;p&gt;Я тоже уже писал &lt;a href=&quot;http://deldev.blogspot.com/2008/05/xml-data-binding-delphi.html&quot;&gt;по этому поводу&lt;/a&gt;, но хотел бы вернуться к реальному случаю быстрого разбора XML файла и извлечения данных, который я сегодня проделал на работе. Получение необходимых данных у меня заняло не более 5 минут времени.&lt;br /&gt;&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Предыстория&lt;/span&gt;. Сегодня понадобилось обработать данные об установленных программах на компьютерах пользователей (да, да, пиратов выявляем :)). Технический отдел предоставил мне такую информацию содраную с ничего не подозревающих пользователей по сети с использованием &lt;a href=&quot;http://ru.wikipedia.org/wiki/WMI&quot;&gt;WMI&lt;/a&gt;. Программа, которой они пользовались выдает отчеты в формате XML. Соответственно - мне притащили гору XML файлов с довольно сложной структурой из которых мне необходимо было вытащить только название установленных программных продуктов.&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Обработка&lt;/span&gt;. Просмотрев пару файлов вручную, понял что так и состариться не долго, и решил написать небольшой конвертер. Запустив Delphi - выбрал в репозитарии объект XML DataBinding и скормил ему один из файлов. Все настройки и параметры я оставил по умолчанию и в результате у меня сформировался модуль с большим количеством классов и интерфейсов для доступа к элементам этого XML файла. Я не стал долго разбираться со структурой классов, сразу же перешел к написанию конвертера.&lt;br /&gt;&lt;p&gt;В новом консольном приложении написал довольно простой код:&lt;br /&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;program XML2TXT;&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Forms,&lt;br /&gt;  Classes, SysUtils,&lt;br /&gt;  SoftwareXML in &#39;SoftwareXML.pas&#39;;&lt;br /&gt;&lt;br /&gt;procedure CovertXML2Text;&lt;br /&gt;var&lt;br /&gt;  softbase : IXMLSTDSoftwareType;&lt;br /&gt;  i: integer;&lt;br /&gt;  sr: TSearchRec;&lt;br /&gt;  CurDir: string;&lt;br /&gt;  ExportFile: TStringList;&lt;br /&gt;begin&lt;br /&gt;  CurDir := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));&lt;br /&gt;  if FindFirst(CurDir+&#39;*.xml&#39;, faAnyFile, sr) = 0 then&lt;br /&gt;  repeat&lt;br /&gt;    ExportFile := TStringList.Create;&lt;br /&gt;    softbase := LoadSTDSoftware(Pchar(CurDir+sr.Name));&lt;br /&gt;    for i := 0 to softbase.InstalledSoftware.source.software.Count - 1 do&lt;br /&gt;      ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName);&lt;br /&gt;    ExportFile.Sort;&lt;br /&gt;    ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+&#39;.txt&#39;);&lt;br /&gt;    ExportFile.Free;&lt;br /&gt;  until FindNext(sr) &lt;&gt; 0;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  Application.Initialize;&lt;br /&gt;  CovertXML2Text;&lt;br /&gt;end.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;В результате которого у меня образовался по одному текстовичку на каждый компьютер в сетке, содержащий список установленного ПО.&lt;br /&gt;&lt;p&gt;Чувствую что данный код потребует пояснений. Например, зачем я в консольном приложении использовал модуль &lt;span style=&quot;font-weight:bold; font-style:italic;&quot;&gt;Forms&lt;/span&gt; и вызывал процедуру Application.Initialize;?&lt;br /&gt;&lt;p&gt;На самом деле все просто - это небольшой хак, позволяющий использовать XML Data Binding в консольном приложении. Потому как в нем упорно отказывался инициализироваться класс для работы с XML. В истинных причинах пока не разбирался - сегодня было важно время, я и так 4 из 5 минут потратил на борьбу с этой ошибкой. :) Думаю позже разобраться с этой проблемой и написать в чем истинная причина.&lt;br /&gt;&lt;p&gt;Странный класс softbase был создан на основе XML файла - так назывался корневой элемент, а softbase.InstalledSoftware.source.software[i].DisplayName - просто навигация по вложенным элементам до нужного и получение его значения. &lt;br /&gt;&lt;p&gt;Вот собственно так выглядит один из самых быстрых способов работы с XML в Delphi.&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/5714060203172204274/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/xml.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/5714060203172204274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/5714060203172204274'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/xml.html' title='Работа с XML'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-220569005090385875</id><published>2009-01-12T19:49:00.005+10:00</published><updated>2009-01-13T00:07:52.487+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><title type='text'>Новое в Delphi 2009: работа с ресурсами</title><content type='html'>&lt;p&gt;Чуть ранее я уже писал &lt;a href=&quot;http://deldev.blogspot.com/2008/12/delphi.html&quot;&gt;о работе с ресурсами в Delphi&lt;/a&gt;. Там был описан абсолютно универсальный способ, работающий в любой версии Delphi. Существует &lt;a href=&quot;http://delphist.ru/resursy-v-proekte/&quot;&gt;еще одна возможность&lt;/a&gt; прикрепления ресурсов. Но сегодня я расскажу о том, какие новые возможности по работе с ресурсами нам предлагает Delphi 2009.&lt;p&gt;Если раньше можно было добавить файл с описаниями ресурсов (*.rc) в проект, и он автоматически скомпилируется и привяжется, то в Delphi 2009 разработчики пошли еще дальше. Теперь с помощью менеджера проектов (Project Manager) в проект можно добавлять сами ресурсы!&lt;p&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; width: 299px; height: 381px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgQi2Ze8SxSpRUTQeMZmKHBXZg4Eqg8Ku0czIdD3qE7OzToq66fzMazhc0LqAgharDAcVfYUDmtl7_Dbb72o6zywSH1i9ePAAiZDL8gP6R2rhvUiJu0xdmbrBzG0TneOM0f7jVvavZvCY1/s400/resources1.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5290404711010600946&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Так же с помощью меню Project -&gt; Resources можно вызвать менеджер ресурсов:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; width: 400px; height: 253px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiDCFaebsAQ2j8BZp6lL0TNiWoZ798MmF2FN3jHppyKzXvk6nLZnokeNSN_DQr5Q2IJKAUTwPqP-xNcQlhB_LwCRlpi7CqlTUSAestmAjaXBJOGu4nZVDakQ2oUoumtHdWSD9w1P9v8_x1/s400/resources2.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5290405388779340962&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Единственное, чем мне не понравились эти нововведения - это не очень удобный менеджер ресурсов. Мне кажется в нем будет сложно работать при большом количестве подключаемых ресурсов. &lt;s&gt;Так же удивило малое количество поддерживаемых типов ресурсов, поддерживаются только Bitmap, RCData и None.&lt;/s&gt; На самом деле тип ресурса определяется по формату файла. Так например при добавлении курсора в выпадающем списке становятся доступны варианты - Cursor, RCData, None, при выборе иконки - Icon, RCData и None, а при выборе JPEG изображения - только RCData И None.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Все подключенные подобным образом ресурсы при работе с программой подгружаются стандартным образом с использованием идентификатора, которй так же можно при желании изменить с помощью менеджера ресурсов.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/220569005090385875/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/delphi-2009_12.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/220569005090385875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/220569005090385875'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/delphi-2009_12.html' title='Новое в Delphi 2009: работа с ресурсами'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgQi2Ze8SxSpRUTQeMZmKHBXZg4Eqg8Ku0czIdD3qE7OzToq66fzMazhc0LqAgharDAcVfYUDmtl7_Dbb72o6zywSH1i9ePAAiZDL8gP6R2rhvUiJu0xdmbrBzG0TneOM0f7jVvavZvCY1/s72-c/resources1.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-5705441782596213633</id><published>2009-01-11T23:34:00.008+10:00</published><updated>2009-01-12T01:39:04.370+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for .NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><title type='text'>Технологии интеллектуального редактирования (Часть III)</title><content type='html'>&lt;p&gt;В этой заметке я продолжу обзор наиболее продвинутых возможностей редактирования исходного кода в Delphi. Напомню, что несколько ранее в &lt;a href=&quot;http://deldev.blogspot.com/2009/01/i.html&quot;&gt;Части I&lt;/a&gt; рассматривались возможности интеллектуального поиска, а в &lt;a href=&quot;http://deldev.blogspot.com/2009/01/ii.html&quot;&gt;Части II&lt;/a&gt; - возможности по быстрому созданию и переименованию конструкций кода.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ну чтож, начнем. Наиболее мощной и одновременно ресурсоемкой является возможность перемещения (Move). Причем перемещать можно как статические члены класса в другой класс, так и сами классы в другое пространство имен. Для выполнения этой функции следует встать на соответствующий идентификатор и дать команду &lt;span style=&quot;font-weight: bold;&quot;&gt;Refactor -&gt; Move&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; width: 376px; height: 296px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-phNCVJRLVs9VZkyARSht_ijU8kRLGu86R6-hMFYNqO1Nji7nbjTPwfwCSLK9c0XUnamgwCi0TXZ_KysU7E3vMM8jOlIxnOuSfLfC4xja13IAT6t60Aw_27ClVUsRDhhy05rtFVu_kqWe/s400/refactoring9.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5290044042262949474&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; width: 341px; height: 262px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSpO7fhtZqpZPXS2SnuCw232wKYFMyw6SgHlLWroKWyjaUVLzy0eO-JVR142_NheHYPxB-rTHSPUrr5Oj4BAERUIGoVx-QodoV6ARltd3EcmI6M2UzvD9iPIhSm7xtiJ-iiZC_O7dEAZ8B/s400/refactoring10.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5290047361291150162&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;p&gt;Так же есть возможность быстро перемещать члены классов от дочерних классов к одному из родительских или наоборот - от родительского класса - к одному из классов-наследников. Если данная команда применима к выделенному члену класса, то на экране появится следующее диалоговое окно для выбора:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; width: 400px; height: 282px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxHKvhl5at3HE4HLDpB20ZNuN-Hc248hhkReF1VkDRPce4xJP0E7U2vBQ6E0yBETlkCK_AfCKBZwd8CelPh6IKiaZqMxCU7YegHv_rOhq9YLGFGWlwslXPaU71jG8CHvddY7Wk348P9B9/s400/refactoring11.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5290050146363163906&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Это были две самые интересные, на мой взгляд, операции рефакторинга, которые позволяют вносить глобальные изменения в код, не рискуя при этом потерять его работоспособность или внести большое количество трудноуловимых ошибок.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Еще одной немаловажной особенностью является то, что перед применением выполнения рефакторинга можно оценить те изменения в коде которые получатся. А в том случае, если вдруг в результате затяжной операции рефакторинга произойдет какая либо ошибка - код вернется в исходное состояние.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ну и еще - рефакторини можно отменять так же как и любые другие действия в редакторе кода - с помощью клавиш &lt;span style=&quot;font-weight: bold;&quot;&gt;Ctrl+Z&lt;/span&gt;, что делает их очень мощным и простым инструментом.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/5705441782596213633/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/iii.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/5705441782596213633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/5705441782596213633'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/iii.html' title='Технологии интеллектуального редактирования (Часть III)'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-phNCVJRLVs9VZkyARSht_ijU8kRLGu86R6-hMFYNqO1Nji7nbjTPwfwCSLK9c0XUnamgwCi0TXZ_KysU7E3vMM8jOlIxnOuSfLfC4xja13IAT6t60Aw_27ClVUsRDhhy05rtFVu_kqWe/s72-c/refactoring9.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-7882428233865290556</id><published>2009-01-10T14:18:00.008+10:00</published><updated>2009-01-10T16:01:47.759+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for .NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><title type='text'>Технологии интеллектуального редактирования (Часть II)</title><content type='html'>&lt;p&gt;Продолжим &lt;a href=&quot;http://deldev.blogspot.com/2009/01/i.html&quot;&gt;начатый ранее разговор&lt;/a&gt; о рефакторинге. Сегодня рассмотрим более продвинутые возможности по интеллектуальному редактированию.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Как обычно начнем с более простых возможностей, первой из которых рассмотрим быструю декларацию переменной и поля. В заметке &lt;a href=&quot;http://deldev.blogspot.com/2008/07/blog-post_19.html&quot;&gt;посвященной LiveTemplates&lt;/a&gt; я уже рассказывал как можно быстро объявить переменную. Но есть еще один вариант. Представим себе ситуацию, когда вы уже пытаетесь скомпилировать проект с не объявленной переменной, естественно компилятор выдаст ошибку:&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;[DCC Error] Unit2.pas(94): E2003 Undeclared identifier: &#39;s&#39;&lt;/blockquote&gt;&lt;p&gt;Так вот, если теперь встать на эту ошибку и из контекстного меню выбрать пункт &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Declare Variable&lt;/span&gt; то в диалоговом окне можно выбрать тип определяемой переменной и при необходимости даже инициализировать ее:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 288px; height: 177px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6Y_PJVlphzT3LW3anz32Hqm1wuNZAJXyFbVZrjuoy3OIlV5Gcn8oKapoDW41lPifDoXLMbNJrzsIyCiP7QBzvVZxBN7d4dBKr2yriXQV76PgE0yevXDghIslGlK3vIiEFWA22tR-PMfGt/s400/refactoring4.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5289520445667724034&quot; border=&quot;0&quot; /&gt;Этим средством удобно пользоваться когда необходимо быстро задействовать новые локальные переменны - например при добавлении циклов.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Аналогично можно поступить если требуется не локальная переменная, а поле класса - Declare Field. Единственное отличие заключается в том, что для поля класса можно дополнительно выбрать область видимости.&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;p&gt;Следующая замечательная возможность называется визуальное создание метода (Extract Method). Она позволяет выделить в редакторе кода произвольную часть кода, и организовать ее в виде метода. На рисунке я выделил код, отвечающий за удаление временных файлов в отдельный метод:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 246px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSAaWzxKVavDhmGH9FkfRc5Aev983yOiBD3lNWcNkvITFZ1ep2WZ5IfgP-jS8Jeqhl4O3r5lLt-sd9LWJwRi4OjkwqBbu2Nv6IBOD-4U0VtzHGOTbcC9DhMg6shXB6qYQMQ2mjb_5CYycL/s400/refactoring5.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5289527333900206610&quot; border=&quot;0&quot; /&gt;При выделении более сложного участка кода в процессе рефакторинга автоматически создадутся параметры метода и его локальные переменные.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Пожалуй самая используемая мной возможность рефакторинга - это визуальное изменение параметров (Change Parameters). Очень удобно при большом количестве параметров, часть из которых задана со значениями по умолчанию. Вызывается из контекстного меню редактора кода, если предварительно выделить имя необходимой процедуры или метода.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 297px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8KG2awJFnQAPcvN-IAL0ka2VTVEQOw3CRiKWsElEqAK1nkkgIEmYTHo1PjlSLPm_Bm73nCfaTpxB_6KHq9S2lyWEpfYBxjtCYHpLZ6DgSKLrHZe7BLWx1X12u1sZE0W6Q-R6JdSu_Szwk/s400/refactoring6.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5289534628121903602&quot; border=&quot;0&quot; /&gt;Ну и в завершение еще одна из часто используемых и полезных функций рефакторинга - глобальное переименование идентификатора (Rename). Сколько хлопот раньше приносило переименование какого-либо визуального контрола (скажем TLabel) если он использовался  коде. Все вхождения можно было отловить только с помощью компилятора и спотыкания на каждом вхождении. Но теперь с этим покончено. Необходимо всего лишь встать на необходимый идентификатор и дать команду Refactor -&gt; Rename. Данная операция применима к названиям переменных, методов, полей, классов, структуур, интерфейсов и параметров.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 312px; height: 182px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE0o5fGSxBvzmIDknm-qPuyc8loKjxlYBJt4vNG__jrGP12aL1e8gbuQCbISyXlCm1yfF3fEkORyh6xNiQXaGuinFmH5R40mFVgVCeqs0CsfHHOYZQN3K6jAIcMqyCo_Tn20Vou881GpPx/s400/refactoring7.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5289537882694297938&quot; border=&quot;0&quot; /&gt;Перед переименованием можно просмотреть все идентификаторы которые будут изменены.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUhshpXcErzqOzxf_lMTn1OGdD-bG_WvTJCehLR54kxTbNcwOYmKoa_aaMqenox2CPMa_obbVq97qG14n8SmAiPVTFQKSB3vPn1gTeTY6jUtVvVS6kv83h0CSFWmg8VqJWxIqIRZhNL7a/s1600-h/refactoring8.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 143px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUhshpXcErzqOzxf_lMTn1OGdD-bG_WvTJCehLR54kxTbNcwOYmKoa_aaMqenox2CPMa_obbVq97qG14n8SmAiPVTFQKSB3vPn1gTeTY6jUtVvVS6kv83h0CSFWmg8VqJWxIqIRZhNL7a/s400/refactoring8.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5289539383290763490&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;В следующей части речь пойдет перемещениях частей кода. Не переключайтесь. :)&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/7882428233865290556/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/ii.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/7882428233865290556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/7882428233865290556'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/ii.html' title='Технологии интеллектуального редактирования (Часть II)'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6Y_PJVlphzT3LW3anz32Hqm1wuNZAJXyFbVZrjuoy3OIlV5Gcn8oKapoDW41lPifDoXLMbNJrzsIyCiP7QBzvVZxBN7d4dBKr2yriXQV76PgE0yevXDghIslGlK3vIiEFWA22tR-PMfGt/s72-c/refactoring4.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-3156786503918501955</id><published>2009-01-09T16:54:00.010+10:00</published><updated>2009-01-10T13:10:21.006+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for .NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><title type='text'>Технологии интеллектуального редактирования (Часть I)</title><content type='html'>&lt;p&gt;Продолжаю публиковать серию заметок начатую мной в заметке &lt;a href=&quot;http://deldev.blogspot.com/2008/07/delphi-delphi-7.html&quot;&gt;&quot;Отличия новых версий Delphi от Delphi 7&quot;&lt;/a&gt;.  Сегодня речь пойдет о технологиях интеллектуального редактирования (в англоязычной терминологии Refactoring). Взамен такого длинного русскоязычного названия я буду применять более короткое – &quot;рефакторинг&quot;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Итак, рефакторинг является одним из наиболее значимых нововведений последних версий Delphi. Ключевой особенностью рефакторинга является то, что перед применением изменений их можно просмотреть, а при необходимости легко отменить.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Начнем, пожалуй, с самых простых сценариев применения рефакторинга с поиска. Рассмотрим первую возможность - &quot;Поиск модуля&quot;.  Данная возможность позволяет найти необходимый модуль и добавить его к списку подключенных модулей в разделе Interface или Implementation. Кстати сказать, все команды рефакторинга вызываются либо из главного меню среды – Refactorings, либо через контекстное меню редактора кода. Причем можно производить поиск не только по имени модуля, но и по имении функций входяших в него (!!!). На рисунке приведен пример поиска модуля по функции ShellExecute:&lt;br /&gt;&lt;p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 283px; height: 310px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg5kMaqOHkTeALdH-CoKzVXAtvduTYk18EueXVSY13j3bOye3HFyk9VU_UOsIAG83e7-vkEB3MAOBMVVImR0eRFx_6ix7shgDoOU_sNFdCAqYxzhFHCZb21UGr-an_zNb02I-VGLqfXqnb/s320/refactoring.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5289189854845346594&quot; border=&quot;0&quot; /&gt;При нажатии кнопки OK название модуля ShellAPI добавится в раздел подключенных модулей раздела Implementation.&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;p&gt;Еще одна прекрасная возможность поиска - поиск ссылок (FindReference), позволяющаяя найти все упоминания о каком либо идентификаторе во всех связанных файлах проекта.&lt;br /&gt;&lt;/p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCM-kBYy5S2j7DOqgVSSaw89a0TYo8lVWIdfREbVwc7NpGnXx-TdTo4OacMNi6B9ao00zY0aCqsO4LswpArY6aJG7sfwUu6XyNPDSvbPVbpDkAT-UT64z_67xGRaSmz2NnPYdE_aBfNl3a/&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5289192012886904114&quot; border=&quot;0&quot; /&gt;&lt;p&gt;При двойном щелчке на элементах дерева в редакторе кода будет подсвечиваться соответствующая строчка кода.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Для поиска локальных идентификаторов можно воспользоваться вариантом этой функции - Find Local Reference. Результат ее действия аналогичен.&lt;/p&gt;&lt;p&gt;Рассмотрим еще одну возможность поиска. Новая возможность называется &quot;Поиск класса&quot; (FindClass), позволяющая находить определения классов по их именам.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 264px; height: 310px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiSctibiqMWXQPpgIf0K-IQPnjwWMFWiMvrGzInb1QIlPI5114ug1SBShPjKIoPvTtsqxKAwWjzrC0bWhZmos62mGAJe8Mqel9g8fB_se2c8SM-lun1Ej_hkQYiRa5bLRQZtU4hE3PdFDU/s400/refactoring3.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5289195660701563474&quot; border=&quot;0&quot; /&gt;Нажав кнопку OK мы перейдем к описанию класса.&lt;/p&gt;&lt;p&gt;На сегодня, пожалуй, все, продолжение в следующих заметках.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/3156786503918501955/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/i.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/3156786503918501955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/3156786503918501955'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/i.html' title='Технологии интеллектуального редактирования (Часть I)'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg5kMaqOHkTeALdH-CoKzVXAtvduTYk18EueXVSY13j3bOye3HFyk9VU_UOsIAG83e7-vkEB3MAOBMVVImR0eRFx_6ix7shgDoOU_sNFdCAqYxzhFHCZb21UGr-an_zNb02I-VGLqfXqnb/s72-c/refactoring.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-1902023010456013164</id><published>2009-01-09T02:13:00.005+10:00</published><updated>2009-01-09T02:28:58.355+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Блог"/><category scheme="http://www.blogger.com/atom/ns#" term="Интернет"/><title type='text'>Обновление блога</title><content type='html'>&lt;p&gt;Еще немного поразмыслив над целями, поставленными мной ранее в заметке &lt;a href=&quot;http://deldev.blogspot.com/2009/01/2009.html&quot;&gt;«Цели блога 2009»&lt;/a&gt;, и сопоставив их с текущими положением дел с хостингом, решил немного обновить блог. На это меня в большой степени подтолкнул блог &lt;a href=&quot;http://blogohelp.blogspot.com/&quot;&gt;«On-line помощь при ведении блога на Blogger.com»&lt;/a&gt; В новом обновленном дизайне блок для вывода содержания заметки несколько больше – так что исходный код теперь должен помещаться. Так же в скором времени планирую прикрутить подсветку синтаксиса для исходного кода и отказаться от размещения исходного кода в картинках – &lt;a href=&quot;http://deldev.blogspot.com/2009/01/delphi-2009.html&quot;&gt;как в предыдущей моей заметке&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Еще из нового – появилась возможность подписываться в один клик в &lt;a href=&quot;http://fusion.google.com/add?feedurl=http://feeds.feedburner.com/DelphiDevelopment&quot;&gt;агрегатор новостей Google Reader&lt;/a&gt;, а так же получать новые заметки &lt;a href=&quot;http://www.rss2email.ru/?rss=http://deldev.blogspot.com/feeds/posts/default&quot;&gt;по электронной почте&lt;/a&gt;, так что не забываем &lt;a href=&quot;http://deldev.blogspot.com/feeds/posts/default&quot;&gt;подписываться на обновления&lt;/a&gt;, в планах еще много интересных (на мой взгляд) тем для заметок. :)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Теперь комментирование заметок встроено на страницу с самой заметкой, а не отдельно как было ранее. Комментировать стало удобнее – так что не забываем комментировать. :)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Самому пока не нравится как выводятся списки последних заметок и комментариев – буду думать как исправить. Пока пусть так будет. :) Если заметите еще проблемы с дизайном, можно оставлять комментарии к этой заметке, буду пытаться исправлять.&lt;/p&gt;&lt;p&gt;Вот, в принципе и все.&lt;/p&gt;&lt;p&gt;P.S. Странное черное поле ввода в правом верхнем углу - это поиск по блогу. :)&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/1902023010456013164/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/blog-post_09.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/1902023010456013164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/1902023010456013164'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/blog-post_09.html' title='Обновление блога'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-6026516575179558004</id><published>2009-01-08T20:32:00.009+10:00</published><updated>2009-01-10T13:28:44.258+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="Ошибки"/><title type='text'>Перевод проекта на Delphi 2009 – первые грабли</title><content type='html'>&lt;p&gt;Сегодня выдалось немного свободного времени и решил я поковырять свой проект на предмет совместимости с Delphi 2009. В одной из моих предыдущих заметок я уже говорил, что проект отказался компилироваться. Начнем разбираться почему.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Первым делом компилятор споткнулся о «мертвую» (нигде не использующуюся) процедуру RunDosAndWait которая запускала консольное приложение фоном и ждала его выполнения. Честно говоря, я намеренно не стал убирать эту процедуру и берег ее для такого случая, как она мне сегодня пригодится – речь пойдет немного позже.&lt;/p&gt;&lt;p&gt;Итак, не работает функция CreateProcess(nil, PChar(CommandLine), nil, nil, true, 0, nil, nil, StartupInfo, ProcessInfo). Попробовал поискать в инете, толком решения проблемы не нашел. На одном из &lt;a href=&quot;http://programmersforum.ru/showthread.php?t=31245&quot;&gt;форумов&lt;/a&gt; тоже сталкивались с этой проблемой, но решения предложено не было.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Пробуем просто создать процесс:&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO0iaqNWAPknke9_1BfAmci_wFH2lPOsktOC4996EILkcYVo5BvE4dDQjZ6dWuyDwDVRMyW2xic9ZWxfBi4YFrasVzD6k7qGMMUbys-5hD91bamRef-DiANtRR_CmNNTw65JtV1g-E_lBF/s1600-h/cp5.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 170px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO0iaqNWAPknke9_1BfAmci_wFH2lPOsktOC4996EILkcYVo5BvE4dDQjZ6dWuyDwDVRMyW2xic9ZWxfBi4YFrasVzD6k7qGMMUbys-5hD91bamRef-DiANtRR_CmNNTw65JtV1g-E_lBF/s320/cp5.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5288869459377351378&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Получаем следующую картинку:&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2i9WtMLC3m9FP9gGQi5cJd5WjpuGQdO8HkDK1za-XJ5ucAooEAALbewKeq9-GEx_6ITzEUUUKivwEE24oKha2YthT1r4BlPoUV9sWXzF46tPucn31eilCDTL2zUzElwHio-m2Hz3diUXg/s1600-h/cp1.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 74px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2i9WtMLC3m9FP9gGQi5cJd5WjpuGQdO8HkDK1za-XJ5ucAooEAALbewKeq9-GEx_6ITzEUUUKivwEE24oKha2YthT1r4BlPoUV9sWXzF46tPucn31eilCDTL2zUzElwHio-m2Hz3diUXg/s320/cp1.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5288869781073239442&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;   &lt;/p&gt;&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;p&gt;Поскольку новая Delphi 2009 это один большой Юникод, то думаю следует поискать причину в этом. Попробуем разобраться почему код отлично работавший в предыдущих версиях резко перестал работать. В предыдущих версиях (не Юникод) при вызове функции CreateProcess фактически вызывалась ANSI-версия этой функции – CreateProcessA, в новой Юникод-версии фактически вызывается CreateProcessW и по всей видимости в этом то и кроется основная проблема. А так как CreateProcess это самая что ни на есть WinAPI  функция, попробуем поискать ответы на наши вопросы в &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/ms682425%28en-us%29.aspx&quot;&gt;MSDN&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Вот собственно, что и следовало доказать. Функции CreateProcessA и CreaterocessW ведут себя по-разному:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;The Unicode version of this function, &lt;strong&gt;CreateProcessW&lt;/strong&gt;, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a &lt;strong&gt;const&lt;/strong&gt; variable or a literal string). If this parameter is a constant string, the function may cause an access violation.&lt;/blockquote&gt;&lt;p&gt;Что в вольном переводе означает, что эта функция может изменить содержание строки и поэтому параметр не может быть константой или строкой символов.  Напрашивается самый простой вариант:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRRKr17xvsWJw9LbPPS_V9fFlKSrd3zDehVMlxUqgtW83guOh3wkgK8GpBxi_usKr0OPoAxji3ii6Oozu5i-5_8nNhMBn6K1nf0UywNvPy0roY7_djNwKHwcUbQJpBYQLBCbk4cQqSjNfI/s1600-h/cp2.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 185px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRRKr17xvsWJw9LbPPS_V9fFlKSrd3zDehVMlxUqgtW83guOh3wkgK8GpBxi_usKr0OPoAxji3ii6Oozu5i-5_8nNhMBn6K1nf0UywNvPy0roY7_djNwKHwcUbQJpBYQLBCbk4cQqSjNfI/s320/cp2.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5288870299820617362&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;   &lt;/p&gt;&lt;p&gt;Но в этом случае программа так же откажется работать. Дело в том, что оптимизирующий компилятор Delphi вместо нашей переменной все равно воткнет константу, поскольку он видит, что значение нигде по коду не меняется. Чтобы проверить правильность наших выводов относительно функции CreateProcess слегка изменим код, чтобы обновить оптимизатор:&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-nQZs73VxQSopzLcZF9j4kaUe51xdhNA2EhAnPBx15r81wj8WLh1x226-DIvehLuymv7Alp_R4mqsE8I3T38bCvbWKq-qzzquzN6_dVIYobmjw3ACEk6vUOONNm1x-5nK-dYQ219ZPaCd/s1600-h/cp4.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 198px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-nQZs73VxQSopzLcZF9j4kaUe51xdhNA2EhAnPBx15r81wj8WLh1x226-DIvehLuymv7Alp_R4mqsE8I3T38bCvbWKq-qzzquzN6_dVIYobmjw3ACEk6vUOONNm1x-5nK-dYQ219ZPaCd/s320/cp4.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5288870640991118418&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;   &lt;/p&gt;&lt;p&gt;Теперь программа исполняется так как положено. Единственное, что мне необходимо было сделать, чтобы обойти этот баг – это изменить описание функции. Вместо:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;function&lt;/span&gt; RunDosAndWait(&lt;span style=&quot;font-weight: bold;&quot;&gt;const&lt;/span&gt; CommandLine:&lt;span style=&quot;font-weight: bold;&quot;&gt; string&lt;/span&gt;; OutSrings: TStrings): boolean;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;написать&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;function&lt;/span&gt; RunDosAndWait(&lt;span style=&quot;font-weight: bold;&quot;&gt;var&lt;/span&gt; CommandLine: &lt;span style=&quot;font-weight: bold;&quot;&gt;string&lt;/span&gt;; OutSrings: TStrings): boolean;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Все - с этим разобрались, но в этой же процедуре осталась ошибка с процедурой OemToChar, переводящей кириллический текст из консоли в удобочитаемый вид. Но об этом – в другой раз.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/6026516575179558004/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/delphi-2009.html#comment-form' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/6026516575179558004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/6026516575179558004'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/delphi-2009.html' title='Перевод проекта на Delphi 2009 – первые грабли'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO0iaqNWAPknke9_1BfAmci_wFH2lPOsktOC4996EILkcYVo5BvE4dDQjZ6dWuyDwDVRMyW2xic9ZWxfBi4YFrasVzD6k7qGMMUbys-5hD91bamRef-DiANtRR_CmNNTw65JtV1g-E_lBF/s72-c/cp5.jpg" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-6873213284945396120</id><published>2009-01-06T17:51:00.004+10:00</published><updated>2009-01-06T18:27:16.027+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Блог"/><category scheme="http://www.blogger.com/atom/ns#" term="ДВ"/><category scheme="http://www.blogger.com/atom/ns#" term="Размышления"/><title type='text'>Цели блога 2009</title><content type='html'>&lt;span xmlns=&quot;&quot;&gt;&lt;p&gt;Сегодня с утра бродил по Интернету в поисках чего-то сверхважного, ну и в итоге нашел совершенно не то, что искал. :) Нашел интересный блог - &lt;a href=&quot;http://blogproblog.com/&quot;&gt;«Блог про блоги от Дмитрия Донченко»&lt;/a&gt;. Почему то меня заинтересовала запись, в которой автором организуется эстафета &lt;a href=&quot;http://blogproblog.com/vashi-celi-dlya-bloga-na-2009-god-estafeta/&quot;&gt;«Интернет-цели 2009»&lt;/a&gt;. Немного пораздумав, решил тоже принять участие, но не в виде эстафеты, поскольку блогосфера у нас еще только начинает развиваться и то если начинает. Вот на пример у нас был один &lt;a href=&quot;http://blogion.ru/fomenko/&quot;&gt;довольно активный блогер&lt;/a&gt;, но умотал в Австралию ... Больше я о таковых не слышал, &lt;a href=&quot;http://toodoo.ru/catalogue/city/1064/%D0%91%D0%B8%D1%80%D0%BE%D0%B1%D0%B8%D0%B4%D0%B6%D0%B0%D0%BD&quot;&gt;TooDoo кстати тоже &lt;/a&gt;...  Отдельно стоят два прошлогодних стартапа - &lt;a href=&quot;http://79region.ru/&quot;&gt;Биробиджанский блог &lt;/a&gt;и &lt;a href=&quot;http://dvblog.ru/&quot;&gt;Дальневосточный IT-блог&lt;/a&gt;. Но они коллективные и узкоспециализированные, поэтому вернемся к моему блогу :)&lt;/p&gt;&lt;p&gt;Несмотря на то, что моему блогу уже более года, он еще зеленый. Отчасти это связано с текущей тематикой блога. Поэтому ставлю целью к двухлетию блога подойти более серьезно. :)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Как я писал в своей &lt;a href=&quot;http://deldev.blogspot.com/2009/01/blog-post.html&quot;&gt;предыдущей записи&lt;/a&gt; – основной целью на 2009 год у меня является освоение новых технологий – в первую очередь технологий Microsoft, в результате это отразится и на самом блоге, он уже не будет таким узко-тематическим, и, по всей видимости, сменит название. По крайней мере, на сегодняшний день это как цель. &lt;/p&gt;&lt;p&gt;Второй целью является переезд блога с Blogger&#39;а. Что-то в последнее время перестал мне нравится этот сервис. Скорее всего блог превратится в standalone и публикации в нем будут появляться более регулярно. &lt;/p&gt;&lt;p&gt;Ну наверное еще читателей побольше, и в рейтинге повыше. Почему то хочется в ТОП1000 на яндекс.блогах и сотню на счетчике feedburner.&lt;/p&gt;&lt;p&gt;Вот такие пока цели, на мой взгляд довольно достижимые. Посмотрим, что из этого всего получится. Обсудим через год. ;-)&lt;/p&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/6873213284945396120/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/2009.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/6873213284945396120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/6873213284945396120'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/2009.html' title='Цели блога 2009'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-4011278373074622917</id><published>2009-01-05T23:49:00.005+10:00</published><updated>2009-01-10T13:34:08.569+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="Программы"/><category scheme="http://www.blogger.com/atom/ns#" term="Размышления"/><title type='text'>Новый год – новые технологии</title><content type='html'>&lt;p&gt;Возможно, данный пост несколько запоздал, но я только что вернулся из поездки в Хабаровск и только сейчас смог спокойно сесть перед компьютером, чтобы отдохнуть и предаться размышлениям.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;На мой взгляд, новогодние каникулы имеют большой смысл. Это время, когда старый год уже ушел, а новый еще вроде как и не наступил. Вся суета, которая обычно случается под конец года уже позади и можно спокойно оглянуться назад, на то, что уже сделано или наоборот не сделано, и посмотреть вперед.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Так как я в прошедшем году так или иначе был связан с программированием, а именно с программированием в среде Delphi, то хочу заострить внимание на ней. Что же случилось за прошедший год с Delphi? А произошло два важных события: 1) в очередной раз перепродались – на этот раз компании Embarcadero 2) выпустили новую версию среды.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Выпущенная версия Delphi имеет номер 12. Существует поверие, которого я тоже придерживаюсь, что наиболее стабильными и удачными являются нечетные версии Delphi. Я работаю с Delphi начиная с 3-й версии, и в основном пользовался именно нечетными версиями. Взять, например такой шедевр, как Delphi 7 не потерявшей актуальности и по сей день. Но как из любого правила есть исключение и таким исключением явилась Delphi версии 9, более известная как Delphi 2005 – полностью провальная и глючная версия. И на сегодняшний момент я считаю наиболее стабильной 11-ю версию среды – Delphi 2007.&lt;br /&gt;&lt;/p&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;p&gt;Это то, что касалось второго пункта. Теперь первый. Глубоко сомневаюсь, что все эти перестроения пошли продукту на пользу. Есть хорошая поговорка – «Новая метла по новому метет», ну и намела она, на отсутствие обратной совместимости с большим количеством сторонних компонентов и на отсутствие исходных кодов, которые раньше стабильно поставлялись с каждой версией Delphi.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ладно, оставим в покое саму среду – на самом деле она не такая уж и плохая, и я не сколько не жалею, что посвятил ей очень много времени. Основная проблема мне видится в самой поддержке своих разработчиков от производителя. Вот, к примеру, захотелось мне создать мега стартап, неважно какой. Что мне для этого необходимо? Инструмент. Я неплохо знаю Delphi и хочу использовать его. Версии Turbo Explorer мне явно не достаточно, да и устарела она уже, следовательно, мне придется выкладывать деньги за полную версию ПО (к слову - Delphi 2009 for Win32 Professional Box - 30300 руб). А если разработчик не один – то получается довольно приличная сумма для стартапа.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;В то же время, ближайший оппонент – компания Microsoft предлагает довольно интересную программу – &lt;a href=&quot;http://www.microsoft.com/BizSpark/&quot;&gt;BizSpark&lt;/a&gt;. Подробнее писать о ней не буду (или пока не буду, кому интересно – можно пойти по ссылке или почитать &lt;a href=&quot;http://blogs.msdn.com/serpo_msdn/archive/2008/12/19/9242185.aspx&quot;&gt;тут&lt;/a&gt;, кстати впервые о ней я услышал на днях разработчика, которые &lt;a href=&quot;http://deldev.blogspot.com/2008/11/blog-post.html&quot;&gt;проходили&lt;/a&gt; в Хабаровске). Скажу суть – практически все технологии компании доступны для стартапов, на определенных условиях, но все же доступны. А где альтернатива от Embarcadero?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Вот отсюда и получается, что мне как разработчику на данный момент выгоднее пользоваться технологиями Microsoft для создания новых проектов. Отсюда и получаются новые приоритеты на 2009 год, которые уже давно подогреваются мыслями о смене языка и переходом на платформу .NET.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/4011278373074622917/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2009/01/blog-post.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/4011278373074622917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/4011278373074622917'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2009/01/blog-post.html' title='Новый год – новые технологии'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-7078117726880534231</id><published>2008-12-31T01:11:00.003+10:00</published><updated>2008-12-31T01:15:05.523+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="Программы"/><category scheme="http://www.blogger.com/atom/ns#" term="Размышления"/><title type='text'>Размышления о бесперспективности рынка</title><content type='html'>&lt;span xmlns=&quot;&quot;&gt;&lt;p&gt;При написании одного &lt;a href=&quot;http://dvblog.ru/blog/topic/104/&quot;&gt;комментария&lt;/a&gt; в &lt;a href=&quot;http://dvblog.ru/&quot;&gt;Дальневосточнй IT блог&lt;/a&gt; обратился к своим старым постам, &lt;a href=&quot;http://deldev.blogspot.com/search/label/Delphi%20for%20PHP&quot;&gt;касающихся Delphi for PHP&lt;/a&gt;, и обнаружил там один интересный &lt;a href=&quot;https://www.blogger.com/comment.g?blogID=5451681982052498183&amp;amp;postID=5785097049741729283&quot;&gt;комментарий&lt;/a&gt; от анонимного пользователя. Который утверждает, что российский рынок бесперспективен для западных разработчиков, почему в них и нет поддержки русского языка, аргументируя, что у нас привыкли воровать софт. Ну, на самом деле это не аргумент, по себе других не судят.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Если взять лидера рынка ПО – компанию Microsoft – то получается же все наоборот. Не так давно компания завершила перевод всей документации содержащейся в &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/library/default.aspx&quot;&gt;MSDN на русский язык&lt;/a&gt;, вышли их программы и инструменты на русском языке – &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/vstudio/bb332392.aspx&quot;&gt;Visual Studio&lt;/a&gt;, &lt;a href=&quot;http://msdn.microsoft.com/ru-ru/sqlserver/bb671254(en-us).aspx&quot;&gt;SQL Server&lt;/a&gt; и многие другие. Зачем это все, если наш рынок так плох?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Не помню точно где, но в каком-то блоге читал – автор пишет, что Microsoft – коммерческая компания, целью создания которой является получение прибыли. Зачем им тогда это все? Проделана колоссальная работа по переводу всей документации, а ведь Microsoft не благотворительная организация.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Прихожу к выводу, что не все так однозначно с нашим рынком :) и автор комментария, по меньшей мере, заблуждается. Ведь в последнее время в нашей стране ситуация с пиратским ПО постепенно улучшается, что не может меня не радовать как разработчика. Немалую роль в улучшении ситуации, на мой взгляд, играют и принимаемые законодательные меры и усилия разработчиков ПО. К примеру, &lt;a href=&quot;http://www.kaspersky.ru/&quot;&gt;Лаборатория Касперского&lt;/a&gt;. В свое время благодаря пиратству их антивирус приобрел довольно большую популярность, а потом – «ваш ключ занесен в черный список» и хоть ты тресни, но не найти рабочего ключа в сети. И стали покупать. А куда деться то? Ведь вирусы никуда не делись. А остальные решения – какие то не серьезные. Особенно NOD32 – сколько раз уже приходилось восстанавливать систему «защищенную» им, но пораженную древним вирусом lovesun.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;На этом завершаю свои предновогодние философствования, а то так можно тоже скатиться к «религиозной войне» которая &lt;a href=&quot;http://dvblog.ru/blog/topic/104/&quot;&gt;разгорелась&lt;/a&gt; на Дальневосточном блоге по поводу PHP.&lt;/p&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/7078117726880534231/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2008/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/7078117726880534231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/7078117726880534231'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2008/12/blog-post.html' title='Размышления о бесперспективности рынка'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-1060872986353269083</id><published>2008-12-29T00:30:00.001+10:00</published><updated>2009-01-10T13:36:18.249+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi for Win32"/><category scheme="http://www.blogger.com/atom/ns#" term="Курсоры"/><category scheme="http://www.blogger.com/atom/ns#" term="Ресурсы"/><title type='text'>Использование собственных курсоров в Delphi</title><content type='html'>&lt;p&gt;На днях мне задали довольно тривиальный вопрос: &quot;Как сделать собственные курсоры в Delphi?&quot;. Что, думаю, в сети разве нет информации по этому поводу? Методом &quot;гугления&quot; обнаружил статью на &lt;a href=&quot;http://www.delphisources.ru/pages/faq/base/own_cursors.html&quot;&gt;DelphiSources&lt;/a&gt; - была первая в списке. Но это не совсем то, просмотрев еще несклько ресурсов, бросил это дело. И хотя вся процедура создания и подключения курсоров, да и других ресурсов довольно проста, но она не прозрачна и содержит много подводных камней, и может вызвать затруднения у начинающего программиста. &lt;p&gt;Итак, что мы имеем? Тривиальная задача из студенчества: создание примитивнейшего графического редактора. Необходимо подключить к программе и использовать курсоры для карандаша и резинки.&lt;br /&gt;&lt;p&gt;Собственно курсоры создаются в программе ImageEditor входящей в поставку Delphi 7 (именно для этой версии прозвучал порос). Процесс рисования курсора опустим - там все достаточно просто. Первые проблемы могут возникнуть при попытке подключения курсоров к программе.&lt;br /&gt;&lt;p&gt;В некоторых статьях рекомендуют открывать файл ресурсов, создаваемый в приложении по умолчанию и добавлять курсоры туда. Я не советую так делать, поскольку в свое время наколося на этом - среда просто переписала созданный файл (не помню зачем - ей виднее) и все курсоры пропали, пришлось делать заново - что не очень приятно. Поэтому будем делать собственный файл ресурсов, тем более что в этом нет ничего сложного.&lt;br /&gt;&lt;span class=&quot;fullpost&quot;&gt;&lt;br /&gt;&lt;p&gt;Для создания ресурсов нам понадобится утилита brcc32.exe (Borland Resource Compiler) - которая распологается в каталоге с Delphi. Я рекомендую создать отдельный подкаталог &quot;resources&quot; в каталоге с проектом и разместить там все необходимые файлы для создания файла с собственными ресурсами. Туда же скопировать и эту утилиту.&lt;br /&gt;&lt;p&gt;&lt;img id=&quot;BLOGGER_PHOTO_ID_5284838074772748482&quot; style=&quot;DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 294px; CURSOR: hand; HEIGHT: 320px; TEXT-ALIGN: center&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOn7n0aCcrSOAkBCiCOqdmKrvL3rIdWxxhufCDc0-YadTH9K9kVLTjpczXUH52Ry5Tm-abpKFBylpwhnEQ6m50XLY87H2-CY7UnAjiGHtqyB9wWgcR8ipZANTazoIy0a37SbjTmU6UpxH6/s320/resources_dir.jpg&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;p&gt;Теперь необходимо подготовить файлик для компиляции ресурсов. Неоходимо открыть блокнот и описать каждый курсор в следующем формате:&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;ИМЯ_РЕСУРСА ТИП_РЕСУРСА ПУТЬ_К_РЕСУРСУ&lt;/p&gt;&lt;p align=&quot;left&quot;&gt;Для исключения возможных неточностей следует имя ресурса сразу же писать заглавными латинскими буквами. Чтобы мои ресурсы можно было легко увидеть в одном месте я именую их все с заглавной буквы Z - так проще. Реальный файл с описаниями ресурсов одного из моих проектов представлен ниже:&lt;/p&gt;&lt;p&gt;&lt;img id=&quot;BLOGGER_PHOTO_ID_5284840814235193810&quot; style=&quot;DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 165px; TEXT-ALIGN: center&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_ZukU8bek-uo9zGNfpct9e0D-1Q_gXEk6yaX58DAmyBhvqzDEgZA_29V8qahDXypY5Ihy8nGgRE9T7pQxIua2uFwwyA1AzISRwrbIhlirjaOdYikSrSqtQ_7Ji7e4tj86Bb49eTkon9Hw/s320/rc.jpg&quot; border=&quot;0&quot; /&gt;В нашем случае необходимо написать следующее:&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;ZCURSOR_PEN CURSOR pen.cur&lt;br /&gt;ZCURSOR_ERR CURSOR err.cur &lt;/p&gt;&lt;p align=&quot;left&quot;&gt;и сохранить в файле cursors.rc. Теперь остается только выполнить из командной строки команду &lt;strong&gt;&lt;em&gt;brcc32 cursors.rc &lt;/em&gt;&lt;/strong&gt;в результате чего создастся файл с ресурсами cursors.res, содержащий в себе наши курсоры.&lt;/p&gt;&lt;p align=&quot;left&quot;&gt;Теперь остается только подключить этот файл к проекту, делается это следующей директивой &lt;strong&gt;&lt;em&gt;{$R cursors.res}. &lt;/em&gt;&lt;/strong&gt;В моем проекте это сделано следующим образом:&lt;/p&gt;&lt;p&gt;&lt;img id=&quot;BLOGGER_PHOTO_ID_5284843542766143890&quot; style=&quot;DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 62px; TEXT-ALIGN: center&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQuyfuNWC6lKiC3wog3ATCqkSx4mwvIOfuZDPhiZWkyvtwxdQsp4hNp4knSCgDCczAG_Px0hnooTkqywdfQodtVl2vV-FQAtapGzMi6dldjLeXpaUJs7y8Eym6G4gux5P4qSQGl1LovuqZ/s320/res_delphi.jpg&quot; border=&quot;0&quot; /&gt;Затем объявляется числовая константа на каждый курсор, например:&lt;/p&gt;&lt;p&gt;crPen = 100;&lt;br /&gt;crErraser = 101;&lt;/p&gt;&lt;p&gt;и далее при инициализации формы следует подгрузить эти ресурсы:&lt;/p&gt;&lt;p&gt;Screen.Cursors[crPen] := LoadCursor(HInstance, &#39;ZCURSOR_PEN&#39;);&lt;br /&gt;Screen.Cursors[crErraser] := LoadCursor(HInstance, &#39;ZCURSOR_ERR CURSOR&#39;);&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ну и теперь, наконец-то, можно с ними работать как с обычными курсорами. Кстати, &lt;a href=&quot;http://www.realcoding.net/article/view/123&quot;&gt;тут &lt;/a&gt;можно посмотреть описание функций для работы с курсорами.&lt;/p&gt;&lt;p&gt;Вот собственно и все, довольно объемный пост получился, даже сам не ожидал :)&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/1060872986353269083/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2008/12/delphi.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/1060872986353269083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/1060872986353269083'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2008/12/delphi.html' title='Использование собственных курсоров в Delphi'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOn7n0aCcrSOAkBCiCOqdmKrvL3rIdWxxhufCDc0-YadTH9K9kVLTjpczXUH52Ry5Tm-abpKFBylpwhnEQ6m50XLY87H2-CY7UnAjiGHtqyB9wWgcR8ipZANTazoIy0a37SbjTmU6UpxH6/s72-c/resources_dir.jpg" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5451681982052498183.post-360282434183102329</id><published>2008-12-28T14:06:00.003+10:00</published><updated>2008-12-28T14:21:38.379+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="FIBPlus"/><category scheme="http://www.blogger.com/atom/ns#" term="Ошибки"/><title type='text'>И снова Delphi 2009</title><content type='html'>&lt;p&gt;Ура! Наконец то мне удалось запустить Delphi 2009 и избавиться от проблем о которых я &lt;a href=&quot;http://deldev.blogspot.com/2008/11/delphi-2009-3.html&quot;&gt;писал ранее&lt;/a&gt;. Решил проблему кардинально - поставил Microsoft Virtual PC (кстати, был очень удивлен - не знал что она теперь полностью бесплатна) - поднял на ней Windows XP и на чистую систему Delphi 2009 установилась без проблем. А вот в чем была истинная причина тех непонятных сбоев мне выяснить так и не удалось, но и ладно, и в виртуальной машине можно работать, только вот колесо прокрутки что то глючит иногда :)&lt;br /&gt;&lt;p&gt;Но на этом проблемы с ней не закончились. Мой проект, над которым я работаю последние несколько лет - отказался компилироваться. Те ошибки которые касались моего кода удалось довольно быстро локализовать и исправить (они касались несовместимости типов), а вот основная проблема случилась с компонентами FIBPlus. На настоящий момент на сайте разработчиков нет версии компонентов под эту версию Delphi, что очень жаль - непростительно тормозят разработчики! На полумертвом форуме на официальном сайте как то обнаружил запись, что они должны были выйти еще в ноябре ... Что ж, видимо это дух времени - обещать релиз и не выполнять обещания ...&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://deldev.blogspot.com/feeds/360282434183102329/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://deldev.blogspot.com/2008/12/delphi-2009.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/360282434183102329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5451681982052498183/posts/default/360282434183102329'/><link rel='alternate' type='text/html' href='http://deldev.blogspot.com/2008/12/delphi-2009.html' title='И снова Delphi 2009'/><author><name>Валерий</name><uri>http://www.blogger.com/profile/11450146015280942061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEAL6sTnWEW_yyY-S63dejsO9sZYfExEfhwuXwu_HZ13KZuOUXwwFIEtg_uMFA_zMmQlKRb_2pT5o7OIFjnVX89AN9lAIJEGJSFbc790unLPD4xdPR3eMQtI9MexMCJow/s220/1.jpg'/></author><thr:total>0</thr:total></entry></feed>