<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://delphi.forumkz.ru/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>Delphi.Forever</title>
		<link>https://delphi.forumkz.ru/</link>
		<description>Delphi.Forever</description>
		<language>ru-ru</language>
		<lastBuildDate>Tue, 30 Jun 2020 20:21:29 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>RE: Introduction &amp; Greetings - Miracle Digital Hong Kong</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=49#p49</link>
			<description>&lt;p&gt;At Miracle, Digital Marketing and Transformation Agency in Hong Kong, we help our clients improve digital services to make them simple, clear and fast. We help our client transform, create and improve their product in a digital way such as branding, web &amp;amp; app design, e-commerce solution, Digital Marketing strategy, Virtual Reality (VR) and Augmented Reality(AR).&lt;br /&gt;We are experts in their fields and enjoy challenging work. We work together to share knowledge and build our capability to improve user experiences. This helps us work smarter and more effectively. App Development HK Web Agency HK UX Solution UI Solution Shopify HK&lt;br /&gt;We are confident, capable and committed. We nurture curiosity and encourage our people to keep learning. We have flexible work arrangements and a supportive environment. We help our people balance their whole life and be the best version of themselves.&lt;br /&gt;At Miracle, Digital Marketing and Transformation Agency in Hong Kong, we help our clients improve digital services to make them simple, clear and fast. We help our client transform, create and improve their product in a digital way such as branding, web &amp;amp; app design, e-commerce solution, Digital Marketing strategy, Virtual Reality (VR) and Augmented Reality(AR).&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;https://www.miracles.com.hk/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/our-vision/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/our-vision/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/user-experience/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; xperience/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/user-interface/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; interface/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design-hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/web-development/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; velopment/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/wordpress-development/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; velopment/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/web-hosting-and-maintenance/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; intenance/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-online-shop/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/app-design-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/app-design-hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/app-design-hong-kong/app-ux-design-and-prototyping/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/app-design- &amp;#8230; ototyping/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-online-shop/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/shopify/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-o &amp;#8230; p/shopify/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/woocommerce/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-o &amp;#8230; ocommerce/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/digital-marketing/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/digital-marketing/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/digital-marketing/sem-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/digital-mar &amp;#8230; hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/digital-marketing/seo-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/digital-mar &amp;#8230; hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/virtual-reality-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/virtual-reality-hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/virtual-reality-hong-kong/webvr/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/virtual-rea &amp;#8230; ong/webvr/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/virtual-reality-hong-kong/interior-design-virtual-reality/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/virtual-rea &amp;#8230; l-reality/&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (timothybaker)</author>
			<pubDate>Tue, 30 Jun 2020 20:21:29 +0300</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=49#p49</guid>
		</item>
		<item>
			<title>Miracle Digital HK - Web Design HK</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=48#p48</link>
			<description>&lt;p&gt;At Miracle, Digital Marketing and Transformation Agency in Hong Kong, we help our clients improve digital services to make them simple, clear and fast. We help our client transform, create and improve their product in a digital way such as branding, web &amp;amp; app design, e-commerce solution, Digital Marketing strategy, Virtual Reality (VR) and Augmented Reality(AR).&lt;br /&gt;We are experts in their fields and enjoy challenging work. We work together to share knowledge and build our capability to improve user experiences. This helps us work smarter and more effectively. App Development HK Web Agency HK UX Solution UI Solution Shopify HK&lt;br /&gt;We are confident, capable and committed. We nurture curiosity and encourage our people to keep learning. We have flexible work arrangements and a supportive environment. We help our people balance their whole life and be the best version of themselves.&lt;br /&gt;At Miracle, Digital Marketing and Transformation Agency in Hong Kong, we help our clients improve digital services to make them simple, clear and fast. We help our client transform, create and improve their product in a digital way such as branding, web &amp;amp; app design, e-commerce solution, Digital Marketing strategy, Virtual Reality (VR) and Augmented Reality(AR).&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;https://www.miracles.com.hk/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/our-vision/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/our-vision/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/user-experience/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; xperience/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/user-interface/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; interface/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design-hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/web-development/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; velopment/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/wordpress-development/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; velopment/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/web-hosting-and-maintenance/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; intenance/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-online-shop/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/app-design-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/app-design-hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/app-design-hong-kong/app-ux-design-and-prototyping/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/app-design- &amp;#8230; ototyping/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-online-shop/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/shopify/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-o &amp;#8230; p/shopify/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/woocommerce/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-o &amp;#8230; ocommerce/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/digital-marketing/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/digital-marketing/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/digital-marketing/sem-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/digital-mar &amp;#8230; hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/digital-marketing/seo-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/digital-mar &amp;#8230; hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/virtual-reality-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/virtual-reality-hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/virtual-reality-hong-kong/webvr/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/virtual-rea &amp;#8230; ong/webvr/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/virtual-reality-hong-kong/interior-design-virtual-reality/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/virtual-rea &amp;#8230; l-reality/&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (timothybaker)</author>
			<pubDate>Tue, 30 Jun 2020 20:10:08 +0300</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=48#p48</guid>
		</item>
		<item>
			<title>RE: Introduction &amp; Greetings - Miracle Digital Hong Kong</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=47#p47</link>
			<description>&lt;p&gt;At Miracle, Digital Marketing and Transformation Agency in Hong Kong, we help our clients improve digital services to make them simple, clear and fast. We help our client transform, create and improve their product in a digital way such as branding, web &amp;amp; app design, e-commerce solution, Digital Marketing strategy, Virtual Reality (VR) and Augmented Reality(AR).&lt;br /&gt;We are experts in their fields and enjoy challenging work. We work together to share knowledge and build our capability to improve user experiences. This helps us work smarter and more effectively. App Development HK Web Agency HK UX Solution UI Solution Shopify HK&lt;br /&gt;We are confident, capable and committed. We nurture curiosity and encourage our people to keep learning. We have flexible work arrangements and a supportive environment. We help our people balance their whole life and be the best version of themselves.&lt;br /&gt;At Miracle, Digital Marketing and Transformation Agency in Hong Kong, we help our clients improve digital services to make them simple, clear and fast. We help our client transform, create and improve their product in a digital way such as branding, web &amp;amp; app design, e-commerce solution, Digital Marketing strategy, Virtual Reality (VR) and Augmented Reality(AR).&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;https://www.miracles.com.hk/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/our-vision/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/our-vision/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/user-experience/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; xperience/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/user-interface/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; interface/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design-hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/web-development/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; velopment/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/wordpress-development/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; velopment/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/web-design-hong-kong/web-hosting-and-maintenance/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/web-design- &amp;#8230; intenance/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-online-shop/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/app-design-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/app-design-hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/app-design-hong-kong/app-ux-design-and-prototyping/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/app-design- &amp;#8230; ototyping/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-online-shop/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/shopify/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-o &amp;#8230; p/shopify/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/ecommerce-online-shop/woocommerce/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/ecommerce-o &amp;#8230; ocommerce/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/digital-marketing/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/digital-marketing/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/digital-marketing/sem-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/digital-mar &amp;#8230; hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/digital-marketing/seo-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/digital-mar &amp;#8230; hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/virtual-reality-hong-kong/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/virtual-reality-hong-kong/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/virtual-reality-hong-kong/webvr/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/virtual-rea &amp;#8230; ong/webvr/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.miracles.com.hk/virtual-reality-hong-kong/interior-design-virtual-reality/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.miracles.com.hk/virtual-rea &amp;#8230; l-reality/&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (timothybaker)</author>
			<pubDate>Tue, 30 Jun 2020 20:09:01 +0300</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=47#p47</guid>
		</item>
		<item>
			<title>Не реклама</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=46#p46</link>
			<description>&lt;p&gt;Ага, слышал... пока не покупал, не было необходимости.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Ксардас)</author>
			<pubDate>Tue, 18 Jun 2019 17:03:33 +0300</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=46#p46</guid>
		</item>
		<item>
			<title>Новости</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=45#p45</link>
			<description>&lt;p&gt;Вот спасибо.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Лоракс)</author>
			<pubDate>Tue, 18 Jun 2019 17:00:03 +0300</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=45#p45</guid>
		</item>
		<item>
			<title>Ссылки</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=43#p43</link>
			<description>&lt;p&gt;&lt;span style=&quot;font-style: italic&quot;&gt;Давайте разнообразим ссылки на дельфи-ресурсы чем-то более &amp;quot;легким&amp;quot;. Вот помните, когда делали дипломы или курсовые, приходилось идти к тетенькам и за денежку прокалывать в них отверстия для скоросшивателя? А эти тетеньки постоянно где-то гуляли вместо того, чтобы работать. А был бы тогда дома дырокол для бумаги, хотя бы такой: &lt;a href=&quot;https://www.b2b-service.kz/dyrokoly/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.b2b-service.kz/dyrokoly/&lt;/a&gt; спокойно бы сделали это дома. К чему это я? А просто вспомнились институтские годы :)&lt;/span&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Ксардас)</author>
			<pubDate>Fri, 18 Jan 2019 17:14:40 +0300</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=43#p43</guid>
		</item>
		<item>
			<title>Что можно сделать при помощи...</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=42#p42</link>
			<description>&lt;p&gt;Видел нечто подобное на &lt;a href=&quot;https://www.kassa24.kz/cars&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.kassa24.kz/cars&lt;/a&gt; там, где оплата запасных деталей авто, можете с их разработчиками связаться и спросить может они вам по-быстрому что-то накидают, как по мне лучше ориентироваться на интернет онлайн задачи, а не на разного рода exe-шники.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Pro100Den)</author>
			<pubDate>Tue, 26 Jun 2018 11:09:14 +0300</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=42#p42</guid>
		</item>
		<item>
			<title>сайт delphi.kz</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=41#p41</link>
			<description>&lt;p&gt;А что это у нас такое? А это папка на 4 кольцах, купленная здесь: &lt;a href=&quot;https://www.b2b-service.kz/papki-na-koltsakh/kolichestvo-kolets-4-koltsa/.&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.b2b-service.kz/papki-na-kol &amp;#8230; 4-koltsa/.&lt;/a&gt; Конечно, всю СУБД в такой папке не сохранишь, но если их будет много, то нет предела совершенству)).&lt;br /&gt;Одно но: ни с Delphi, ни с SQL не совмещается.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Алена Байбакова)</author>
			<pubDate>Sat, 16 Jun 2018 22:53:12 +0300</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=41#p41</guid>
		</item>
		<item>
			<title>БД для начинающих</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=37#p37</link>
			<description>&lt;p&gt;&lt;strong&gt;Что такое базы данных?&lt;/strong&gt;&lt;br /&gt;Итак базы данных существуют следующих видов:&lt;br /&gt;1) Древовидные - простейший пример - Windows Registry, файловая система FAT и XML - здесь информация хранится в древовидной структуре и доступ осуществляется через &amp;quot;путь&amp;quot;, т.е. указание всех узлов от корневого до нужного. Например:&lt;br /&gt;&amp;quot;c:\My Docs\MyPictures\Me.jpg&amp;quot;. Недостатки этого способа хранения данных является очень медленный поиск, если не известен путь и очень плохая устойчивость к повреждениям структуры. Преимущество - возможность хранить в классифицированном виде очень разнородную информацию и очень быстрый поиск при знании ключа. Эти базы данных мы разбирать здесь не будем.&lt;br /&gt;2) Сетевые базы данных - простейший пример - интернет. Т.е. существуют узлы, обособленные друг от друга, содержащие определённую информацию. Каждый узел представляет какое-то количество ссылок на другие узлы, по которым и ведётся поиск. Недостатки - очень сложный и долгий поиск, возможна неполное предоставление информации или невозможность найти нужную информацию. Преимущества - очень легко добавить любую, разнородную информацию, самая высокая стабильность из всех систем. Эти базы данных мы разбирать здесь не будем.&lt;br /&gt;3) Объектные базы данных - новое веяние. Их мы разбирать здесь не будем, но интересующиеся найдут интересной &lt;br /&gt;дискуссию о них в нашем разделе по базам данных.&lt;br /&gt;4) Реляционные базы данных - именно с ними мы и будем работать. В дальнейшем если говорится &amp;quot;база данных&amp;quot;, то подразумевается &amp;quot;Реляционная база данных&amp;quot;. &amp;quot;Реляционный&amp;quot; - Relation - обозначает взаимосвязанный. С этими связями мы будем разбираться потом, а пока можно для простоты считать, что реляционная база данных - это набор двумерных простых таблиц. Недостатки реляционных баз данных - хранение только однородной информации, сложности в добавлении новых структур и взаимоотношений, информация хранящаяся в такой БД должна быть в нужной степени абстрагированна. &lt;br /&gt;Преимущества - прежде всего очень высокая скорость поиска - по этому параметру у реляционных баз данных конкурентов нет, высокая стабильность, обилие софта для их поддержки и разработки, удобность для очень широкого круга задач.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Реляционные базы данных?&lt;/strong&gt;&lt;br /&gt;Итак, Реляционная база данных упрощённо является набором таблиц. Таблица же есть основной строительный кирпичик базы данных. Расмотрим структуру таблицы. Для начала представте себе таблицу, например в Word...&lt;br /&gt;Что в ней есть?&lt;br /&gt;Во-первых есть строки и колонки (raw and columns). В базах данных, в отличие от Word есть строгие ограничения на их содержимое, да и терминология немного другая:&lt;br /&gt;1) Колонка называется тоже columns, но чаще употребляется понятие &amp;quot;поле&amp;quot; (field). Колонка всегда имеет имя (по которому ее можно найти) и обязана хранить данные только одного какого-либо типа - например целые числа, строки, дату/время и &lt;br /&gt;т.п. Создавая таблицу вы обязаны указать какой тип имеет каждое поле, другими словами, вы заранее должны определится, какого сорта данные будут хранится в колонке. Например, вот примерно так может выглядеть структура таблицы для хранения данных об участнике этого форума:&lt;br /&gt;· Ник - строка (25 символов) &lt;br /&gt;· ФИО - строка (250 символов) &lt;br /&gt;· Дата регистрации - Дата/время &lt;br /&gt;· Количество постингов - Целое &lt;br /&gt;· Показывать email - True/False &lt;br /&gt;Обратите внимание что для строк я указал конкретную длину, а для остальных ничего не указывал. Зачем? Ответ прост -&lt;br /&gt;каждая строка должна занимать строго одинаковое место (об исключениях потом), и это сделано для быстроты поиска. &lt;br /&gt;Действительно , если бы каждая строка имела разную длину, то чтобы найти например 1000 строку, надо было бы перечитать все 999 предыдущих строк, но если известно, что каждая строка занимает например 1Кб, то чтобы прочитать 1000 строку достаточно прочитать 1 Кб с 999Кб... Другая сторона этого - например мне надо сравнить даты в приведенной выше таблице - сделать это просто - я точно знаю что первую дату можно прочитать с 276 байта, и так же точно я знаю точные координаты каждой даты. Именно в этом и лежит одна из сторон высокой скорости работы баз данных (другие способы ускорения работы рассмотрим позже).&lt;br /&gt;2) Строка - в базах данных имеет специфическое название - запись (Record) - к Дельфийскому типу Record этот термин не имеет никакого отношения. Хотя большинство БД дают возможность перейти и прочитать например 10 запись, надо с самого начала попытаться никогда этим не пользоваться. Почему? Да просто потому что БД практически всегда подразумевают совместный доступ нескольких пользователей к одним и тем же данным, и если Вы хотите перейти на 10 запись, а другой пользователь в это время удалит запись номер 5, то вы перейдёте вовсе не на ту запись что ожидалось. А как же быть? У вас есть 2 способа - либо вы находите нужную запись по значению поля - например для нашей таблицы это будет выглядеть примерно так:&lt;br /&gt;&amp;quot;Найти пользователя [Вася] в первой колонке&amp;quot;&lt;br /&gt;В результате вы получите доступ ко всем полям записи для &amp;quot;Васи&amp;quot;. Либо вы берёте все записи и перебираете их в цикле пока не найдёте нужный - это гораздо худший способ, так как работает на 2-3 порядка медленнее и имеет другие неприятные последствия (об этом позже), но он возможен и иногда применяется. &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Первая программа с базами данных?&lt;/strong&gt;&lt;br /&gt;После небольшого теоретизирования спустимся с небес на землю откроем Дельфи и напишем простейшую программу для баз данных. Напишем, это громко сказано, потому что писать ничего не прийдётся, только компоненты потыкаем.&lt;br /&gt;Открываем новый проект. Открываем форму. Кладём на форму компонент TTable (с закладки &amp;quot;Data Access&amp;quot; или &amp;quot;BDE&amp;quot; - у кого какая версия Дельфей). Оп! Не ожидали - вроде бы и таблица, а компонт не визуальный! Итак компонент TTable - это пока основной компонент для нашей базы - всё обращение к таблице идёт только через него. Теперь давай-те его подсоединим к базе данных. &lt;br /&gt;К Дельфи прилогается учебная база данных, её мы и будем пользовать. Найдите свойство DatabaseName и из выпадающего списка выберите &amp;quot;DBDEMOS&amp;quot; - это и есть учебная база данных. Теперь берём свойство TableName и в выпадающем списке обнаруживаем список имён всех таблиц в базе данных &amp;quot;DBDEMOS&amp;quot;, выбираем например &amp;quot;biolife.db&amp;quot; - &lt;br /&gt;это таблица так называется (а в данном случае и название файла) &lt;br /&gt;Всё - таблица подсоединена, и с ней даже можно работать, но только в коде. А мы, как особо ленивые, попробуем на сегодня без кода обойтись, а подключить к таблице грид и другие визуальные компоненты. &lt;br /&gt;Но все визуальные компоненты могут подсоединится к TTable только через вспомогательный компонент TDataSource - находящийся на той же закладке. Ставим и его на форму. Находим свойство DataSet у этого компонента и в выпадающем списке указываем на Table1. Теперь визуальные компоенты будут &amp;quot;видеть&amp;quot; инфу в таблице через TDataSource.&lt;br /&gt;Переходим на другую закладку компонентов - &amp;quot;Data Controls&amp;quot; и ставим компоент TDBGrid. В его свойстве DataSource указываем на DataSource1. Что видим? Пока ничего! Таблица то не открыта - кликаем на Table1 и устанавливаем свойство Active в True. Работает!&lt;br /&gt;Можно программу откомпиллировать и поиграться со своим первым приложением для баз данных. Неправда ли очень просто! &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Визуальные компоненты для DB&lt;/strong&gt;&lt;br /&gt;Итак, мы не написав ни строчки кода получили простейшее приложение, работающее с базой данных. С помощью него мы можем просматривать и редактировать содержимое таблицы. Давайте теперь сделаем эту процедуру немного удобнее, на &lt;br /&gt;закладке &amp;quot;Data Control&amp;quot; есть компонент TDBNavigator. Положим его на форму и в инспекторе объектов поставим его &lt;br /&gt;свойство DataSource указывающим на тот же DataSource1, что и для DBGrid - собственно, теперь оба визуальных контрола(DBGrid и DBNavigator) привязаны к одному и тому же DataSource и через него к одной и той же таблицы. &lt;br /&gt;DBNavigator имеет несколько кнопок (вы можете настроить какие именно вы хотите видеть) дающие лёгкий контроль над следующими операциями:&lt;br /&gt;(перечисление в порядке расположения кнопок)&lt;br /&gt;1) Переход на первую запись &lt;br /&gt;2) Переход на предыдущую запись &lt;br /&gt;3) Переход на следующую запись &lt;br /&gt;4) Переход на последнюю запись &lt;br /&gt;5) Добавить запись &lt;br /&gt;6) Удалить запись &lt;br /&gt;7) Редактировать запись &lt;br /&gt;8) Сохранить изменения &lt;br /&gt;9) Отменить изменения &lt;br /&gt;10) Перечитать таблицу &lt;br /&gt;Обратите внимание, что запись (строка) таблицы есть как бы неделимый квант информации - т.е. отменяются действия произведенные для всей записи целиком, добавляется или удаляется тоже строка целиком. &lt;br /&gt;Разберём ещё несколько визуальных компонентов, чтобы покончить с визуализацией данных и перейти собственно к программированию.&lt;br /&gt;На закладке Data Controls есть ещё несколько важных компонентов, давайте поставим их на нашу форму: DBLabel, DBEdit, DBMemo и DBImage. Все их так же как и DBGrid соединим с DataSource1. Однако здесь мы обнаружим что этого недостаточно, эти компоненты работают с отдельной ячейкой в таблице, поэтому мы должны указать ещё поле (столбец) который они будут показывать. &lt;br /&gt;Давайте сделаем следуюшие - для каждого из этих компонентов укажем свойство DataField, например следующим образом:&lt;br /&gt;DBLabel - ассоциируем с полем Category&lt;br /&gt;DBEdit - ассоциируем с полем Common_name&lt;br /&gt;DBMemo - ассоциируем с полем Notes&lt;br /&gt;DBImage - ассоциируем с полем Graphic&lt;br /&gt;Можно откомпилировать программу и немного поиграться с ней. Итак что мы можем здесь увидеть? Что в каждый данный момент времени из всей таблицы у нас есть запись которая активная (текущая) - в DBGrid она показывается треугольничком слева. Именно с этой единственной записью мы и можем оперировать - удалять, добавлять, редактировать, именно её содержимое отображается в DBLabel, DBEdit, DBMemo, DBImage и именно она может быть изменена при помощи этих компонентов. Описанная только что структура позволяет работать только с одной записью в определённый момент времени, если вы переходите на другую запись то все изменения должны быть либо запомнены либо отменены! По умолчанию они запоминаются без всяких запросов, в чём вы можете убедиться меняя значения и переходя на другую запись.&lt;br /&gt;Поиск нужных данных&lt;br /&gt;Теперь разберём более эффективные способы нахождения нужной записи&lt;br /&gt;в таблице. &lt;br /&gt;А если нам надо перейти к вполне конкретной строке (записи)? Можно конечно&lt;br /&gt;организовать такой цикл и найти нужную запись, но это громоздко, неудобно,&lt;br /&gt;и главное очень медлено! Для этого можно использовать метод таблицы Locate.&lt;br /&gt;Например в нашей задаче нам надо найти запись где в поле Category значение&lt;br /&gt;&amp;quot;Cod&amp;quot;. Этого можно добится примерно следующим кодом:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;Table1.Locate(&#039;Category&#039;,&#039;Cod&#039;,[loCaseInsensitive]);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Можно &amp;quot;повесить&amp;quot; этот код на кнопку и убедится, что после выполнения этого&lt;br /&gt;кода активная запись стала именно та которая нам и нужна. Итак что же за параметры&lt;br /&gt;мы передаём этому методу? Первый параметер - это имя поля, второй параметер -&lt;br /&gt;это значение поля, третий опции поиска (см. справку Дельфи). А что будет если&lt;br /&gt;такого значения нет? Например:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;Table1.Locate(&#039;Category&#039;,&#039;Cod123&#039;,[loCaseInsensitive]);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Ничего не будет, правда метод Locate - это функция и она возвращает значение Boolean&lt;br /&gt;в зависимости от того, найдена запись или нет.&lt;br /&gt;Преобразовав код как&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;if Table1.Locate(&#039;Category&#039;,&#039;Cod123&#039;,[loCaseInsensitive]) then
showmessage(&#039;Record is located seccessful!&#039;)
else
showmessage(&#039;Record is not found!&#039;);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;можно убедится, что теперь мы знаем найдена запись или нет. Можно искать и по части&lt;br /&gt;значения, например&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;Table1.Locate(&#039;Category&#039;,&#039;Co&#039;,[])&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;не сможет найти запись, а&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;Table1.Locate(&#039;Category&#039;,&#039;Co&#039;,[loPartialKey])&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;вполне правильно найдёт запись с значением &#039;Cod&#039;.&lt;br /&gt;А если нам надо найти значение по двум полям? В этой таблице искать так бесполезно,&lt;br /&gt;так как все поля разные. Переключим таблицу на другую. Для этого удалим с формы&lt;br /&gt;все визуальные компоненты кроме DBGrid и DBNavigator (так как у новой таблицы&lt;br /&gt;будет совсем другой список полей). В коде напишем что-то&lt;br /&gt;типа:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 7.5em&quot;&gt;&lt;pre&gt;Table1.active:=false; //закрыли таблицу
Table1.tablename:=&#039;items.db&#039;;//ассоциируем с новой таблицей на диске
Table1.active:=true; //открыли таблицу&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Откомпилируем код, убедимся, что теперь мы видим совсем другую таблицу.&lt;br /&gt;Теперь давайте найдём такую запись, где ItemNo=1 и Discount=50, для этого нам надо&lt;br /&gt;применить Locate следующим образом:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;Table1.Locate(&#039;ItemNo;Discount&#039;,VarArrayOf([1,50]),[]);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Теперь несколько примечаний:&lt;br /&gt;1) Для Дельфи 6/7 - добавьте &amp;quot;Uses Variants;&amp;quot;&lt;br /&gt;2) Первый параметер - это список имён полей через ; без пробелов&lt;br /&gt;3) Второй параметер - это массив вариант - значений полей. Почему вариант? Потому что&lt;br /&gt;поля могут быть разных типов и в этом массиве вполне можно задать значения&lt;br /&gt;разных типов: VarArrayOf([1,&#039;Вася&#039;, True, 3.14]) &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Изменение данных в таблице&lt;/strong&gt;&lt;br /&gt;Теперь последний штрих о работе с таблицами. Мы разобрали способы обратиться к нужному столбцу и нужной записи, их поиск и чтение значений. А как записать новое значение? Для этого есть методы Edit, Append, Insert, Post и Cancel.&lt;br /&gt;1) Надо изменить текущую запись.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 7.5em&quot;&gt;&lt;pre&gt;Table1.edit; //переводим таблицу в режим редактирования 
Table1.fieldbyname(&#039;Category&#039;).asString:=&#039;New value&#039;;//изменяем поле 
Table1.post;//сохраняем изменения&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;2) Надо добавить новую запись.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 7.5em&quot;&gt;&lt;pre&gt;Table1.append; //переводим таблицу в режим добавления новой записи
Table1.fieldbyname(&#039;Category&#039;).asString:=&#039;New value&#039;;//присваиваем значение полей 
Table1.post;//сохраняем изменения&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Итого, как видим изменения данных производятся точно так же как и чтение, но перед изменением КАЖДОЙ записи таблица должна быть переведена в режим редактирования, а после изменения КАЖДОЙ записи изменения должны быть сохранены.&lt;br /&gt;В режим редактирования таблицу переводят следующие методы:&lt;br /&gt;Edit - редактирование текущей записи&lt;br /&gt;Append - добавление записи в конец таблицы&lt;br /&gt;Insert - вставка записи перед текущей&lt;br /&gt;Для выхода из режима редактирования служат методы:&lt;br /&gt;Post - запомнить изменения и выйти из режима редактирования&lt;br /&gt;Cancel - отменить сделанные изменения и выйти из режима редактирования&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 19:55:00 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=37#p37</guid>
		</item>
		<item>
			<title>Перенос программы управления базой данных на другой компьютер</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=29#p29</link>
			<description>&lt;p&gt;Довольно часто возникает необходимость переноса созданной программы управления базой данных на другой компьютер, например, для того чтобы продемонстрировать ее своим друзьям или знакомым. В отличие от процесса переноса обычной программы, когда, как правило, достаточно скопировать только выполняемый файл (ЕХЕ-файл), при переносе программы управления базой данных необходимо выполнить перенос BDE.&lt;/p&gt;
						&lt;p&gt;Здесь следует вспомнить, что BDE представляет собой набор программ, библиотек и драйверов, обеспечивающих работу прикладной программы с базой данных. Выполнить перенос BDE на другой компьютер вручную практически невозможно.&lt;/p&gt;
						&lt;p&gt;Поэтому Borland рекомендует создавать установочную программу, которая выполнит копирование всех необходимых файлов, в том числе и компонентов BDE. В качестве средства создания установочной программы Borland настоятельно рекомендует использовать утилиту InstallShield Express, которая входит в состав всех наборов Delphi. Поставляемая с Delphi версия этой утилиты специально адаптирована к задаче переноса и настройки BDE.&lt;/p&gt;
						&lt;p&gt;Можно попытаться установить BDE вручную. Ниже перечислены файлы (их имена определены опытным путем), необходимые для работы с базой данных Paradox:&lt;br /&gt;BLW32.DLL&lt;br /&gt;IDAPI32.DLL&lt;br /&gt;IDBAT32.DLL&lt;br /&gt;IDPDX32.DLL&lt;br /&gt;IDR20009.DLL&lt;br /&gt;USA.BLL&lt;br /&gt;CHARSET.BLL&lt;/p&gt;
						&lt;p&gt;Эти файлы нужно установить на компьютер пользователя, затем проверить, что в реестре Windows есть перечисленные ниже разделы и параметры:&lt;br /&gt;Раздел HKEY_LOCAL_MACHINESoftwareBorlandDatabase engine — параметр DLLPATH должен содержать путь к DLL-файлам BDE;&lt;br /&gt;Раздел HKEY_LOCAL_MACHINESoftwareBorlandBLW32 — параметр BLAPIPATH должен содержать путь к BLL-файлам BDE.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 06:15:33 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=29#p29</guid>
		</item>
		<item>
			<title>Справочник</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=28#p28</link>
			<description>&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Объявление процедуры&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;procedure ИмяПроцедуры(var Параметр1: Тип1;&lt;/p&gt;
						&lt;p&gt;var Параметр2: Тип2;&lt;/p&gt;
						&lt;p&gt;var ПараметрJ: TипJ } ; const&lt;/p&gt;
						&lt;p&gt;{ описание констант }&lt;/p&gt;
						&lt;p&gt;var&lt;/p&gt;
						&lt;p&gt;{ описание переменных } begin&lt;/p&gt;
						&lt;p&gt;{ инструкции процедуры } end;&lt;/p&gt;
						&lt;p&gt;Примечание&lt;/p&gt;
						&lt;p&gt;Слово var ставится перед именем параметра в том случае, если параметр используется для возврата значения из функции в вызвавшую ее программу.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Объявление функции&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;function ИмяФункции(var Параметр1: Тип 1; var Параметр2: Тип2;&lt;/p&gt;
						&lt;p&gt;var ПараметрJ: TиnJ ) : Тип; const&lt;/p&gt;
						&lt;p&gt;{ описание констант } var&lt;/p&gt;
						&lt;p&gt;/ описание переменных } begin&lt;/p&gt;
						&lt;p&gt;{ инструкции функции }&lt;/p&gt;
						&lt;p&gt;Result:=Значение; end;&lt;/p&gt;
						&lt;p&gt;Примечание&lt;/p&gt;
						&lt;p&gt;Слово var ставится перед именем параметра в том случае, если параметр используется для возврата значения из функции в вызвавшую ее программу.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Инструкция while&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;while Условие do begin&lt;/p&gt;
						&lt;p&gt;{ инструкции ) end;&lt;/p&gt;
						&lt;p&gt;Сначала проверяется Условие, если оно истинно, то выполняются инструкции между begin и end. Затем снова проверяется Условие. Если оно выполняется, то инструкции цикла выполняются еще раз. И так до тех пор, пока Условие не станет ложным.&lt;/p&gt;
						&lt;p&gt;Примечание&lt;/p&gt;
						&lt;p&gt;Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Инструкция repeat&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;repeat&lt;/p&gt;
						&lt;p&gt;{ инструкции } until Условие;&lt;/p&gt;
						&lt;p&gt;Сначала выполняются инструкции цикла, которые расположены между repeat и until. Затем вычисляется значение выражения Условие, и если оно равно False, то инструкции цикла выполняются еще раз. И так до тех пор, пока значение выражения Условие не станет равным True.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Инструкция for&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Вариант 1 (с увеличением счетчика):&lt;/p&gt;
						&lt;p&gt;for Счетчик:=НачальноеЗначение to КонечноеЗначение do begin&lt;/p&gt;
						&lt;p&gt;{ здесь инструкции } end;&lt;/p&gt;
						&lt;p&gt;Инструкции между begin и end выполняется (КонечноеЗначение - НачальноеЗначение) + 1 раз.&lt;/p&gt;
						&lt;p&gt;ЕСЛИ НачальноеЗначение &amp;gt; КонечноеЗначение, ТО инструкции между begin И&lt;/p&gt;
						&lt;p&gt;end не выполняются.&lt;/p&gt;
						&lt;p&gt;Примечание&lt;/p&gt;
						&lt;p&gt;Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.&lt;/p&gt;
						&lt;p&gt;Вариант 2 (с уменьшением счетчика)&#039;.&lt;/p&gt;
						&lt;p&gt;for Счетчик:=НачальноеЗначение downto КонечноеЗначение do begin&lt;/p&gt;
						&lt;p&gt;{ здесь инструкции } end;&lt;/p&gt;
						&lt;p&gt;Инструкции между begin и end выполняется (НачальноеЗначение - КонечноеЗначение) + 1 раз.&lt;/p&gt;
						&lt;p&gt;Если НачальноеЗначение &amp;lt; КонечноеЗначение, то инструкции между begin и end не выполняются.&lt;/p&gt;
						&lt;p&gt;Примечание&lt;/p&gt;
						&lt;p&gt;Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Инструкции выбора &lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Инструкция if&lt;/p&gt;
						&lt;p&gt;Вариант 1: if-then-else. if Условие then&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt;{ Инструкции, которые выполняются, ) { если условие истинно. } end else&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt;{ Инструкции, которые выполняются, } { если условие ложно } end ;&lt;/p&gt;
						&lt;p&gt;Вариант 2. if-then.&lt;/p&gt;
						&lt;p&gt;if Условие then&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt;{ Инструкции, которые выполняются, } { если условие истинно. } end;&lt;/p&gt;
						&lt;p&gt;Примечание&lt;/p&gt;
						&lt;p&gt;Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Запись&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Вариант 1. Объявление записи в разделе переменных: Запись: record Поле1:Тип1; Поле2: Тип2;&lt;/p&gt;
						&lt;p&gt;ПолеJ: TиnJ; end;&lt;/p&gt;
						&lt;p&gt;Вариант 2. Сначала объявляется тип-запись, затем — переменная-запись:&lt;/p&gt;
						&lt;p&gt;type&lt;/p&gt;
						&lt;p&gt;ТипЗапись = record Поле1: Тип1; Поле 2:Тип2;&lt;/p&gt;
						&lt;p&gt;ПолеК: ТипК; end;&lt;/p&gt;
						&lt;p&gt;var&lt;/p&gt;
						&lt;p&gt;За пись: ТипЗапись;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Массив&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Объявление одномерного массива:&lt;/p&gt;
						&lt;p&gt;ИмяМассива: array [НижнийИндекс...ВерхнийИндекс] of ТипЭлементов;&lt;br /&gt;Объявление двумерного массива:&lt;/p&gt;
						&lt;p&gt;ИмяМассива: array [НижнийИндекс1..ВерхнийИндекс1,&lt;/p&gt;
						&lt;p&gt;НижнийИндекс2..ВерхнийИкдекс2] of ТипЭлементов;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Строки&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Объявление переменной-строки длиной 255 символов:&lt;/p&gt;
						&lt;p&gt;Имя:string;&lt;br /&gt;Объявление переменной-строки указанной длины:&lt;/p&gt;
						&lt;p&gt;Имя:string [ ДлинаСтроки ].&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Основные типы данных&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;К основным типам данных языка Delphi относятся: П целые числа (integer); П дробные числа (real); П символы (char);&lt;br /&gt;строки (string);&lt;br /&gt;логический тип (boolean).&lt;/p&gt;
						&lt;p&gt;Целые числа и числа с плавающей точкой могут быть представлены в различных форматах &lt;/p&gt;
						&lt;p&gt;Тип / Диапазон	&lt;br /&gt;Shortint	-128.. 127	&lt;br /&gt;Integer -32 768.. 32 767	&lt;br /&gt;Longint -2 147 483 648.. 2 147 483 647	&lt;br /&gt;Byte 0..255	&lt;br /&gt;Word 0..65535	&lt;br /&gt;Real 2,9e-39.. 1,7e38	&lt;br /&gt;Single 1,5e-45.. 3,4e38	&lt;br /&gt;Double 5,0e-324.. 1,7e308	&lt;br /&gt;Extended 3,4e-4932.. 1,1e4932	&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Структура модуля&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Модуль состоит из последовательности разделов. Каждый раздел начинается ключевым словом и продолжается до начала следующего раздела.&lt;/p&gt;
						&lt;p&gt;unit ИмяМодуля;&lt;/p&gt;
						&lt;p&gt;interface // раздел интерфейса&lt;/p&gt;
						&lt;p&gt;{ Здесь находятся описания процедур и функций модуля, коч-орые могут использоваться другими модулями. )&lt;/p&gt;
						&lt;p&gt;const // раздел объявления констант&lt;/p&gt;
						&lt;p&gt;{ Здесь находятся объявления глобальных констант модуля, которые могут использоваться процедурами и функциями модуля.}&lt;/p&gt;
						&lt;p&gt;type // раздел объявления типов&lt;/p&gt;
						&lt;p&gt;{ Здесь находятся объявления глобальных типов модуля,&lt;/p&gt;
						&lt;p&gt;которые могут использоваться процедурами и функциями модуля }&lt;/p&gt;
						&lt;p&gt;var // раздел объявления переменных&lt;/p&gt;
						&lt;p&gt;{ Здесь находятся объявления глобальных переменных модуля, которые могут использоваться процедурами и функциями модуля }&lt;/p&gt;
						&lt;p&gt;implementation // раздел реализации&lt;/p&gt;
						&lt;p&gt;{ Здесь находятся описания (текст) процедур и функций модуля) &lt;/p&gt;
						&lt;p&gt;end.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;Зарезервированные слова и директивы&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Зарезервированные слова:&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	&lt;br /&gt;and File	not then	 array For object to asm	&lt;br /&gt;function of type begin Goto or	unit case	&lt;br /&gt;If packed until const implementation procedure	&lt;br /&gt;uses constructor	In program var destructor	&lt;br /&gt;inherited record	while div inline repeat	with	&lt;br /&gt;do intenface set	xor downto Label else Mod	&lt;br /&gt;shr end	Nil string&lt;/p&gt;
						&lt;p&gt;Директивы:&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	&lt;br /&gt;absolute assembler external Far forward&lt;br /&gt; interrupt near private public virtual&lt;/p&gt;
						&lt;p&gt;продолжение следует..&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 05:04:07 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=28#p28</guid>
		</item>
		<item>
			<title>Рекомендуемая дополнительная литература</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=27#p27</link>
			<description>&lt;p&gt;1. Вирт Н. Алгоритмы и структуры данных / Пер. с англ. — М.: Мир, 1989. - 360 с., ил.&lt;/p&gt;
						&lt;p&gt;2. Гринзоу Лу. Философия программирования для Windows 95/NT / Пер. с англ. — СПб.: Символ-Плюс, 1997. — 640 с., ил.&lt;/p&gt;
						&lt;p&gt;3. Зелковиц М., Шоу А., Гэннон Дж. Принципы разработки программного обеспечения / Пер. с англ. — М.: Мир, 1982. — 386 с., ил.&lt;/p&gt;
						&lt;p&gt;4. Практическое руководство по программированию / Пер. с англ. Б. Мик, П. Хит, Н. Рашби и др.; под ред. Б. Мика, П. Хит, Н. Рашби. — М.: Радио и связь, 1986. — 168 с., ил.&lt;/p&gt;
						&lt;p&gt;5. Фокс Дж. Программное обеспечение и его разработка / Пер. с англ. — М.: Мир, 1985. - 368 с., ил.&lt;/p&gt;
						&lt;p&gt;6. Язык компьютера. Пер. с англ, под ред. и с предисл. В. М. Курочки-на. — М.: Мир, 1989. - 240 с., ил.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 04:53:39 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=27#p27</guid>
		</item>
		<item>
			<title>Создание визуальных компонентов в Delphi</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=26#p26</link>
			<description>&lt;p&gt;При первом знакомстве с delphi несомненно удивляешься великому множеству разных визуальных компонентов. Кнопочки, панельки, надписи и многое другое. Но после нескольких месяцев пользования этой средой разработки появляется желание написать что-то свое. Именно эту задачу мы и попытаемся решить используя инвентарь delphi который есть в у нас в наличии и естественно свое воображение. &lt;/p&gt;
						&lt;p&gt;Постановка задачи&lt;/p&gt;
						&lt;p&gt;Для начала определимся, что и как мы будем делать. В этом вопросе большую роль играет ваше воображение, эстетические предпочтения и т.д. Я же в силу своей распущенности предложу Вам в качестве примерного варианта создать кнопку нестандартной формы, а именно – овальной.&lt;/p&gt;
						&lt;p&gt;Реализация&lt;/p&gt;
						&lt;p&gt;Наиболее правильным, с точки зрения иерархии vcl, методом решения первого пункта поставленной задачи, будет создание нового компонента, в качестве базового класса которого мы выберем tcustomcontrol. Этот класс является базовым для создания компонентов-надстроек над визуальными объектами windows, и предоставляет методы для отрисовки объектов разных форм. Если же у вас нет необходимости наследовать все особенности поведения объектов windows то можете в качестве базового класса использовать tgraphiccontrol, наследники которого отрисовываются быстрее, поскольку не должны следить за уймой Виндовских служебных сообщений.&lt;/p&gt;
						&lt;p&gt;Сам компонент tcustomcontrol определен в модуле controls.pas следующим образом:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 21em&quot;&gt;&lt;pre&gt;tcustomcontrol = class(twincontrol)
private
fcanvas: tcanvas;
procedure wmpaint(var message: twmpaint); message wm_paint;
protected
procedure paint; virtual;
procedure paintwindow(dc: hdc); override;
property canvas: tcanvas read fcanvas;
public
constructor create(aowner: tcomponent); override;
destructor destroy; override;
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Здесь самым интересным для нас является метод paint и свойство canvas. Посредством этих двух членов класса tcustomcontrol мы и будет рисовать нашу кнопку.&lt;/p&gt;
						&lt;p&gt;Кроме этого мы немножко расширим функциональность нашего компонента и придадим ему возможность устанавливать цвет темного и светлого участка своей границы, а также ее толщину, и наконец определим свойство flat которое отвечает за функциональность аналогичного свойства стандартных компонентов delphi.&lt;/p&gt;
						&lt;p&gt;Исходя из вышесказанного прототип нашего компонента (tellipsebutton) будет выглядеть следующим образом:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;tellipsebutton = class(tcustomcontrol)
private
fdarkcolor,flightcolor,fbackcolor:tcolor;
fsize:integer;
fpushed:boolean;
rgn:hrgn;
fflat:boolean;
fdrawflat:boolean;
fonmouseenter,fonmouseleave:tnotifyevent;
{ private declarations }
protected
procedure setdarkcolor(value:tcolor);
procedure setlightcolor(value:tcolor);
procedure setsize(size:integer);
procedure setbackcolor(value:tcolor);
procedure dblclick;override;
procedure drawflat;dynamic;
procedure drawnormal;dynamic;
procedure drawpushed;dynamic;
procedure wmlbuttondown(var message:twmmouse);message wm_lbuttondown;
procedure wmlbuttonup(var message:twmmouse);message wm_lbuttonup;
procedure wmmousemove(var message:twmmousemove);message wm_mousemove;
procedure cmmouseenter(var message:tmessage);message cm_mouseenter;
procedure cmmouseleave(var message:tmessage);message cm_mouseleave;
procedure cmtextchanged(var message:tmessage);message cm_textchanged;
procedure setflat(value:boolean);
procedure domouseenter;
procedure domouseleave;
{ protected declarations }
public
constructor create(aowner:tcomponent);override;
procedure afterconstruction;override;
destructor destory;virtual;
procedure repaint;override;
procedure paint;override;
{ public declarations }
property canvas;
published
property darkcolor:tcolor read fdarkcolor write setdarkcolor default clblack;
property lightcolor:tcolor read flightcolor write setlightcolor default clwhite;
property backcolor:tcolor read fbackcolor write setbackcolor default clbtnface;
property size:integer read fsize write setsize;
property flat:boolean read fflat write setflat;
property caption;
{events}
property onclick;
property ondblclick;
property onmousemove;
property onmousedown;
property onmouseup;
property onmouseenter:tnotifyevent read fonmouseenter write fonmouseenter;
property onmouseleave:tnotifyevent read fonmouseleave write fonmouseleave;
{ published declarations }
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Как видим, здесь помимо базовых конструктора create и метода afterconstruction переопределены и методы paint и repaint.&lt;/p&gt;
						&lt;p&gt;Вся функциональность этого компонента в основном заключена в динамических методах drawflat, drawnormal, drawpushed которые отвечают за рисование компонента соответственно в режиме flat, в нормальном приподнятом режиме и в нажатом режиме.&lt;/p&gt;
						&lt;p&gt;Собственно рисование делается с помощью метода canvas.arc, который рисует часть эллипса заданным цветом. Таким образом мы рисуем одну половину темным цветом а другую – светлым и получаем эффект выпуклости. Поменяв местами цвета мы достигаем эффекта «нажатия» для нашей кнопки. Ну а использовав в качестве цвета фона – средний между темным и светлым цветами границы – мы получаем ефект flat:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;procedure tellipsebutton.drawflat;
var x,y:integer;
begin
canvas.lock;
try
inherited paint; 
canvas.brush.color:=backcolor;
canvas.pen.color:=clgray;
canvas.arc(0,0,width,height,0,height,width,0);
canvas.brush.style:=bsclear;
canvas.ellipse(clientrect);
canvas.font.size:=5;
x:=self.clientwidth-canvas.textwidth(caption);
x:=x div 2;
y:=self.clientheight-canvas.textheight(caption);
y:=y div 2;
canvas.textrect(self.clientrect,x,y,caption);
finally
canvas.unlock;
end;
end;

procedure tellipsebutton.drawnormal;
var i:integer;x,y:integer;
begin
canvas.lock;
try 
inherited paint; 
canvas.brush.style:=bsclear;
canvas.brush.color:=backcolor;
canvas.pen.color:=darkcolor;
canvas.arc(0,0,width,height,0,height,width,0);
for i:=0 to fsize do
canvas.arc(i,i,width-i,height-i,i,height-i,width-i,i);
canvas.pen.color:=lightcolor;
canvas.arc(0,0,width,height,width,0,0,height);
for i:=0 to fsize do
canvas.arc(i,i,width-i,height-i,width-i,i,i,height-i);
canvas.brush.style:=bsclear;
canvas.font.size:=5;
x:=self.clientwidth-canvas.textwidth(caption);
x:=x div 2;
y:=self.clientheight-canvas.textheight(caption);
y:=y div 2;
canvas.textrect(self.clientrect,x,y,caption);
finally
canvas.unlock;
end;
end;

procedure tellipsebutton.drawpushed;
var i:integer;x,y:integer;
begin
canvas.lock;
try
inherited paint;
canvas.brush.style:=bsclear;
canvas.brush.color:=backcolor;
canvas.pen.color:=lightcolor;
canvas.arc(0,0,width,height,0,height,width,0);
for i:=0 to fsize do
canvas.arc(i,i,width-i,height-i,i,height-i,width-i,i);
canvas.pen.color:=darkcolor;
canvas.arc(0,0,width,height,width,0,0,height);
for i:=0 to fsize do
canvas.arc(i,i,width-i,height-i,width-i,i,i,height-i);
canvas.brush.style:=bsclear;
canvas.font.size:=5;
x:=self.clientwidth-canvas.textwidth(caption);
x:=x div 2;
y:=self.clientheight-canvas.textheight(caption);
y:=y div 2;
canvas.textrect(self.clientrect,x,y,caption);
finally
canvas.unlock;
end;
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Теперь, оснастив наш компонент необходимыми функциями мы можем приступить к его «причесыванию», т.е. написанию рутинных методов по присвоению значений свойствам и отладке. Первым делом здесь надо реализовать реакцию компонента на события мыши. Это мы делаем посредством методов wmlbuttondown, wmlbuttonup, wmmousemove.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;procedure tellipsebutton.wmlbuttondown;
begin
inherited;
paint;
end;

procedure tellipsebutton.wmlbuttonup;
begin
inherited;
paint;
end;
procedure tellipsebutton.wmmousemove;
begin
inherited;
if csclicked in controlstate then
begin
if ptinrect(clientrect,smallpointtopoint(message.pos)) then
begin
if not fpushed then drawpushed;
fpushed:=true;
end else
begin
if fpushed then drawnormal;
fpushed:=false;
end
end;
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Здесь также мы реализуем функциональность свойства flat. (в wmmousemove).&lt;/p&gt;
						&lt;p&gt;Кроме этого мы используем методы cmmouseenter, cmmouseleave для вызова соответствующих обработчиков событий.&lt;/p&gt;
						&lt;p&gt;А также реализовываем метод cmtextchanged для правильного отображения текста кнопки:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;procedure tellipsebutton.cmtextchanged;
begin
invalidate;
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Теперь же дело только за методами paint и repaint, которые мы реализовываем следующим образом:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 27em&quot;&gt;&lt;pre&gt;procedure tellipsebutton.paint;
begin
if not fflat then
begin
if not (csclicked in controlstate) then
drawnormal else drawpushed;
end else
if fdrawflat then drawflat else
if not (csclicked in controlstate) then drawnormal else drawpushed;
end;

procedure tellipsebutton.repaint;
begin
inherited;
paint;
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Все. Теперь наш компонент готов к испытаниям. И перед тем как его регистрировать и кидать на палитру компонентов настоятельно рекомендую Вам проверить его функциональность в runtime режиме. В противном же случае вы рискуете повесить всю ide delphi при добавлении компонента на форму.&lt;/p&gt;
						&lt;p&gt;Проверка компонента&lt;br /&gt;Проверка компонента в runtime режиме не вызовет осложнений даже у новичка. Всего-то лишь надо:&lt;/p&gt;
						&lt;p&gt;-создать новое приложение &lt;br /&gt;-в секции uses разместить ссылку на модуль с вашим компонентом (ellipsebutton.pas) &lt;br /&gt;-объявить переменную типа tellipsebutton &lt;br /&gt;-создать компонент, заполнить все его свойства и показать. &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;unit main;

interface

uses
windows, messages, sysutils, variants, classes, graphics, controls, forms,
dialogs, mycontrols;

type
tform1 = class(tform)
ellipsebutton1: tellipsebutton;
procedure formcreate(sender:tobject);
procedure formdestroy(sender:tobject);
private
{ private declarations }
public
{ public declarations }
end;

var
form1: tform1;

implementation

{$r *.dfm}
procedure tform1.formcreate(sender:tobject);
begin
ellipsebutton1:=tellipsebutton.create(self);
ellipsebutton1.parent:=self;
ellipsebutton1.setbounds(10,10,100,100);
ellipsebutton1.visible:=true;
end;

procedure tform1.formdestroy(sender:tobject);
begin
ellipsebutton1.free;
end;

end.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;После такой, наглядной проверки и отладки вы можете спокойно регистрировать ваш компонент:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;procedure register;
begin
registercomponents(&#039;usable&#039;, [tellipsebutton]);
end;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;И использовать уже в ваших приложениях для быстрого создания эллипсоидных кнопок.&lt;/p&gt;
						&lt;p&gt;Итоги&lt;br /&gt;Теперь, обладая, мастерством рисования, и зная методику написания визуальных компонентов для delphi вы можете преспокойно написать любой замысловатый элемент интерфейса и даже продавать его как отдельный программный продукт за немаленькие деньги.&lt;/p&gt;
						&lt;p&gt;Источник: &lt;a href=&quot;http://www.gigabyte.iatp.org.ua&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.gigabyte.iatp.org.ua&lt;/a&gt; Автор: Михаил Продан&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 04:49:09 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=26#p26</guid>
		</item>
		<item>
			<title>Новости форума</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=22#p22</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;redasar написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Только более подробно, а не куски-переводы с англицкого сайта.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;Не обещаю но постараюсь (добавлю задачу в стек :D ) по окончании заполненич форума базовой инфой посидеть над переводами статей с википедии.&lt;/p&gt;&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;redasar написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Ты в одиночку все это затеял?!&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;Да, пока (я надеюсь только пока) я один. Но уже заинтрерсовал некоторых знакомых. Осталось доупросить их написать парочку статей. Так же я буду очень рад любой помощи от посетителей хоть даже совету.&lt;/p&gt;&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;redasar написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;От себя могу посерфить мусоросборник и выделить из него наиболее интересные моменты в основной форум (компоненты, исходники, etc)&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;Если все вышеперечисленное не ограничится одним (этим) постом, то был бы очень признателен.&lt;/p&gt;&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;redasar написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Да и помодерить на досуге тоже не прочь&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;Ну модераторские права я на основании одних обещаний выдавать разумеется не буду.&lt;br /&gt;Для того, чтобы стать модератором на ветке необходимо положительно себя на этой ветке зарекомендовать. В дальнейшем я планирую создать в категории /help создать ветку для приема/удаления модераторов. Но это пока только туманное будущее. Так как форум родился на свет сутки назад в ближайшее время основным критерием отбора в модеры будет десяток другой &amp;quot;полезных&amp;quot; (для развития форума) постов. А пока редасару + себе надежду на сотрудничество. &lt;br /&gt;З.Ы. Глядишь как для первого активного посетителя появится больше шансов стать злым модератором.&amp;#160; :D&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 04:21:40 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=22#p22</guid>
		</item>
		<item>
			<title>Delphi 7 Studio</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=21#p21</link>
			<description>&lt;p&gt;В данной посте приводятся рекомендации по настройке среды разработки Borland Delphi 7. Следует учитывать, что настройка любой рабочей среды - дело сугубо индивидуальное, и моя задача состоит не в написании некого кодекса, а описание плюсов и минусов выбора той или иной опции, опираясь на собственный опыт.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Вызов окна настройки осуществляется командой Tools | Environment options главного меню Delphi. Окно имеет десять страниц с опциями настройки:&lt;br /&gt;Preferences - общие настройки конфигурации окон среды (автосохранение конфигурации, встраиваемость окон IDE и конфигурация окон при компиляции и выполнении приложения).&lt;br /&gt;Designer - настройка внешнего вида окна Конструктора формы.&lt;br /&gt;Object inspector - настройка Инспектора объектов.&lt;br /&gt;Palette - настройка Палитры компонентов Delphi.&lt;br /&gt;Library - списки каталогов с файлами, используемыми средой Delphi.&lt;br /&gt;Explorer - настойка Обозревателя кода.&lt;br /&gt;Type library - настройки редактора библиотеки типов.&lt;br /&gt;Environment variables - переменные окружения среды Delphi.&lt;br /&gt;Delphi direct - опции обновления файлов среды через web.&lt;br /&gt;Internet - настройка работы с файлами и скриптами в Internet-приложениях.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Блок Autosave options осуществляет установку автоматического сохранения редактируемых файлов при компиляции приложения (флажок Editor files) и Рабочего стола текущего проекта при его закрытии (Project desktop). Для второго случая блок Desktop contents определяет, что именно будет сохранено на Рабочем столе: только состояние экрана проекта (Desktop only) или дополнительно будут сохранены символы последней успешной компиляции (Desktop and symbols).&lt;/p&gt;
						&lt;p&gt;&amp;#160; Хотя некоторые из моих знакомых устанавливают флажок Editor files, лично я считаю это неосмотрительным: если внесенные изменения будут сохранены, отменить их будет сложно. Кроме того, иногда полезно при проектировании делать некоторые эксперименты с кодом или компоновкой форм, которые не всегда удачны сразу, и в этом случае придется отменять исправления. Установка этого флажка не приносит защиты от случайной потери исправлений: намного полезнее делать резервную копию проекта после каждого существенного успешного изменения, предварительно не только откомпилировав, но и собрав проект командой [Project | Build [current project].&lt;/p&gt;
						&lt;p&gt;&amp;#160; Если Вы занимаетесь разработкой одного конкретного проекта в течение значительного времени, вам поможет опция Project desktop. Она позволит сохранить не только расположение окон проекта, но и открытые файлы Редактора кода и Конструктора форм. При следующем открытии проекта ваш Рабочий стол Delphi будет выглядеть таким, каким он был при последнем закрытии проекта. Если к тому же установлена опция Desktop and symbols, то будут восстановлены все замечания компилятора, сделанные при последней компиляции перед закрытием проекта.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Флажок Auto drag docking разрешает окнам IDE встраиваться друг в друга. Если он включен, то избежать неуместного встраивания можно, нажав при перемещении окна клавишу [Ctrl]. Некоторым разработчикам склонность окон Delphi к встраиванию мешает в работе. Если вы относитесь к их числу, снимите этот флажок.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Блок опций Compiling and running определяет свойства конфигурации окон при переходе среды в режимы компиляции и выполнения приложения. Вы можете вывести на экран окно информации о ходе процесса компиляции (Show compiler progress), просматривать замечания сборки пакетов при компиляции (Warn on package rebuild), заставить окна среды сворачиваться при запуске приложения на выполнение (Minimize on run) и сделать невидимыми окна проектирования во время выполнения приложения, оставив только окна Отладчика (Hide designers on run). &lt;/p&gt;
						&lt;p&gt;&amp;#160; Использование этих настроек - дело вкуса, но я заметил, что при включенной опции Minimize on run на некоторых компьютерах при возвращении к режиму редактирования Delphi виснет или выдает системную ошибку. Опция Hide designers on run полезна в процессе отладки приложения, позволяя сконцентрироваться на информации Отладчика и убирая ненужные в этом режиме окна разработки.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Поле внизу страницы определяет расположения каталога Депозитария Delphi (файл delphi32.dro). По умолчанию этот файл хранится в каталоге Bin в папке Delphi. Если того не требуют чрезвычайные обстоятельства, оставьте &amp;quot;ребенка&amp;quot; в его &amp;quot;колыбели&amp;quot;…&lt;br /&gt;Страница Designer&lt;/p&gt;
						&lt;p&gt;&amp;#160; Блок Grid options позволяет делать видимой сетку на форме (Display grid), привязывать к ней компоненты (Snap to grid) и изменять расстояние между линиями сетки (Grid size). Лично я предпочитаю шаг сетки 4x4 пикселя с автоматическим выравниванием компонентов по сетке. Если мне потребуется выставить положение компонента более точно, то я воспользуюсь комбинациями клавиш [Ctrl -&amp;lt;], [Ctrl -&amp;gt;], [Ctrl - ^] или [Ctrl - v].&lt;/p&gt;
						&lt;p&gt;&amp;#160; Опции описания в проекте новой формы в текстовом формате вместо бинарного (New form as text) и определения новых форм и модулей данных как автоматически создаваемых при запуске приложения (Auto create forms and data modules) я тоже включаю. Первое полезно, поскольку описание в текстовом формате, несмотря на несколько больший размер, позволяет контролировать описание формы и, при необходимости, легко его исправлять &amp;quot;на лету&amp;quot;. А второе позволяет не заботиться на начальных стадиях разработки и отладки о процессах создания и уничтожения форм и модулей данных. Когда придет время, я легко переведу их в статус доступных для создания на странице Forms параметров проекта (Project | Project options…).&lt;/p&gt;
						&lt;p&gt;&amp;#160; Флажок Show component caption полезен тем, что позволяет легко идентифицировать на форме несколько однотипных невизуальных компонентов. Иначе форма выглядела бы так…&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; При проектировании не менее важно оперативно отслеживать положение и размеры визуальных компонентов, а также другую информацию о дизайне компонентов. Контролировать эту информацию в Инспекторе объектов не всегда удобно. Поэтому установите флажки Show designer hints и Show extended control hints и просматривайте информацию об объекте, просто наведя на него указатель мыши.&lt;/p&gt;
						&lt;p&gt;&amp;#160; C помощью списка SpeedSettings можно быстро настроить цветовую палитру Инспектора объектов по одной из прилагаемых схем. Выбранную схему можно поправить с помощью расположенного ниже списка установки цвета для каждой категории элементов Инспектора объектов. &lt;/p&gt;
						&lt;p&gt;&amp;#160; Блок Options позволяет настроить внешний вид окна Инспектора объектов (сверху вниз): &lt;br /&gt;показывать выпадающий список объектов и их классов;&lt;br /&gt;отображать классы для всех объектов в списке (т.е. не только для выбранного в настоящий момент);&lt;br /&gt;показывать строку состояния;&lt;br /&gt;показывать линии сетки между свойствами или событиями;&lt;br /&gt;запретить показ неполных строк при изменении вертикального размера окна (если в окне нет других встроенных окон или если Инспектор объектов сам не встроен в другое окно);&lt;br /&gt;отображать свойства объекта, доступные только для чтения;&lt;br /&gt;выделять жирным шрифтом величины, отличающиеся от заданных по умолчанию.&lt;/p&gt;
						&lt;p&gt;&amp;#160; В основном, использование этих настроек - дело вкуса разработчика. Лично я предпочитаю выделять величины, значения которых отличаются от значений, принятых по умолчанию, чтобы осуществлять более гибкий контроль над проектом. Иногда полезно иметь перед глазами свойства, доступные только для чтения, но, с другой стороны, это может сбивать с толку…&lt;/p&gt;
						&lt;p&gt;&amp;#160; Блок опций References позволяет настроить отображение свойств-объектов в окне Инспектора объектов. Флажок Expand inline позволяет включать список свойств свойства-объекта внутрь списка текущего объекта. Например, если главное меню TMainMenu связано со списком пиктограмм TImageList свойством Images, то возле названия этого свойства появляется значок [+], при нажатии которого выпадает список свойств компонента TImageList. Это очень удобно, потому что можно настроить оба компонента одновременно, контролируя конечный результат. Флажок Show on events page позволяет такие же возможности на странице событий.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Эту страницу настроек можно вызвать командой меню Components | Configure palette или командой Properties всплывающего меню палитры компонентов Delphi.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Если в списке Pages выбрать страницу Палитры, то в списке Components отобразятся все установленные на нее компоненты с указанием на пакет, в котором они описаны и реализованы. Страницу можно добавить в Палитру, переименовать, удалить (если она пустая) и переместить вверх или вниз по списку страниц. Можно изменять состав страниц, скрывая некоторые компоненты кнопкой [Hide] или перетаскивая компоненты из одной страницы в другую.&lt;/p&gt;
						&lt;p&gt;&amp;#160; В список Library path добавляются каталоги, в которых находятся исходные пакеты компонентов. Откомпилированные пакеты *.bpl будут помещаться в папку, указанную в строке BPL output directory, а файлы *.dcp - в папку, указанную в параметре DCP output directory. Наконец, параметр Browsing path определяет каталоги, в которых Проводник кода ищет информацию об идентификаторах.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Все эти параметры задаются по необходимости…&lt;/p&gt;
						&lt;p&gt;&amp;#160; Отображение Обозревателя кода определяется опциями Explorer option. Флажок Automatically show Explorer снимите, если хотите окно Редактора кода сделать шире, не растягивая его над Инспектором объектов. Все-таки, Обозреватель реже нужен, чем Редактор.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Флажок включает выделение в окне Обозревателя незавершенных свойств и методов жирным шрифтом, например, если метод объявлен, но не реализован.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Если нужно, чтобы в окне отображались не только имена объектов, но и синтаксис объявления, то поставьте флажок Show declaration syntax.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Группа опций Explorer sorting позволяют выбрать тип сортировки списка объектов по алфавиту или по последовательности объявления в модуле.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Флажок Finish incomplete syntax позволяет автоматически добавлять в код шаблон реализации незавершенного свойства. В противном случае такая возможность будет только у незавершенных методов.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Группа Initial browser view определяет страницу, которая будет отображаться в Проводнике объектов при его выводе на экран. При этом в окне Проводника будет отображаться информация, определяемая в блоке Browser scope: либо информация только о символах модулей текущего проекта (Project symbols only), либо о символах всех модулей, явно или неявно используемых в проекте, включая модули VCL (All symbols). Последнее не рекомендую ввиду большого избытка информации. Но иногда это необходимо.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Список Explorer categories определяет состав объектов, отображаемых в Обозревателе кода и Проводнике объектов. Здесь все зависит от проекта и предпочтений его разработчика.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Группа SafeCall function mapping определяет, какие функции будут объявлены как SafeCall при преобразовании из Delphi в IDL при генерации библиотеки типов. Здесь важно понимать, что функции SafeCall автоматически применяют соглашение COM для ошибок и исключений, преобразуя код ошибки HResult в исключение. При выборе в блоке Languages языка IDL необходимо будет явно укзывать соглашения вызова как safecall или stdcall.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Можно использовать SafeCall для всех интерфейсов (All v-table interfaces), только для дуальных интерфейсов (Only dual interfaces) или вообще не использовать SafeCall (Do not map).&lt;/p&gt;
						&lt;p&gt;&amp;#160; Значение параметра Language определяет язык для описания интерфейсов в библиотеке типов. Я использую Pascal, хотя более &amp;quot;родным&amp;quot; для Windows и ее приложений является IDL.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Необходимые условия импорта ActiveX-компонентов определяются параметрами Ignore special CoClass flags when importing. Импортируются только те соклассы, для которых сняты соответствующие флаги в этой группе опций. По умолчанию помечен только флаг CanCreate, что позволяет импортировать объект для общего пользования.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Опция Display updates before refreshing включает вывод запроса на подтверждение обновления объекта. В противном случае при редактировании объект будет обновлен без предупреждения.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Имеет два списка: System variables, содержащий переменные окружения IDE Delphi, и User overrides, содержащий переменные, переопределенные пользователем. Переменным первого списка можно добавить переопределение. Ко второму списку можно добавлять свои переменные, изменять и удалять имеющиеся значения.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Если включен флаг Enable debugging, то при ошибке в скрипте будет запущен отладчик, установленный на компьютере. В противном случае будет выдано только сообщение об ошибке.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Мастер приложений Web будет присваивать html-файлам расширение, указанное параметром HTML file extension.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Если истинное изображение недоступно при проектировании, то вместо него будет выводиться рисунок, указанный в поле Sample image file.&lt;/p&gt;
						&lt;p&gt;&amp;#160; В этом окне индикатор Automatically poll network разрешает автоматическое подключение к узлу обновлений Delphi. Не знаю, как вас, а меня раздражает манера некоторых приложений тыкаться в Сеть без моей команды, особенно, когда идет работа над важным участком кода. Поэтому я эту опцию отключаю сразу!&lt;/p&gt;
						&lt;p&gt;&amp;#160; Если вас такие проблемы не мучат, то задайте интервал обновлений (в днях) в параметре Polling interval. Дата последнего подключения будет выводиться в поле Last poll.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Наконец, флаг Automatically show Delphi direct on refresh включит автоматический вывод окна контроля процесса обновления, когда тот начнется.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 03:22:27 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=21#p21</guid>
		</item>
		<item>
			<title>Bug List</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=16#p16</link>
			<description>&lt;p&gt;Сюда постить все найденные ошибки в постах.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 00:42:15 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=16#p16</guid>
		</item>
		<item>
			<title>Предложения по улучшению</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=15#p15</link>
			<description>&lt;p&gt;Мы охотно рассмотрим предложения по улучшению нашего форума!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 00:38:11 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=15#p15</guid>
		</item>
		<item>
			<title>Жалуемсо и делаем замечания (стучим в опщем :) )</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=14#p14</link>
			<description>&lt;p&gt;Настоятельно советуем-с в этой теме сообщать о всех замеченных (право)нарушениях.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 00:31:27 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=14#p14</guid>
		</item>
		<item>
			<title>FAQ по работе с СУБД</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=13#p13</link>
			<description>&lt;p&gt;Часть II&lt;br /&gt;Q&amp;gt;:&lt;br /&gt;(DB2) Можно ли подсоединиться к другой БД из SP?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;В DB2 можно. Если хочешь все корректно делать, ставь&lt;br /&gt;distributed unit of work для всех соединений. Такое с гарантией&lt;br /&gt;отработает.&lt;/p&gt;
						&lt;p&gt;Lilya A. Kozlenko&lt;br /&gt;li@relex.ru&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;В процессе работы программы изменилась структура БД (alter table etc.).&lt;br /&gt;Программа продолжала успешно открывать таблицы, но запросы посылались в&lt;br /&gt;соответствии со старой схемой данных. Как исправить?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;В установках BDE (Configuration utility или BDEAdmin) можно выставить&lt;br /&gt;SCHEMA CACHE = FALSE (не кэшировать схему данных).&lt;/p&gt;
						&lt;p&gt;Но в некоторых случаях ошибки такого рода все-таки происходят. В таком случае&lt;br /&gt;необходимо воспользоваться методом TDatabase.FlushSchemaCache после каждого&lt;br /&gt;изменения метаданных.&lt;/p&gt;
						&lt;p&gt;Alex Kaganoff&lt;br /&gt;(2:5030/82.50)&lt;/p&gt;
						&lt;p&gt;Посмотри настройки BDE &amp;quot;SCHEMA CACHE DIR&amp;quot; , если пусто, то скорее всего в&lt;br /&gt;рабочем каталоге твоей программы должен объявиться некий(некие) .ini файл(ы), в&lt;br /&gt;котором хранятся указания на файлы, в которых храниция информация о кэше схемы&lt;br /&gt;БД. Удали их.&lt;br /&gt;/К сожалению точных названий файлов не помню, имел этот гимор имел года&lt;br /&gt;полтора назад, убрал кэш и забыл/&lt;/p&gt;
						&lt;p&gt;Sergey Klochkovski&lt;br /&gt;(2:5080/60.3)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Как в Delphi сбросить кэш БД на диск?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;uses BDE {в Delphi 1.x не помню, но вроде bdeprocs};&lt;/p&gt;
						&lt;p&gt;dbiSaveChanges&lt;/p&gt;
						&lt;p&gt;На Delphi 1.x (16bit) дополнительно вызовите эту процедуру -&lt;/p&gt;
						&lt;p&gt;procedure DropCache; assembler;&lt;br /&gt;asm&lt;br /&gt;&amp;#160; mov ah,$0D&lt;br /&gt;&amp;#160; int $21&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Boris Podchezertseff&lt;br /&gt;(2:5020/898.15)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Как сделать так, чтобы в DBGrid напротив некоторых строк можно было бы&lt;br /&gt;галочку поставить?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Ну примерно тaк (лишнее мaло-мaло порезaл, больно много его, но идея виднa :)&lt;/p&gt;
						&lt;p&gt;нa сервере - тaблицa Advertis.DB, первичный ключ ID - autoincrement.&lt;br /&gt;Ha локaльном диске - тaблицa Founds.DB, с полем Advertis: integer, по которому&lt;br /&gt;есть индекс, и tblFounds.IndexFieldNames = &#039;Advertis&#039;.&lt;/p&gt;
						&lt;p&gt;Ha гриде:&lt;/p&gt;
						&lt;p&gt;=== cut ===&lt;/p&gt;
						&lt;p&gt;procedure TMainForm.dbgWorkDblClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;&amp;#160; TriggerRowSelection;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TMainForm.TriggerRowSelection;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; if dmFile.AdvertisCount &amp;lt;&amp;gt; 0 then begin&lt;br /&gt;&amp;#160; &amp;#160; with dmFile do if not tblFounds.FindKey([tblAdvertisID.Value]) then begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; tblFounds.AppendRecord([tblAdvertisID.Value]);&lt;br /&gt;&amp;#160; &amp;#160; end else begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; tblFounds.Delete;&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; dbgWork.Refresh;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TMainForm.dbgWorkDrawColumnCell(Sender: TObject;&lt;br /&gt;&amp;#160; const Rect: TRect; DataCol: Integer; Column: TColumn;&lt;br /&gt;&amp;#160; State: TGridDrawState);&lt;br /&gt;begin&lt;br /&gt;&amp;#160; if DataCol = 0 then with dmFile, dbgWork.Canvas do begin&lt;br /&gt;&amp;#160; &amp;#160; FillRect(Rect);&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; {clear the cell}&lt;br /&gt;&amp;#160; &amp;#160; if tblFounds.FindKey([tblAdvertisID.Value]) then begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; TextOut(Rect.Left, Rect.Top, &#039;ь&#039;);&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;=== cut ===&lt;/p&gt;
						&lt;p&gt;Окaзывaется, я переопределял рисовaние гридa, a не вычислял поле. Не помню&lt;br /&gt;точно, но кaжется, чтобы не перечитывaть тaблицу нa кaждый дaблклик, a только&lt;br /&gt;перерисовaть грид.&lt;/p&gt;
						&lt;p&gt;А колонкa для гaлки в гриде определялaсь тaк:&lt;/p&gt;
						&lt;p&gt;=== cut ===&lt;br /&gt;&amp;#160; with dmFile, dbgWork.Columns do begin&lt;br /&gt;&amp;#160; &amp;#160; BeginUpdate;&lt;br /&gt;&amp;#160; &amp;#160; Clear;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; {check mark}&lt;br /&gt;&amp;#160; &amp;#160; nc := Add;&lt;br /&gt;&amp;#160; &amp;#160; nc.Width := 14;&lt;br /&gt;&amp;#160; &amp;#160; nc.Font.Name := &#039;Wingdings&#039;;&lt;br /&gt;&amp;#160; &amp;#160; nc.Font.Size := 11;&lt;br /&gt;&amp;#160; &amp;#160; nc.Alignment := taRightJustify;&lt;br /&gt;&amp;#160; &amp;#160; nc.Title.Caption := &#039;ю&#039;;&lt;br /&gt;&amp;#160; &amp;#160; nc.Title.Font.Name := &#039;Wingdings&#039;;&lt;br /&gt;&amp;#160; &amp;#160; nc.Title.Font.Size := 10;&lt;br /&gt;&amp;#160; &amp;#160; nc.Title.Alignment := taCenter;&lt;/p&gt;
						&lt;p&gt;[skip определения остaльных колонок]&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; EndUpdate;&lt;br /&gt;&amp;#160; end;&lt;/p&gt;
						&lt;p&gt;=== cut ===&lt;/p&gt;
						&lt;p&gt;Вроде всё.&lt;br /&gt;Ну, кaк нaпечaтaть/обрaботaть только помеченное, сaм рaзберёшься. У меня тaм&lt;br /&gt;нaкручено чего-то с фильтрaми, думaю, можно проще.&lt;/p&gt;
						&lt;p&gt;Что кaсaется других способов - можно вместо временной тaблицы попользовaть&lt;br /&gt;список, мaссив или in-memory table.&lt;/p&gt;
						&lt;p&gt;Dmitry Shikhman (Дмитрий Шихман)&lt;br /&gt;(2:468/13.32)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(PX) Что нужно сделать для нормальной работы в одноранговой сети&lt;br /&gt;с базами Paradox?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;BDE Config/Admin - нa вклaдке System устaнови LOCAL SHARE в TRUE!&lt;/p&gt;
						&lt;p&gt;Здесь комментарий -&lt;/p&gt;
						&lt;p&gt;В Help параметр LOCAL SHARE описан как:&lt;br /&gt;AA&amp;gt; === Cut ===&lt;br /&gt;AA&amp;gt; The ability to share access to local data between an active BDE&lt;br /&gt;AA&amp;gt; application and an active non-BDE application.&amp;#160; Set to TRUE if you need to&lt;br /&gt;AA&amp;gt; work with the same files through both a BDE and a non-BDE application at&lt;br /&gt;AA&amp;gt; the same time.&amp;#160; (It is not necessary to set LOCAL SHARE to TRUE if you do&lt;br /&gt;AA&amp;gt; not need to have both applications open at the same time.)&amp;#160; Default: FALSE.&lt;br /&gt;AA&amp;gt; === Cut ===&lt;/p&gt;
						&lt;p&gt;Дaк читaл я вышеизложенное, и рaсценивaю его кaк тумaнопускaтельство. А&lt;br /&gt;подозревaю, что просто у BDE для скорости есть свой внутренний кэш (или, может,&lt;br /&gt;мехaнизм блокировок в пaмяти), и для двух приложений _нa_одном_компьютере_ оно&lt;br /&gt;всё делaет хорошо, a вот если приложение нaходится нa другом компьютере (и&lt;br /&gt;лезет в БД через другую копию BDE), то у него есть доступ только к фaйлaм нa&lt;br /&gt;диске (кaк и у non-BDE application).&lt;/p&gt;
						&lt;p&gt;Скорее всего, борлaнд отключaет эти хитрости у сетевых дисков. Но для&lt;br /&gt;_локaльного_ дискa, который рaсшaрен по сети, он этого, похоже, не сделaл :(&lt;br /&gt;И BDE нa фaйл-сервере не зaботится о прaвильных индексaх и блокировкaх нa диске&lt;br /&gt;(т.е. не ожидaет, что кто-то мог испрaвить индекс, покa оно ворон считaло).&lt;/p&gt;
						&lt;p&gt;А этa устaновкa _зaстaвляет_ его рaботaть по стaрым пaрaдоховым соглaшениям.&lt;/p&gt;
						&lt;p&gt;Что и требовaлось.&lt;/p&gt;
						&lt;p&gt;PS Инaче говоря, следует считaть, что network is non-BDE application, и тогдa&lt;br /&gt;это не есть бaгa :)&lt;/p&gt;
						&lt;p&gt;Dmitry Shikhman (Дмитрий Шихман)&lt;br /&gt;(2:468/13.32)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(IB) При попытке регистрации UDF возникает ошибка (udf not defined).&lt;br /&gt;Что не так?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;1) Располагайте DLL в каталоге Interbase/Bin, или в одном из каталогов,&lt;br /&gt;в которых ОС обязательно будет произведен поиск этой библиотеки&lt;br /&gt;(для Windows это %SystemRoot% и %Path%);&lt;br /&gt;2) При декларировании функции не следует указывать расширение модуля (в Windows&lt;br /&gt;по умолчанию DLL):&lt;/p&gt;
						&lt;p&gt;declare external function f_SubStr&lt;br /&gt;&amp;#160; cstring(254), integer, integer&lt;br /&gt; returns&lt;br /&gt;&amp;#160; cstring(254)&lt;br /&gt; entry_point &amp;quot;Substr&amp;quot; module_name &amp;quot;UDF1&amp;quot;&lt;/p&gt;
						&lt;p&gt;Где UDF1 - UDF1.DLL.&lt;/p&gt;
						&lt;p&gt;Alexey Malinin&lt;br /&gt;(2:5057/19.18)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;При выполнении некоторых живых запросов, возвращающих единственную запись,&lt;br /&gt;BDE ругается &amp;quot;multiple records found, but only one was expected&amp;quot;. Как лечить?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Запросы вида&lt;/p&gt;
						&lt;p&gt;&amp;#160; SELECT c, b, a, q FROM T WHERE b = :b,&lt;/p&gt;
						&lt;p&gt;где ключ c, но Дельфы посчитали ключом&amp;#160; a. Интересный запрос, да? Такое&lt;br /&gt;впечатление, что, поскольку ключом в исходной таблице являлсь третья колонка,&lt;br /&gt;то Дельфы посчитали ключом третью колонку. Перестановкой SELECT a, b, c, q...&lt;br /&gt;все исправилось. Я решил теперь использовать в таких (live) запросах только&lt;br /&gt;SELECT *.&lt;/p&gt;
						&lt;p&gt;Victor V. Metelitsa&lt;br /&gt;(2:5077/13)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Требуется информация о принципе и порядке работы с TUpdateSQL&lt;br /&gt;для работы с неживыми запросами.&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Кидаешь UpdateSQL на форму, после чего в том SQL, который ты собираешься&lt;br /&gt;редактировать, устанавливаешь в UpdateObject имя этого UpdateSQL. После этих&lt;br /&gt;дел по дабл-клику на UpdateSQL выдаётся редактор, в котором ты должен для&lt;br /&gt;каждой из таблиц,входящих в твой запрос, указать набор полей, являющихся&lt;br /&gt;уникальным ключём _таблицы_, и набор полей, которые требуется редактировать.&lt;br /&gt;В общем случае возможны глюки с редактированием, если в числе изменяемых полей&lt;br /&gt;будут элементы ключа. Указав все поля, давишь кнопку Generate SQL и в&lt;br /&gt;результате у тебя генерятся запросы на редактирование, добавление и удаление,&lt;br /&gt;которые прописываются в том же UpdateSQL. Обычно эти запросы никакого&lt;br /&gt;дополнительного редактирования не требуют. После всех&lt;br /&gt;этих дел ты можешь нормально редактировать запрос, как обычную таблицу.&lt;/p&gt;
						&lt;p&gt;Некоторые моменты.&lt;/p&gt;
						&lt;p&gt;Для того, чтобы всё это нормально работало, нужно, чтобы в TQuery были включены&lt;br /&gt;RequestLive и CashedUpdates. Соответственно, для подтверждения изменений нужно&lt;br /&gt;вызывать TQuery.ApplyUpdates и TQuery.CommitUpdates, либо&lt;br /&gt;TDatabase.ApplyUpdates, а для отмены - CancelUpdates.&lt;/p&gt;
						&lt;p&gt;Если меняешь структуру таблиц, то не забывай менять&amp;#160; списки полей в UpdateSQL,&lt;br /&gt;иначе можешь получить неприятный сюрприз - будешь долго сидеть и думать,&lt;br /&gt;почему при редактировании/добавлении некоторые поля не прописываются :-).&lt;/p&gt;
						&lt;p&gt;-- Отрезано --&lt;/p&gt;
						&lt;p&gt;Насчёт CachedUpdates.&lt;br /&gt;Сия хреновина придумана для того, чтобы обеспечить сохранение/отмену&lt;br /&gt;редактирования/добавления/удаления сразу нескольких записей. Принцип&lt;br /&gt;совершенно элементарен: если CachedUpdates&amp;#160; включен, то все производимые&lt;br /&gt;изменения в датасете по команде Post фиксируются не в базе, а во временном&lt;br /&gt;файле на винте клиента. Для того, чтобы прописать изменения в таблице&lt;br /&gt;(физически), необходимо вызвать для соответствующего запроса последовательно&lt;br /&gt;методы ApplyUpdates и CommitUpdates, а для отмены ВСЕХ изменений (начиная от&lt;br /&gt;последнего выполненного CommitUpdates), вызвать CancelUpdates.&lt;br /&gt;Кроме того, метод ApplyUpdates у TDataBase. Этому методу нужен список&lt;br /&gt;датасетов, и он производит их обновление в одной транзакции.&lt;/p&gt;
						&lt;p&gt;Практическое применение, например, такое: на форме редактирования с&lt;br /&gt;гридом и набором кнопок Добавить, Удалить, Редактировать, ОК, Отмена,&lt;br /&gt;вешаешь на первые три кнопки обработчики с Insert, Delete и Edit&lt;br /&gt;соответственно,на ОК - такой примерно обработчик:&lt;/p&gt;
						&lt;p&gt;with DataSet do begin&lt;br /&gt;&amp;#160; if State in [dsEdit,dsInsert] then Post;&lt;br /&gt;&amp;#160; ApplyUpdates;&lt;br /&gt;&amp;#160; CommitUpdates;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;а на Отмену такой:&lt;/p&gt;
						&lt;p&gt;with DataSet do begin&lt;br /&gt;&amp;#160; if State in [dsEdit,dsInsert] then Cancel;&lt;br /&gt;&amp;#160; CancelUpdates;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;В результате юзер может редактировать хоть всю таблицу, но если&lt;br /&gt;успеет спохватиться, то может отменить все свои художества.&lt;br /&gt;Только желательно на выходе из формы проверить, сохранены ли&lt;br /&gt;изменения,и если нет, то напомнить/переспросить.&lt;/p&gt;
						&lt;p&gt;Ivan Kudryashov&lt;br /&gt;jony@chat.ru&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(DB2) Как заставить работать DB2 через протокол IPX?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;=== begin DB2IPX.TXT ===&lt;br /&gt;Связь Win-клиента c DB2 в сети Netware&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;Настройка доступа к DB2&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;--------------------------&lt;/p&gt;
						&lt;p&gt;&amp;#160; 1. Связь с использованием протокола IPX/SPX.&lt;br /&gt;-----------------------------------------------&lt;/p&gt;
						&lt;p&gt;Возможны два варианта доступа:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; - через сервер NETWARE;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; - прямая адресация.&lt;/p&gt;
						&lt;p&gt;&amp;#160; 1.1. Конфигурация для доступа через сервер.&lt;br /&gt;------------------------------------------------------&lt;/p&gt;
						&lt;p&gt;Замечание. Проверялся доступ через сервера NW 3.11 и 3.12.&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;Для 4.х нужно еще разобраться.&lt;/p&gt;
						&lt;p&gt;&amp;#160; 1.1.1.&amp;#160; DB2 Сервер.&lt;br /&gt;---------------------&lt;/p&gt;
						&lt;p&gt;- должна быть установлена OS/2 Warp или OS/2 Warp Connect.&lt;/p&gt;
						&lt;p&gt;- включена поддержка NETWARE;&lt;/p&gt;
						&lt;p&gt;- в CONFIG.SYS в переменную среды DB2COMM добавить (через запятую) IPXSPX и&lt;br /&gt;перезагрузить систему;&lt;/p&gt;
						&lt;p&gt;- создать командный файл DBIPXSET.CMD :&lt;br /&gt;&amp;#160; |------------------------------------------------------------------&lt;br /&gt;&amp;#160; |db2 update dbm cfg using fileserver &amp;lt;NWSERVER&amp;gt; objectname dbserver&lt;br /&gt;&amp;#160; |------------------------------------------------------------------&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; где - &amp;lt;NWSERVER&amp;gt; - имя сервера;&lt;/p&gt;
						&lt;p&gt;- выполнить командный файл DBIPXSET.CMD ;&lt;/p&gt;
						&lt;p&gt;- перестартовать сервер базы данных;&lt;/p&gt;
						&lt;p&gt;- создать командный файл DBIPXREG.CMD :&lt;br /&gt;&amp;#160; |----------------------------------------------------------------&lt;br /&gt;&amp;#160; |db2 register nwbindery user &amp;lt;USERNAME&amp;gt;&lt;br /&gt;&amp;#160; |----------------------------------------------------------------&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; где - &amp;lt;USERNAME&amp;gt; - имя пользователя, обладающего правами&lt;br /&gt;администратора на сервере &amp;lt;NWSERVER&amp;gt; ;&lt;/p&gt;
						&lt;p&gt;- выполнить командный файл DBIPXREG.CMD ;&lt;/p&gt;
						&lt;p&gt;- ответить на запрос пароля.&lt;/p&gt;
						&lt;p&gt;&amp;#160; 1.1.2. WINDOWS - клиент.&lt;br /&gt;--------------------------&lt;/p&gt;
						&lt;p&gt;- установить WINDOWS 3.1 или WfWG 3.11;&lt;/p&gt;
						&lt;p&gt;- установить клиента NETWARE от версии 4.х&lt;br /&gt;- при установке влючить поддержку WINDOWS;&lt;br /&gt;- установить клиента DB2 для WINDOWS;&lt;br /&gt;- используя программу Client Setup описать новый узел - сервер базы&lt;br /&gt;данных :&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Name - &amp;lt;любое имя&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Protocol - IPX/SPX&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; File server - &amp;lt;NWSERWER&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Object name - dbserver&lt;br /&gt;- описать базу данных и разрешить доступ к ней через ODBC.&lt;/p&gt;
						&lt;p&gt;&amp;#160; 1.2. Конфигурация для доступа через прямую адресацию&lt;br /&gt;----------------------------------------------------------&lt;/p&gt;
						&lt;p&gt;&amp;#160; 1.2.1.&amp;#160; DB2 Сервер.&lt;br /&gt;---------------------&lt;/p&gt;
						&lt;p&gt;- см. п 1.1.1.&lt;/p&gt;
						&lt;p&gt;- найти в директории x:\sqllib\misc программу&amp;#160; DB2IPXAD.EXE и&lt;br /&gt;выполнить ее;&lt;br /&gt;- записать полученный адрес.&lt;/p&gt;
						&lt;p&gt;&amp;#160; 1.2.2. WINDOWS - клиент.&lt;br /&gt;--------------------------&lt;/p&gt;
						&lt;p&gt;- см. п. 1.1.2. (первые три);&lt;br /&gt;- используя программу Client Setup описать новый узел - сервер базы&lt;br /&gt;данных :&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Name - &amp;lt;любое имя&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Protocol - IPX/SPX&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; File server - *&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Object name - &amp;lt;адрес полученный от DB2IPXAD.EXE&amp;gt;&lt;br /&gt;-&amp;#160; описать базу данных и разрешить доступ к ней через ODBC.&lt;/p&gt;
						&lt;p&gt;=== end DB2IPX.TXT ===&lt;/p&gt;
						&lt;p&gt;Sergei Babain&lt;br /&gt;(2:5058/88.23)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Можно ли в TDBGrid pазpешить только опеpации UPDATE записей&lt;br /&gt;и запpетить INSERT/DELETE ? И как это сделать?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;А я делаю так. а DataSource к которому прицеплен Grid вешаю Event OnStateChange&lt;br /&gt;при ентом обрабатываю&lt;/p&gt;
						&lt;p&gt;if DBGrid1.DataSource.DataSet.State in [dsEdit, dsInsert] then&lt;br /&gt;&amp;#160; &amp;#160;DBGrid1.Options:=DBGrid1.Options+goRowSelect&lt;br /&gt;else&lt;br /&gt;&amp;#160; &amp;#160;DBGrid1.Options:=DBGrid1.Options-goRowSelect;&lt;/p&gt;
						&lt;p&gt;Дело в том что если у Grid&#039;а стоит опция goRowSelect из Grid&#039;а невозможно&lt;br /&gt;добавить запись. у а когда програмно вызываешь редактирование то курсор&lt;br /&gt;принимает обычный вид и все Ok Ob.&lt;/p&gt;
						&lt;p&gt;Denis Kim&lt;br /&gt;(2:5020/799.2)&lt;/p&gt;
						&lt;p&gt;Лучше &amp;quot;not State in dsEditModes&amp;quot;&lt;/p&gt;
						&lt;p&gt;Max Belugin&lt;br /&gt;(2:5020/484.28)&lt;br /&gt;belugin@bsd.lanit.ru&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(MSSQL) Как поймать свой RAISEERROR в Delphi?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Отлавливать нужно NativeCode напpимеp так:&lt;/p&gt;
						&lt;p&gt;procedure TFDMUtils.GeneralError(DataSet: TDataSet; E: EDatabaseError;&lt;br /&gt;&amp;#160; var Action: TDataAction);&lt;br /&gt;&amp;#160; var i: Word;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; ExtInfo : String;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; ExtInfo := &#039;&#039;;&lt;/p&gt;
						&lt;p&gt;if (E is EDBEngineError) then begin&lt;br /&gt;&amp;#160; if (EDBEngineError(E).Errors[0].NativeError = 0) then begin // Local Error&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;if EDBEngineError(E).Errors[0].Errorcode = 9732 then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; ExtInfo := DataSet.FieldByName(trim(copy(E.Message,&lt;br /&gt;29,20))).DisplayLabel;&lt;br /&gt;.......................................&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; end else begin&amp;#160; &amp;#160; &amp;#160; &amp;#160;// Remote SQL Server error&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; ExtInfo := ExtractFieldLabels(DataSet, E.Message);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; case EDBEngineError(E).Errors[0].NativeError of&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;233, 515 :&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;Alert(&#039;Ошибка&#039;,&#039;Не все поля заполнены ! &#039;+ExtInfo );&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;547&amp;#160; &amp;#160; &amp;#160; :&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;if (StrPos(PChar(E.Message), PChar(&#039;DELETE&#039;)) &amp;lt;&amp;gt; nil ) then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;Alert(&#039;Ошибка пpи удалении&#039;,&#039;Имеются подчиненные записи,&lt;br /&gt;удаление (изменение) невозможно! &#039;+ExtInfo )&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;if (StrPos(PChar(E.Message), PChar(&#039;INSERT&#039;)) &amp;lt;&amp;gt; nil ) then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; Alert(&#039;Ошибка пpи вставке&#039;,&#039;Отсутствует запись в&lt;br /&gt;МАСТЕР-таблице! &#039;+ExtInfo )&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;if (StrPos(PChar(E.Message), PChar(&#039;UPDATE&#039;)) &amp;lt;&amp;gt; nil ) then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; Alert(&#039;Ошибка пpи обновлении&#039;,&#039;Отсутствует запись в&lt;br /&gt;МАСТЕР-таблице! &#039;+ExtInfo );&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;2601&amp;#160; &amp;#160; &amp;#160;:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;Alert(&#039;Ошибка&#039;,&#039;Такая запись уже есть!&#039; );&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;Alert(&#039;Ошибка&#039;,&#039;Неизвестная ошибка, код - &#039;+&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; inttostr(EDBEngineError(E).Errors[0].NativeError)&lt;br /&gt;+ExtInfo);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;br /&gt;------------------------------------------------------&lt;br /&gt;Этот код был заточен под MSSQL, но не нужно пытаться его использовать, а лучше&lt;br /&gt;по этому пpимеpу написать свою.&lt;/p&gt;
						&lt;p&gt;Sergey Gristchuk&lt;br /&gt;gristchuk@usa.net&lt;br /&gt;(2:463/209.31)&lt;/p&gt;
						&lt;p&gt;&amp;gt; --- added in v3&lt;br /&gt;Q&amp;gt;:&lt;br /&gt;Как заставить компонент реагировать на изменения в TDataSource?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;TFieldDataLink. За D2 не скажу, а в D1 в Help&#039;е его нет, pеализован в&lt;br /&gt;\DELPHI\SOURCE\VCL\DBTABLES.PAS.&lt;/p&gt;
						&lt;p&gt; VV&amp;gt;&amp;#160; &amp;#160;Более конкретный вопрос: Как заставить произвольные объекты&lt;br /&gt; VV&amp;gt; (предположительно формы) реагировать на изменения в каком-то DataSource?&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;&amp;#160; TMyForm = class(TForm)&lt;br /&gt;&amp;#160; &amp;#160; {...}&lt;br /&gt;&amp;#160; &amp;#160; Table1: TTable;&lt;br /&gt;&amp;#160; &amp;#160; DataSource1: TDataSource;&lt;br /&gt;&amp;#160; private&lt;br /&gt;&amp;#160; &amp;#160; FDL : TFieldDataLink;&lt;br /&gt;&amp;#160; &amp;#160; procedure RecChange(Sender: TObject);&lt;br /&gt;&amp;#160; public&lt;br /&gt;&amp;#160; &amp;#160; {...}&lt;br /&gt;&amp;#160; end;&lt;/p&gt;
						&lt;p&gt;procedure TMyForm.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;&amp;#160; FDL:=TFieldDataLink.Create;&lt;br /&gt;&amp;#160; FDL.OnDataChange:=RecChange;&lt;br /&gt;&amp;#160; FDL.DataSource:=DataSource1;&lt;br /&gt;&amp;#160; FDL.FieldName:=&#039;MyFieldName&#039;;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TTabEditDlg.FormDestroy(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;&amp;#160; FDL.Free;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TTabEditDlg.MasterChange(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;&amp;#160; {... тут pеагиpуй на изменения ...}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Eugene Polkin&lt;br /&gt;(2:5001/12.3)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;В Delphi 3 ползунок TDBGrid иногда может находится не только в трех&lt;br /&gt;фиксированных позициях. Что для этого нужно?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Здесь отрывки из исходников VCL -&lt;/p&gt;
						&lt;p&gt;==========&lt;br /&gt;unit DBGrids;&lt;br /&gt;procedure TCustomDBGrid.UpdateScrollBar;&lt;br /&gt;var&lt;br /&gt;&amp;#160; SIOld, SINew: TScrollInfo;&lt;br /&gt;begin&lt;/p&gt;
						&lt;p&gt;[skipped]&lt;/p&gt;
						&lt;p&gt;&amp;gt;&amp;#160; &amp;#160; &amp;#160; if IsSequenced then&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; SINew.nMin := 1;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; SINew.nPage := Self.VisibleRowCount;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; SINew.nMax := RecordCount + SINew.nPage -1;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if State in [dsInactive, dsBrowse, dsEdit] then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; SINew.nPos := RecNo;&amp;#160; // else keep old pos&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; end&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; SINew.nMin := 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; SINew.nPage := 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; SINew.nMax := 4;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if BOF then SINew.nPos := 0&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; else if EOF then SINew.nPos := 4&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; else SINew.nPos := 2;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; end;&lt;/p&gt;
						&lt;p&gt;[skipped]&lt;/p&gt;
						&lt;p&gt;unit dbtables;&lt;br /&gt;function TBDEDataSet.IsSequenced: Boolean;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; Result := (FRecNoStatus = rnParadox) and (not Filtered);&lt;br /&gt;end;&lt;br /&gt;==========&lt;/p&gt;
						&lt;p&gt;Ilya Andreev&lt;br /&gt;(2:5030/55.28)&lt;/p&gt;
						&lt;p&gt;То есть, к примеру, все будет работать &amp;quot;красиво&amp;quot; на таблицах BDE, если они:&lt;br /&gt; а) таблицы Paradox;&lt;br /&gt; б) на них не установлен фильтр.&lt;br /&gt;TClientDataSet в режиме singletier (briefcase) также работает &amp;quot;красиво&amp;quot;.&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(Desktop) Можно ли использовать результаты выполнения одного TQuery для другого TQuery?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Если Вы работаете с локальными БД, то Вам поможет -&lt;/p&gt;
						&lt;p&gt;DbiMakePermanent(SourceQuery.Handle, RName, false);&lt;/p&gt;
						&lt;p&gt;Ilya Andreev&lt;br /&gt;(2:5030/55.28)&lt;br /&gt;Sergey Sukhanov&lt;br /&gt;(2:5019/1.32)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(DB2/NT) Как создать БД в кодировке CP1251?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;Вот такая конструкция проходит на DB2 2.1.2/NT и UDB5/NT...&lt;/p&gt;
						&lt;p&gt;=== Cut ===&lt;br /&gt;CREATE&amp;#160; DATABASE Efes2&lt;br /&gt; USING CODESET 1251 TERRITORY RU&lt;br /&gt; COLLATE USING IDENTITY;&lt;br /&gt;=== Cut ===&lt;/p&gt;
						&lt;p&gt;Ilia Starkov&lt;br /&gt;(2:5061/2.21)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(Oracle) Подскажите, как на Oracle 7.3.2.3 (Solaris x86) поменять compatible на&lt;br /&gt;7.3.2.3 (c 7.1.0.0)?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Ставить в initmybase.ora&lt;br /&gt; compatible = &amp;quot;7.3.2.3&amp;quot;&lt;br /&gt;и после старта с новым параметром сделать&lt;br /&gt;ALTER DATABASE RESET COMPABILITY;&lt;br /&gt;И рестартовать базу.&lt;/p&gt;
						&lt;p&gt;Alexander Medvedev&lt;br /&gt;(2:5010/3.88)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(IB) Как получить результирующим полем разницу между хранимой датой и текущей&lt;br /&gt;датой?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;&amp;#160; &amp;#160;SELECT CAST((поле_с_датой -&amp;quot;NOW&amp;quot;) AS INTEGER)&lt;br /&gt;&amp;#160; &amp;#160;FROM MyBase&lt;/p&gt;
						&lt;p&gt;Получишь результат в днях.&lt;/p&gt;
						&lt;p&gt;Andrey K.Yazev&lt;br /&gt;(aky@infra.sar.nnov.ru)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(D3) Как добится верной работы фильтра на запросах и на неиндексированных таблицах?&lt;br /&gt;(Т.е. при работе программы наблюдалась следующая картина:&lt;br /&gt;в результате очередной фильтрации оставалось&lt;br /&gt;видно 4 записи из восьми. Добавляем букву к фильтру, остается, допустим,&lt;br /&gt;две. Убираем букву, которую только что добавили, в гриде все равно видно&lt;br /&gt;только две записи.)&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Эта проблема была в D3 только на TQuery, а в D3.01 появилась и в TTable.&lt;br /&gt;Лечится так (простой пример):&lt;/p&gt;
						&lt;p&gt;procedure TMainForm.Edit1Change(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;&amp;#160; if length(Edit1.Text) &amp;gt; 0 then begin&lt;br /&gt;&amp;#160; &amp;#160; Table1.Filtered := TRUE;&lt;br /&gt;&amp;#160; &amp;#160; UpdateFilter(Table1);&lt;br /&gt;&amp;#160; end&lt;br /&gt;&amp;#160; else Table1.Filtered := FALSE;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TMainForm.UpdateFilter(DataSet: TDataSet);&lt;br /&gt;var&lt;br /&gt;&amp;#160; FR: TFilterRecordEvent;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; with DataSet do begin&lt;br /&gt;&amp;#160; &amp;#160; FR := OnFilterRecord;&lt;br /&gt;&amp;#160; &amp;#160; if Assigned(FR) and Active then begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; DisableControls;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; OnFilterRecord := nil;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; OnFilterRecord := FR;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; EnableControls;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Pavel Krasikov&lt;br /&gt;(2:5005/7)&lt;/p&gt;
						&lt;p&gt;&amp;gt; --- changed in v3&lt;br /&gt;Q&amp;gt;:&lt;br /&gt;(PX, DBF) Подскажите, плз, как упаковать базу (dBase,Paradox) в runtime?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Для dBase:&lt;/p&gt;
						&lt;p&gt; uses&lt;br /&gt;&amp;#160; &amp;#160;DbiProcs;&lt;/p&gt;
						&lt;p&gt; with Table do&lt;br /&gt; begin&lt;br /&gt;&amp;#160; &amp;#160;OldState := Active; Close;&lt;br /&gt;&amp;#160; &amp;#160;Exclusive := True; Open;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;DbiPackTable(DBHandle, Handle, nil, nil, True);&lt;br /&gt;&amp;#160; &amp;#160;{^ здесь можно добавить check()}&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Close; Exclusive := False;&lt;br /&gt;&amp;#160; &amp;#160;Active := OldState;&lt;br /&gt;&amp;#160; &amp;#160;{ при желании можно сохранить закладку }&lt;br /&gt; end;&lt;/p&gt;
						&lt;p&gt; Для Paradox:&lt;/p&gt;
						&lt;p&gt; DbiDoRestructure(DBHandle, 1, ?, nil, nil, nil, False); { см. dbiProcs.int }&lt;/p&gt;
						&lt;p&gt; Вместо ? указатель на массив длинных таких структур с описанием&lt;br /&gt;реструктуризации. Кто делал на Px, я думаю, дадут пример.&lt;/p&gt;
						&lt;p&gt;Pavel Kulchenko&lt;br /&gt;(2:465/66)&lt;/p&gt;
						&lt;p&gt;Это насчет упаковки db (может что-то и лишнее, что-то можно&lt;br /&gt;сделать по-дpугому, но pаботает )&lt;/p&gt;
						&lt;p&gt;Пpимеp для Paradox:&lt;/p&gt;
						&lt;p&gt;Uses BDE; // for D3, для D2 непомню (что-то типа DbiProc и еще что-то)&lt;/p&gt;
						&lt;p&gt;// для пpимеpа&lt;br /&gt;tLog : TTable; // таблица юзающая d:\db\log.db&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;TblDesc:&amp;#160; CRTblDesc;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;rslt&amp;#160; &amp;#160;:&amp;#160; DBIResult;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;Dir&amp;#160; &amp;#160; :&amp;#160; String; //имеется в виду huge string т.е. {$H+}&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;hDb&amp;#160; &amp;#160; :&amp;#160; hDbiDb;&lt;/p&gt;
						&lt;p&gt;begin&lt;br /&gt;&amp;#160; tLog.Active:=False; //деактивиpуем TTable&lt;/p&gt;
						&lt;p&gt;&amp;#160; SetLength(Dir, dbiMaxNameLen + 1);&lt;br /&gt;&amp;#160; DbiGetDirectory(tLog.DBHandle, False, PChar(Dir));&lt;br /&gt;&amp;#160; SetLength(Dir, StrLen(PChar(Dir)));&lt;/p&gt;
						&lt;p&gt;&amp;#160; DbiOpenDatabase(nil, nil, dbiReadWrite, dbiOpenExcl, nil, 0, nil, nil, hDb);&lt;/p&gt;
						&lt;p&gt;&amp;#160; DbiSetDirectory(hDb, PChar(Dir));&lt;/p&gt;
						&lt;p&gt;&amp;#160; FillChar(TblDesc, sizeof(CRTblDesc), 0);&lt;br /&gt;&amp;#160; StrPCopy(TblDesc.szTblName, &#039;d:\db\log.db&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // здесь должно быть полное имя файла&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; //котоpое можно: а) ввести pуками;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; //б) вытащить из пpопеpтей таблицы;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; //в) вытащить из алиаса;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; //г) см. FAQ&lt;br /&gt;&amp;#160; StrCopy(TblDesc.szTblType, szParadox);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;//BTW тут может и szDBase стоять&lt;/p&gt;
						&lt;p&gt;&amp;#160; TblDesc.bPack := TRUE;&lt;/p&gt;
						&lt;p&gt;&amp;#160; DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False);&lt;br /&gt;&amp;#160; DbiCloseDatabase(hDb);&lt;/p&gt;
						&lt;p&gt;end;&lt;/p&gt;
						&lt;p&gt;// можно еще чеки ввести, но облом :-)&lt;/p&gt;
						&lt;p&gt;Robert Gluvchinskiy&lt;br /&gt;(2:463/102.108)&lt;/p&gt;
						&lt;p&gt;&amp;gt; --- added in v2&lt;br /&gt;Q&amp;gt;:&lt;br /&gt;Неожиданно возник следующий вопрос :&lt;br /&gt;Каким образом можно узнать где физически располагается локальная база&lt;br /&gt;данных, если известно имя Alias-а ?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;1. По таблице (фактически по Database) получить физическое местонахождение.&lt;br /&gt; Прим. Database можно создать явно, если нет, Дельфи сама его создаст, доступ&lt;br /&gt;по Table(Query).Database&lt;/p&gt;
						&lt;p&gt;uses&lt;br /&gt;&amp;#160; DbiProcs;&lt;/p&gt;
						&lt;p&gt;function GetDirByDatabase(Database: TDatabase): string;&lt;br /&gt;var&lt;br /&gt;&amp;#160; pszDir: PChar;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; pszDir := StrAlloc(255);&lt;br /&gt;&amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; DbiGetDirectory(Database.Handle, True, pszDir);&lt;br /&gt;&amp;#160; &amp;#160; Result := StrPas(pszDir);&lt;br /&gt;&amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; StrDispose(pszDir);&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;2. По алиасу.&lt;/p&gt;
						&lt;p&gt;function GetPhNameByAlias(sAlias: string): string;&lt;br /&gt;var&lt;br /&gt;&amp;#160; Database: TDatabase;&lt;br /&gt;&amp;#160; pszDir: PChar;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; Database := TDatabase.Create(nil);&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;{allocate memory}&lt;br /&gt;&amp;#160; pszDir := StrAlloc(255);&lt;br /&gt;&amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; Database.AliasName := sAlias;&lt;br /&gt;&amp;#160; &amp;#160; Database.DatabaseName := &#039;TEMP&#039;;&amp;#160; &amp;#160;{requires a name -- is ignored}&lt;br /&gt;&amp;#160; &amp;#160; Database.Connected := True;&amp;#160; &amp;#160; {connect without opening any table}&lt;br /&gt;&amp;#160; &amp;#160; DbiGetDirectory(Database.Handle, True, pszDir);&amp;#160; &amp;#160; &amp;#160;{get the dir.}&lt;br /&gt;&amp;#160; &amp;#160; Database.Connected := False;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; {disconnect}&lt;br /&gt;&amp;#160; &amp;#160; Result := StrPas(pszDir);&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; {convert to a string}&lt;br /&gt;&amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; Database.Free;&amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; StrDispose(pszDir);&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Pavel Kulchenko&lt;br /&gt;(2:465/66)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Как записать в BLOB поле большой текст (&amp;gt;255) из DELPHI?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;var S: TBlobStream;&lt;br /&gt;&amp;#160; &amp;#160; B: pointer;&lt;br /&gt;&amp;#160; &amp;#160; c: integer;&lt;/p&gt;
						&lt;p&gt;Table1.Edit;&lt;br /&gt;S := TBlobStream.Create(Table1BlobField as TBlobField, bmWrite); {кажется, так}&lt;br /&gt;C := S.Write(B, C);&lt;br /&gt;Table1.Post;&lt;br /&gt;S.Destroy;&lt;/p&gt;
						&lt;p&gt;или так&lt;/p&gt;
						&lt;p&gt;var S: TMemoryStream;&lt;br /&gt;&amp;#160; &amp;#160; B: pointer;&lt;br /&gt;&amp;#160; &amp;#160; C: integer;&lt;/p&gt;
						&lt;p&gt;S := TMemoryStream.Create;&lt;br /&gt;...&lt;br /&gt;Table1.Edit;&lt;br /&gt;S.Clear;&lt;br /&gt;S.SetSize(C);&lt;br /&gt;C := S.Write(B,C);&lt;br /&gt;(Table1BlobField as TBlobField).LoadFromStream(S);&lt;br /&gt;S.Clear;&lt;br /&gt;Table1.Post;&lt;br /&gt;...&lt;br /&gt;S.Destroy;&lt;/p&gt;
						&lt;p&gt;Alexey Kats&lt;br /&gt;(2:463/201.9)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(DBF) Как открыть индексированную таблицу dBase, если нет файла *.MDX?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Для DBASE-таблицы встроенными средствами ты не перестроишь индекс,&lt;br /&gt;если его нет.&amp;#160; Для этой цели мне пришлось написать процедуру для&lt;br /&gt;физического удаления признака индексации в самом dbf файле и после ее&lt;br /&gt;применения добавлять индексы заново. Для этого в заголовок файла dbf&lt;br /&gt;по смещению 28(dec) записываешь 0. По другому никак не выходит(я долго&lt;br /&gt;бился)- вот для Paradox таблиц все Ok.&lt;/p&gt;
						&lt;p&gt;Олег (GOS)&lt;br /&gt;oleg@avia.cmw.ru&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(MSSQL) Можно ли вызвать Stored Procedure через TQuery, если она&lt;br /&gt;не возвращает курсора?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;В случае MS SQL нужно написать:&lt;br /&gt;Query1.Sql:=&#039;declare @res&#039;+#13#10+&#039;exec MyFunc :Param1,:Param2,@res OUTPUT&#039;;&lt;br /&gt;Query1.Open;&lt;br /&gt;Result:=Query1.FieldByName(&#039;Column1&#039;).Value;&lt;br /&gt;Query1.Close;&lt;/p&gt;
						&lt;p&gt;Konstantin Suslov&lt;br /&gt;(2:5020/300.16)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(Oracle) Как настроить Personal Oracle с русским языком на корректную работу&lt;br /&gt;с числами и BDE?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;прописать в \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE параметр:&lt;br /&gt;NLS_NUMERIC_CHARACTERS = &#039;.,&#039;&lt;br /&gt;или&lt;br /&gt;после соединения с ORACLE выполнить&lt;br /&gt;ALTER SESSION SET NLS_NUMERIC_CHARACTERS = &#039;.,&#039;&lt;/p&gt;
						&lt;p&gt;Aleksei Alekseenko&lt;br /&gt;(2:5030/548.2)&lt;br /&gt;Voice phone: 007-812-694-8625&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(MSSQL) Как настроить MS SQL Server 6.5 на корректную работу&lt;br /&gt;с числами и BDE при выполнении UPDATE?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;&amp;#160; Дело в том, что SQL Links на _NT_ишном клиенте шлет на сеpвеp дату как&lt;br /&gt;1-янв-97, что сеpвеp не пpиемлет. Совеpшенно случайно я нашел системный скpипт,&lt;br /&gt;котоpый подключает pусский и болгаpский языки.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;- выполни sp_configure и убедись, что у тебя default sortorder id==106 (rus&lt;br /&gt;case insens) или 105 (rus case sens). Если нет - пеpеставь сеpвеp.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;- найди в каталоге c:\mssql\install скpипт instlang.sql и запусти его.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;- либо pуками каждому пpоставь каждому логину, pаботающему с NT, язык&lt;br /&gt;pусский, либо поставь его как default language сеpвеpу. В этом случае 95-м&lt;br /&gt;клиентам пpидется pуками пpописать в логине язык us_english, иначе они&lt;br /&gt;пеpестанут pаботать.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Для установки russian как default надо выполнить скpипт:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;exec sp_configure &#039;default language&#039;, 2&lt;br /&gt;&amp;#160; &amp;#160;go&lt;br /&gt;&amp;#160; &amp;#160;reconfigure&lt;br /&gt;&amp;#160; &amp;#160;go&lt;/p&gt;
						&lt;p&gt;Vadim Shcolin&lt;br /&gt;vadim@vsh.spb.su&lt;br /&gt;(2:5030/87.91)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Как научить VCL делать Refresh для запросов правильно?&lt;br /&gt;Особенно интересует Refresh для связки Master-Detail.&lt;br /&gt;A&amp;gt;:&lt;br /&gt;(IB?)&lt;br /&gt;Старо как мир, и нет ничего военного:&lt;/p&gt;
						&lt;p&gt;=== Cut ===&lt;br /&gt;procedure&amp;#160; RefreshQuery (Query : TQuery; F : boolean);&lt;br /&gt;var B : TBookMark;&lt;br /&gt;begin&lt;br /&gt; with Query do&lt;br /&gt;&amp;#160; &amp;#160;if Query.Active then&lt;br /&gt;&amp;#160; &amp;#160;begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;B:=GetBookMark;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;try&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;Close;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;Unprepare;&amp;#160; {Если не поставить этого, то если используется select&lt;br /&gt;SP, то иногда последующая операция вешает сервер.&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; Кто скажет почему?!}&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;Active:=True;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;if F then begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;try&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;GotoBookMark(B)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;except&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;on EDatabaseError do First;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;end&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;end&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;else First;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;finally&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;FreeBookmark(B);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;end;&lt;br /&gt;&amp;#160; &amp;#160;end;&lt;br /&gt;end;&lt;br /&gt;=== Cut ===&lt;/p&gt;
						&lt;p&gt;Eugene Zhilkin&lt;br /&gt;(2:461/88)&lt;/p&gt;
						&lt;p&gt;Уфф! Кажется, лyчше yже не сделать. :)&lt;/p&gt;
						&lt;p&gt;dbtables можно опционально пpопатчить (см.в конце), чтобы иметь такой вот&lt;br /&gt;pyлезный Detail query.&lt;/p&gt;
						&lt;p&gt;&amp;gt;== Режем pаз ==&amp;lt;&lt;/p&gt;
						&lt;p&gt;Update for dbtables.pas&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; New interface function DoRefreshQuery can Refresh TQuery component in&lt;br /&gt;master-detail scheme and alone.&lt;br /&gt;&amp;#160; &amp;#160; TQuery.RefreshParams should be updated&lt;/p&gt;
						&lt;p&gt;function GetFieldNamesStr(DataSet: TDataSet): String;&lt;br /&gt;var&lt;br /&gt;&amp;#160; I: Integer;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; Result := &#039;&#039;;&lt;br /&gt;&amp;#160; with DataSet do&lt;br /&gt;&amp;#160; &amp;#160; for I := 0 to FieldCount - 1 do&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; Result := Result + Fields[i].FieldName + &#039;;&#039;;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure DoRefreshQuery(Query: TQuery; KeyFields: String; BookMarkSearch:&lt;br /&gt;Boolean);&lt;br /&gt;var&lt;br /&gt;&amp;#160; Fields: TList;&lt;br /&gt;&amp;#160; KeyValues: Variant;&lt;br /&gt;&amp;#160; KeyNames: String;&lt;br /&gt;&amp;#160; Bmk: TBookmark;&lt;br /&gt;&amp;#160; I: Integer;&lt;br /&gt;&amp;#160; BookmarkFound: Boolean;&lt;br /&gt;&amp;#160; CanLocate: Boolean;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; Fields := TList.Create;&lt;br /&gt;&amp;#160; if KeyFields = &#039;&#039; then KeyFields := GetFieldNamesStr(Query);&lt;br /&gt;&amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; Query.GetFieldList(Fields, KeyFields);&lt;br /&gt;&amp;#160; &amp;#160; for I := Fields.Count - 1 downto 0 do&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; with TField(Fields[i]) do&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if Calculated or Lookup then Fields.Delete(I);&lt;br /&gt;&amp;#160; &amp;#160; CanLocate := Fields.Count &amp;gt; 0;&lt;br /&gt;&amp;#160; &amp;#160; if CanLocate then&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; if Fields.Count = 1 then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; KeyValues := TField(Fields[0]).Value&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; else begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; KeyValues := VarArrayCreate([0, Fields.Count - 1], varVariant);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; KeyValues[0] := TField(Fields[0]).Value;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; KeyNames := TField(Fields[0]).FieldName;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; for I := 1 to Fields.Count - 1 do&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; KeyNames := KeyNames + &#039;;&#039; + TField(Fields[i]).FieldName;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; KeyValues[i] := TField(Fields[i]).Value;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; Fields.Free;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;&amp;#160; with Query do&lt;br /&gt;&amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; Bmk := nil;&lt;br /&gt;&amp;#160; &amp;#160; DisableControls;&lt;br /&gt;&amp;#160; &amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; BookmarkFound := False;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; if BookMarkSearch then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Bmk := GetBookmark;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; Close;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; Open;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; if Assigned(Bmk) then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; GotoBookMark(Bmk);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; BookmarkFound := True;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; except&amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; if not BookmarkFound and CanLocate then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Locate(KeyNames, KeyValues, []);&lt;br /&gt;&amp;#160; &amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; EnableControls;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; Screen.Cursor := crDefault;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; FreeBookmark(Bmk);&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TQuery.RefreshParams;&lt;br /&gt;var&lt;br /&gt;&amp;#160; DataSet: TDataSet;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; DisableControls;&lt;br /&gt;&amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; if FDataLink.DataSource &amp;lt;&amp;gt; nil then&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; DataSet := FDataLink.DataSource.DataSet;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; if DataSet &amp;lt;&amp;gt; nil then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if DataSet.Active and (DataSet.State &amp;lt;&amp;gt; dsSetKey) then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; DoRefreshQuery(Self, GetFieldNamesStr(Self), False);&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; EnableControls;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;&amp;gt;== Режем два ==&amp;lt;&lt;/p&gt;
						&lt;p&gt;Vladimir Gaitanoff&lt;br /&gt;(2:5020/880.5)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Как пересчитать все Calculated Fields без переоткрытия TDataSet?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;&amp;#160; &amp;#160; Resync([rmExact, rmCenter])&lt;/p&gt;
						&lt;p&gt;Vladimir Gaitanoff&lt;br /&gt;(2:5020/880.5)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(Oracle) Как в Oracle создать sequence с некоторого номера?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;create sequence minvalue 10;&lt;/p&gt;
						&lt;p&gt;Andrey V. Petrow&lt;br /&gt;(2:5030/53.334)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Как создать текстовую таблицу с поддержкой русских букв?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Делай pаз - create database ... без всяких default character set&lt;br /&gt;Делай два - запускай BDE Config и создавай алиас&lt;br /&gt;Делай тpи - делай настpойки:&lt;/p&gt;
						&lt;p&gt;стpаница&amp;#160; &amp;#160;паpаметp&amp;#160; &amp;#160; &amp;#160; &amp;#160; значение&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;Пpимечание&lt;br /&gt;Drivers&amp;#160; &amp;#160; LANGDRIVER&amp;#160; &amp;#160; &amp;#160; &#039;ascii&#039; ANSI&amp;#160; &amp;#160; &amp;#160;У INTERBASE&lt;br /&gt;Alias&amp;#160; &amp;#160; &amp;#160; LANGDRIVER&amp;#160; &amp;#160; &amp;#160; пусто&lt;br /&gt;System&amp;#160; &amp;#160; &amp;#160;LANGDRIVER&amp;#160; &amp;#160; &amp;#160; &#039;ascii&#039; ANSI&lt;br /&gt;System&amp;#160; &amp;#160; &amp;#160;DEFAULT DRIVER&amp;#160; ASCIIDRV&lt;/p&gt;
						&lt;p&gt;Alexey Malinin&lt;br /&gt;(2:5057/19.18)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(Oracle) Как решать некоторые вопросы при подключении к Oracle?&lt;br /&gt;A&amp;gt;:&lt;/p&gt;
						&lt;p&gt; DD&amp;gt; 1. Все поля (TField), опpеделенные в фоpмах, имеющие типы TDateField,&lt;br /&gt; DD&amp;gt; TSmallIntField - пpи откpытии таблицы pугаются: Field &amp;quot;...&amp;quot; is not of&lt;br /&gt; DD&amp;gt; expected type. Посмотpел - пpи пеpеопpеделении их под Oracle&#039;ом они&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160;Чтобы &amp;quot;увидеть&amp;quot; integer-поля нужно в настройке Alias&#039;а Oracle в BDE&lt;br /&gt;установить Enable Integers -&amp;gt; True (и напрочь будет потерян Locate по этим якобы&lt;br /&gt;int/smallint полям).&amp;#160; С датами, возможно, тоже надо разбираться&lt;br /&gt;через настройки Win &amp;amp; Oracle. У меня в Win дата формата &amp;quot;дд.мм.гггг&amp;quot;, в Oracle&lt;br /&gt;NLS_LANG -&amp;gt; AMERICAN_AMERICA.CL8MSWIN1251 и с датами все гут.&lt;/p&gt;
						&lt;p&gt; DD&amp;gt; 2. Используя в SQL&lt;br /&gt; DD&amp;gt; стpоки типа &#039;SELECT XX FROM YY WHERE XX=&amp;quot;QQQ&amp;quot;&#039; мы поступали&lt;br /&gt; DD&amp;gt; непpавильно,&lt;br /&gt; DD&amp;gt; т.к. двойные кавычки в Oracle обpабатывабтся не так, как в Btrieve.&lt;br /&gt; DD&amp;gt; Тут мы&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; Oracle в данном случае не причем. Это глюк BDE. Лечилось просто - вместо&lt;br /&gt;обрамления двойными кавычками строкового значения, нужно обрамлять его с&lt;br /&gt;помощью #39, примерно так&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; MySQLString:=&#039;SELECT XX FROM YY WHERE XX=&#039;+#39+&#039;QQQ&#039;+#39;&lt;/p&gt;
						&lt;p&gt;Belsky Roman&lt;br /&gt;(2:450/94.75)&lt;/p&gt;
						&lt;p&gt; SS&amp;gt; У кого-нибудь есть опыт по настройке BDE ? Откликнитесь плиз! При&lt;br /&gt; SS&amp;gt; попытке соединиться с базой вылезает ошибка: Vendor failed init!&lt;br /&gt; SS&amp;gt; Delphi запускаю под 95. На всякий случай пути к \BDE и ORAWIN\BIN я&lt;br /&gt; SS&amp;gt; проставил! orant71.dll (родной или переименнованый ora72win.dll)&lt;br /&gt; SS&amp;gt; закидывал куда угодно, но.... все равно вылетает ошибка BDE Error&lt;br /&gt; SS&amp;gt; 15879 Vendor failed init :-(&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Клиент у тебя NT, как я понял?&lt;br /&gt;&amp;#160; &amp;#160;ora7x.dll - 32bit клиент для win95&lt;br /&gt;&amp;#160; &amp;#160;orant7x.dll - 32bit клиент для NT&lt;br /&gt;&amp;#160; &amp;#160;ora7xwin.dll - 16bit клиент для win&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;т.е. ora7xwin в Delphi3 вообще ставить бесполезно (16bit для 32bit appl).&lt;br /&gt;&amp;#160; ora*71.dll у меня изначально к ORACLE 7.2 не коннектился - они там как-то&lt;br /&gt;&amp;#160; резко сменили OCI. Правда потом ora72win.dll с Pers. Oracle 7.3 работал,&lt;br /&gt;&amp;#160; но все равно лучше, наверное, чтобы номер версии dll был не ниже версии&lt;br /&gt;&amp;#160; сервера.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; А вообще я 32bit дельфях в Vendor Init давно прописываю OCIW32.dll -&lt;br /&gt;&amp;#160; он всегда для последней версии сервера с которым ты работаешь.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Это IMHO. Но у меня Delphi3 и Delphi1 коннектятся как с Oracle 7.1 на&lt;br /&gt;&amp;#160; Unix&#039;е, так и с Pers. Oracle 7.3&lt;/p&gt;
						&lt;p&gt;Alex Mironov&lt;br /&gt;&lt;a href=&quot;http://WWW.MEB.RU/igorvl.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://WWW.MEB.RU/igorvl.html&lt;/a&gt;&lt;br /&gt;(2:5020/238.46)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Как заставить BDE сохранять в БД поле времени с сотыми долями секунды?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Если руками, то в BDE Administrator. Если в в инсталлялке, то -&lt;/p&gt;
						&lt;p&gt;В пункте Make Registry Changes InstallShield&#039;а создай ключ&lt;br /&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine\Settings\SYSTEM\&lt;br /&gt;FORMATS\TIME\MILSECONDS=TRUE&lt;/p&gt;
						&lt;p&gt;Alexey Yashin&lt;br /&gt;(2:5020/62.31)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Как создать Calculated Fields в RunTime?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;See book &amp;quot;Developing Custom Delphi Components&amp;quot; by Ray Konopka.&lt;/p&gt;
						&lt;p&gt;This is little bit corrected example from this book:&lt;/p&gt;
						&lt;p&gt;function TMyClass.CreateCalcField( const AFieldName:string;&lt;br /&gt;AFieldClass:TFieldClass; ASize:Word ) : TField;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; Result := FDataSet.FindField(AFieldName); // Field may already exists!&lt;br /&gt;&amp;#160; if Result&amp;lt;&amp;gt;nil then Exit;&lt;br /&gt;&amp;#160; if AFieldClass=nil then DBErrorFmt( SUnknownFieldType, [AFieldName] );&lt;br /&gt;&amp;#160; Result := FieldClass.Create(Owner);&lt;br /&gt;&amp;#160; with Result do&lt;br /&gt;&amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; FieldName := AFieldName;&lt;br /&gt;&amp;#160; &amp;#160; if (Result is TStringField) or&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;(Result is TBCDField) or&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;(Result is TBlobField) or&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;(Result is TBytesField) or&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;(Result is TVarBytesField)&lt;br /&gt;&amp;#160; &amp;#160; then Size := ASize;&lt;br /&gt;&amp;#160; &amp;#160; Calculated := True;&lt;br /&gt;&amp;#160; &amp;#160; DataSet := FDataset;&lt;br /&gt;&amp;#160; &amp;#160; Name := FDataSet.Name+AFieldName;&lt;br /&gt;&amp;#160; except&lt;br /&gt;&amp;#160; &amp;#160; Free;&amp;#160; // We must release allocated memory on error!&lt;br /&gt;&amp;#160; &amp;#160; raise;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Alex Konshin&lt;br /&gt;(2:5030/217.217)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Как создать новый запрос и скопировать туда точно такие же описания полей?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Копируешь FieldDefs. Проходишь циклом по FieldDefs.Items[i].CreateField(Owner);&lt;/p&gt;
						&lt;p&gt;Alex Konshin&lt;br /&gt;(2:5030/217.217)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(DB2) Почему DB2 ругается на Create Trigger?&lt;br /&gt;A&amp;gt;:&lt;br /&gt;&amp;#160; Я тут писал по поводу того, что у меня не pаботали тpиггеpы. Все дело&lt;br /&gt;оказалось в пpавиле написания команды &amp;quot;create trigger&amp;quot;. Если все остальные&lt;br /&gt;команды коppектно воспpинимаются на любом pегистpе, то эта только набpанная&lt;br /&gt;одними большими буквами.&lt;/p&gt;
						&lt;p&gt;Aleksey Sushko&lt;br /&gt;(2:4615/7.32)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(IB) Как заставить Interbase принять COLLATE PXW_CYRL по умолчанию?&lt;br /&gt;(AA: Это очень полезно при прямой работе с IB из PowerDesigner)&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Чтобы не писать каждый раз COLLATE я сделал следующее:&lt;/p&gt;
						&lt;p&gt;1) Создал сохраненную процедуру&lt;/p&gt;
						&lt;p&gt;create procedure fix_character_sets&lt;br /&gt;as&lt;br /&gt;begin&lt;br /&gt;&amp;#160; update rdb$character_sets&lt;br /&gt;&amp;#160; &amp;#160; set rdb$default_collate_name = &#039;PXW_CYRL&#039;&lt;br /&gt;&amp;#160; &amp;#160; where rdb$character_set_name = &#039;WIN1251&#039; and&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; rdb$default_collate_name = &#039;WIN1251&#039;;&lt;br /&gt;end&lt;/p&gt;
						&lt;p&gt;2) Запустил ее один раз.&lt;/p&gt;
						&lt;p&gt;3) Создаю таблицы без COLLATE.&lt;/p&gt;
						&lt;p&gt;4) После восстановления из архива, запускаю еще раз.&lt;/p&gt;
						&lt;p&gt;Кудрин Олег, АТС-55, Красноярск.&lt;br /&gt;oleg@ats.telecom.krasnoyarsk.su&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;Есть некоторая таблица и требуется при нажатии на кнопку создавать&lt;br /&gt;таблицы такой же структуры, подскажите как это удобнее всего сделать.&lt;br /&gt;A&amp;gt;:&lt;br /&gt;Удобней всего, напpимеp, так -&lt;br /&gt;with bmovMyBatchMove do&lt;br /&gt;begin&lt;br /&gt;Mode := bmCopy;&lt;br /&gt;RecordCount := 1;&lt;br /&gt;Execute;&lt;br /&gt;Destination.Delete;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Akzhan Abdulin&lt;br /&gt;(2:5040/55.46)&lt;/p&gt;
						&lt;p&gt;&amp;#160; Неправда Ваша! ;) Этот загадочный BatchMove имеет одну очень неприятную&lt;br /&gt;особенность (по крайней мере при работе с DBF таблицами и в D1), как-то:&lt;br /&gt;увеличивает в создаваемых таблицах в полях типа NUMBER количество значащих&lt;br /&gt;цифирей после запятой (не помню - возможно, что и до), если там указаны&lt;br /&gt;небольшие (~ 1-3 цифр) значения :(. Я эту особенность побороть не сумел, а&lt;br /&gt;мириться с ней в условиях нашей конторы (когда приходится бороться за место под&lt;br /&gt;солнцем с программистами на Clipper и FoxPro совершенно неприемлимо.&lt;br /&gt;&amp;#160; Кроме того, в предложенном выше варианте еще и запись удалять приходится...:)&lt;br /&gt;&amp;#160; Решалась же эта проблема следующим способом:&lt;/p&gt;
						&lt;p&gt;&amp;gt;============&amp;#160; Cut Begin&amp;#160; Myutils.Pas ====================&lt;/p&gt;
						&lt;p&gt;procedure CopyStruct(SrcTable,DestTable: TTable; cpyFields: array of string);&lt;br /&gt;var&lt;br /&gt;&amp;#160; i: Integer;&lt;br /&gt;&amp;#160; bActive: Boolean;&lt;br /&gt;&amp;#160; SrcDatabase,DestDatabase: TDatabase;&lt;br /&gt;&amp;#160; iSrcMemSize,iDestMemSize: Integer;&lt;br /&gt;&amp;#160; pSrcFldDes: PFldDesc;&lt;br /&gt;&amp;#160; CrtTableDesc: CRTblDesc;&lt;br /&gt;&amp;#160; bNeedAllFields: Boolean;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; SrcDatabase:=Session.OpenDatabase(SrcTable.DatabaseName);&lt;br /&gt;&amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; DestDatabase:=Session.OpenDatabase(DestTable.DatabaseName);&lt;br /&gt;&amp;#160; &amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; bActive:=SrcTable.Active;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; SrcTable.FieldDefs.Update;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; iSrcMemSize:=SrcTable.FieldDefs.Count*SizeOf(FLDDesc);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; pSrcFldDes:=AllocMem(iSrcMemSize);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; if pSrcFldDes = nil then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; raise EOutOfMemory.Create(&#039;=х iтрEрхE ярь Eш!&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; SrcTable.Open;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Check(DbiGetFieldDescs(SrcTable.Handle,pSrcFldDes));&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; SrcTable.Active:=bActive;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; FillChar(CrtTableDesc,SizeOf(CrtTableDesc),0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; with CrtTableDesc do&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; StrPcopy(szTblName,DestTable.TableName);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; StrPcopy(szTblType,&#039;DBASE&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(Length(cpyFields[0]) = 0) or (cpyFields[0] = &#039;*&#039;) then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; bNeedAllFields:=True;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; SrcTable.FieldDefs.Update;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; iFldCount:=SrcTable.FieldDefs.Count;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; end&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; bNeedAllFields:=False;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; iFldCount:=High(cpyFields)+1;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; iDestMemSize:=iFldCount*Sizeof(FLDDesc);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; CrtTableDesc.pFLDDesc:=AllocMem(iDestMemSize);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if CrtTableDesc.pFLDDesc = nil then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; raise EOutOfMemory.Create(&#039;=х iтрEрхE ярь Eш!&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if bNeedAllFields then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; for i:=0 to CrtTableDesc.iFldCount-1 do&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; Move(PFieldDescList(pSrcFldDes)^[i],&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; PFieldDescList(CrtTableDesc.pFLDDesc)^[i],SizeOf(FldDesc))&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; for i:=0 to CrtTableDesc.iFldCount-1 do&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; Move(PFieldDescList(pSrcFldDes)^[SrcTable.FieldDefs.Find(cpyField&lt;br /&gt;s[i]).FieldNo-1],&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; PFieldDescList(CrtTableDesc.pFLDDesc)^[i],SizeOf(FldDesc));&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; Check(DbiCreateTable(DestDatabase.Handle,True,CrtTableDesc));&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; FreeMem(CrtTableDesc.pFLDDesc,iDestMemSize);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; FreeMem(pSrcFldDes,iSrcMemSize);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; Session.CloseDatabase(DestDatabase);&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; Session.CloseDatabase(SrcDatabase);&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;&amp;gt;============&amp;#160; &amp;#160;Cut End&amp;#160; &amp;#160;====================&lt;/p&gt;
						&lt;p&gt;Vlad Fillippov&lt;br /&gt;(2:5055/34.3)&lt;/p&gt;
						&lt;p&gt;Q&amp;gt;:&lt;br /&gt;(SAW) Как бы мне соорудить в SP исключение, чтобы его увидел Delphi-клиент?&lt;br /&gt;A&amp;gt;:&lt;/p&gt;
						&lt;p&gt; SS&amp;gt;&amp;#160; &amp;#160;sqlstate=&#039;99999&#039; не подходит, т.к. хочется на клиенте видеть код&lt;br /&gt; SS&amp;gt; исключения.&lt;/p&gt;
						&lt;p&gt;&amp;#160; Используй RAISERROR с кодом &amp;gt;20000. Если еще пpи этом научишься без потеpь&lt;br /&gt;пеpедавать на Delphi-клиента pусские pугательства, то скажи мне как ты этого&lt;br /&gt;добился :). У меня для этого pаботает pедкостный извpат, даже людям показать&lt;br /&gt;стыдно :).&lt;/p&gt;
						&lt;p&gt;Alexander Tesanov&lt;br /&gt;(2:5015/23.5)&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 00:23:10 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=13#p13</guid>
		</item>
		<item>
			<title>VCL FAQ</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=11#p11</link>
			<description>&lt;p&gt;Часть II&lt;br /&gt;Вопрос:&lt;br /&gt;Как узнать есть ли в заданном CD-ROM&#039;е Audio CD?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Можно использовать функцию Windows API GetDriveType() чтобы определить является ли дисковод CD-ROM&#039;мом. И функцию API GetVolumeInformation() чтобы проверить VolumeName на равенство &#039;Audio CD&#039;. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;function IsAudioCD(Drive : char) : bool;&lt;br /&gt;var&lt;br /&gt;	DrivePath : string;&lt;br /&gt;	MaximumComponentLength : DWORD;&lt;br /&gt;	FileSystemFlags : DWORD;&lt;br /&gt;	VolumeName : string;&lt;br /&gt;Begin&lt;br /&gt;	sult := false;&lt;br /&gt;	DrivePath := Drive + &#039;:\&#039;;&lt;br /&gt;	if GetDriveType(PChar(DrivePath)) &amp;lt;&amp;gt; DRIVE_CDROM then&lt;br /&gt;&amp;#160; &amp;#160; exit;&lt;br /&gt;	SetLength(VolumeName, 64);&lt;br /&gt;	GetVolumeInformation(PChar(DrivePath),PChar(VolumeName),&lt;br /&gt;	Length(VolumeName),nil,MaximumComponentLength,FileSystemFlags,nil,0);&lt;br /&gt;	if lStrCmp(PChar(VolumeName),&#039;Audio CD&#039;) = 0 then&lt;br /&gt;&amp;#160; &amp;#160; result := true;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;function PlayAudioCD(Drive : char) : bool;&lt;br /&gt;var&lt;br /&gt;	mp : TMediaPlayer;&lt;br /&gt;begin&lt;br /&gt;	result := false;&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	if not IsAudioCD(Drive) then&lt;br /&gt;&amp;#160; &amp;#160; exit;&lt;br /&gt;	mp := TMediaPlayer.Create(nil);&lt;br /&gt;	mp.Visible := false;&lt;br /&gt;	mp.Parent := Application.MainForm;&lt;br /&gt;	mp.Shareable := true;&lt;br /&gt;	mp.DeviceType := dtCDAudio;&lt;br /&gt;	mp.FileName := Drive + &#039;:&#039;;&lt;br /&gt;	mp.Shareable := true;&lt;br /&gt;	mp.Open;&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	mp.Play;&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	mp.Close;&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	mp.free;&lt;br /&gt;	result := true;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	if not PlayAudioCD(&#039;D&#039;) then&lt;br /&gt;&amp;#160; &amp;#160; ShowMessage(&#039;Not an Audio CD&#039;);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как узнать есть ли у мыши колесико?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Свойство &amp;quot;WheelPresent&amp;quot; глобального обьекта &amp;quot;mouse&amp;quot;.&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;События KeyPress и KeyDown не вызываются для клавиши Tab - как определить, что она была нажата? &lt;br /&gt;Ответ:&lt;br /&gt;На уровне формы клавиша tab обычно обрабатывается Windows. В примере создается обработчик события CM_Dialog для перехвата Dialog keys. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;	TForm1 = class(TForm)&lt;br /&gt;	private&lt;br /&gt;&amp;#160; &amp;#160; procedure CMDialogKey( Var msg: TCMDialogKey );&lt;br /&gt;&amp;#160; &amp;#160; message CM_DIALOGKEY;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.CMDialogKey(var msg: TCMDialogKey);&lt;br /&gt;begin&lt;br /&gt;	if msg.Charcode &amp;lt;&amp;gt; VK_TAB then&lt;br /&gt;&amp;#160; &amp;#160; inherited;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);&lt;br /&gt;begin&lt;br /&gt;	if Key = VK_TAB then&lt;br /&gt;	Form1.Caption := &#039;Tab Key Down!&#039;;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;В чем отличие между Create(Self) и Create(Application)?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Self может быть использовано только в методе класса, и ссылается на текущий экземпляр класса. Таким образом &amp;quot;Self&amp;quot; в методе класса TForm1 ссылается на текущий экземпляр TForm1. При создании компонента Вы передаете его владельца (owner) в конструктор. При уничтожении формы или компонента автоматически уничтожаются и все компоненты владельцем которого она является. Таким образом если при создании формы передать в качестве владельца Application эта форма будет автоматически уничтожена при уничтожении Application. Если же при создании формы передать в качестве владельца другую форму, вновь созданная форма будет автоматически уничтоженна при уничтожении формы-владельца. &lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как во время выполнения определить поддерживает ли обьект заданное свойство?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;function HasProperty(Obj : TObject; Prop : string) : PPropInfo;&lt;br /&gt;begin&lt;br /&gt;	Result := GetPropInfo(Obj.ClassInfo, Prop);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	p : pointer;&lt;br /&gt;begin&lt;br /&gt;	p :=&amp;#160; HasProperty(Button1, &#039;Color&#039;);&lt;br /&gt;	if p &amp;lt;&amp;gt; nil then&lt;br /&gt;&amp;#160; &amp;#160; SetOrdProp(Button1, p, clRed)&lt;br /&gt;	else&lt;br /&gt;&amp;#160; &amp;#160; ShowMessage(&#039;Button has no color property&#039;);&lt;br /&gt;	p :=&amp;#160; HasProperty(Label1, &#039;Color&#039;);&lt;br /&gt;	if p &amp;lt;&amp;gt; nil then&lt;br /&gt;&amp;#160; &amp;#160; SetOrdProp(Label1, p, clRed)&lt;br /&gt;	else&lt;br /&gt;&amp;#160; &amp;#160; ShowMessage(&#039;Label has no color property&#039;);&lt;br /&gt;	p :=&amp;#160; HasProperty(Label1.Font, &#039;Color&#039;);&lt;br /&gt;	if p &amp;lt;&amp;gt; nil then&lt;br /&gt;&amp;#160; &amp;#160; SetOrdProp(Label1.Font.Color, p, clBlue)&lt;br /&gt;	else&lt;br /&gt;&amp;#160; &amp;#160; ShowMessage(&#039;Label.Font has no color property&#039;);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как при проигрывании музыки с Audio CD показывать сколько прошло минут и секунд?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В примере время выводится по таймеру.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;uses MMSystem;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	Trk : Word;&lt;br /&gt;	Min : Word;&lt;br /&gt;	Sec : Word;&lt;br /&gt;begin&lt;br /&gt;	with MediaPlayer1 do&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	Trk := MCI_TMSF_TRACK(Position);&lt;br /&gt;&amp;#160; &amp;#160; 	Min := MCI_TMSF_MINUTE(Position);&lt;br /&gt;&amp;#160; &amp;#160; 	Sec := MCI_TMSF_SECOND(Position);&lt;br /&gt;&amp;#160; &amp;#160; 	Label1.Caption := Format(&#039;%.2d&#039;,[Trk]);&lt;br /&gt;&amp;#160; &amp;#160; 	Label2.Caption := Format(&#039;%.2d:%.2d&#039;,[Min,Sec]);&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Можно ли рисовать на рамке формы?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Обрабатывайте событие WM_NCPAINT. В примере рамка обводится красной линией&lt;br /&gt;толщиной в 1 пиксел.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;	TForm1 = class(TForm)&lt;br /&gt;	private&lt;br /&gt;	{Private declarations}&lt;br /&gt;&amp;#160; &amp;#160; procedure WMNCPaint(var Msg : TWMNCPaint); message WM_NCPAINT;&lt;br /&gt;	public&lt;br /&gt;	{Public declarations}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.WMNCPaint(var Msg: TWMNCPaint);&lt;br /&gt;var&lt;br /&gt;	dc : hDc;&lt;br /&gt;	Pen : hPen;&lt;br /&gt;	OldPen : hPen;&lt;br /&gt;	OldBrush : hBrush;&lt;br /&gt;begin&lt;br /&gt;	inherited;&lt;br /&gt;	dc := GetWindowDC(Handle);&lt;br /&gt;	msg.Result := 1;&lt;br /&gt;	Pen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0));&lt;br /&gt;	OldPen := SelectObject(dc, Pen);&lt;br /&gt;	OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));&lt;br /&gt;	Rectangle(dc, 0,0, Form1.Width, Form1.Height);&lt;br /&gt;	SelectObject(dc, OldBrush);&lt;br /&gt;	SelectObject(dc, OldPen);&lt;br /&gt;	DeleteObject(Pen);&lt;br /&gt;	ReleaseDC(Handle, Canvas.Handle);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как выполнить какой-то процесс тогда, когда пользователь не работает с моим приложением?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Создайте процедуру, которая будет вызываться при событии Application.OnIdle.&lt;/p&gt;
						&lt;p&gt;Обьявим процедуру:&lt;br /&gt;{Private declarations}&lt;br /&gt;procedure IdleEventHandler(Sender: TObject; var Done: Boolean);&lt;/p&gt;
						&lt;p&gt;В разделе implementation опишем поцедуру:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.IdleEventHandler(Sender: TObject; var Done: Boolean);&lt;br /&gt;begin&lt;br /&gt;	{Do a small bit of work here}&lt;br /&gt;	Done := false;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;В методе Form&#039;ы OnCreate - укажем что наша процедура вызывается на событии&lt;br /&gt;Application.OnIdle.&lt;/p&gt;
						&lt;p&gt;Application.OnIdle := IdleEventHandler;&lt;br /&gt;Событие OnIdle возникает один раз - когда приложение переходит в режим &amp;quot;безделья&amp;quot; (idle). Если в обработчике переменной Done присвоить False событие будет вызываться вновь и вновь, до тех пор пока приложение &amp;quot;бездельничает&amp;quot; и переменной Done не присвоенно значение True. &lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;При перемещении фокуса ввода клавишей Tab чтобы переместить его в RadioGroup нужно нажать клавишу Tab дважды если какой нибудь пункт RadioGroup уже выбран, но только один раз если не выбран. Можно ли сделать поведение RadioGroup логичным? &lt;br /&gt;Ответ:&lt;br /&gt;Установка свойства RadioGroup&#039;ы TabStop в false должна решить эту проблему - поскольку клавиша tab будет продолжать работать - перемещаясь сразу на выделенный пункт RadioGroup.&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как разместить маленькие картинки в компоненте TPopUpMenu?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В приведенном примере показано как это сделать с использованием функции Windows API SetMenuItemBitmaps(). Эта функция получает handle popup menu, позицию строчки меню куда будет помещена картинка, и два дескриптора(handles) на две картинки (одна из них - картинка которая будет показана когда строка меню доступна, вторая - когда строка меню недоступна). &lt;br /&gt;type&lt;br /&gt;	TForm1 = class(TForm)&lt;br /&gt;&amp;#160; &amp;#160; PopupMenu1: TPopupMenu;&lt;br /&gt;&amp;#160; &amp;#160; Pop11: TMenuItem;&lt;br /&gt;&amp;#160; &amp;#160; Pop21: TMenuItem;&lt;br /&gt;&amp;#160; &amp;#160; Pop31: TMenuItem;&lt;br /&gt;&amp;#160; &amp;#160; procedure FormCreate(Sender: TObject);&lt;br /&gt;&amp;#160; &amp;#160; procedure FormDestroy(Sender: TObject);&lt;br /&gt;&amp;#160; &amp;#160; procedure FormMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; 	Shift: TShiftState; X, Y: Integer);&lt;br /&gt;	private&lt;br /&gt;&amp;#160; &amp;#160; {Private declarations}&lt;br /&gt;&amp;#160; &amp;#160; bmUnChecked : TBitmap;&lt;br /&gt;&amp;#160; &amp;#160; bmChecked : TBitmap;&lt;br /&gt;	public&lt;br /&gt;&amp;#160; &amp;#160; {Public declarations}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	bmUnChecked := TBitmap.Create;&lt;br /&gt;	bmUnChecked.LoadFromFile(&#039;C:\Program Files\Borland\BitBtns\ALARMRNG.BMP&#039;);&lt;br /&gt;	bmChecked := TBitmap.Create;&lt;br /&gt;	bmChecked.LoadFromFile(&#039;C:\Program Files\Borland\BitBtns\CHECK.BMP&#039;);&lt;br /&gt;	{Add the bitmaps to the item at index 1 in PopUpMenu}&lt;br /&gt;	SetMenuItemBitmaps(PopUpMenu1.Handle,1,MF_BYPOSITION,BmUnChecked.Handle,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; 	BmChecked.Handle);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	bmUnChecked.Free;&lt;br /&gt;	bmChecked.Free;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;var&lt;br /&gt;	pt : TPoint;&lt;br /&gt;begin&lt;br /&gt;	pt := ClientToScreen(Point(x, y));&lt;br /&gt;	PopUpMenu1.Popup(pt.x, pt.y);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как узнать число кадров AVI файла, и выяснить как долго будет проигрывться этот файл?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В приведенном примере указано как получить эту информацию.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	MediaPlayer1.TimeFormat := tfFrames;&lt;br /&gt;	ShowMessage(&#039;Number of frames = &#039; + IntToStr(MediaPlayer1.Length));&lt;br /&gt;	MediaPlayer1.TimeFormat := tfMilliseconds;&lt;br /&gt;	ShowMessage(&#039;Number of milliseconds = &#039; + IntToStr(MediaPlayer1.Length));&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как изменить число фиксированных колонок в TDbGrid?&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	TStringGrid(DbGrid1).FixedCols := 2;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Некоторые компоненты баз данных (и среди них TDBGrid) никак не меняют визуальных свойств, когда к ним отключен доступ (disabled). Как это изменить програмно? &lt;br /&gt;Ответ:&lt;br /&gt;Ниже приведен пример, меняющий цвет шрифта на clGray, когда доступ к элементу управления (в данном случае TDBGrid) запрещен (disabled). &lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	DbGrid1.Enabled := false;&lt;br /&gt;	DbGrid1.Font.Color := clGray;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button2Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	DbGrid1.Enabled := true;&lt;br /&gt;	DbGrid1.Font.Color := clBlack;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как определить нажаты ли клавиши Shift, Alt, or Ctrl в какой-либо момент времени?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В приведенном примере показано как определить нажата ли клавиша Shift при выборе строчки меню. Пример также содержит функции проверки состояния клавиш Alt, Ctrl. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;function CtrlDown : Boolean;&lt;br /&gt;var&lt;br /&gt;	State : TKeyboardState;&lt;br /&gt;begin&lt;br /&gt;	GetKeyboardState(State);&lt;br /&gt;	Result := ((State[vk_Control] And 128) &amp;lt;&amp;gt; 0);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;function ShiftDown : Boolean;&lt;br /&gt;var&lt;br /&gt;	State : TKeyboardState;&lt;br /&gt;begin&lt;br /&gt;	GetKeyboardState(State);&lt;br /&gt;	Result := ((State[vk_Shift] and 128) &amp;lt;&amp;gt; 0);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;function AltDown : Boolean;&lt;br /&gt;var&lt;br /&gt;	State : TKeyboardState;&lt;br /&gt;begin&lt;br /&gt;	GetKeyboardState(State);&lt;br /&gt;	Result := ((State[vk_Menu] and 128) &amp;lt;&amp;gt; 0);&lt;br /&gt;end;&lt;br /&gt;procedure TForm1.MenuItem12Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	if ShiftDown then&lt;br /&gt;&amp;#160; &amp;#160; Form1.Caption := &#039;Shift&#039;&lt;br /&gt;	else	&lt;br /&gt;&amp;#160; &amp;#160; Form1.Caption := &#039;&#039;;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как изменить шрифта hint&#039;а?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В примере перехватывается событие Application.OnShowHint и изменяется шрифт Hint&#039;а.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;	TForm1 = class(TForm)&lt;br /&gt;&amp;#160; &amp;#160; procedure FormCreate(Sender: TObject);&lt;br /&gt;	private&lt;br /&gt;&amp;#160; &amp;#160; {Private declarations}&lt;br /&gt;	public&lt;br /&gt;&amp;#160; &amp;#160; procedure MyShowHint(var HintStr: string;&lt;br /&gt;&amp;#160; &amp;#160; 	var CanShow: Boolean;var HintInfo: THintInfo);&lt;br /&gt;&amp;#160; &amp;#160; {Public declarations}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.MyShowHint(var HintStr: string; var CanShow: Boolean;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; var HintInfo: THintInfo);&lt;br /&gt;var&lt;br /&gt;	i : integer;&lt;br /&gt;begin&lt;br /&gt;	for i := 0 to Application.ComponentCount - 1 do&lt;br /&gt;	if Application.Components[i] is THintWindow then&lt;br /&gt;&amp;#160; &amp;#160; with THintWindow(Application.Components[i]).Canvas do&lt;br /&gt;&amp;#160; &amp;#160; 	begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Font.Name:= &#039;Arial&#039;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Font.Size:= 18;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Font.Style:= [fsBold];&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; HintInfo.HintColor:= clWhite;&lt;br /&gt;&amp;#160; &amp;#160; 	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	Application.OnShowHint := MyShowHint;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Есть ли в Delphi эквивалент функции SendKeys Visual Basic&#039;а?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Ниже приведена процедура, позволяющаю отправлять нажатия в любой элемент управления (window control), способный принимать ввод с клавиатуры. Вы можете использовать эту технику чтобы включать клавиши NumLock, CapsLock и ScrollLock под Windows NT. Та же техника работает и под Windows 95 для CapsLock и ScrollLock но не работает для клавиши NumLock. &lt;br /&gt;Обратите внимание, что приведены четыре поцедуры: SimulateKeyDown() - эмулировать нажатие клавиши (без отпускания) SimulateKeyUp() - эмулировать отпускание клавиши SimulateKeystroke() - эмулировать удар по клавише (нажатие и отпускание) и SendKeys(), позволяющие Вам гибко контролировать посылаемые сообщения клавиатуры. &lt;br /&gt;SimulateKeyDown(), SimulateKeyUp() и SimulateKeystroke() получают коды виртуальных клавиш (virtural key) (вроде VK_F1). Процедура SimulateKeystroke() получает дополнительный параметр, полезный при эмуляции нажатия PrintScreen. Когда этот параметр равен нулю весь экран будет скопирован в буфер обмена (clipboard). Если дополнительный параметр равен 1 будет скопированно только активное окно. &lt;br /&gt;Четыре метода &amp;quot;button click&amp;quot; демонстрируют использование: ButtonClick1 - включает capslock ButtonClick2 - перехватывает весь экран в буфер обмена (clipboard). ButtonClick3 - перехватывает активное окно в буфер обмена (clipboard). ButtonClick4 - устанавливает фокус в Edit и отправляет в него строку. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure SimulateKeyDown(Key : byte);&lt;br /&gt;begin&lt;br /&gt;	keybd_event(Key, 0, 0, 0);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure SimulateKeyUp(Key : byte);&lt;br /&gt;begin&lt;br /&gt;	keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure SimulateKeystroke(Key : byte; extra : DWORD);&lt;br /&gt;begin&lt;br /&gt;	keybd_event(Key,extra,0,0);&lt;br /&gt;	keybd_event(Key,extra,KEYEVENTF_KEYUP,0);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure SendKeys(s : string);&lt;br /&gt;var&lt;br /&gt;	i : integer;&lt;br /&gt;	flag : bool;&lt;br /&gt;	w : word;&lt;br /&gt;begin&lt;br /&gt;	{Get the state of the caps lock key}&lt;br /&gt;	flag := not GetKeyState(VK_CAPITAL) and 1 = 0;&lt;br /&gt;	{If the caps lock key is on then turn it off}&lt;br /&gt;	if flag then&lt;br /&gt;&amp;#160; &amp;#160; SimulateKeystroke(VK_CAPITAL, 0);&lt;br /&gt;	for i := 1 to Length(s) do&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	w := VkKeyScan(s[i]);&lt;br /&gt;&amp;#160; &amp;#160; 	{If there is not an error in the key translation}&lt;br /&gt;&amp;#160; &amp;#160; 	if ((HiByte(w) &amp;lt;&amp;gt; $FF) and (LoByte(w) &amp;lt;&amp;gt; $FF)) then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	{If the key requires the shift key down - hold it down}&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	if HiByte(w) and 1 = 1 then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; SimulateKeyDown(VK_SHIFT);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; {Send the VK_KEY}&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	SimulateKeystroke(LoByte(w), 0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	{If the key required the shift key down - release it}&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	if HiByte(w) and 1 = 1 then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; SimulateKeyUp(VK_SHIFT);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;{if the caps lock key was on at start, turn it back on}&lt;br /&gt;if flag then&lt;br /&gt;	SimulateKeystroke(VK_CAPITAL, 0);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	{Toggle the cap lock}&lt;br /&gt;	SimulateKeystroke(VK_CAPITAL, 0);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button2Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	{Capture the entire screen to the clipboard}&lt;br /&gt;	{by simulating pressing the PrintScreen key}&lt;br /&gt;	SimulateKeystroke(VK_SNAPSHOT, 0);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button3Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	{Capture the active window to the clipboard}&lt;br /&gt;	{by simulating pressing the PrintScreen key}&lt;br /&gt;	SimulateKeystroke(VK_SNAPSHOT, 1);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button4Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	{Set the focus to a window (edit control) and send it a string}&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	Edit1.SetFocus;&lt;br /&gt;	SendKeys(&#039;Delphi Is RAD!&#039;);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Я загружаю TImageList динамически. Как сделать картинки из TImageList прозрачными?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;См. ответ.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	bm : TBitmap;&lt;br /&gt;	il : TImageList;&lt;br /&gt;begin&lt;br /&gt;	bm := TBitmap.Create;&lt;br /&gt;	bm.LoadFromFile(&#039;C:\DownLoad\TEST.BMP&#039;);&lt;br /&gt;	il := TImageList.CreateSize(bm.Width,bm.Height);&lt;br /&gt;	il.DrawingStyle := dsTransparent;&lt;br /&gt;	il.Masked := true;&lt;br /&gt;	il.AddMasked(bm, clRed);&lt;br /&gt;	il.Draw(Form1.Canvas, 0, 0, 0);&lt;br /&gt;	bm.Free;&lt;br /&gt;	il.Free;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как заставить TMediaPlayer проигрывать одно и тоже бесконечно? AVI например?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В примере AVI файл проигрывается снова и снова - используем событие MediaPlayer&#039;а Notify&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.MediaPlayer1Notify(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	with MediaPlayer1 do&lt;br /&gt;&amp;#160; &amp;#160; if NotifyValue = nvSuccessful then&lt;br /&gt;&amp;#160; &amp;#160; 	begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Notify := True;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Play;&lt;br /&gt;&amp;#160; &amp;#160; 	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;При выполнении диалога FontDialog со свойством Device равным fdBoth or fdPrinter, появляется ошибка &amp;quot;There are no fonts installed&amp;quot;. &lt;br /&gt;Ответ:&lt;br /&gt;Эти установки должны показать шрифты совместимые либо с принтером либо с экраном. В примере диалог Windows ChooseFont вызывается напрямую чтобы показать список шрифтов, совместимых одновременно и с экраном и с принтером. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;uses Printers, CommDlg;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	cf : TChooseFont;&lt;br /&gt;	lf : TLogFont;&lt;br /&gt;	tf : TFont;&lt;br /&gt;begin&lt;br /&gt;	if PrintDialog1.Execute then&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	GetObject(Form1.Canvas.Font.Handle, sizeof(lf),@lf);&lt;br /&gt;&amp;#160; &amp;#160; 	FillChar(cf, sizeof(cf), #0);&lt;br /&gt;&amp;#160; &amp;#160; 	cf.lStructSize := sizeof(cf);&lt;br /&gt;&amp;#160; &amp;#160; 	cf.hWndOwner := Form1.Handle;&lt;br /&gt;&amp;#160; &amp;#160; 	cf.hdc := Printer.Handle;&lt;br /&gt;&amp;#160; &amp;#160; 	cf.lpLogFont := @lf;&lt;br /&gt;&amp;#160; &amp;#160; 	cf.iPointSize := Form1.Canvas.Font.Size * 10;&lt;br /&gt;&amp;#160; &amp;#160; 	cf.Flags := CF_BOTH or CF_INITTOLOGFONTSTRUCT or&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; CF_EFFECTS or CF_SCALABLEONLY or CF_WYSIWYG;&lt;br /&gt;&amp;#160; &amp;#160; 	cf.rgbColors := Form1.Canvas.Font.Color;&lt;br /&gt;&amp;#160; &amp;#160; 	if ChooseFont(cf) &amp;lt;&amp;gt; false then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	tf := TFont.Create;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	tf.Handle := CreateFontIndirect(lf);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	tf.COlor := cf.RgbColors;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	Form1.Canvas.Font.Assign(tf);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	tf.Free;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	Form1.Canvas.TextOut(10, 10, &#039;Test&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как сменить дисковод, откуда&amp;#160; MediaPlayer проигрывает аудио CD?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;См. пример.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;MediaPlayer1.FileName := &#039;E:&#039;;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как убрать кнопку с названием моей программы из Панели Задач(Taskbar)?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Отредактируйте файл-проекта (View -&amp;gt; Project Source) Добавьте модуль Windows в раздел uses. Application.ShowMainForm := False; в строку после &amp;quot;Application.Initialize;&amp;quot;. Добавьте ShowWindow(Application.Handle, SW_HIDE); в строку перед &amp;quot;Application.Run;&amp;quot; &lt;br /&gt;Ваш файл проекта должен выглядеть приблизительно так:&lt;/p&gt;
						&lt;p&gt;program Project1;&lt;/p&gt;
						&lt;p&gt;uses&lt;br /&gt;	Windows,&lt;br /&gt;	Forms,&lt;br /&gt;	Unit1 in &#039;Unit1.pas&#039; {Form1},&lt;br /&gt;	Unit2 in &#039;Unit2.pas&#039; {Form2};&lt;/p&gt;
						&lt;p&gt;{$R *.RES}&lt;/p&gt;
						&lt;p&gt;begin&lt;br /&gt;	Application.Initialize;&lt;br /&gt;	Application.ShowMainForm := False;&lt;br /&gt;	Application.CreateForm(TForm1, Form1);&lt;br /&gt;	Application.CreateForm(TForm2, Form2);&lt;br /&gt;	ShowWindow(Application.Handle, SW_HIDE);&lt;br /&gt;	Application.Run;&lt;br /&gt;end.&lt;/p&gt;
						&lt;p&gt;В разделе &amp;quot;initialization&amp;quot; (в самом низу) каждого unit&#039;а добавьте&lt;/p&gt;
						&lt;p&gt;begin&lt;br /&gt;	ShowWindow(Application.Handle, SW_HIDE);&lt;br /&gt;end.&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как преобразовать цвета в строку - название цвета&amp;#160; VCL?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Модуль graphics.pas содержит функцию ColorToString() которое преобразует допустимое значение TColor в его строковое представление используя либо константу-название цвета (по возможности) либо шестнадцатиричную строку. Обратная функция - StringToColor() &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	Memo1.Lines.Add(ColorToString(clRed));&lt;br /&gt;	Memo1.Lines.Add(IntToStr(StringToColor(&#039;clRed&#039;)));&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;При показе максимизированное формы она перекрывает task bar и не выравнивается&lt;br /&gt;по верху экрана. В чем тут дело?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Это может произойти когда свойство position формы установленно в poScreenCenter.&lt;br /&gt;Установите position = poDefault.&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как заставить TEdit не &#039;пикать&#039; при нажатии недопустимых клавиш?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Перехватите событие KeyPress и установите key = #0 для недопустимых клавиш.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);&lt;br /&gt;begin&lt;br /&gt;	if ((UpCase(Key) &amp;lt; &#039;A&#039;) or (UpCase(Key) &amp;gt; &#039;Z&#039;)) then&lt;br /&gt;&amp;#160; &amp;#160; Key := #0;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как получить число и список всех компонентов, расположенных на TNoteBook?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В примере список выводится на Listbox.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	n: integer;&lt;br /&gt;	p: integer;&lt;br /&gt;begin&lt;br /&gt;	ListBox1.Clear;&lt;br /&gt;	with Notebook1 do&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; for n := 0 to ControlCount - 1 do&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	with TPage(Controls[n]) do&lt;br /&gt;&amp;#160; &amp;#160; 	begin&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; ListBox1.Items.Add(&#039;Notebook Page: &#039; +&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; TPage(Notebook1.Controls[n]).Caption);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; for p := 0 to ControlCount - 1 do&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; ListBox1.Items.Add(Controls[p].Name);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; ListBox1.Items.Add(EmptyStr);&lt;br /&gt;&amp;#160; &amp;#160; 	end;&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Я хочу вставить escape code в строку при использовании функции Format(). Например, я хочу создать строку, содержащую символ табуляции. В &amp;quot;C&amp;quot; я бы написал что-то вроде sprintf(buffer, &amp;quot;%s\t%s&amp;quot;, str);. А как это будет на Pascal&#039;e? &lt;br /&gt;Ответ:&lt;br /&gt;Функция Format Pascal&#039;я не использует escape codes. Вместо этого нужно вставить в строку действительное значение символа в кодировке ASCII. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;Buffer := Format(&#039;%s&#039;#9&#039;%s&#039;, [Str1, Str2]);&lt;br /&gt;ShowMessage(Format(&#039;%s&#039;#9&#039;%s&#039;, [&#039;Column1&#039;, &#039;Column2&#039;]));&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как показать первый кадр AVI-файла?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;См. пример.&lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	MediaPlayer1.Open;&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	MediaPlayer1.Step;&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	MediaPlayer1.Previous;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Когда пользователь щелкает по listview, он переходит в режим редактирования.&lt;br /&gt;Как перевисти его в редим редактирования по нажатию клавиши (например F2)?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Перехватите F2 на событии keydown.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);&lt;br /&gt;begin&lt;br /&gt;	if Ord(Key) = VK_F2 then&lt;br /&gt;	ListView1.Selected.EditCaption;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Когда я добавляю обьект в список TStrings как мне его потом уничтожить?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Просто вызовите метод free этого обьекта.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	Icon: TIcon;&lt;br /&gt;begin&lt;br /&gt;	Icon := TIcon.Create;&lt;br /&gt;	Icon.LoadFromFile(&#039;C:\Program Files\BorlandImages\CONSTRUC.ICO&#039;);&lt;br /&gt;	ListBox1.Items.AddObject(&#039;Item 0&#039;, Icon);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	ListBox1.Items.Objects[0].Free;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Вместо печати графики я хочу использовать резидентный шрифт принтера. Как?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Используте функцию Windows API - GetStockObject() чтобы получить дескриптор (handle) шрифта по умолчанию устройства (DEVICE_DEFAULT_FONT) и передайте его Printer.Font.Handle. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;uses Printers;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	tm : TTextMetric;&lt;br /&gt;	i : integer;&lt;br /&gt;begin&lt;br /&gt;	if PrintDialog1.Execute then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; Printer.BeginDoc;&lt;br /&gt;&amp;#160; &amp;#160; Printer.Canvas.Font.Handle := GetStockObject(DEVICE_DEFAULT_FONT);&lt;br /&gt;&amp;#160; &amp;#160; GetTextMetrics(Printer.Canvas.Handle, tm);&lt;br /&gt;&amp;#160; &amp;#160; for i := 1 to 10 do&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	Printer.Canvas.TextOut(100,i * tm.tmHeight +&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; tm.tmExternalLeading,&#039;Test&#039;);&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; Printer.EndDoc;&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Мне нужно программно установить некоторые файлы с установочного диска Windows. На многих компьютерах CAB-файлы установки Windows находятся в каком-то каталоге на жестком диске, на других - Windows был установлен с CD. Как узнать откуда была установленна Windows? &lt;br /&gt;Ответ:&lt;br /&gt;Эту информацию можно получить из реестра.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;br /&gt;uses Registry;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	reg: TRegistry;&lt;br /&gt;begin&lt;br /&gt;	reg := TRegistry.Create;&lt;br /&gt;	reg.RootKey := HKEY_LOCAL_MACHINE;&lt;br /&gt;	reg.OpenKey(&#039;Software\Microsoft\Windows\CurrentVersion\SETUP&#039;,false);&lt;br /&gt;	ShowMessage(reg.ReadString(&#039;SourcePath&#039;));&lt;br /&gt;	reg.CloseKey;&lt;br /&gt;	reg.free;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как получить строку сообщения об ошибке Windows код которой получен функцией&lt;br /&gt;GetLastError?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Функция RTL SysErrorMessage(GetLastError).&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	{Cause a Windows system error message to be logged}&lt;br /&gt;	ShowMessage(IntToStr(lStrLen(nil)));&lt;br /&gt;	ShowMessage(SysErrorMessage(GetLastError));&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как заставить Delphi выполнять еще более строгую проверка типов? Напрмер - я создаю пользовательский тип, унаследованный от double и могу передавать его любым функциям, принимающим параметр типа double. Как заставить компилятор проводить более строгую проверку типов и выдавать предупреждение в таких случаях? &lt;br /&gt;Ответ:&lt;br /&gt;См. ответ.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type TStrongType = type Double;&lt;br /&gt;type TWeakType = Double;&lt;/p&gt;
						&lt;p&gt;procedure AddWeakType(var d : TWeakType);&lt;br /&gt;begin&lt;br /&gt;	d := d + 1;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure AddStrongType(var d : TStrongType);&lt;br /&gt;begin&lt;br /&gt;	d := d + 1;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure AddDoubleType(var d : Double);&lt;br /&gt;begin&lt;br /&gt;	d := d + 1;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	d : Double;&lt;br /&gt;	s : TStrongType;&lt;br /&gt;	w : TWeakType;&lt;br /&gt;begin&lt;br /&gt;	AddDoubleType(d); {compiles fine}&lt;br /&gt;	AddDoubleType(w); {compiles fine}&lt;br /&gt;	AddDoubleType(s); {&amp;lt;- compile error}&lt;br /&gt;	AddDoubleType(double(s)); {compiles fine}&lt;br /&gt;	AddWeakType(d); {compiles fine}&lt;br /&gt;	AddWeakType(w); {compiles fine}&lt;br /&gt;	AddWeakType(s); {&amp;lt;- compile error}&lt;br /&gt;	AddWeakType(TWeakType(s)); {compiles fine}&lt;br /&gt;	AddStrongType(d); {&amp;lt;- compile error}&lt;br /&gt;	AddStrongType(TStrongType(d)); {compiles fine}&lt;br /&gt;	AddStrongType(w); {&amp;lt;- compile error}&lt;br /&gt;	AddStrongType(TStrongType(w)); {compiles fine}&lt;br /&gt;	AddStrongType(s); {compiles fine}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Где в Delphi обьявленны VK_Key для A-Z и 0-9?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Они не обьявлены в Delphi поскольку они просто могуть быть заменены буквами.&lt;br /&gt;VK_0 до VK_9 то же что и&amp;#160; ASCII &#039;0&#039; до &#039;9&#039; ($30 - $39),&lt;br /&gt;VK_A до VK_Z то же что и&amp;#160; ASCII &#039;A&#039; до &#039;Z&#039; ($41 - $5A).&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как изменить оконную процедуру для TForm?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Переопределите в подклассе TForm оконную процедуру WinProc класса. В примере оконная процедура переопределяется для того чтобы реагировать на сообщение WM_CANCELMODE, показывающее, что выполняется messagebox или какой-либо еще диалог. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;	TForm1 = class(TForm)&lt;br /&gt;&amp;#160; &amp;#160; Button1: TButton;&lt;br /&gt;&amp;#160; &amp;#160; procedure WndProc (var Message: TMessage); override;&lt;br /&gt;&amp;#160; &amp;#160; procedure Button1Click(Sender: TObject);&lt;br /&gt;	private&lt;br /&gt;&amp;#160; &amp;#160; {Private declarations}&lt;br /&gt;	public&lt;br /&gt;&amp;#160; &amp;#160; {Public declarations}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.WndProc (var Message: TMessage);&lt;br /&gt;begin&lt;br /&gt;	if Message.Msg = WM_CANCELMODE then&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	Form1.Caption := &#039;A dialog or message box has popped up&#039;;&lt;br /&gt;&amp;#160; &amp;#160; end&lt;br /&gt;	else&lt;br /&gt;&amp;#160; &amp;#160; inherited&amp;#160; // &amp;lt;- остальное сделает родительская процедура&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	ShowMessage(&#039;Test Message&#039;);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как узнать размеры TComboBox с показанным выпадающим списком до показа списка?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;На событии FormShow пошлите сообщение CB_SHOWDROPDOWN в ComboBox дважды - один раз чтобы заставить список выпасть, второй - чтобы убрать его. Затем пошлите сообщение CB_GETDROPPEDCONTROLRECT, передав в качестве параметра адрес TRect. TRect будет содержать экранные кординаты прямоугольника описывающего ComboBox вместе с выпавшим списком. Затем Вы можете вызвать ScreenToClient чтобы преобразовать экранные кординаты в координаты клиентской области окна. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	R : TRect;&lt;br /&gt;procedure TForm1.FormShow(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	T : TPoint;&lt;br /&gt;begin&lt;br /&gt;	SendMessage(ComboBox1.Handle, CB_SHOWDROPDOWN, 1, 0);&lt;br /&gt;	SendMessage(ComboBox1.Handle, CB_SHOWDROPDOWN, 0, 0);&lt;br /&gt;	SendMessage(ComboBox1.Handle, CB_GETDROPPEDCONTROLRECT, 0, LongInt(@r));&lt;br /&gt;	t := ScreenToClient(Point(r.Left, r.Top));&lt;br /&gt;	r.Left := t.x;&lt;br /&gt;	r.Top := t.y;&lt;br /&gt;	t := ScreenToClient(Point(r.Right, r.Bottom));&lt;br /&gt;	r.Right := t.x;&lt;br /&gt;	r.Bottom := t.y;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	Form1.Canvas.Rectangle(r.Left, r.Top, r.Right, r.Bottom );&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Я хочу создать в своей программе меню &amp;quot;а ля Дельфи 4&amp;quot;. Как это сделать?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;1. Разместите на форме TControlBar. (закладка Additional) Установите Align = Client.&lt;br /&gt;2. Разместите TToolBar (закладка Win32) внутри TControlBar.&lt;br /&gt;3. Установите в True свойства Flat и ShowCaptions этого TToolBar.&lt;br /&gt;4. Создайте на TToolBar столько TToolButtons сколько Вам нужно. (щелкнув по TToolBar&lt;br /&gt;	правой кнопкой и выбрав NewButton)&lt;br /&gt;5. Установите свойство Grouped = True для всех TToolButtons. Это позволит меню выпадать&lt;br /&gt;	при перемещении курсора между главными пунктами меню (если меню уже показано).&lt;br /&gt;6. Разместите на фоме TMainMenu и убедитесь, что оно *НЕ присоденено* как меню главной&lt;br /&gt;	формы. (посмотрите свойство Menu формы).&lt;br /&gt;7. Создайте все пункты меню (щелкнув по TMainMenu кнопкой и выбрав Menu Designer)&lt;br /&gt;8. Для каждой TToolButton установите ее MenuItem равным соответсвующему пункту TMainMenu.&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как добится того чтобы TMemo и TEdit имели работали не только в режиме вставки символов,&lt;br /&gt;но и в режиме замены?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Элементы управления Windows TEdit и TMemo не имеют режима замены. Однако этот режим можно эмулировать установив свойство SelLength edit&#039;а или memo в 1 при обработке события KeyPress. Это заставит его перезаписывать символ в текущей позиции курсора. В примере этот способ используется для TMemo. Режим вставка/замена переключается клавишей &amp;quot;Insert&amp;quot;. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;	TForm1 = class(TForm)&lt;br /&gt;&amp;#160; &amp;#160; Memo1: TMemo;&lt;br /&gt;&amp;#160; &amp;#160; procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);&lt;br /&gt;&amp;#160; &amp;#160; procedure Memo1KeyPress(Sender: TObject; var Key: Char);&lt;br /&gt;private&lt;br /&gt;	{Private declarations}&lt;br /&gt;&amp;#160; &amp;#160; InsertOn : bool;&lt;br /&gt;public&lt;br /&gt;	{Public declarations}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);&lt;br /&gt;begin&lt;br /&gt;	if (Key = VK_INSERT) and (Shift = []) then&lt;br /&gt;&amp;#160; &amp;#160; InsertOn := not InsertOn;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);&lt;br /&gt;begin&lt;br /&gt;	if ((Memo1.SelLength = 0) and (not InsertOn)) then&lt;br /&gt;&amp;#160; &amp;#160; Memo1.SelLength := 1;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как отправить сообщение сразу всем элементам управления формы?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Можно использовать Screen.Forms[i].BroadCast(msg); где [i] - индекс той формы, которой Вы хотите переслать сообщение. BroadCast работает со всеми компонентами, потомками TWinControls и отправляет сообщение всем дочерним компонентам из массива Controls. Если один из дочерних компонентов обрабатывает это сообщение и устанавливает Msg.Result в ненулевое значение - дальнейшая рассылка сообщения останавливается. &lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;При попытке присвоить значение свойству &amp;quot;selected&amp;quot; ListBox&#039;а вырабатывается exception&lt;br /&gt;&amp;quot;Index is out of bounds&amp;quot;. В чем тут дело и как присвоить значение свойству selected?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Свойство &amp;quot;selected&amp;quot; компонента ТListBox может быть использованно только если свойство&lt;br /&gt;MultiSelect установленно в True. Если Вы работаете с ListBox&#039;ом у которого&lt;br /&gt;MultiSelect=false то используйте свойство ItemIndex.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	ListBox1.Items.Add(&#039;1&#039;);&lt;br /&gt;	ListBox1.Items.Add(&#039;2&#039;);&lt;br /&gt;	{This will fail on a single selection ListBox}&lt;br /&gt;//	ListBox1.Selected[1] := true;&lt;br /&gt;	ListBox1.ItemIndex := 1; {This is ok}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как ограничить длинну текста, вводимого в TEdit, так чтобы ширина текста не превышала&lt;br /&gt;ширину TEdit&#039;а?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В примере приведено два способа ограничить длинну текста в TEdit так чтобы она не превышала ширину клиентской области окна TEdit&#039;а и не появлялась прокрутка текста. Первый способ устанавливает свойство TEdit&#039;а MaxLength равным числу букв &amp;quot;W&amp;quot;, которые поместятся в TEdit. &amp;quot;W&amp;quot; выбрана потому, что является, наверное, самой широкой буквой в любом шрифте. Этот метод сносно работает для шрифтов с фиксированной шириной букв, но для шрифтов с переменной шириной букв вряд ли сгодится. Второй способ перхватывает событие KeyPress TEdit&#039;а и измеряет ширину уже введенного текста и ширину нового символа. Если ширина больше чем клиентская область TEdit&#039;а новый символ отбрасывается и вызывается MessageBeep. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	cRect : TRect;&lt;br /&gt;	bm : TBitmap;&lt;br /&gt;	s : string;&lt;br /&gt;begin&lt;br /&gt;	Windows.GetClientRect(Edit1.Handle, cRect);&lt;br /&gt;	bm := TBitmap.Create;&lt;br /&gt;	bm.Width := cRect.Right;&lt;br /&gt;	bm.Height := cRect.Bottom;&lt;br /&gt;	bm.Canvas.Font := Edit1.Font;&lt;br /&gt;	s := &#039;W&#039;;&lt;br /&gt;	while bm.Canvas.TextWidth(s) &amp;lt; CRect.Right do&lt;br /&gt;	s := s + &#039;W&#039;;&lt;br /&gt;	if length(s) &amp;gt; 1 then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; Delete(s, 1, 1);&lt;br /&gt;&amp;#160; &amp;#160; Edit1.MaxLength := Length(s);&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;{Другой вариант}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);&lt;br /&gt;var&lt;br /&gt;	cRect : TRect;&lt;br /&gt;	bm : TBitmap;&lt;br /&gt;begin&lt;br /&gt;	if ((Ord(Key) &amp;lt;&amp;gt; VK_TAB) and (Ord(Key) &amp;lt;&amp;gt; VK_RETURN) and&lt;br /&gt;&amp;#160; &amp;#160; (Ord(Key) &amp;lt;&amp;gt; VK_LEFT) and (Ord(Key) &amp;lt;&amp;gt; VK_BACK)) then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; Windows.GetClientRect(Edit1.Handle, cRect);&lt;br /&gt;&amp;#160; &amp;#160; bm := TBitmap.Create;&lt;br /&gt;&amp;#160; &amp;#160; bm.Width := cRect.Right;&lt;br /&gt;&amp;#160; &amp;#160; bm.Height := cRect.Bottom;&lt;br /&gt;&amp;#160; &amp;#160; bm.Canvas.Font := Edit1.Font;&lt;br /&gt;&amp;#160; &amp;#160; if bm.Canvas.TextWidth(Edit1.Text + Key) &amp;gt; CRect.Right then&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	Key := #0;&lt;br /&gt;&amp;#160; &amp;#160; 	MessageBeep(-1);&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;&amp;#160; &amp;#160; bm.Free;&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как сохранить обьект TFont в реестре/ini/файле/таблице базы данных?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Нужно сохранять атрибуты шрифта (имя, размер и т.п.) а не сам обьект TFont. После считывания этой информации следует проверить существует ли такой шрифт, прежде чем его использовать. Чтобы не показаться голословным дополню ответ Borland&#039;а своим примером сохранения/чтения шрифта в/из реестра &lt;br /&gt;Uses&amp;#160; &amp;#160; ... Registry;&lt;/p&gt;
						&lt;p&gt;procedure SaveFontToRegistry(Font : TFont; SubKey : String);&lt;br /&gt;Var&lt;br /&gt;	R : TRegistry;&lt;br /&gt;	FontStyleInt : byte;&lt;br /&gt;	FS : TFontStyles;&lt;br /&gt;begin&lt;br /&gt;	R:=TRegistry.Create;&lt;br /&gt;	try&lt;br /&gt;&amp;#160; &amp;#160; FS:=Font.Style;&lt;br /&gt;&amp;#160; &amp;#160; Move(FS,FontStyleInt,1);&lt;br /&gt;&amp;#160; &amp;#160; R.OpenKey(SubKey,True);&lt;br /&gt;&amp;#160; &amp;#160; R.WriteString(&#039;Font Name&#039;,Font.Name);&lt;br /&gt;&amp;#160; &amp;#160; R.WriteInteger(&#039;Color&#039;,Font.Color);&lt;br /&gt;&amp;#160; &amp;#160; R.WriteInteger(&#039;CharSet&#039;,Font.Charset);&lt;br /&gt;&amp;#160; &amp;#160; R.WriteInteger(&#039;Size&#039;,Font.Size);&lt;br /&gt;&amp;#160; &amp;#160; R.WriteInteger(&#039;Style&#039;,FontStyleInt);&lt;br /&gt;	finally&lt;br /&gt;&amp;#160; &amp;#160; R.Free;&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;function ReadFontFromRegistry(Font : TFont; SubKey : String) : boolean;&lt;br /&gt;Var&lt;br /&gt;	R : TRegistry;&lt;br /&gt;	FontStyleInt : byte;&lt;br /&gt;	FS : TFontStyles;&lt;br /&gt;begin&lt;br /&gt;	R:=TRegistry.Create;&lt;br /&gt;	try&lt;br /&gt;&amp;#160; &amp;#160; result:=R.OpenKey(SubKey,false); if not result then exit;&lt;br /&gt;&amp;#160; &amp;#160; Font.Name:=R.ReadString(&#039;Font Name&#039;);&lt;br /&gt;&amp;#160; &amp;#160; Font.Color:=R.ReadInteger(&#039;Color&#039;);&lt;br /&gt;&amp;#160; &amp;#160; Font.Charset:=R.ReadInteger(&#039;CharSet&#039;);&lt;br /&gt;&amp;#160; &amp;#160; Font.Size:=R.ReadInteger(&#039;Size&#039;);&lt;br /&gt;&amp;#160; &amp;#160; FontStyleInt:=R.ReadInteger(&#039;Style&#039;);&lt;br /&gt;&amp;#160; &amp;#160; Move(FontStyleInt,FS,1);&lt;br /&gt;&amp;#160; &amp;#160; Font.Style:=FS;&lt;br /&gt;	finally&lt;br /&gt;&amp;#160; &amp;#160; R.Free;&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	If FontDialog1.Execute then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; SaveFontToRegistry(FontDialog1.Font,&#039;Delphi Kingdom\Fonts&#039;);&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button2Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	NFont : TFont;&lt;br /&gt;begin&lt;br /&gt;	NFont:=TFont.Create;&lt;br /&gt;	if ReadFontFromRegistry(NFont,&#039;Delphi Kingdom\Fonts&#039;) then&lt;br /&gt;	begin //здесь добавить проверку - существует ли шрифт&lt;br /&gt;&amp;#160; &amp;#160; Label1.Font.Assign(NFont);&lt;br /&gt;&amp;#160; &amp;#160; NFont.Free;&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;&amp;#160; Как перемещать компонент мышкой во время работы программы &amp;quot;runtime&amp;quot;?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Перехватить событие OnMouseDown, запомнить x и y координты курсора мыши. Отслеживать движение мыши по событию OnMouseMove и перемещать компонент вслед за курсором мыши до тех пор пока не произойдет событие OnMouseUp. В примере показано перемещение компонента TButton. Перемещение начинается, когда пользователь &amp;quot;берет&amp;quot; TButton мышью, удерживая нажатой клавишу &amp;quot;Сontrol&amp;quot;. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;	TForm1 = class(TForm)&lt;br /&gt;&amp;#160; &amp;#160; Button1: TButton;&lt;br /&gt;&amp;#160; &amp;#160; procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;&amp;#160; &amp;#160; procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Y: Integer);&lt;br /&gt;&amp;#160; &amp;#160; procedure Button1MouseUp(Sender: TObject; Button:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; TMouseButton; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;	private&lt;br /&gt;&amp;#160; &amp;#160; {Private declarations}&lt;br /&gt;	public&lt;br /&gt;&amp;#160; &amp;#160; {Public declarations}&lt;br /&gt;&amp;#160; &amp;#160; MouseDownSpot : TPoint;&lt;br /&gt;&amp;#160; &amp;#160; Capturing : bool;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	Shift: TShiftState; X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt;	if ssCtrl in Shift then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; SetCapture(Button1.Handle);&lt;br /&gt;&amp;#160; &amp;#160; Capturing := true;&lt;br /&gt;&amp;#160; &amp;#160; MouseDownSpot.X := x;&lt;br /&gt;&amp;#160; &amp;#160; MouseDownSpot.Y := Y;&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,&amp;#160; Y: Integer);&lt;br /&gt;begin&lt;br /&gt;	if Capturing then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; Button1.Left := Button1.Left - (MouseDownSpot.x - x);&lt;br /&gt;&amp;#160; &amp;#160; Button1.Top := Button1.Top - (MouseDownSpot.y - y);&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1MouseUp(Sender: TObject; Button:&lt;br /&gt;&amp;#160; &amp;#160; 	TMouseButton; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt;	if Capturing then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; ReleaseCapture;&lt;br /&gt;&amp;#160; &amp;#160; Capturing := false;&lt;br /&gt;&amp;#160; &amp;#160; Button1.Left := Button1.Left - (MouseDownSpot.x - x);&lt;br /&gt;&amp;#160; &amp;#160; Button1.Top := Button1.Top - (MouseDownSpot.y - y);&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;При попытке создать обьект класса TPrinter (TPrinter.Create) я получаю exception.&lt;br /&gt;Почему?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В создании обьекта класса TPrinter с использованием TPrinter.Create нет необходимости,&lt;br /&gt;так как обьект класса TPrinter (называемый Printer) автоматически создается при&lt;br /&gt;использовании модуля Printers.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;uses Printers;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	Printer.BeginDoc;&lt;br /&gt;	Printer.Canvas.TextOut(100, 100, &#039;Hello World!&#039;);&lt;br /&gt;	Printer.EndDoc;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как перехватить события в неклиентской области формы, в заголовке окна, например?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Создайте обработчик одного из сообщений WM_NC (non client - не клиентских) (посмотрите&lt;br /&gt;WM_NC в Windows API help). Пример показывает как перехватить вижение мыши во всей&lt;br /&gt;неклиенстской области окна (рамка и заголовок).&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;unit Unit1;&lt;/p&gt;
						&lt;p&gt;interface&lt;/p&gt;
						&lt;p&gt;uses&lt;br /&gt;&amp;#160; &amp;#160;Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;TForm1 = class(TForm)&lt;br /&gt;private&lt;br /&gt;	{Private declarations}&lt;br /&gt;	procedure WMNCMOUSEMOVE(var Message: TMessage);&lt;br /&gt;	message WM_NCMOUSEMOVE;&lt;br /&gt;public&lt;br /&gt;	{Public declarations}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.WMNCMOUSEMOVE(var Message: TMessage);&lt;br /&gt;var&lt;br /&gt;	s : string;&lt;br /&gt;begin&lt;br /&gt;	case Message.wParam of&lt;br /&gt;&amp;#160; &amp;#160; HTERROR: 	&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTERROR&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTTRANSPARENT:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTTRANSPARENT&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTNOWHERE:	&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTNOWHERE&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTCLIENT:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTCLIENT&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTCAPTION:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTCAPTION&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTSYSMENU:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTSYSMENU&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTSIZE:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTSIZE&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTMENU:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTMENU&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTHSCROLL:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTHSCROLL&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTVSCROLL:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTVSCROLL&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTMINBUTTON:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTMINBUTTON&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTMAXBUTTON:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTMAXBUTTON&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTLEFT:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTLEFT&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTRIGHT:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTRIGHT&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTTOP:&lt;br /&gt;&amp;#160; &amp;#160; 	s := &#039;HTTOP&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTTOPLEFT:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTTOPLEFT&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTTOPRIGHT:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTTOPRIGHT&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTBOTTOM:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTBOTTOM&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTBOTTOMLEFT:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTBOTTOMLEFT&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTBOTTOMRIGHT:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTBOTTOMRIGHT&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTBORDER:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTBORDER&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTOBJECT:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTOBJECT&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTCLOSE:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTCLOSE&#039;;&lt;br /&gt;&amp;#160; &amp;#160; HTHELP:&lt;br /&gt;&amp;#160; &amp;#160; 	s:= &#039;HTHELP&#039;;&lt;br /&gt;&amp;#160; &amp;#160; else s:= &#039;&#039;;&lt;br /&gt;	end;&lt;br /&gt;	Form1.Caption := s;&lt;br /&gt;	Message.Result := 0;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;end.&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;При попытке использовать метод TCanvas.StretchDraw чтобы нарисовать иконку&lt;br /&gt;увеличенной ее размер не изменяется. Что делать?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Иконки всегда рисуются размером принятым в системе по умолчанию. Чтобы показать&lt;br /&gt;увеличенный вид иконки скоприуйте ее на bitmap, а зате используйте метод&lt;br /&gt;TCanvas.StretchDraw.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	TheBitmap : TBitmap;&lt;br /&gt;begin&lt;br /&gt;	TheBitmap := TBitmap.Create;&lt;br /&gt;	TheBitmap.Width := Application.Icon.Width;&lt;br /&gt;	TheBitmap.Height := Application.Icon.Height;&lt;br /&gt;	TheBitmap.Canvas.Draw(0, 0, Application.Icon);&lt;br /&gt;	Form1.Canvas.StretchDraw(Rect(0,0,TheBitmap.Width * 3,TheBitmap.Height * 3),&lt;br /&gt;&amp;#160; &amp;#160;&amp;#160; &amp;#160; TheBitmap);&lt;br /&gt;	TheBitmap.Free;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Можно ли сделать так чтобы TStringGrid автоматически изменял ширину колонок, чтобы&lt;br /&gt;вместить самую длинную строчку в колонке?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;См. пример.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure AutoSizeGridColumn(Grid : TStringGrid; column : integer);&lt;br /&gt;var&lt;br /&gt;	i : integer;&lt;br /&gt;	temp : integer;&lt;br /&gt;	max : integer;&lt;br /&gt;begin&lt;br /&gt;	max := 0;&lt;br /&gt;	for i := 0 to (Grid.RowCount - 1) do&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; temp := Grid.Canvas.TextWidth(grid.cells[column, i]);&lt;br /&gt;&amp;#160; &amp;#160; if temp &amp;gt; max then max := temp;&lt;br /&gt;	end;&lt;br /&gt;	Grid.ColWidths[column] := Max + Grid.GridLineWidth + 3;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	AutoSizeGridColumn(StringGrid1, 1);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;TTimer работает не достаточно точно. Как получить более высокую точность?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Таймер Windows не был создан с целью получения сверхточного хронометра. :-( Другими словами, когда Вы устанавливаете таймер на срабатывания каждые 1000 миллисекунд, он может срабатывать через интервал несколько больший чем 1000 миллисекунд. Значения меньше 55 миллисекунд никогда не будут срабатывать вовремя в Windows, поскольку это минимальная точность таймера. Можно проверять системное время и сравнивать его со временем предыдущего события таймера чтобы повысить точность. &lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как поместить JPEG-картинку в exe-файл и потом загрузить ее?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;1) Создайте текстовый файл с расширением &amp;quot;.rc&amp;quot;. Имя этого файла должно отличаться&lt;br /&gt;от имени файла-пректа или любого модуля проекта.&lt;br /&gt;Файл должен содержать строку вроде: MYJPEG JPEG C:\DownLoad\MY.JPG&lt;br /&gt;где:&lt;br /&gt;&amp;quot;MYJPEG&amp;quot; имя ресурса&lt;br /&gt;&amp;quot;JPEG&amp;quot; пользовательский тип ресурса&lt;br /&gt;&amp;quot;C:\DownLoad\MY.JPG&amp;quot; руть к&amp;#160; JPEG файлу.&lt;/p&gt;
						&lt;p&gt;Пусть например rc-файл называется &amp;quot;foo.rc&amp;quot;&lt;/p&gt;
						&lt;p&gt;Запустите BRCC32.exe (Borland Resource CommandLine Compiler) - программа находится&lt;br /&gt;в каталоге Bin Delphi/C++ Builder&#039;а - передав ей в качестве параметра полный путь&lt;br /&gt;к rc-файлу.&lt;br /&gt;В нашем примере:&lt;/p&gt;
						&lt;p&gt;C:\DelphiPath\BIN\BRCC32.EXE&amp;#160; C:\ProjectPath\FOO.RC&lt;br /&gt;Вы получите откомпилированный ресурс - файл с расширением &amp;quot;.res&amp;quot;.&lt;br /&gt;(в нашем случает foo.res).&lt;br /&gt;Далее добавте ресурс к своему приложению.&lt;/p&gt;
						&lt;p&gt;{Грузим ресурс}&lt;br /&gt;{$R FOO.RES}&lt;/p&gt;
						&lt;p&gt;uses Jpeg;&lt;/p&gt;
						&lt;p&gt;procedure LoadJPEGFromRes(TheJPEG : string; ThePicture : TPicture);&lt;br /&gt;var&lt;br /&gt;	ResHandle : THandle;&lt;br /&gt;	MemHandle : THandle;&lt;br /&gt;	MemStream : TMemoryStream;&lt;br /&gt;	ResPtr&amp;#160; &amp;#160; : PByte;&lt;br /&gt;	ResSize&amp;#160; &amp;#160;: Longint;&lt;br /&gt;	JPEGImage : TJPEGImage;&lt;br /&gt;begin&lt;br /&gt;	ResHandle := FindResource(hInstance, PChar(TheJPEG), &#039;JPEG&#039;);&lt;br /&gt;	MemHandle := LoadResource(hInstance, ResHandle);&lt;br /&gt;	ResPtr&amp;#160; &amp;#160; := LockResource(MemHandle);&lt;br /&gt;	MemStream := TMemoryStream.Create;&lt;br /&gt;	JPEGImage := TJPEGImage.Create;&lt;br /&gt;	ResSize := SizeOfResource(hInstance, ResHandle);&lt;br /&gt;	MemStream.SetSize(ResSize);&lt;br /&gt;	MemStream.Write(ResPtr^, ResSize);&lt;br /&gt;	FreeResource(MemHandle);&lt;br /&gt;	MemStream.Seek(0, 0);&lt;br /&gt;	JPEGImage.LoadFromStream(MemStream);&lt;br /&gt;	ThePicture.Assign(JPEGImage);&lt;br /&gt;	JPEGImage.Free;&lt;br /&gt;	MemStream.Free;&lt;br /&gt;end;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	LoadJPEGFromRes(&#039;MYJPEG&#039;, Image1.Picture);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как перехватить сообщения прокрутки в TScrollBox?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Следующий пример перехватывает сообщения о прокрутке компонента TScrollBox и&lt;br /&gt;синхронизирует обе линейки прокрутки. Сообщения прокрутки перехватываются с помощью&lt;br /&gt;переопределения окнной процедуры (WinProc) ScrollBox&#039;а.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;{$IFDEF WIN32}&lt;br /&gt;	WParameter = LongInt;&lt;br /&gt;{$ELSE}&lt;br /&gt;	WParameter = Word;&lt;br /&gt;{$ENDIF}&lt;br /&gt;	LParameter = LongInt;&lt;/p&gt;
						&lt;p&gt;{Declare a variable to hold the window procedure we are replacing}&lt;br /&gt;var&lt;br /&gt;	OldWindowProc : Pointer;&lt;/p&gt;
						&lt;p&gt;function NewWindowProc(WindowHandle : hWnd;&lt;br /&gt;	TheMessage&amp;#160; &amp;#160;: WParameter;&lt;br /&gt;	ParamW : WParameter;&lt;br /&gt;	ParamL : LParameter) : LongInt&lt;br /&gt;{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}&lt;br /&gt;var&lt;br /&gt;	TheRangeMin : integer;&lt;br /&gt;	TheRangeMax : integer;&lt;br /&gt;	TheRange : integer;&lt;br /&gt;begin&lt;br /&gt;	if TheMessage = WM_VSCROLL then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; {Get the min and max range of the horizontal scroll box}&lt;br /&gt;&amp;#160; &amp;#160; GetScrollRange(WindowHandle, SB_HORZ, TheRangeMin, TheRangeMax);&lt;br /&gt;&amp;#160; &amp;#160; {Get the vertical scroll box position}&lt;br /&gt;&amp;#160; &amp;#160; TheRange := GetScrollPos(WindowHandle, SB_VERT);&lt;br /&gt;&amp;#160; &amp;#160; {Make sure we wont exceed the range}&lt;br /&gt;&amp;#160; &amp;#160; if TheRange &amp;lt; TheRangeMin then&lt;br /&gt;&amp;#160; &amp;#160; TheRange := TheRangeMin else&lt;br /&gt;&amp;#160; &amp;#160; if TheRange &amp;gt; TheRangeMax then&lt;br /&gt;&amp;#160; &amp;#160; TheRange := TheRangeMax;&lt;br /&gt;&amp;#160; &amp;#160; {Set the horizontal scroll bar}&lt;br /&gt;&amp;#160; &amp;#160; SetScrollPos(WindowHandle, SB_HORZ, TheRange, true);&lt;br /&gt;	end;&lt;br /&gt;	if TheMessage = WM_HSCROLL then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; {Get the min and max range of the horizontal scroll box}&lt;br /&gt;&amp;#160; &amp;#160; GetScrollRange(WindowHandle, SB_VERT, heRangeMin, TheRangeMax);&lt;br /&gt;&amp;#160; &amp;#160; {Get the horizontal scroll box position}&lt;br /&gt;&amp;#160; &amp;#160; TheRange := GetScrollPos(WindowHandle, SB_HORZ);&lt;br /&gt;&amp;#160; &amp;#160; {Make sure we wont exceed the range}&lt;br /&gt;&amp;#160; &amp;#160; if TheRange &amp;lt; TheRangeMin then&lt;br /&gt;&amp;#160; &amp;#160; 	TheRange := TheRangeMin&lt;br /&gt;&amp;#160; &amp;#160; else&lt;br /&gt;&amp;#160; &amp;#160; 	if TheRange &amp;gt; TheRangeMax then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; TheRange := TheRangeMax;&lt;br /&gt;&amp;#160; &amp;#160; 	{Set the vertical scroll bar}&lt;br /&gt;&amp;#160; &amp;#160; 	SetScrollPos(WindowHandle, SB_VERT, TheRange, true);&lt;br /&gt;	end;&lt;/p&gt;
						&lt;p&gt;	{Call the old Window procedure to allow processing of the message.}&lt;br /&gt;	NewWindowProc := CallWindowProc(OldWindowProc, WindowHandle, TheMessage,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	ParamW, ParamL);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	{Set the new window procedure for the control and remember&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; the old window procedure.}&lt;br /&gt;	OldWindowProc := Pointer(SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; LongInt(@NewWindowProc)));&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	{Set the window procedure back to the old window procedure.}&lt;br /&gt;	SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC, LongInt(OldWindowProc));&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как сделать прямоугольник для выделения части картинки для редактирования?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Самый простой способ - воспользоваться функцией Windows API DrawFocusRect. Функция DrawFocusRect использует операцию XOR при рисовании - таким образом вывод прямоугольника дважды с одними и теми же координатами стирает прямоугольник, и прямоугольник всегда будет виден, на фоне какого бы цвета он не выводился. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;	TForm1 = class(TForm)&lt;br /&gt;&amp;#160; &amp;#160; procedure FormMouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;&amp;#160; &amp;#160; procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Y: Integer);&lt;br /&gt;&amp;#160; &amp;#160; procedure FormMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;	private&lt;br /&gt;&amp;#160; &amp;#160; {Private declarations}&lt;br /&gt;&amp;#160; &amp;#160; Capturing : bool;&lt;br /&gt;&amp;#160; &amp;#160; Captured : bool;&lt;br /&gt;&amp;#160; &amp;#160; StartPlace : TPoint;&lt;br /&gt;&amp;#160; &amp;#160; EndPlace : TPoint;&lt;br /&gt;	public&lt;br /&gt;&amp;#160; &amp;#160; {Public declarations}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;function MakeRect(Pt1 : TPoint; Pt2 : TPoint) : TRect;&lt;br /&gt;begin&lt;br /&gt;	if pt1.x &amp;lt; pt2.x then&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	Result.Left := pt1.x;&lt;br /&gt;&amp;#160; &amp;#160; 	Result.Right := pt2.x;&lt;br /&gt;&amp;#160; &amp;#160; end&lt;br /&gt;	else&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	Result.Left := pt2.x;&lt;br /&gt;&amp;#160; &amp;#160; 	Result.Right := pt1.x;&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;	if pt1.y &amp;lt; pt2.y then&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	Result.Top := pt1.y;&lt;br /&gt;&amp;#160; &amp;#160; 	Result.Bottom := pt2.y;&lt;br /&gt;&amp;#160; &amp;#160; end&lt;br /&gt;	else&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; Result.Top := pt2.y;&lt;br /&gt;&amp;#160; &amp;#160; Result.Bottom := pt1.y;&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt;&amp;#160; &amp;#160; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt;	if Captured then&lt;br /&gt;&amp;#160; &amp;#160; DrawFocusRect(Form1.Canvas.Handle,MakeRect(StartPlace,EndPlace));&lt;br /&gt;	StartPlace.x := X;&lt;br /&gt;	StartPlace.y := Y;&lt;br /&gt;	EndPlace.x := X;&lt;br /&gt;	EndPlace.y := Y;&lt;br /&gt;	DrawFocusRect(Form1.Canvas.Handle,MakeRect(StartPlace,EndPlace));&lt;br /&gt;	Capturing := true;&lt;br /&gt;	Captured := true;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,&lt;br /&gt;&amp;#160; &amp;#160; Y: Integer);&lt;br /&gt;begin&lt;br /&gt;	if Capturing then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; DrawFocusRect(Form1.Canvas.Handle,MakeRect(StartPlace,EndPlace));&lt;br /&gt;&amp;#160; &amp;#160; EndPlace.x := X;&lt;br /&gt;&amp;#160; &amp;#160; EndPlace.y := Y;&lt;br /&gt;&amp;#160; &amp;#160; DrawFocusRect(Form1.Canvas.Handle,MakeRect(StartPlace,EndPlace));&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt;&amp;#160; &amp;#160; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt;	Capturing := false;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Можно ли использовать иконку как картинку на кнопке TSpeedButton?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Можно. См. пример.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;uses ShellApi;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormShow(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	Icon: TIcon;&lt;br /&gt;begin&lt;br /&gt;	Icon := TIcon.Create;&lt;br /&gt;	Icon.Handle := ExtractIcon(0,&#039;C:\WINDOWS\NOTEPAD.EXE&#039;,1);&lt;br /&gt;	SpeedButton1.Glyph.Width := Icon.Width;&lt;br /&gt;	SpeedButton1.Glyph.Height := Icon.Height;&lt;br /&gt;	SpeedButton1.Glyph.Canvas.Draw(0, 0, Icon);&lt;br /&gt;	Icon.Free;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как поместить прозрачную фоновую каринку на компонент CoolBar?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	Bm1 : TBitmap;&lt;br /&gt;	Bm2 : TBitmap;&lt;br /&gt;begin&lt;br /&gt;	Bm1 := TBitmap.Create;&lt;br /&gt;	Bm2 := TBitmap.Create;&lt;br /&gt;	Bm1.LoadFromFile(&#039;c:\download\test.bmp&#039;);&lt;br /&gt;	Bm2.Width := Bm1.Width;&lt;br /&gt;	Bm2.Height := Bm1.Height;&lt;br /&gt;	bm2.Canvas.Brush.Color := CoolBar1.Color;&lt;br /&gt;	bm2.Canvas.BrushCopy(Rect(0, 0, bm2.Width, bm2.Height), Bm1,&lt;br /&gt;&amp;#160; &amp;#160; 	Rect(0, 0, Bm1.width, Bm1.Height), ClWhite);&lt;br /&gt;	bm1.Free;&lt;br /&gt;	CoolBar1.Bitmap.Assign(bm2);&lt;br /&gt;	bm2.Free;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Ползунок компонента TScrollBar все время мигает. Как это отключить?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Установите свойтсво ScrollBar.TabStop в False.&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как программно перевести DBgrid в реим редактирования и установить курсор в&lt;br /&gt;окошке редактирования в требуемую позицию?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Переведите таблицу в режим редактирования, затем получите дескриптор (handle) окна редактирования и перешлите ей сообщение EM_SETSEL. В качестве параметров вы должны переслать начальную позицию курсора, и конечную позицию, определяющую конец выделения текста цветом. В приведенном примере курсор помещается во вторую позицию, текст внутри ячейки не выделяется. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	h : THandle;&lt;br /&gt;begin&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	DbGrid1.SetFocus;&lt;br /&gt;	DbGrid1.EditorMode := true;&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	h:= Windows.GetFocus;&lt;br /&gt;	SendMessage(h, EM_SETSEL, 2, 2);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как поместить курсор в определенную позицию edit&#039;а и подобных ему элементов управления?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Можно использовать методы Delphi SelStart() и SelectLength().&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	Edit1.SetFocus;&lt;br /&gt;	{переводим курсор во вторую позицию}&lt;br /&gt;	Edit1.SelStart := 2;&lt;br /&gt;	{не выделяем никакого текста}&lt;br /&gt;	Edit1.SelLength := 0;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как среагировать на минимизацию-максимизацию формы перед тем как произойдет изменение&lt;br /&gt;размера формы?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В примере перехватывается сообщение WM_SYSCOMMAND. Если это сообщение говорит о&lt;br /&gt;минимизации или максимизации формы - пищит динамик.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;	TForm1 = class(TForm)&lt;br /&gt;	private&lt;br /&gt;&amp;#160; &amp;#160; {Private declarations}&lt;br /&gt;&amp;#160; &amp;#160; procedure WMSysCommand(var Msg: TWMSysCommand);&lt;br /&gt;&amp;#160; &amp;#160; message WM_SYSCOMMAND;&lt;br /&gt;	public&lt;br /&gt;&amp;#160; &amp;#160; {Public declarations}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.WMSysCommand;&lt;br /&gt;begin&lt;br /&gt;	if (Msg.CmdType = SC_MINIMIZE) or (Msg.CmdType = SC_MAXIMIZE) then&lt;br /&gt;&amp;#160; &amp;#160; MessageBeep(0)&lt;br /&gt;	else&lt;br /&gt;&amp;#160; &amp;#160; inherited;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Можно ли сделать так - одна форма показывает другую и остается позади нее, но фокус&lt;br /&gt;ввода не переходит к новой форме, а остается у старой?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В примере показывается не автосоздаваемая (non auto-created) форма, но фокус ввода ей&lt;br /&gt;не передается.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;uses Unit2;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	Form2 := TForm2.Create(Application);&lt;br /&gt;	Form2.Visible := FALSE;&lt;br /&gt;	ShowWindow(Form2.Handle, SW_SHOWNA);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;На некоторых laptop компьютерах может не быть флоппи дисковода. Можно ли удалять&lt;br /&gt;из списка TDriveComboBox диски которые отключены?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В примере TDriveComboBox не показывает дисководы, которые не готовы. (not ready).&lt;br /&gt;Учтите что на многих компьютерах будет ощутимая задержка при поверке plug&amp;amp;play&lt;br /&gt;флоппи дисковода.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	i : integer;&lt;br /&gt;	OldErrorMode : Word;&lt;br /&gt;	OldDirectory : string;&lt;br /&gt;begin&lt;br /&gt;	OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);&lt;br /&gt;	GetDir(0, OldDirectory);&lt;br /&gt;	i := 0;&lt;br /&gt;	while i &amp;lt;= DriveComboBox1.Items.Count - 1 do begin&lt;br /&gt;	{$I-}&lt;br /&gt;	ChDir(DriveComboBox1.Items[i][1] + &#039;:\&#039;);&lt;br /&gt;	{$I+}&lt;br /&gt;	if IoResult &amp;lt;&amp;gt; 0 then&lt;br /&gt;&amp;#160; &amp;#160; DriveComboBox1.Items.Delete(i)&lt;br /&gt;	else&lt;br /&gt;&amp;#160; &amp;#160; inc(i);&lt;br /&gt;	end;&lt;br /&gt;	ChDir(OldDirectory);&lt;br /&gt;	SetErrorMode(OldErrorMode);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как сообщить всем формам моего приложения (в том числе и не видимым в данный момент)&lt;br /&gt;об изминении каких-то глобальных значений?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Один из способов - создать пользовательское сообщение и использовать метод preform&lt;br /&gt;чтобы разослать его всем формам из массива Screen.Forms.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;{Code for Unit1}&lt;/p&gt;
						&lt;p&gt;const&lt;br /&gt;	UM_MyGlobalMessage = WM_USER + 1;&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;	TForm1 = class(TForm)&lt;br /&gt;&amp;#160; &amp;#160; Label1: TLabel;&lt;br /&gt;&amp;#160; &amp;#160; Button1: TButton;&lt;br /&gt;&amp;#160; &amp;#160; procedure FormShow(Sender: TObject);&lt;br /&gt;&amp;#160; &amp;#160; procedure Button1Click(Sender: TObject);&lt;br /&gt;&amp;#160; &amp;#160;private	&lt;br /&gt;&amp;#160; &amp;#160; {Private declarations}&lt;br /&gt;&amp;#160; &amp;#160; procedure UMMyGlobalMessage(var AMessage: TMessage); message&lt;br /&gt;&amp;#160; &amp;#160; UM_MyGlobalMessage;&lt;br /&gt;	public&lt;br /&gt;&amp;#160; &amp;#160; {Public declarations}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;uses Unit2;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormShow(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	Form2.Show;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.UMMyGlobalMessage(var AMessage: TMessage);&lt;br /&gt;begin&lt;br /&gt;	Label1.Left := AMessage.WParam;&lt;br /&gt;	Label1.Top&amp;#160; := AMessage.LParam;&lt;br /&gt;	Form1.Caption := &#039;Got It!&#039;;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	f: integer;&lt;br /&gt;begin&lt;br /&gt;	for f := 0 to Screen.FormCount - 1 do&lt;br /&gt;	Screen.Forms[f].Perform(UM_MyGlobalMessage, 42, 42);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;{Code for Unit2}&lt;/p&gt;
						&lt;p&gt;const&lt;br /&gt;	UM_MyGlobalMessage = WM_USER + 1;&lt;br /&gt;type&lt;br /&gt;	TForm2 = class(TForm)&lt;br /&gt;&amp;#160; &amp;#160; Label1: TLabel;&lt;br /&gt;	private&lt;br /&gt;&amp;#160; &amp;#160; {Private declarations}&lt;br /&gt;&amp;#160; &amp;#160; procedure UMMyGlobalMessage(var AMessage: TMessage);&lt;br /&gt;&amp;#160; &amp;#160; message UM_MyGlobalMessage;&lt;br /&gt;	public&lt;br /&gt;&amp;#160; &amp;#160; {Public declarations}&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;	Form2: TForm2;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm2.UMMyGlobalMessage(var AMessage: TMessage);&lt;br /&gt;begin&lt;br /&gt;	Label1.Left := AMessage.WParam;&lt;br /&gt;	Label1.Top&amp;#160; := AMessage.LParam;&lt;br /&gt;	Form2.Caption := &#039;Got It!&#039;;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как обновить список дисков компонента TDriveComboBox, учитывая, что могуд быть&lt;br /&gt;подключены/отключены сетевые диски и произведена &amp;quot;горячая замена&amp;quot; plug&amp;amp;play дисков?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Следующий пример вызывает защищенный (protected) метод класса TDriveComboBox&lt;br /&gt;BuildList() для регеирации списка дисков. (использовая так наз. &amp;quot;class cracer&amp;quot;)&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;	TNewDriveComboBox = class(TDriveComboBox)&amp;#160; //это наш &amp;quot;class cracer&amp;quot;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	Drive : char;&lt;br /&gt;begin&lt;br /&gt;	Drive := DriveComboBox1.Drive;&lt;br /&gt;	TNewDriveComboBox(DriveComboBox1).BuildList;&lt;br /&gt;&amp;#160; &amp;#160; 	//вызываем защищенный метод родительского класса&lt;br /&gt;	DriveComboBox1.Drive := Drive;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как программно заставить выпасть меню?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В примере показано как показать меню и выбрать в нем какой-то пункт, эмулируя нажатие &amp;quot;быстрой кдавиши&amp;quot; пункта меню. Если у Вашего пункта меню нет &amp;quot;быстрой клавиши&amp;quot; Вы можете посылать комбинации VK_MENU, VK_LEFT, VK_DOWN, и VK_RETURN, чтобы программно &amp;quot;путешествовать&amp;quot; по меню. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	//Allow button to finish painting in response to the click&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	{Alt Key Down}&lt;br /&gt;	keybd_Event(VK_MENU, 0, 0, 0);&lt;br /&gt;	{F Key Down - Drops the menu down}&lt;br /&gt;	keybd_Event(ord(&#039;F&#039;), 0, 0, 0);&lt;br /&gt;	{F Key Up}&lt;br /&gt;	keybd_Event(ord(&#039;F&#039;), 0, KEYEVENTF_KEYUP, 0);&lt;br /&gt;	{Alt Key Up}&lt;br /&gt;	keybd_Event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);&lt;br /&gt;	{F Key Down}&lt;br /&gt;	keybd_Event(ord(&#039;S&#039;), 0, 0, 0);&lt;br /&gt;	{F Key Up}&lt;br /&gt;	keybd_Event(ord(&#039;S&#039;), 0, KEYEVENTF_KEYUP, 0);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как сделать клавишу-акселератор (keyboard shortcut) компонету у которого нет заголовка?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Возможный вариант - присвоить ссылку на этот компонент свойству FocusControl TLabel&#039;а. В примере используется невидимый Label для создания &amp;quot;быстрой&amp;quot; клавиши (Alt+M) компонента Memo. Чтобы использовать пример, разместите на форме компонет TMemo, Label и несколько других компонентов, которые могут принимать фокус ввода. Запустите программу, перевидите фокус ввода куда-нибудь вне Memo и нажмите Alt+M - фокус ввода вернется в Memo. &lt;br /&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;	Label1.Visible := false;&lt;br /&gt;	Label1.Caption := &#039;&amp;amp;M&#039;;&lt;br /&gt;	Label1.FocusControl := Memo1;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Можно ли как-то уменьшить мерцание при перерисовке компонента?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Если добавить флаг csOpaque (непрозрачный) к свойству ControlStyle компонента&lt;br /&gt;- то фон компонента перерисовываться не будет.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;constructor TMyControl.Create;&lt;br /&gt;begin&lt;br /&gt;	inherited;&lt;br /&gt;	ControlStyle := ControlStyle + [csOpaque];&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как запретить изменение размера моего компонента в design-time?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Поместите в конструктор компонента код, устанавливающий размеры по умолчанию.&lt;br /&gt;Переопределите метод SetBounds и проверяйте в нем &amp;quot;componentstate&amp;quot;. Если компонет&lt;br /&gt;находится режиме &amp;quot;design-time&amp;quot; (csDesigning in ComponentState) просто передавайте&lt;br /&gt;значения ширины и высоты (width и heights) компонента по умолчанию (в нашем&lt;br /&gt;примере 50) методу класса-предка.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;procedure TVu.SetBounds(ALeft : integer; ATop : integer; AWidth : integer;&lt;br /&gt;&amp;#160; &amp;#160; 	AHeight : integer);&lt;br /&gt;begin&lt;br /&gt;	if csdesigning in componentstate then&lt;br /&gt;	begin&lt;br /&gt;&amp;#160; &amp;#160; AWidth := 50;&lt;br /&gt;&amp;#160; &amp;#160; AHeight := 50;&lt;br /&gt;&amp;#160; &amp;#160; inherited;&amp;#160; //вызываем унаследованный от предка метод&lt;br /&gt;	end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Можно ли уменьшить потребляемые компонентами TNotebook и TTabbedNotebook ресурсы?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Да. Можно уничтожать обьекты, расположенные не на текущей странице TNotebook или&lt;br /&gt;TTabbedNotebook. В примере вызывается защищенный (Protected) метод путем создания&lt;br /&gt;так называемый &amp;quot;class cracer&#039;ов&amp;quot;.&lt;/p&gt;
						&lt;p&gt;type TMyTabbedNotebook = class(TTabbedNotebook); //это наш &amp;quot;class cracer&amp;quot;&lt;br /&gt;type TMyNotebook = class(TNotebook);&lt;/p&gt;
						&lt;p&gt;procedure TForm1.TabbedNotebook1Change(Sender: TObject; NewTab: Integer;&lt;br /&gt;&amp;#160; &amp;#160; 	var AllowChange: Boolean);&lt;br /&gt;begin&lt;br /&gt;	with TabbedNotebook1 do&amp;#160; //вызываем защищенный метод родительского класса&lt;br /&gt;&amp;#160; &amp;#160; TMyTabbedNotebook(TWinControl(Pages.Objects[PageIndex])).DestroyHandle;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.TabSet1Change(Sender: TObject; NewTab: Integer;&lt;br /&gt;&amp;#160; &amp;#160; 	var AllowChange: Boolean);&lt;br /&gt;begin&lt;br /&gt;	with Notebook1 do //вызываем защищенный метод родительского класса&lt;br /&gt;&amp;#160; &amp;#160; TMyNotebook(TWinControl(Pages.Objects[PageIndex])).DestroyHandle;&lt;br /&gt;&amp;#160; &amp;#160; NoteBook1.PageIndex := NewTab;&lt;br /&gt;&amp;#160; &amp;#160; AllowChange := true&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Функция keybd_event() принимает значения до 244 - как мне отправить нажатие&lt;br /&gt;клавиши с кодом #255 в элемент управления Windows?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Это может понадобится для иностранных языков или для специальных символов. (например,&lt;br /&gt;в русских шрифтах символ с кодом #255 - я прописное). Приведенный в примере метод,&lt;br /&gt;не стоит использовать в случае если символ может быть передан обычным способом&lt;br /&gt;(функцией keybd_event()).&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	KeyData : packed record&lt;br /&gt;&amp;#160; &amp;#160; RepeatCount : word;&lt;br /&gt;&amp;#160; &amp;#160; ScanCode : byte;&lt;br /&gt;&amp;#160; &amp;#160; Bits : byte;&lt;br /&gt;	end;&lt;br /&gt;begin&lt;br /&gt;	{Let the button repaint}&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	{Set the focus to the window}&lt;br /&gt;	Edit1.SetFocus;&lt;br /&gt;	{Send a right so the char is added to the end of the line}&lt;br /&gt;	//&amp;#160; SimulateKeyStroke(VK_RIGHT, 0);&lt;br /&gt;	keybd_event(VK_RIGHT, 0,0,0);&lt;br /&gt;	{Let the app get the message}&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	FillChar(KeyData, sizeof(KeyData), #0);&lt;br /&gt;	KeyData.ScanCode := 255;&lt;br /&gt;	KeyData.RepeatCount := 1;&lt;br /&gt;	SendMessage(Edit1.Handle, WM_KEYDOWN, 255,LongInt(KeyData));&lt;br /&gt;	KeyData.Bits := KeyData.Bits or (1 shl 30);&lt;br /&gt;	KeyData.Bits := KeyData.Bits or (1 shl 31);&lt;br /&gt;	SendMessage(Edit1.Handle, WM_KEYUP, 255, LongInt(KeyData));&lt;br /&gt;	KeyData.Bits := KeyData.Bits and not (1 shl 30);&lt;br /&gt;	KeyData.Bits := KeyData.Bits and not (1 shl 31);&lt;br /&gt;	SendMessage(Edit1.Handle, WM_CHAR, 255, LongInt(KeyData));&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Некоторые компоненты не меняют курсор мыши до тех пор пока пользователь не&lt;br /&gt;сдвинет мышь. Как эмулировать движение мыши?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;В примере мышка слегка &amp;quot;подталкивается&amp;quot; без участия пользователя.&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	pt : TPoint;&lt;br /&gt;begin&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	Screen.Cursor := CrHourglass;&lt;br /&gt;	GetCursorPos(pt);&lt;br /&gt;	SetCursorPos(pt.x + 1, pt.y + 1);&lt;br /&gt;	Application.ProcessMessages;&lt;br /&gt;	SetCursorPos(pt.x - 1, pt.y - 1);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Вопрос:&lt;br /&gt;Как зарегистрировать расширение файла за своим приложением и контекстное меню,&lt;br /&gt;связанное с этим типом?&lt;/p&gt;
						&lt;p&gt;Ответ:&lt;br /&gt;Пример регистрирует расширение файла(.myext) - файлы этого типа будут открываться&lt;br /&gt;приложением MyApp.Exe. Также регнстрируется одно действие (action) по умолчанию&lt;br /&gt;для файлов этого типа и два дополнительных пункта контекстного меню, связанного с&lt;br /&gt;этим типом файлов. Возможно, потребуется перезайти в систему чтобы изменения&lt;br /&gt;вступили в силу.&lt;/p&gt;
						&lt;p&gt;Пример:&lt;/p&gt;
						&lt;p&gt;uses&lt;br /&gt;	Registry;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;	R : TRegIniFile;&lt;br /&gt;begin&lt;br /&gt;	R := TRegIniFile.Create(&#039;&#039;);&lt;br /&gt;	with R do&lt;br /&gt;&amp;#160; &amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160; 	RootKey := HKEY_CLASSES_ROOT;&lt;br /&gt;&amp;#160; &amp;#160; 	WriteString(&#039;.myext&#039;,&#039;&#039;,&#039;MyExt&#039;);&lt;br /&gt;&amp;#160; &amp;#160; 	WriteString(&#039;MyExt&#039;,&#039;&#039;,&#039;Some description of MyExt files&#039;);&lt;br /&gt;&amp;#160; &amp;#160; 	WriteString(&#039;MyExt\DefaultIcon&#039;,&#039;&#039;,&#039;C:\MyApp.Exe,0&#039;);&lt;br /&gt;&amp;#160; &amp;#160; 	WriteString(&#039;MyExt\Shell&#039;,&#039;&#039;,&#039;This_Is_Our_Default_Action&#039;);&lt;br /&gt;&amp;#160; &amp;#160; 	WriteString(&#039;MyExt\Shell\First_Action&#039;,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &#039;&#039;,&#039;This is our first action&#039;);&lt;br /&gt;&amp;#160; &amp;#160; 	WriteString(&#039;MyExt\Shell\First_Action\command&#039;,&#039;&#039;,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &#039;C:\MyApp.Exe /LotsOfParamaters %1&#039;);&lt;br /&gt;&amp;#160; &amp;#160; 	WriteString(&#039;MyExt\Shell\This_Is_Our_Default_Action&#039;,&#039;&#039;,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &#039;This is our default action&#039;);&lt;br /&gt;&amp;#160; &amp;#160; 	WriteString(&#039;MyExt\Shell\This_Is_Our_Default_Action\command&#039;,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &#039;&#039;,&#039;C:\MyApp.Exe %1&#039;);&lt;br /&gt;&amp;#160; &amp;#160; 	WriteString(&#039;MyExt\Shell\Second_Action&#039;,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &#039;&#039;,&#039;This is our second action&#039;);&lt;br /&gt;&amp;#160; &amp;#160; 	WriteString(&#039;MyExt\Shell\Second_Action\command&#039;,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &#039;&#039;,&#039;C:\MyApp.Exe /TonsOfParameters %1&#039;);&lt;br /&gt;&amp;#160; &amp;#160; 	Free;&lt;br /&gt;&amp;#160; &amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Tue, 21 Apr 2009 00:04:13 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=11#p11</guid>
		</item>
		<item>
			<title>Общий FAQ</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=9#p9</link>
			<description>&lt;p&gt;Q: Моя программа довольно долго делает какую-то полезную работу, типа&lt;br /&gt;&amp;#160; &amp;#160;чтения дерева каталогов или обильных вычислений, и в этот момент почти&lt;br /&gt;&amp;#160; &amp;#160;не работают остальные программы. Как разрешить им это делать?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Application.ProcessMessages.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;(AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь&lt;br /&gt;&amp;#160; &amp;#160;Sleep(0); это отдаст остаток слайса системе.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;(Win16) Если вы хотите разрешить отработку сообщений другим&lt;br /&gt;&amp;#160; &amp;#160;программам, но не вашей, то лучше пользоваться Yield().&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта&lt;br /&gt;&amp;#160; &amp;#160;программа не отработает? Как выяснить, работает ли программа или уже&lt;br /&gt;&amp;#160; &amp;#160;завершилась? Как принудительно закрыть выполняющуюся программу?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: WinExec() или ShellExecute. У второй больше возможностей.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;(SO): CreateProcess() в параметре process info возвращает handle&lt;br /&gt;&amp;#160; &amp;#160;запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess,&lt;br /&gt;&amp;#160; &amp;#160;INFINITE);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;(AA): (Win16) Delay можно взять из rxLib.&lt;/p&gt;
						&lt;p&gt;handle := WinExec(...);&lt;br /&gt;if handle &amp;gt;= 32 then&lt;br /&gt;&amp;#160; while GetModuleUsage(handle) &amp;gt; 0 do&lt;br /&gt;&amp;#160; &amp;#160; Delay( nn );&lt;br /&gt;else&lt;br /&gt; raise ....&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;(AM): Чтобы выяснить, работает ли программа, используйте&lt;br /&gt;&amp;#160; &amp;#160;GetProcessTimes(), параметр lpExitTime.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;(Win32) Для принудительного завершения процесса -- TerminateProcess.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;(Win16) (RR): Надо послать программе сообщение WM_QUIT:&lt;/p&gt;
						&lt;p&gt;Handle := Winexec(App, 0);&lt;br /&gt;PostMessage(Handle, WM_QUIT, 0, 0);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel&lt;br /&gt;&amp;#160; &amp;#160;запускался, например, браузер с сайтом программы или почтовая&lt;br /&gt;&amp;#160; &amp;#160;программа с определенным адресом получателя?&lt;/p&gt;
						&lt;p&gt;uses ShellApi;&lt;/p&gt;
						&lt;p&gt;{ ... }&lt;/p&gt;
						&lt;p&gt;ShellExecute(&amp;quot;http://www.company.com&amp;quot;, ... );&lt;/p&gt;
						&lt;p&gt;ShellExecute(&amp;quot;mailto:author@somewhere.net&amp;quot;, ...);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма&lt;br /&gt;&amp;#160; &amp;#160;при закрывании просто минимизируется?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Обрабатывайте событие OnClose для формы и выставляйте в нем&lt;br /&gt;&amp;#160; &amp;#160;параметр Action в caFree. Дело в том, что его значение по умолчанию&lt;br /&gt;&amp;#160; &amp;#160;для MDI Child форм&amp;#160; caMinimize. Кстати, если сделать Action := caNone,&lt;br /&gt;&amp;#160; &amp;#160;то форму нельзя будет закрыть.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Мне надо добавить много строк в TListbox или в TCombobox или в&lt;br /&gt;&amp;#160; &amp;#160;TMemo или в TRichEdit, при этом сам объект постоянно мигает,&lt;br /&gt;&amp;#160; &amp;#160;перерисовываясь. Как избавиться от этого?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: BeginUpdate/EndUpdate.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как мне запрограммировать непрямоугольную форму, например, как у&lt;br /&gt;&amp;#160; &amp;#160;Norton CrashGuard, в форме щита?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: SetWindowRgn() (Win32).&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как использовать свои курсоры в программе?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A:&lt;/p&gt;
						&lt;p&gt;{$R CURSORS.RES}&lt;/p&gt;
						&lt;p&gt;const&lt;br /&gt;&amp;#160; crZoomIn = 1;&lt;br /&gt;&amp;#160; crZoomOut = 2;&lt;/p&gt;
						&lt;p&gt;Screen.Cursors[crZoomIn] := LoadCursor(hInstance, &#039;CURSOR_ZOOMIN&#039;);&lt;br /&gt;Screen.Cursors[crZoomOut] := LoadCursor(hInstance, &#039;CURSOR_ZOOMOUT&#039;);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;С вашей программой должен быть слинкован файл ресурсов, содержащий&lt;br /&gt;&amp;#160; &amp;#160;соответствующие курсоры.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как ограничить перемещение курсора мыши какой-либо областью экрана?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: ClipCursor(). Учтите, что использование этой функции -- плохой тон.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как из программы переключить раскладку клавиатуры?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: ActivateKeyboardLayout(). Учтите, что использование этой функции --&lt;br /&gt;&amp;#160; &amp;#160;плохой тон.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а&lt;br /&gt;&amp;#160; &amp;#160;выдавала запрос на сохранение?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Обрабатывать OnCloseQuery.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как получить короткий путь файла если имеется длинный? (&amp;quot;c:\Program&lt;br /&gt;&amp;#160; &amp;#160;Files&amp;quot; ==&amp;gt; &amp;quot;c:\progra~1&amp;quot;).&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: GetShortPathName()&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как написать сервис для Windows NT?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: В поставке Delphi 4 есть пример. [28]http://www.sawatzki.de.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как работать с registry?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: TRegistry&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как выдвинуть дверцу CD-ROM&#039;а?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: mciSendString(&#039;Set cdaudio Door Open Wait&#039;, nil, 0, handle);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как перехватывать клавиши, нажатые в окне другой программы? И&lt;br /&gt;&amp;#160; &amp;#160;вообще, любые события, поступающие другим программам?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: SetWindowsHookEx().&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как вызывать из 32-битной программы 16-битные DLL?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Надо применять так называемые &amp;quot;thunks&amp;quot;. Смотри статью на&lt;br /&gt;&amp;#160; &amp;#160;[29]http://www.itecuk.com/delmag/thunk95.htm.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Почему у меня record a : word; b : longint end; имеет размер восемь&lt;br /&gt;&amp;#160; &amp;#160;байт вместо шести?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: RTFM packed, $A.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Где взять подробную документацию по работе с RTF, TRichEdit?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: В MSDN.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий&lt;br /&gt;&amp;#160; &amp;#160;MS RichEdit 2.0 и его DB-aware версия. Рекомендуется.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как можно перетаскивать форму не только за заголовок?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: WM_NCHITTEST.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как отследить &amp;quot;уход&amp;quot; курсора мыши с компонета?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как добавить пункты в системное меню окна?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Получить хэндл системного меню окна можно с помощью функции&lt;br /&gt;&amp;#160; &amp;#160;GetSystemMenu().&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Можно ли сделать так, чтобы в исполняемом файле программы находился&lt;br /&gt;&amp;#160; &amp;#160;какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;В файл MyWave.rc пишешь:&lt;/p&gt;
						&lt;p&gt;MyWave RCDATA LOADONCALL MyWave.wav&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;brcc32.exe MyWave.rc, получаешь MyWave.res.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;В своей программе пишешь:&lt;/p&gt;
						&lt;p&gt;{$R MyWave.res}&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Все!&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Предупреждая следующий твой вопрос &amp;quot;а как прочитать wave-файл из&lt;br /&gt;&amp;#160; &amp;#160;исполняемого файла?&amp;quot;&lt;/p&gt;
						&lt;p&gt;procedure RetrieveMyWave;&lt;br /&gt;var&lt;br /&gt;&amp;#160; hResource: THandle;&lt;br /&gt;&amp;#160; pData: Pointer;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; hResource:=LoadResource( hInstance, FindResource(hInstance, &#039;MyWave&#039;, RT_RCDA&lt;br /&gt;TA));&lt;br /&gt;&amp;#160; try&lt;br /&gt;&amp;#160; &amp;#160; pData := LockResource(hResource);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if pData = nil then&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; raise Exception.Create(&#039;Cannot read MyWave&#039;);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; // Здесь pData указывает на MyWave&lt;br /&gt;&amp;#160; &amp;#160; // Теперь можно, например, проиграть его (Win32):&lt;br /&gt;&amp;#160; &amp;#160; PlaySound(&#039;MyWave&#039;, 0, SND_MEMORY);&lt;br /&gt;&amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; FreeResource(hResource);&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как узнать и поменять разрешение экрана?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Поменять:&lt;/p&gt;
						&lt;p&gt;procedure ChangeDisplayResolution(x, y : word);&lt;br /&gt;var&lt;br /&gt;&amp;#160; dm : TDEVMODE;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; ZeroMemory(@dm, sizeof(TDEVMODE));&lt;br /&gt;&amp;#160; dm.dmSize := sizeof(TDEVMODE);&lt;br /&gt;&amp;#160; dm.dmPelsWidth := x;&lt;br /&gt;&amp;#160; dm.dmPelsHeight := y;&lt;br /&gt;&amp;#160; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;&lt;br /&gt;&amp;#160; ChangeDisplaySettings(dm, 0);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как во время выполнения программы создать так называемый &amp;quot;array of&lt;br /&gt;&amp;#160; &amp;#160;const&amp;quot;, например, параметры для функции Format()?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: В библиотеке Technical Information на сайте Inprise есть документ&lt;br /&gt;&amp;#160; &amp;#160;за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве&lt;br /&gt;&amp;#160; &amp;#160;array of const можно использовать массив типа TVarRec.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как обратиться к определенному адресу физической памяти? А как&lt;br /&gt;&amp;#160; &amp;#160;прочитать значение из порта? Где мой любимый массив Port[]?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Прочитайте какую-нибудь книжку про программирование под Win32.&lt;br /&gt;&amp;#160; &amp;#160;Вкратце -- забудьте про все эти глупости.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Я создал объект TStrings, но при попытке обращения к нему выдается&lt;br /&gt;&amp;#160; &amp;#160;ошибка. В чем проблема?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: TStrings -- это абстрактный класс. Вам нужен TStringList.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как работать с графическими форматами, хотя бы самыми известными?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: На [31]http://www.imagelib.com лежит библиотека ImageLib.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;На компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если&lt;br /&gt;&amp;#160; &amp;#160;сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP,&lt;br /&gt;&amp;#160; &amp;#160;DIB, RLE, TGA, PCX.&lt;br /&gt;&amp;#160; &amp;#160;[32]http://einstein.ae.eng.ua.edu/nishita/index.htm.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как работать с файлами архивов, хотя бы самыми распространенными?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Воспользуйтесь библиотекой ExceedZip 3.0&lt;br /&gt;&amp;#160; &amp;#160;([33]http://www.exceedsoft.com).&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как использовать DirectX в своей программе?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Модули для работы с DirectX находятся на Delphi Super Page, в&lt;br /&gt;&amp;#160; &amp;#160;пакете DelphiX. Также на&lt;br /&gt;&amp;#160; &amp;#160;[34]http://www.geocities.com/SiliconValley/1142/ лежит модули для&lt;br /&gt;&amp;#160; &amp;#160;работы с DirectSound. Информацию по программированию DirectX можно&lt;br /&gt;&amp;#160; &amp;#160;взять на MSDN и в книге Чарльза Калверта &amp;quot;Delphi 2: Энциклопедия&lt;br /&gt;&amp;#160; &amp;#160;пользователя&amp;quot;.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Учтите существование эхи RU.DIRECTX.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Как использовать OpenGL в своей программе?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Модули для работы с OpenGL можно взять на&lt;br /&gt;&amp;#160; &amp;#160;[35]http://www.signsoft.com/opengl. Информацию -- на&lt;br /&gt;&amp;#160; &amp;#160;[36]http://www.opengl.org. Также есть книга Ю. Тихомирова &amp;quot;OpenGL:&lt;br /&gt;&amp;#160; &amp;#160;программирование трехмерной графики&amp;quot;. Еще загляните на&lt;br /&gt;&amp;#160; &amp;#160;[37]http://reality.sgi.com/mjk за примерами и&lt;br /&gt;&amp;#160; &amp;#160;[38]http://www.scitechsoft.com за библиотекой MesaGL.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Учтите существование эхи RU.OPENGL.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как встроить просмотр HTML в свою программу?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;В Delphi 4 имеется пример Web-браузера на Delphi.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: MS Internet Explorer умеет быть элементом управления ActiveX, что&lt;br /&gt;&amp;#160; &amp;#160;позволяет поместить его на форму.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Netscape Navigator умеет делать то же самое, подробности на&lt;br /&gt;&amp;#160; &amp;#160;[39]http://www.chami.com/tips/delphi/103096D.html&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Еще на [40]http://www.pbear.com лежат THTMLViewer и TFrameViewer.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Где достать процедуру типа &amp;quot;сумма прописью&amp;quot;?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: (Vladimir Gaitanoff, 2:5020/880.5), [41]http://www.tsinet.ru/~vg.&lt;br /&gt;&amp;#160; &amp;#160;Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Какие инструменты можно применить для коллективной разработки&lt;br /&gt;&amp;#160; &amp;#160;проекта?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: CVS. [42]http://www.cyclic.com. С его помощью разрабатывается&lt;br /&gt;&amp;#160; &amp;#160;весьма львиная доля программного обеспечения в Internet. Интеграция с&lt;br /&gt;&amp;#160; &amp;#160;Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею&lt;br /&gt;&amp;#160; &amp;#160;ощутимое время и не представляю себе более разработки без этого&lt;br /&gt;&amp;#160; &amp;#160;средства. &amp;quot;Введение в CVS&amp;quot; можно прочитать на&lt;br /&gt;&amp;#160; &amp;#160;[43]http://alexm.here.ru.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Microsoft Visual Source Safe. Проигрывает в функциональности, может&lt;br /&gt;&amp;#160; &amp;#160;выигрывать в &amp;quot;привычности&amp;quot;.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как можно обнаружить утечки памяти и ресурсов в программе?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: MSDebug Макса Русова. Находится на&lt;br /&gt;&amp;#160; &amp;#160;[44]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше,&lt;br /&gt;&amp;#160; &amp;#160;ловит только утечки памяти, но делает это хорошо.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;На [45]http://www.numega.com можно купить BoundsChecker for Delphi. Он&lt;br /&gt;&amp;#160; &amp;#160;проверяет также и утечки ресурсов.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Рекламировался также &amp;quot;MemProof&amp;quot;, информацию о котором можно получить&lt;br /&gt;&amp;#160; &amp;#160;на [46]http://www.listsoft.ru/programs/pr1520.htm.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Мне нужно заниматься разбором математических выражений, например,&lt;br /&gt;&amp;#160; &amp;#160;строить график функции, заданной пользователем во время работы&lt;br /&gt;&amp;#160; &amp;#160;программы.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: В rxLib есть компонент TrxMathParser, достаточно мощный для&lt;br /&gt;&amp;#160; &amp;#160;большого количества применений.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как уменьшить размер исполняемого файла программы?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Писать на WinAPI без использования VCL. Это пригодно для и без того&lt;br /&gt;&amp;#160; &amp;#160;крохотных программ.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Воспользоваться пакетами (packages) из Delphi 3. Эффект появится,&lt;br /&gt;&amp;#160; &amp;#160;когда исполняемых файлов больше одного.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Воспользоваться компрессорами исполняемых файлов, например: Shrinker&lt;br /&gt;&amp;#160; &amp;#160;[47]http://www.blinkinc.com, WWPack32&lt;br /&gt;&amp;#160; &amp;#160;[48]http://kolos.uni.lodz.pl/warezak, NeoLite&lt;br /&gt;&amp;#160; &amp;#160;[49]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne&lt;br /&gt;&amp;#160; &amp;#160;olitee.zip, Petite, [50]http://www.icl.ndirect.co.uk/petite/.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Где достать всяких иконок, картинок для кнопок, etc. для своей&lt;br /&gt;&amp;#160; &amp;#160;программы?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: [51]http://www.iconbazaar.com&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как сделать ping из своей программы? И вообще, посоветуйте&lt;br /&gt;&amp;#160; &amp;#160;какую-нибудь альтернативу стандартным дельфовым Internet-компонентам.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Зайди на [52]http://www.rtfm.be/fpiette. Там кyча компонентов для&lt;br /&gt;&amp;#160; &amp;#160;инета с исходниками. Там и ping есть.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как правильно создавать компоненты в run-time? Что задавать в&lt;br /&gt;&amp;#160; &amp;#160;качестве параметра Owner при создании компоненты? Как обрабатывать&lt;br /&gt;&amp;#160; &amp;#160;события от созданных компонент, типа нажатий на кнопки?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Начнем с создания.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Сущность свойства Owner в том, что владелец перед смертью уничтожает&lt;br /&gt;&amp;#160; &amp;#160;(через Free) принадлежащие ему объекты. Таким образом, все зависит от&lt;br /&gt;&amp;#160; &amp;#160;того, кому вы хотите доверить уничтожение созданных форм/компонентов.&lt;br /&gt;&amp;#160; &amp;#160;В частности, если вы сами будете этим заниматься, то AOwner может&lt;br /&gt;&amp;#160; &amp;#160;быть, например, nil.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Для того, чтобы созданный компонент появился на экране, надо указать&lt;br /&gt;&amp;#160; &amp;#160;его родителя, заполнив свойство Parent, например, NewButton.Parent :=&lt;br /&gt;&amp;#160; &amp;#160;Form1;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Пример кода, обрабатывающего события от свежесозданных компонентов:&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;&amp;#160; TForm1 = class(TForm)&lt;br /&gt;&amp;#160; { ... }&lt;br /&gt;&amp;#160; private&lt;br /&gt;&amp;#160; &amp;#160; { эта процедура будет вызываться при нажатии на кнопку }&lt;br /&gt;&amp;#160; &amp;#160; procedure ButtonClicked(Sender : TObject);&lt;/p&gt;
						&lt;p&gt;&amp;#160; public&lt;br /&gt;&amp;#160; &amp;#160; { в этой процедуре происходит создание кнопки }&lt;br /&gt;&amp;#160; &amp;#160; procedure CreateButton;&lt;/p&gt;
						&lt;p&gt;&amp;#160; end;&lt;/p&gt;
						&lt;p&gt;{ ... }&lt;/p&gt;
						&lt;p&gt;procedure TForm1.CreateButton;&lt;br /&gt;var&lt;br /&gt;&amp;#160; btn : TButton;&lt;br /&gt;begin&lt;br /&gt;btn := TButton.Create(Self);&amp;#160; { Уничтожать кнопку будет форма }&lt;br /&gt;btn.Parent := Self;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;{ Родителем кнопки будет форма }&lt;br /&gt;btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при }&lt;br /&gt;btn.Visible := true;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; { нажатии на кнопку }&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как мне работать с файлами MS Word или таблицами MS Excel?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual&lt;br /&gt;&amp;#160; &amp;#160;Basic for Applications) или WordBasic.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;NB: Обратите внимание на то, как устанавливаются именованные параметры&lt;br /&gt;&amp;#160; &amp;#160;у процедур WordBasic&#039;а, например, FileOpen(Name := &#039;myname.doc&#039;);&lt;/p&gt;
						&lt;p&gt;=== Cut Пример by Sergey Arkhipov 2:5054/88.10 ===&lt;/p&gt;
						&lt;p&gt;Пример проверен только на русском Word 7.0! Может, поможет...&lt;/p&gt;
						&lt;p&gt;unit InWord;&lt;br /&gt;interface&lt;br /&gt;uses&lt;br /&gt;&amp;#160; ... ComCtrls; // Delphi3&lt;br /&gt;&amp;#160; ... OLEAuto;&amp;#160; // Delphi2&lt;br /&gt;[skip]&lt;br /&gt;procedure TPrintForm.MPrintClick(Sender: TObject);&lt;br /&gt;var W: Variant;&lt;br /&gt;&amp;#160; &amp;#160; S: String;&lt;br /&gt;begin&lt;br /&gt;&amp;#160; S:=VarToStr(Table1[&#039;Num&#039;]); //В D3 без промежуточной записи&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // в var у меня не пошло :(&lt;br /&gt;&amp;#160; try // А вдруг где ошибка :)&lt;br /&gt;&amp;#160; &amp;#160; W:=CreateOleObject(&#039;Word.Basic&#039;);&lt;br /&gt;&amp;#160; &amp;#160; // Создаем документ по шаблону MyWordDot&lt;br /&gt;&amp;#160; &amp;#160; // с указанием пути если он не в папке шаблонов Word&lt;br /&gt;&amp;#160; &amp;#160; W.FileNew(Template:=&#039;C:\MyPath\DB\MyWordDot&#039;,NewTemplate:=0);&lt;br /&gt;&amp;#160; &amp;#160; // Отключение фоновой печати (на LJ5L без этого был пустой лист)&lt;br /&gt;&amp;#160; &amp;#160; W.ToolsOptionsPrint(Background:=0);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; // Переходим к закладке Word&#039;a &#039;Num&#039;&lt;br /&gt;&amp;#160; &amp;#160; W.EditGoto(&#039;Num&#039;); W.Insert(S);&lt;br /&gt;&amp;#160; &amp;#160; //Сохранение&lt;br /&gt;&amp;#160; &amp;#160; W.FileSaveAs(&#039;C:\MayPath\Reports\MyReport&#039;)&lt;br /&gt;&amp;#160; &amp;#160; W.FilePrint(NumCopies:=&#039;2&#039;); // Печать 2-х копий&lt;br /&gt;&amp;#160; finally&lt;br /&gt;&amp;#160; &amp;#160; W.ToolsOptionsPrint(Background:=1);&lt;br /&gt;&amp;#160; &amp;#160; W:=UnAssigned;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;br /&gt;{.....}&lt;/p&gt;
						&lt;p&gt;=== Cut Конец примера ===&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как сделать так, чтобы запущенная программа не была видна на панели&lt;br /&gt;&amp;#160; &amp;#160;задач?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Во-первых, можно по примеру Back Orifice воспользоваться функцией&lt;br /&gt;&amp;#160; &amp;#160;RegisterServiceProcess.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из&lt;br /&gt;&amp;#160; &amp;#160;rxLib, иначе непонятно, как вы будете возвращать программу обратно из&lt;br /&gt;&amp;#160; &amp;#160;минимизированного состояния.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: (EM, DS):&lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt;&amp;#160; TForm1 = class(TForm)&lt;br /&gt;&amp;#160; &amp;#160; Label1: TLabel;&lt;br /&gt;&amp;#160; &amp;#160; RxTrayIcon1: TRxTrayIcon;&lt;br /&gt;&amp;#160; &amp;#160; procedure FormCreate(Sender : TObject);&lt;br /&gt;&amp;#160; &amp;#160; procedure RxTrayIcon1DblClick(Sender: TObject);&lt;br /&gt;&amp;#160; private&lt;br /&gt;&amp;#160; &amp;#160; { Private declarations }&lt;br /&gt;&amp;#160; &amp;#160; procedure ApplicationMinimize(Sender : TObject);&lt;br /&gt;&amp;#160; &amp;#160; procedure ApplicationRestore(Sender : TObject);&lt;br /&gt;&amp;#160; public&lt;br /&gt;&amp;#160; &amp;#160; { Public declarations }&lt;br /&gt;&amp;#160; end;&lt;/p&gt;
						&lt;p&gt;var&lt;br /&gt;&amp;#160; Form1: TForm1;&lt;/p&gt;
						&lt;p&gt;implementation&lt;/p&gt;
						&lt;p&gt;{$R *.DFM}&lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;Application.OnMinimize := ApplicationMinimize;&lt;br /&gt;Application.OnRestore := ApplicationRestore;&lt;br /&gt;ShowWindow(Application.Handle, SW_HIDE);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.ApplicationMinimize(Sender : TObject);&lt;br /&gt;begin&lt;br /&gt;ShowWindow(Application.Handle, SW_HIDE);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.ApplicationRestore(Sender : TObject);&lt;br /&gt;begin&lt;br /&gt;ShowWindow(Application.Handle, SW_HIDE);&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.RxTrayIcon1DblClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;Application.Restore;&lt;br /&gt;Application.BringToFront;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;(AK): Только сpазу предупреждаю про грабли, на которые я наступал --&lt;br /&gt;&amp;#160; &amp;#160;будь готов к тому, что если пpи попытке закрытия приложения в&lt;br /&gt;&amp;#160; &amp;#160;OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут&lt;br /&gt;&amp;#160; &amp;#160;быть проблемы с автоматическим завершением пpогpаммы пpи shutdown --&lt;br /&gt;&amp;#160; &amp;#160;под Win95 просто зависает, под WinNT не завершается. Очевидно, что&lt;br /&gt;&amp;#160; &amp;#160;сообщение выводится, но его не видно (причем SW_RESTORE не&lt;br /&gt;&amp;#160; &amp;#160;сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких&lt;br /&gt;&amp;#160; &amp;#160;завеpшающих действий и вызова CallTerminateProcs выдавать Halt.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: После работы программы не сохраняются изменения в базе Paradox. Что&lt;br /&gt;&amp;#160; &amp;#160;делать?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Где-нибудь при закрытии главной формы выполните нижеследующие куски&lt;br /&gt;&amp;#160; &amp;#160;кода:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Для Delphi 3: Table.FlushBuffers при открытой таблице.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle));&lt;br /&gt;&amp;#160; &amp;#160;Table.Close;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как мне упаковать Paradox или DBF таблицу?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Воспользоваться функцией PackTable из rxLib.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Для перегенерации индексов:&lt;/p&gt;
						&lt;p&gt;Table1.Exclusive := True;&lt;br /&gt;Table1.Open;&lt;br /&gt;Check(dbiRegenIndexes(Table1.Handle);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Почему при добавлении/изменении записей в некоторых запросах&lt;br /&gt;&amp;#160; &amp;#160;возникает ошибка Cannot modify a read-only dataset?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос&lt;br /&gt;&amp;#160; &amp;#160;был редактируемым, он должен удовлетворять требованиям, изложенным в&lt;br /&gt;&amp;#160; &amp;#160;помощи при поиске по &amp;quot;live result sets&amp;quot;.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Почему не работает сортировка и функция UPPER() в Interbase&#039;овской&lt;br /&gt;&amp;#160; &amp;#160;базе данных?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Смотри в F.A.Q. по Borland Interbase от демо-центра.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Не получается вставить в таблицу записи со строками на русском&lt;br /&gt;&amp;#160; &amp;#160;языке -- некоторые буквы меняются на другие -- что делать?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: В Database Desktop поставьте правильный Language Driver у таблицы,&lt;br /&gt;&amp;#160; &amp;#160;например, Pdox ANSI Cyrr.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Я переписал готовую программу на машину заказчика, а она там не&lt;br /&gt;&amp;#160; &amp;#160;запускается -- говорит &amp;quot;Error initializing database engine&amp;quot;. Что&lt;br /&gt;&amp;#160; &amp;#160;делать?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Прочитать X:\DELPHI\DOC\deploy.txt.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: Как правильно соединяться с базой данных под Personal Oracle?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: user/password@2: Это так для Oracle SQL Plus, и более других его&lt;br /&gt;&amp;#160; &amp;#160;утилит. А в BDE надо оставить все как для соединения с сетевым&lt;br /&gt;&amp;#160; &amp;#160;сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную&lt;br /&gt;&amp;#160; &amp;#160;DLL) только вместо имени сервера написать &amp;quot;2:&amp;quot;. Это годится и для&lt;br /&gt;&amp;#160; &amp;#160;случая, когда на одной машине и сетевой сервер и приложение.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;Q: У меня в программе происходит очень большой запрос -- в районе&lt;br /&gt;&amp;#160; &amp;#160;нескольких тысяч или десятков тысяч записей. Соответственно, большой&lt;br /&gt;&amp;#160; &amp;#160;сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь&lt;br /&gt;&amp;#160; &amp;#160;оптимизировать это все?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;A: Постарайтесь изменить логику приложения так, чтобы таких запросов&lt;br /&gt;&amp;#160; &amp;#160;не возникало. Обычно подобные вещи свидетельствуют о несколько&lt;br /&gt;&amp;#160; &amp;#160;неверной архитектуре приложения.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Mon, 20 Apr 2009 22:04:48 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=9#p9</guid>
		</item>
		<item>
			<title>Правила форума</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=8#p8</link>
			<description>&lt;p&gt;Данный форум посвящен обсуждению IDE семейства Delphi.&lt;/p&gt;
						&lt;p&gt;Форум является постмодерируемым, любые сообщения, в случае нарушения приведенных ниже правил, в любой момент могут быть отредактированы или удалены модераторами и администраторами форума. Все оставленные на форуме сообщения отражают исключительно мнение их авторов. Администрация и модераторы форума не несут никакой ответственности за эти сообщения, даже если они противоречат данным правилам. Приведённые на&amp;#160; этой странице правила являются первичными и обязательны для исполнения во всех разделах и всеми участниками форума.&lt;/p&gt;
						&lt;p&gt;1. Основные положения&lt;br /&gt;1.1. Перед созданием новой темы необходимо воспользоваться поиском по форуму (строка поиска находится в верхнем левом углу страницы). Крайне велика вероятность, что всё, что вы хотите узнать, уже не раз обсуждалось.&lt;br /&gt;1.2. Листинги и содержимое текстовых файлов следует добавлять в сообщение с помощью тега &lt;/p&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Свернутый текст&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;...&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;, либо прикреплять к сообщению в виде отдельного файла.&lt;br /&gt;1.3. Разрешено обращение на «ты» ко всем участникам форума. При этом, в связи со спецификой интернет-форумов, подобное обращение не должно расцениваться как фамильярное или невежливое.&lt;br /&gt;1.4. Проявляйте больше терпения к другим участникам форума, особенно к новичкам. Не всем легко даётся освоение незнакомого языка программирования. Все мы когда-то начинали.&lt;br /&gt;1.5. Обо всех спорных моментах сообщайте модераторам форума, мы тоже живые люди и можем что-то пропустить. Вы очень нам поможете, если обратите наше внимание на случаи нарушения данных правил.&lt;/p&gt;
						&lt;p&gt;2. На форуме ЗАПРЕЩЕНО&lt;br /&gt;2.1. Использовать ненормативную лексику в любом виде. В том числе сокращённые и искажённые нецензурные слова. Замена нецензурных слов спецсимволами допускается.&lt;br /&gt;2.2. Оскорблять кого-либо из участников форума или принижать его личные качества. Будьте вежливы и культурны!&lt;br /&gt;2.3. Флудить и заниматься флеймом, а так же оставлять сообщения, не относящиеся к теме обсуждения. Для общения есть различные чаты, конференции, IRC-каналы и т.д.&lt;br /&gt;2.4. Создавать темы с неинформативным названием, например «Помогите», «Пара вопросов» и т. п.&lt;br /&gt;2.5. Создавать одинаковые темы в разных разделах, публиковать одинаковые сообщения в разных темах, а также добавлять новые темы в неподходящие разделы. Старайтесь чётко определять тематику Вашего сообщения и помещать его в соответствующий раздел форума.&lt;br /&gt;2.6. Задавать в одной теме несвязанные вопросы. Не бойтесь создавать по одной теме на каждый вопрос в соответствующих разделах.&lt;br /&gt;2.7. Использовать транслит в сообщениях. Уважайте тех, кому придётся читать то, что вы написали. Если у вас нет возможности печатать на русском, используйте специальные сайты-транслитераторы (например, translit.ru) или виртуальные клавиатуры.&lt;br /&gt;2.8. Чрезмерное цитирование. Цитаты нужны для выделения какой-то небольшой части сообщения с целью её комментирования, не забывайте об этом.&lt;br /&gt;2.9. Обсуждать действия модераторов и администрации в темах, не относящихся к этому напрямую. Для разрешения спорных ситуаций пользуйтесь личными сообщениями или разделом «Админы не спят!».&lt;br /&gt;2.10. Самовольное модерирование форума. Даже если пользователь не прав и тему стоит закрыть, не нужно об этом писать в теме &lt;br /&gt;2.11. Обсуждать любые материалы, нарушающие авторские права.&lt;br /&gt;2.12. Несанкционированно рекламировать и продвигать другие сетевые и несетевые ресурсы, товары, компании, услуги; так же запрещён любой PR.&lt;br /&gt;2.13. Публиковать материалы, противоречащие действующему законодательству РК, в том числе распространять вирусы и любые другие вредоносные программы.&lt;br /&gt;2.14. Регистрировать пользователей, имена которых могут быть восприняты как нецензурные и/или оскорбительные; использовать в качестве имен адреса электронной почты, веб-сайтов, номера телефонов и прочее, что может быть расценено как PR.&lt;br /&gt;2.15. Обсуждение вопросов, напрямую не связанных с использованием семейства Delphi. Другие темы следует обсуждать на иных, специализированных ресурсах.&lt;/p&gt;
						&lt;p&gt;3. Ответственность за нарушение данных правил&lt;/p&gt;
						&lt;p&gt;3.1. За нарушение правил пользователю может быть вынесено предупреждение. &lt;br /&gt;3.2. После трёх предупреждений пользователь может быть на некоторое время переведен в режим «только чтение». В случае дальнейших нарушений пользователю может быть навсегда закрыт доступ на форум. &lt;br /&gt;3.3. При применении санкций учитываются предыдущие нарушения правил форума. Предупреждения имеют срок давности (в зависимости от тяжести нарушений), по прошествии которого они снимаются.&lt;/p&gt;
						&lt;p&gt;Незнание правил, как и всегда, не освобождает от ответственности. Данные правила могут корректироваться и изменяться администраторами форума без предварительного уведомления всех пользователей.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Mon, 20 Apr 2009 20:06:17 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=8#p8</guid>
		</item>
		<item>
			<title>История создания Delphi</title>
			<link>https://delphi.forumkz.ru/viewtopic.php?pid=5#p5</link>
			<description>&lt;p&gt;В России Borland Delphi появляется в конце 1993 г. и сразу же завоевывает широкую популярность. Новые версии выходят практически каждый год. В них реализуются все новые мастера, компоненты и технологии программирования.&lt;/p&gt;
						&lt;p&gt;Действительно, процесс разработки в Delphi предельно упрощен. В первую очередь это относится к созданию интерфейса, на который уходит 80% времени разработки программы. Вы просто помещаете нужные компоненты на поверхность Windows-окна (в Delphi оно называется формой) и настраиваете их свойства с помощью специального инструмента (Object Inspector). С его помощью можно связать события этих компонентов (нажатие на кнопку, выбор мышью элемента в списке и т.д.) с кодом его обработки - и вот простое приложение готово. Причем разработчик получает в свое распоряжение мощные средства отладки (вплоть до пошагового выполнения команд процессора), удобную контекстную справочную систему (в том числе и по Microsoft API), средства коллективной работы над проектом, всего просто не перечислить. Вы можете создавать компоненты ActiveX без использования Microsoft IDL, расширять возможности web-сервера (скрипты на стороне сервера), практически ничего не зная об HTML, XML или ASP. Можно создавать распределенные приложения на базе СОМ и CORBA, Интернет- и intranet-приложения, используя для доступа к данным Borland DataBase Engine, ODBC-драйверы или Microsoft ADO. Появившаяся, начиная с Delphi 3, поддержка многозвенной технологии (multi-tiered) доступа к данным позволяет создавать масштабируемые приложения (относительно слабо зависящие от сервера БД) за счет перенесения методов обработки информации (бизнес-правил) на среднее звено.&lt;/p&gt;
						&lt;p&gt;Как уже говорилось ранее, в Delphi используется язык Object Pascal, который постоянно расширяется и дополняется Borland. Язык в полной мере поддерживает все требования, предъявляемые к объектно-ориентированному языку программирования. Как и положено строго типизированному языку, классы поддерживают только простое наследование, но зато интерфейсы могут иметь сразу несколько предков. К числу особенностей языка следует отнести поддержку обработки исключительных ситуаций (exceptions), а также перегрузку методов и подпрограмм (overload) в стиле C++. К числу удачных, на взгляд автора, относится также поддержка длинных строк в формате WideChar и AnsiChar. Последний тип (AnsiStrmg) позволяет использовать все прелести динамического размещения информации в памяти без всяких забот о ее выделении и сборке мусора Delphi делает это автоматически. Для поклонников свободного стиля программирования имеются открытые массивы, варианты и вариантные массивы, позволяющие размещать в памяти все, что душе угодно и смешивать типы данных.&lt;/p&gt;
						&lt;p&gt;Вы можете создавать свои собственные компоненты, импортировать ОСХ-компоненты, создавать &amp;lt;шаблоны&amp;gt; проектов и &amp;lt;мастеров&amp;gt;, создающих &amp;lt;заготовки&amp;gt; проектов. Мало того, Delphi предоставляет разработчику интерфейс для связи ваших приложений (или внешних программ) с интегрированной оболочкой Delphi (IDE).&lt;/p&gt;
						&lt;p&gt;Таким образом, вы можете использовать Delphi для создания как самых простых приложений, на разработку которых требуется 2-3 часа, так и серьезных корпоративных проектов, предназначенных для работы десятков и сотен пользователей. Причем для этого можно использовать самые последние веяния в мире компьютерных технологий с минимальными затратами времени и сил.&lt;/p&gt;
						&lt;p&gt;Ну, и одна из самых последних новостей от Inprise обещает, что в ближайшем будущем вы сможете переносить приложения, разработанные в Delphi, на платформу Linux. Более подробную информацию о Delphi можно получить на сайтах wwwinprise.com и wwwinprise.ru. Существует большое количество сайтов, посвященных Delphi, например &amp;lt;Королевство Delphi&amp;gt; - delphi.vitpc.com, Torry’s Delphi Pages - wwwtorry.ru. Последний содержит большое число ссылок на ресурсы, связанные с Delphi. Ну а если вы уже давно знакомы с этим продуктом, то на сайте wwwbrainbench.com можно бесплатно протестироваться в качестве программиста Delphi и получить по почте сертификат.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (root)</author>
			<pubDate>Mon, 20 Apr 2009 17:06:39 +0400</pubDate>
			<guid>https://delphi.forumkz.ru/viewtopic.php?pid=5#p5</guid>
		</item>
	</channel>
</rss>
