<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://pp09.rolka.me/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>Ответы на экзамен</title>
		<link>https://pp09.rolka.me/</link>
		<description>Ответы на экзамен</description>
		<language>ru-ru</language>
		<lastBuildDate>Sat, 12 Nov 2011 00:16:14 +0400</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>14.	Нечеткие отношения. Свойства нечетких отношений.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=120#p120</link>
			<description>&lt;p&gt;&lt;a href=&quot;http://ecosyn.ru/page0030.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://ecosyn.ru/page0030.html&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Sat, 12 Nov 2011 00:16:14 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=120#p120</guid>
		</item>
		<item>
			<title>13.	Нечеткие множества. Определение, способы записи. Операции над нече</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=119#p119</link>
			<description>&lt;p&gt;Элементы теории нечетких множеств&lt;/p&gt;
						&lt;p&gt;Рассмотрим основные элементы теории нечетких множеств [l]. Пусть U— полное множество, охватывающее все объекты некоторого класса. Нечеткое подмножество F множества U, которое в дальнейшем будем называть нечетким множеством, определяется через функцию принадлежности &amp;#61549;F (u), и &amp;#61646; U. Эта функция отображает элементы Ui, множества U на множество вещественных чисел отрезка [0,1], которые указывают степень принадлежности каждого элемента нечеткому множеству F.&lt;br /&gt;Если полное множество U состоит из конечного числа элементов иi, i = 1, 2, ..., п, то нечеткое множество F можно представить в следующем виде:&lt;/p&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s017.radikal.ru/i437/1111/99/4c9ae4f6a72f.jpg&quot; alt=&quot;http://s017.radikal.ru/i437/1111/99/4c9ae4f6a72f.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;где &amp;quot;+&amp;quot; означает не сложение, а, скорее, объединение: символ &amp;quot;/&amp;quot; показывает, что значение &amp;#61549;F относится к элементу, следующему за ним (а не означает деление на иi).&lt;br /&gt;В случае, если множество U является непрерывным, F можно записать как интеграл:&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;Нечеткие множества широко применяются для формализации лингвистических знаний. Рассмотрим для примера множество процентных ставок, предоставляемых банками по вкладам. Каким образом можно выделить подмножество высоких процентных ставок? В условиях динамично изменяющейся среды не всегда возможно точно ответить на этот вопрос, однозначно выделив множество высоких ставок. При использовании аппарата теории нечетких множеств решить такую задачу можно даже при отсутствии полной количественной информации об окружении. Функция принадлежности для элементов нечеткого множества F1, соответствующих понятию &amp;quot;высокие процентные ставки&amp;quot; (рис. 4.1), будет иметь следующий вид:&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;Функция принадлежности к нечеткому множеству низких процентных ставок запишется следующим образом:&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Sat, 12 Nov 2011 00:12:47 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=119#p119</guid>
		</item>
		<item>
			<title>11.	Оценка достоверности.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=118#p118</link>
			<description>&lt;p&gt;Оценка однородности суждений&lt;/p&gt;
						&lt;p&gt;В практических задачах количественная (кардинальная) и транзитивная (порядковая) однородность (согласованность) нарушается, поскольку человеческие ощущения нельзя выразить точной формулой. Для улучшения однородности в числовых суждениях, какая бы величина aij ни была взята для сравнения i-го элемента с j-м, aij приписывается значение обратной величины, т. е. аij = 1/aij. Отсюда следует, что если один элемент в а раз предпочтительнее другого, то последний только в 1/а раз предпочтительнее первого.&lt;br /&gt;При нарушении однородности ранг матрицы отличен от единицы и она будет иметь несколько собственных значений. Однако при небольших отклонениях суждений от однородности одно из собственных значений будет существенно больше остальных и приблизительно равно порядку матрицы. Таким образом, для оценки однородности суждений эксперта необходимо использовать отклонение величины максимального собственного значения &amp;#955;max от порядка матрицы п.&lt;br /&gt;Однородность суждений оценивается индексом однородности (ИО) или отношением однородности (OO) в соответствии со следующими выражениями:&lt;/p&gt;
						&lt;p&gt;где М(ИО) — среднее значение (математическое ожидание) индекса однородности случайным образом составленной матрицы парных сравнений [E], которое основано на экспериментальных данных (табл. 2.3), полученных в работе [2].&lt;br /&gt;Таблица 2.3&lt;br /&gt;Среднее значение индекса однородности в зависимости от порядка матрицы&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;1&lt;br /&gt;	0,00&lt;br /&gt;	6&lt;br /&gt;	1,24&lt;br /&gt;	11&lt;br /&gt;	1,51&lt;/p&gt;
						&lt;p&gt;2&lt;br /&gt;	0,00&lt;br /&gt;	7&lt;br /&gt;	1,32&lt;br /&gt;	12&lt;br /&gt;	1,48&lt;/p&gt;
						&lt;p&gt;3&lt;br /&gt;	0,58&lt;br /&gt;	8&lt;br /&gt;	1,41&lt;br /&gt;	13&lt;br /&gt;	1,56&lt;/p&gt;
						&lt;p&gt;4&lt;br /&gt;	0,90&lt;br /&gt;	9&lt;br /&gt;	1,45&lt;br /&gt;	14&lt;br /&gt;	1,57&lt;/p&gt;
						&lt;p&gt;5&lt;br /&gt;	1,12&lt;br /&gt;	10&lt;br /&gt;	1.49&lt;br /&gt;	15&lt;br /&gt;	1,59&lt;br /&gt;	&lt;/p&gt;
						&lt;p&gt;В качестве допустимого используется значение OO &amp;#8804; 0,10. Если для матрицы парных сравнений отношение однородности OO &amp;gt; 0,10, то это свидетельствует о существенном нарушении логичности суждений, допущенном экспертом при заполнении матрицы, поэтому эксперту предлагается пересмотреть данные, использованные для построения матрицы, чтобы улучшить однородность.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Fri, 11 Nov 2011 23:46:49 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=118#p118</guid>
		</item>
		<item>
			<title>10.	Неполная трёхуровневая иерархия. Пример.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=117#p117</link>
			<description>&lt;p&gt;&lt;a href=&quot;http://www.forekc.ru/op2/index-reshenie_zadachi_metodom_analiza_ierarhii.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.forekc.ru/op2/index-reshenie &amp;#8230; rarhii.htm&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Fri, 11 Nov 2011 22:50:30 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=117#p117</guid>
		</item>
		<item>
			<title>9.	Сравнение объектов методом копирования. Пример.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=116#p116</link>
			<description>&lt;p&gt;&lt;a href=&quot;http://www.forekc.ru/op1/index-sravnenie_obektov_metodom_kopirovaniya.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.forekc.ru/op1/index-sravneni &amp;#8230; vaniya.htm&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Fri, 11 Nov 2011 22:48:11 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=116#p116</guid>
		</item>
		<item>
			<title>8.	Сравнение объектов относительно стандартов. Пример.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=115#p115</link>
			<description>&lt;p&gt;&lt;a href=&quot;http://www.forekc.ru/op1/index-sravnenie_obektov_otnositelno_standartov.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.forekc.ru/op1/index-sravneni &amp;#8230; dartov.htm&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Fri, 11 Nov 2011 19:43:22 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=115#p115</guid>
		</item>
		<item>
			<title>6.	Подход МАИ. Шкала отношений матрицы парных сравнений.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=114#p114</link>
			<description>&lt;p&gt;&lt;a href=&quot;http://www.anpavlov.ru/MAI/Chapter%203.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.anpavlov.ru/MAI/Chapter 3.htm&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Fri, 11 Nov 2011 19:34:16 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=114#p114</guid>
		</item>
		<item>
			<title>5.	Метод аналитической иерархии. Условия применения МАИ. Типы иерархий</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=113#p113</link>
			<description>&lt;p&gt;ПРИНЯТИЕ РЕШЕНИЙ НА ОСНОВЕ МЕТОДА АНАЛИЗА ИЕРАРХИЙ&lt;/p&gt;
						&lt;p&gt;Метод анализа иерархий (МАИ) [1,2] предполагает декомпозицию проблемы на все более простые составляющие части и обработку суждений лица, принимающего решение. В результате определяется относительная значимость исследуемых альтернатив для всех критериев, находящихся в иерархии. Относительная значимость выражается численно в виде векторов приоритетов. Полученные таким образом значения векторов являются оценками в шкале отношений и соответствуют так называемым жестким оценкам.&lt;br /&gt;Можно выделить ряд модификаций МАИ, которые определяются характером связей между критериями и альтернативами, расположенными на самом нижнем уровне иерархии, а также методом сравнения альтернатив.&lt;br /&gt;По характеру связей между критериями и альтернативами определяется два типа иерархий. К первому типу относятся такие, у которых каждый критерий, имеющий связь с альтернативами, связан со всеми рассматриваемыми альтернативами (тип иерархий с одинаковыми числом и функциональным составом альтернатив под критериями). Ко второму типу иерархий принадлежат такие, у которых каждый критерий, имеющий связь с альтернативами, связан не со всеми рассматриваемыми альтернативами (тип иерархий с различными числом и функциональным составом альтернатив под критериями).&lt;br /&gt;В МАИ имеется три метода сравнения альтернатив: попарное сравнение; сравнение альтернатив относительно стандартов и сравнение альтернатив копированием.&lt;br /&gt;Ниже рассматриваются методология МАИ и отличительные особенности его модификаций.&lt;/p&gt;
						&lt;p&gt;2.1. Иерархическое представление проблемы, шкала отношений и матрицы парных сравнений&lt;/p&gt;
						&lt;p&gt;Иерархическое представление проблемы&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;http://www.radikal.ru&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s017.radikal.ru/i432/1111/ab/308494fc8739.jpg&quot; alt=&quot;http://s017.radikal.ru/i432/1111/ab/308494fc8739.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;В первой модификации метода рассматривается иерархия с одинаковыми числом и функциональным составом альтернатив под критериями и метод попарного сравнения элементов иерархии. Построение иерархии начинается с очерчивания проблемы исследования. Далее строится собственно иерархия, включающая цель, расположенную в ее вершине, промежуточные уровни (например, критерии) и альтернативы, формирующие самый нижний иерархический уровень.&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;На рис. 2.1 приведен общий вид иерархии, где Еij — элементы иерархии, Аi — альтернативы. &lt;br /&gt;Верхний индекс у элементов указывает уровень иерархии, а нижний индекс — их порядковый номер. Существует несколько альтернативных способов графического отображения иерархии.&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;На рис. 2.2 приведены три варианта отображения одной иерархии.&lt;br /&gt;Первый вариант — конкретизация (декомпозиция) заданного множества элементов (в частности, критериев). Второй вариант противоположен первому и предполагает синтез более общих элементов из заданных частных. Третий вариант — упорядочение предварительно заданного множества элементов на основе их попарного сравнения.&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;&lt;/p&gt;
						&lt;p&gt;Шкала отношений&lt;/p&gt;
						&lt;p&gt;Для установления относительной важности элементов иерархии используется шкала отношений (табл. 2.1). Данная шкала позволяет ЛПР ставить в соответствие степеням предпочтения одного сравниваемого объекта перед другим некоторые числа.&lt;/p&gt;
						&lt;p&gt;Таблица 2.1&lt;br /&gt;Шкала отношений (степени значимости действий)&lt;/p&gt;
						&lt;p&gt;Степень значимости&lt;br /&gt;	Определение&lt;br /&gt;	Объяснение&lt;/p&gt;
						&lt;p&gt;1&lt;br /&gt;	Одинаковая значимость&lt;br /&gt;	Два действия вносят одинаковый вклад в достижение цели&lt;/p&gt;
						&lt;p&gt;3&lt;br /&gt;	Некоторое преобладание значимости одного действия над другим (слабая значимость)	Существуют соображения в пользу предпочтения одного из действий, однако эти соображения недостаточно убедительны&lt;/p&gt;
						&lt;p&gt;5&lt;br /&gt;	Существенная или сильная значимость&lt;br /&gt;	Имеются надежные данные или логические суждения для того, чтобы показать предпочтительность одного из действий&lt;/p&gt;
						&lt;p&gt;7&lt;br /&gt;	Очевидная или очень сильная значимость&lt;br /&gt;	Убедительное свидетельство в пользу одного действия перед другим&lt;br /&gt;9&lt;br /&gt;	Абсолютная значимость&lt;br /&gt;	Свидетельства в пользу предпочтения одного действия другому в высшей степени убедительны&lt;/p&gt;
						&lt;p&gt;2,4,6,8&lt;br /&gt;	Промежуточные значения между двумя соседними суждениями&lt;br /&gt;	Ситуация, когда необходимо компромиссное решение&lt;/p&gt;
						&lt;p&gt;Обратные величины приведен-ных выше ненулевых величин&lt;br /&gt;	Если действию i при сравнении с действием j приписывается одно из определенных выше ненулевых чисел, то действию j при сравнении с действием i приписывается обратное значение	Если согласованность была постулирована при получении N числовых значений для образования матрицы&lt;/p&gt;
						&lt;p&gt;Правомочность этой шкалы доказана теоретически при сравнении со многими другими шкалами [2]. При использовании указанной шкалы ЛПР, сравнивая два объекта в смысле достижения цели, расположенной на вышележащем уровне иерархии, должен поставить в соответствие этому сравнению число в интервале от 1 до 9 или обратное значение чисел. В тех случаях, когда трудно различить столько промежуточных градаций от абсолютного до слабого предпочтения или этого не требуется в конкретной задаче, может использоваться шкала с меньшим числом градаций. В пределе шкала имеет две оценки: 1 — объекты равнозначны; 2 — предпочтение одного объекта над другим.&lt;/p&gt;
						&lt;p&gt;Матрицы парных сравнений&lt;/p&gt;
						&lt;p&gt;После построения иерархии устанавливается метод сравнения ее элементов. Если принимается метод попарного сравнения, то строится множество матриц парных сравнений. Для этого в иерархии выделяют элементы двух типов: элементы-«родители» и элементы-«потомки». Элементы-«потомки» воздействуют на соответствующие элементы вышестоящего уровня иерархии, являющиеся по отношению к первым элементами-«родителями». Матрицы парных сравнений строятся для всех элементов-«потомков», относящихся к соответствующему элементу-«родителю». Элементами-«родителями» могут являться элементы, принадлежащие любому иерархическому уровню, кроме последнего, на котором расположены, как правило, альтернативы. Парные сравнения проводятся в терминах доминирования одного элемента над другим. Полученные суждения выражаются в целых числах с учетом девятибалльной шкалы (см. табл. 2.1).&lt;br /&gt;Заполнение квадратных матриц парных сравнений осуществляется по следующему правилу. Если элемент E1 доминирует над элементом Е2, то клетка матрицы, соответствующая строке Е1 и столбцу E2, заполняется целым числом, а клетка, соответствующая строке E2 и столбцу Е1, заполняется обратным к нему числом. Если элемент Е2 доминирует над Е1, то целое число ставится в клетку, соответствующую строке Е2 и столбцу Е1, а дробь проставляется в клетку, соответствующую строке Е1 и столбцу Е2. Если элементы Е1 и Е2 равнопредпочтительны, то в обе позиции матрицы ставятся единицы.&lt;br /&gt;Для получения каждой матрицы эксперт или ЛПР выносит n(n – 1)/2 суждений (здесь п — порядок матрицы парных сравнений).&lt;br /&gt;Рассмотрим в общем виде пример формирования матрицы парных сравнений.&lt;br /&gt;Пусть Е1,E2, ..., Еп — множество из п элементов (альтернатив) и v1, v2, …, vn — соответственно их веса, или интенсивности. Сравним попарно вес, или интенсивность, каждого элемента с весом, или интенсивностью, любого другого элемента множества по отношению к общему для них свойству или цели (по отношению к элементу-«родителю»). В этом случае матрица парных сравнений [Е] имеет следующий вид:&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;Матрица парных сравнений обладает свойством обратной симметрии, т. е.&lt;br /&gt;aij=1/aji,&lt;br /&gt;где aij=vi / vj&lt;br /&gt;При проведении попарных сравнений следует отвечать на следующие вопросы: какой из двух сравниваемых элементов важнее или имеет большее воздействие, какой более вероятен и какой предпочтительнее.&lt;br /&gt;При сравнении критериев обычно спрашивают, какой из критериев более важен; при сравнении альтернатив по отношению к критерию — какая из альтернатив более предпочтительна или более вероятна.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Fri, 11 Nov 2011 19:19:42 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=113#p113</guid>
		</item>
		<item>
			<title>4.	Классификация методов принятия решений.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=112#p112</link>
			<description>&lt;p&gt;1.4. Классификация методов принятия решений&lt;/p&gt;
						&lt;p&gt;Существует множество классификаций методов принятия решений, основанных на применении различных признаков [10, 19 — 23]. В табл. 1.1 приведена одна из возможных классификаций, признаками которой являются содержание и тип получаемой экспертной информации. 	&lt;/p&gt;
						&lt;p&gt;	Таблица 1.1&lt;/p&gt;
						&lt;p&gt;Классификация методов принятия решений&lt;br /&gt;№ п/п	Содержание информации	Тип информации	Метод принятия решений&lt;br /&gt;1	Экспертная информация не требуется&amp;#160; &amp;#160; Метод доминирования [24, 25]&lt;br /&gt;Метод на основе глобальных критериев [26, 27]&lt;br /&gt;2&lt;br /&gt;	Информация о предпочтениях на множестве критериев&lt;br /&gt;	Качественная информация&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Количественная оценка предпочтительности критериев&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Количественная информация о замещениях&lt;br /&gt;	Лексикографическое упорядочение [24,25] &lt;br /&gt;Сравнение разностей критериальных оценок [22,24] &lt;br /&gt;Метод припасовывания [24] &lt;br /&gt;Методы &amp;quot;эффективность-стоимость&amp;quot; [24,28] &lt;br /&gt;Методы свертки на иерархии критериев [29,30] &lt;br /&gt;Методы порогов [24, 31] &lt;br /&gt;Методы идеальной точки [24] &lt;br /&gt;Метод кривых безразличия [10,24] Методы теории ценности [10, 24]&lt;/p&gt;
						&lt;p&gt;3&lt;br /&gt;	Информация о предпочтительности альтернатив&lt;br /&gt;	Оценка предпочтительности парных сравнений&lt;br /&gt;	Методы математического программирования [32,33] &lt;br /&gt;Линейная и нелинейная свертка при интерактивном способе определения ее параметров [34]&lt;/p&gt;
						&lt;p&gt;4&lt;/p&gt;
						&lt;p&gt;	Информация о предпочтениях на множестве критериев и о последствиях альтернатив&lt;/p&gt;
						&lt;p&gt;	Отсутствие информации о предпочтениях; количественная и/или интервальная информация о последствиях. Качественная информация о предпочтениях и количественная о последствиях&lt;/p&gt;
						&lt;p&gt;Качественная (порядковая) информация о предпочтениях и последствиях&lt;br /&gt;Количественная информация о предпочтениях и последствиях&lt;br /&gt;	Методы с дискретизацией неопределенности [8,26]&lt;br /&gt;Стохастическое доминирование [8,10,22]&lt;br /&gt;Методы принятия решений в условиях риска и неопределенности на основе глобальных критериев [8, 35]&lt;br /&gt;Метод анализа иерархий [36] &lt;br /&gt;Методы теории нечетких множеств [7, 13, 14, 15, 17, 37] &lt;br /&gt;Метод практического принятия решений [8, 24]&lt;br /&gt;Методы выбора статистически ненадежных решений [8,38] &lt;br /&gt;Методы кривых безразличия для принятия решений в условиях риска и неопределенности [8] &lt;br /&gt;Методы деревьев решений [8,37] &lt;br /&gt;Декомпозиционные методы теории ожидаемой полезности [8, 10,11]&lt;/p&gt;
						&lt;p&gt;Используемый принцип классификации позволяет достаточно четко выделить четыре большие группы методов, причем три группы относятся к принятию решений в условиях определенности, а четвертая — к принятию решений в условиях неопределенности. Из множества известных методов и подходов к принятию решений наибольший интерес представляют те, которые дают возможность учитывать многокритериальность и неопределенность, а также позволяют осуществлять выбор решений из множеств альтернатив различного типа при наличии критериев, имеющих разные типы шкал измерения (эти методы относятся к четвертой группе).&lt;br /&gt;В свою очередь, среди методов, образующих четвертую группу, наиболее перспективными являются декомпозиционные методы теории ожидаемой полезности, методы анализа иерархий и теории нечетких множеств. Данный выбор определен тем, что эти методы в наибольшей степени удовлетворяют требованиям универсальности, учета многокритериальности выбора в условиях неопределенности из дискретного или непрерывного множества альтернатив, простоты подготовки и переработки экспертной информации.&lt;br /&gt;Охарактеризовать достаточно полно все методы принятия решений, относящиеся к четвертой группе, в рамках данной работы невозможно, поэтому в дальнейшем рассматриваются только три подхода к принятию решений в условиях неопределенности, которые получили наиболее широкое воплощение в системах компьютерной поддержки, а именно: подходы, основанные на методах теории полезности, анализа иерархий и теории нечетких множеств.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Fri, 11 Nov 2011 19:13:56 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=112#p112</guid>
		</item>
		<item>
			<title>3.	Типы шкал. Множество Эджворта-Паретто.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=111#p111</link>
			<description>&lt;p&gt;Множество Эджворта-Парето&lt;br /&gt;Вернемся к выбору супругами из Монтландии очередного&lt;br /&gt;туристского тура. Напомним, что при оценке альтернатив использовались&lt;br /&gt;два критерия: стоимость и привлекательность.&lt;br /&gt;Варианты, которые упоминались в диалоге супругов, можно&lt;br /&gt;представить в виде табл. 1.&lt;br /&gt;Альтернативы, представленные в табл. 1, изображены графически&lt;br /&gt;на рис. 1. Из рисунка очевидно, почему супруги предпочитают&lt;br /&gt;тур в Свапландию: он не хуже по критериальным&lt;br /&gt;оценкам каждого из двух других туров, а по одному из критериев&lt;br /&gt;- явно лучше.&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;&lt;a href=&quot;http://www.radikal.ru&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s017.radikal.ru/i414/1111/f9/f3fb4aafd66e.jpg&quot; alt=&quot;http://s017.radikal.ru/i414/1111/f9/f3fb4aafd66e.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;нападений на туристов). В соответствии с рис.1 туры в Скай-&lt;br /&gt;ландию и на Океанские острова не находятся в отношении доминирования.&lt;br /&gt;По одному из критериев лучше альтернатива 2,&lt;br /&gt;по другому — альтернатива 1.&lt;br /&gt;Введем следующее определение: альтернативы относятся к&lt;br /&gt;множеству Эджворта-Парето (Э—П), если каждая из них превосходит&lt;br /&gt;любую другую по какому-то из критериев.&lt;br /&gt;Множество Эджворта-Парето названо так по именам ученых,&lt;br /&gt;впервые обративших внимание на альтернативы, не уступающие&lt;br /&gt;друг другу по критериальным оценкам, т. е. на альтер-&#039;&lt;br /&gt;нативы, не находящиеся в отношении доминирования. Альтернативы,&lt;br /&gt;принадлежащие множеству Э—П, принято называть несравнимыми.&lt;br /&gt;Их действительно невозможно сравнить непосредственно&lt;br /&gt;на основе критериальных оценок. Но если решение&lt;br /&gt;должно быть принято (например, супруги должны из многих туров&lt;br /&gt;выбрать один), то сравнение альтернатив, принадлежащих&lt;br /&gt;множеству Э—П, возможно на основе дополнительной информации.&lt;br /&gt;Так, в нашем примере супруги должны решить, что для них&lt;br /&gt;более привлекательно: экономия денег или обилие новых впечатлений.&lt;br /&gt;Такое сравнение является основным для упомянутого&lt;br /&gt;выше третьего этапа процесса принятия решений.&lt;br /&gt;Нетрудно убедиться, что множество Э—П включает в себя&lt;br /&gt;наиболее «контрастные» альтернативы, сложные для сравнения.&lt;br /&gt;Если стоит задача выбора одной лучшей альтернативы, то&lt;br /&gt;она обязательно принадлежит множеству Э-П. Поэтому во мно-&lt;br /&gt;23&lt;br /&gt;гих методах принятия решений очень важен этап выделения&lt;br /&gt;множества Э-П из всего множества заданных альтернатив.&lt;br /&gt;Один из возможных способов решения этой задачи состоит&lt;br /&gt;в попарном сравнении альтернатив и исключении доминируемых.&lt;br /&gt;Задача выделения множества Э—П обычно рассматривается&lt;br /&gt;как предварительная. За ней следует наиболее существенный&lt;br /&gt;этап принятия решений&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Fri, 11 Nov 2011 19:12:19 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=111#p111</guid>
		</item>
		<item>
			<title>2.	Общая схема процесса принятия решений .Альтернативы. Критерии. Трив</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=110#p110</link>
			<description>&lt;p&gt;1.2. Схема процесса принятия решений&lt;/p&gt;
						&lt;p&gt;Общая схема процесса принятия решений включает следующие основные этапы:&lt;br /&gt;Этап 1. Предварительный анализ проблемы. На этом этапе определяются:&lt;br /&gt;• главные цели;&lt;br /&gt;• уровни рассмотрения, элементы и структура системы (процесса), типы связей;&lt;br /&gt;• подсистемы, используемые ими основные ресурсы и критерии качества функционирования подсистем;&lt;br /&gt;• основные противоречия, узкие места и ограничения. &lt;br /&gt;Этап 2. Постановка задачи. Постановка конкретной ЗПР включает:&lt;br /&gt;• формулирование задачи;&lt;br /&gt;• определение типа задачи;&lt;br /&gt;• определение множества альтернативных вариантов и основных критериев для выбора из них наилучших;&lt;br /&gt;• выбор метода решения ЗПР.&lt;br /&gt;Этап 3. Получение исходных данных. На данном этапе устанавливаются способы измерения альтернатив. Это либо сбор количественных (статистических) данных [9], либо методы математического или имитационного моделирования, либо методы экспертной оценки [10, 11]. В последнем случае необходимо решить задачи формирования группы экспертов, проведения экспертных опросов, предварительного анализа экспертных оценок.&lt;br /&gt;Этап 4. Решение ЗПР с привлечением математических методов и вычислительной техники, экспертов и лица, принимающего решение. На этом этапе производятся математическая обработка исходной информации, ее уточнение и модификация в случае необходимости. Обработка информации может оказаться достаточно трудоемкой, при этом может возникнуть необходимость совершения нескольких итераций [12] и желание применить различные методы [13 — 16] для решения задачи. Поэтому именно на этом этапе возникает потребность в компьютерной поддержке процесса принятия решений, которая выполняется с помощью автоматизированных систем принятия решений.&lt;br /&gt;Этап 5. Анализ и интерпретация полученных результатов. Полученные результаты могут оказаться неудовлетворительными и потребовать изменений в постановке ЗПР. В этом случае необходимо будет возвратиться на этап 2 или этап 1 и пройти заново весь путь. Решение ЗПР может занимать достаточно длительный промежуток времени, в течение которого окружение задачи может измениться и потребовать корректировок в постановке задачи, а также в исходных данных (например, могут появиться новые альтернативы, требующие введения новых критериев). Задачи принятия решений можно разделить на статические и динамические. К первым относятся задачи, которые не требуют многократного решения через короткие интервалы времени. К динамическим относятся ЗПР, которые возникают достаточно часто. Следовательно, итерационный характер процесса принятия решений можно считать закономерным, что подтверждает необходимость создания и использования эффективных систем компьютерной поддержки. ЗПР, требующие одного цикла, можно скорее считать исключением, чем правилом.&lt;/p&gt;
						&lt;p&gt;1.3. Классификация задач принятия решений&lt;/p&gt;
						&lt;p&gt;Задачи принятия решений отличаются большим многообразием, классифицировать их можно по различным признакам, характеризующим количество и качество доступной информации. В общем случае задачи принятия решений можно представить следующим набором информации [8, 17, 18]:&lt;br /&gt;&amp;lt;Т, A, К, X, F, G, D&amp;gt;,&lt;br /&gt;где Т— постановка задачи (например, выбрать лучшую альтернативу или упорядочить весь набор);&lt;br /&gt;А — множество допустимых альтернативных вариантов;&lt;br /&gt;К— множество критериев выбора;&lt;br /&gt;Х— множество методов измерения предпочтений (например, использование различных шкал);&lt;br /&gt;F— отображение множества допустимых альтернатив в множество критериальных оценок (исходы);&lt;br /&gt;G — система предпочтений эксперта;&lt;br /&gt;D — решающее правило, отражающее систему предпочтений.&lt;br /&gt;Любой из элементов этого набора может служить классификационным признаком принятия решений.&lt;br /&gt;Рассмотрим традиционные классификации:&lt;br /&gt;1. По виду отображения F. Отображение множества А и К может иметь детерминированный характер, вероятностный или неопределенный вид, в соответствии с которым задачи принятия решений можно разделить на задачи в условиях риска и задачи в условиях неопределенности.&lt;br /&gt;2. Мощность множества К. Множество критериев выбора может содержать один элемент или несколько. В соответствии с этим задачи принятия решений можно разделить на задачи со скалярным критерием и задачи с векторным критерием (многокритериальное принятие решений).&lt;br /&gt;3. Тип системы G. Предпочтения могут формироваться одним лицом или коллективом, в зависимости от этого задачи принятия решений можно классифицировать на задачи индивидуального принятия решений и задачи коллективного принятия решений.&lt;br /&gt;Задачи принятия решений в условиях определенности. К этому классу относятся задачи, для решения которых имеется достаточная и достоверная количественная информация. В этом случае с успехом применяются методы математического программирования, суть которых состоит в нахождении оптимальных решений на базе математической модели реального объекта. Основные условия применимости методов математического программирования следующие:&lt;br /&gt;1. Задача должна быть хорошо формализована, т. е. имеется адекватная математическая модель реального объекта.&lt;br /&gt;2. Существует некоторая единственная целевая функция (критерий оптимизации), позволяющая судить о качестве рассматриваемых альтернативных вариантов.&lt;br /&gt;3. Имеется возможность количественной оценки значений целевой функции.&lt;br /&gt;4. Задача имеет определенные степени свободы (ресурсы оптимизации), т. е. некоторые параметры функционирования системы, которые можно произвольно изменять в некоторых пределах в целях улучшения значений целевой функции.&lt;br /&gt;Задачи в условиях риска. В тех случаях, когда возможные исходы можно описать с помощью некоторого вероятностного распределения, получаем задачи принятия решений в условиях риска. Для построения распределения вероятностей необходимо либо иметь в распоряжении статистические данные, либо привлекать знания экспертов. Обычно для решения задач этого типа применяются методы теории одномерной или многомерной полезности. Эти задачи занимают место на границе между задачами принятия решений в условиях определенности и неопределенности. Для решения этих задач привлекается вся доступная информация (количественная и качественная).&lt;br /&gt;Задачи в условиях неопределенности. Эти задачи имеют место тогда, когда информация, необходимая для принятия решений, является неточной, неполной, неколичественной, а формальные модели исследуемой системы либо слишком сложны, либо отсутствуют. В таких случаях для решения задачи обычно привлекаются знания экспертов. В отличие от подхода, принятого в экспертных системах, для решения ЗПР знания экспертов обычно выражены в виде некоторых количественных данных, называемых предпочтениями.&lt;br /&gt;Выбор и нетривиальность задач принятия решений. Следует отметить, что одним из условий существования задачи принятия решений является наличие нескольких допустимых альтернатив, из которых следует выбрать в некотором смысле лучшую. При наличии одной альтернативы, удовлетворяющей фиксированным условиям или ограничениям, задача принятия решений не имеет места.&lt;br /&gt;Задача принятия решений называется тривиальной, если она характеризуется исключительно одним критерием К и всем альтернативам Аi приписаны конкретные числовые оценки в соответствии со значениями указанного критерия (рис. 1.1 а).&lt;/p&gt;
						&lt;p&gt;Классификация методов принятия решений&lt;/p&gt;
						&lt;p&gt;Существует множество классификаций методов принятия решений, основанных на применении различных признаков [10, 19 — 23]. В табл. 1.1 приведена одна из возможных классификаций, признаками которой являются содержание и тип получаемой экспертной информации. &lt;/p&gt;
						&lt;p&gt; Таблица 1.1&lt;/p&gt;
						&lt;p&gt;Классификация методов принятия решений&lt;br /&gt;№ п/п Содержание информации Тип информации Метод принятия решений&lt;br /&gt;1 Экспертная информация не требуется&amp;#160; &amp;#160; Метод доминирования [24, 25]&lt;br /&gt;Метод на основе глобальных критериев [26, 27]&lt;br /&gt;2&lt;br /&gt; Информация о предпочтениях на множестве критериев&lt;br /&gt; Качественная информация&lt;/p&gt;
						&lt;p&gt;Количественная оценка предпочтительности критериев&lt;/p&gt;
						&lt;p&gt;Количественная информация о замещениях&lt;br /&gt; Лексикографическое упорядочение [24,25] &lt;br /&gt;Сравнение разностей критериальных оценок [22,24] &lt;br /&gt;Метод припасовывания [24] &lt;br /&gt;Методы &amp;quot;эффективность-стоимость&amp;quot; [24,28] &lt;br /&gt;Методы свертки на иерархии критериев [29,30] &lt;br /&gt;Методы порогов [24, 31] &lt;br /&gt;Методы идеальной точки [24] &lt;br /&gt;Метод кривых безразличия [10,24] Методы теории ценности [10, 24]&lt;/p&gt;
						&lt;p&gt;3&lt;br /&gt; Информация о предпочтительности альтернатив&lt;br /&gt; Оценка предпочтительности парных сравнений&lt;br /&gt; Методы математического программирования [32,33] &lt;br /&gt;Линейная и нелинейная свертка при интерактивном способе определения ее параметров [34]&lt;/p&gt;
						&lt;p&gt;4&lt;/p&gt;
						&lt;p&gt; Информация о предпочтениях на множестве критериев и о последствиях альтернатив&lt;/p&gt;
						&lt;p&gt; Отсутствие информации о предпочтениях; количественная и/или интервальная информация о последствиях. Качественная информация о предпочтениях и количественная о последствиях&lt;/p&gt;
						&lt;p&gt;Качественная (порядковая) информация о предпочтениях и последствиях&lt;br /&gt;Количественная информация о предпочтениях и последствиях&lt;br /&gt; Методы с дискретизацией неопределенности [8,26]&lt;br /&gt;Стохастическое доминирование [8,10,22]&lt;br /&gt;Методы принятия решений в условиях риска и неопределенности на основе глобальных критериев [8, 35]&lt;br /&gt;Метод анализа иерархий [36] &lt;br /&gt;Методы теории нечетких множеств [7, 13, 14, 15, 17, 37] &lt;br /&gt;Метод практического принятия решений [8, 24]&lt;br /&gt;Методы выбора статистически ненадежных решений [8,38] &lt;br /&gt;Методы кривых безразличия для принятия решений в условиях риска и неопределенности [8] &lt;br /&gt;Методы деревьев решений [8,37] &lt;br /&gt;Декомпозиционные методы теории ожидаемой полезности [8, 10,11]&lt;/p&gt;
						&lt;p&gt;Используемый принцип классификации позволяет достаточно четко выделить четыре большие группы методов, причем три группы относятся к принятию решений в условиях определенности, а четвертая — к принятию решений в условиях неопределенности. Из множества известных методов и подходов к принятию решений наибольший интерес представляют те, которые дают возможность учитывать многокритериальность и неопределенность, а также позволяют осуществлять выбор решений из множеств альтернатив различного типа при наличии критериев, имеющих разные типы шкал измерения (эти методы относятся к четвертой группе).&lt;br /&gt;В свою очередь, среди методов, образующих четвертую группу, наиболее перспективными являются декомпозиционные методы теории ожидаемой полезности, методы анализа иерархий и теории нечетких множеств. Данный выбор определен тем, что эти методы в наибольшей степени удовлетворяют требованиям универсальности, учета многокритериальности выбора в условиях неопределенности из дискретного или непрерывного множества альтернатив, простоты подготовки и переработки экспертной информации.&lt;br /&gt;Охарактеризовать достаточно полно все методы принятия решений, относящиеся к четвертой группе, в рамках данной работы невозможно, поэтому в дальнейшем рассматриваются только три подхода к принятию решений в условиях неопределенности, которые получили наиболее широкое воплощение в системах компьютерной поддержки, а именно: подходы, основанные на методах теории полезности, анализа иерархий и теории нечетких множеств.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Fri, 11 Nov 2011 19:03:43 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=110#p110</guid>
		</item>
		<item>
			<title>1.	Основы теории принятия решений. Методы системного анализа</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=109#p109</link>
			<description>&lt;p&gt;АНАЛИЗ ЗАДАЧ И МЕТОДОВ ТЕОРИИ ПРИНЯТИЯ РЕШЕНИЙ&lt;/p&gt;
						&lt;p&gt;Задача принятия решений (ЗПР) — одна из самых распространенных в любой предметной области [1 — 7]. Ее решение сводится к выбору одной или нескольких лучших альтернатив из некоторого набора. Для того чтобы сделать такой выбор, необходимо четко определить цель и критерии (показатели качества), по которым будет проводиться оценка некоторого набора альтернативных вариантов. Выбор метода решения такой задачи зависит от количества и качества доступной информации. Данные, необходимые для осуществления обоснованного выбора, можно разделить на четыре категории: информация об альтернативных вариантах, информация о критериях выбора, информация о предпочтениях, информация об окружении задач.&lt;/p&gt;
						&lt;p&gt;1.1. Эволюция теории принятия решений. ЭВМ в принятии решений&lt;/p&gt;
						&lt;p&gt;В своем развитии теория принятия решений прошла через три стадии.&lt;br /&gt;На первой стадии развивался дескриптивный подход к принятию решений. Здесь усилия ученых были направлены на описание процесса выбора решений человеком в целях определения рационального зерна, характерного для всякого разумного выбора. В результате проведенных исследований оказалось, что большинство людей действуют интуитивно, проявляя при этом непоследовательность и противоречивость в своих суждениях. Положительным аспектом исследований в области дескриптивного подхода явилось то, что удалось дать достаточно четкий ответ на вопрос, что может и чего не может человек, решая задачу выбора [8].&lt;br /&gt;На второй стадии исследователи разрабатывали нормативный подход к принятию решений. Однако и здесь их постигла неудача, поскольку идеализированные теории, рассчитанные на сверхрационального человека с мощным интеллектом, не нашли практического применения.&lt;br /&gt;На третьей стадии был развит прескриптивный подход к принятию решений. Он оказался наиболее плодотворным, поскольку предписывал, как должен поступать человек с нормальным интеллектом, желающий напряженно и систематизированно обдумывать все аспекты своей задачи. Прескриптивный подход не гарантирует нахождения оптимального решения в любой ситуации, но обеспечивает выбор такого решения, которое не обременено противоречиями и непоследовательностями. Данный подход предъявляет к человеку серьезные требования по освоению методов и приемов теории принятия решений, а также предписывает проведение многочисленных вычислений, связанных с реализацией этих методов.&lt;br /&gt;Первоначальным импульсом для применения ЭВМ в процессе принятия решений явилась необходимость проведения большого объема вычислений для получения обобщенной оценки путем синтеза всех плюсов и минусов по каждой альтернативе. На этом шаге решением ЗПР занимались специалисты, имеющие широкие знания как в области методов принятия решений, так и в программировании на ЭВМ.&lt;br /&gt;Поскольку на практике указанное сочетание знаний является редким, возникла новая категория специалистов — аналитиков в области принятия решений. Аналитики владели методами принятия решений и навыками программирования и выступали в роли посредников между лицом, принимающим решение (ЛПР), и ЭВМ. Аналитик выполнял следующие функции: уточнял совместно с ЛПР постановку задачи, выбирал метод принятия решений, адекватный задаче, собирал необходимую статистическую и экспертную информацию, строил модель задачи, организовывал обработку накопленной информации на ЭВМ, представлял полученные результаты ЛПР и их интерпретировал.&lt;br /&gt;Следующий шаг в применении ЭВМ для принятия решений был связан с созданием диалоговых систем, позволявших менять интересующие исследователя параметры заложенной в память ЭВМ модели задачи принятия решений, выбирать алгоритм поиска решения или его параметров, исследовать чувствительность полученного решения. Такие системы позволяли получать исчерпывающую информацию для всестороннего обоснования выбираемых решений.&lt;br /&gt;В настоящее время в связи с возросшими возможностями современных ЭВМ разработаны программные информационные системы, обеспечивающие поддержку процесса принятия решений на всех его фазах. Большинство систем принятия решений реализовано на персональных ЭВМ.&lt;/p&gt;
						&lt;p&gt;1.2. Схема процесса принятия решений&lt;/p&gt;
						&lt;p&gt;Общая схема процесса принятия решений включает следующие основные этапы:&lt;br /&gt;Этап 1. Предварительный анализ проблемы. На этом этапе определяются:&lt;br /&gt;• главные цели;&lt;br /&gt;• уровни рассмотрения, элементы и структура системы (процесса), типы связей;&lt;br /&gt;• подсистемы, используемые ими основные ресурсы и критерии качества функционирования подсистем;&lt;br /&gt;• основные противоречия, узкие места и ограничения. &lt;br /&gt;Этап 2. Постановка задачи. Постановка конкретной ЗПР включает:&lt;br /&gt;• формулирование задачи;&lt;br /&gt;• определение типа задачи;&lt;br /&gt;• определение множества альтернативных вариантов и основных критериев для выбора из них наилучших;&lt;br /&gt;• выбор метода решения ЗПР.&lt;br /&gt;Этап 3. Получение исходных данных. На данном этапе устанавливаются способы измерения альтернатив. Это либо сбор количественных (статистических) данных [9], либо методы математического или имитационного моделирования, либо методы экспертной оценки [10, 11]. В последнем случае необходимо решить задачи формирования группы экспертов, проведения экспертных опросов, предварительного анализа экспертных оценок.&lt;br /&gt;Этап 4. Решение ЗПР с привлечением математических методов и вычислительной техники, экспертов и лица, принимающего решение. На этом этапе производятся математическая обработка исходной информации, ее уточнение и модификация в случае необходимости. Обработка информации может оказаться достаточно трудоемкой, при этом может возникнуть необходимость совершения нескольких итераций [12] и желание применить различные методы [13 — 16] для решения задачи. Поэтому именно на этом этапе возникает потребность в компьютерной поддержке процесса принятия решений, которая выполняется с помощью автоматизированных систем принятия решений.&lt;br /&gt;Этап 5. Анализ и интерпретация полученных результатов. Полученные результаты могут оказаться неудовлетворительными и потребовать изменений в постановке ЗПР. В этом случае необходимо будет возвратиться на этап 2 или этап 1 и пройти заново весь путь. Решение ЗПР может занимать достаточно длительный промежуток времени, в течение которого окружение задачи может измениться и потребовать корректировок в постановке задачи, а также в исходных данных (например, могут появиться новые альтернативы, требующие введения новых критериев). Задачи принятия решений можно разделить на статические и динамические. К первым относятся задачи, которые не требуют многократного решения через короткие интервалы времени. К динамическим относятся ЗПР, которые возникают достаточно часто. Следовательно, итерационный характер процесса принятия решений можно считать закономерным, что подтверждает необходимость создания и использования эффективных систем компьютерной поддержки. ЗПР, требующие одного цикла, можно скорее считать исключением, чем правилом.&lt;/p&gt;
						&lt;p&gt;1.3. Классификация задач принятия решений&lt;/p&gt;
						&lt;p&gt;Задачи принятия решений отличаются большим многообразием, классифицировать их можно по различным признакам, характеризующим количество и качество доступной информации. В общем случае задачи принятия решений можно представить следующим набором информации [8, 17, 18]:&lt;br /&gt;&amp;lt;Т, A, К, X, F, G, D&amp;gt;,&lt;br /&gt;где Т— постановка задачи (например, выбрать лучшую альтернативу или упорядочить весь набор);&lt;br /&gt;А — множество допустимых альтернативных вариантов;&lt;br /&gt;К— множество критериев выбора;&lt;br /&gt;Х— множество методов измерения предпочтений (например, использование различных шкал);&lt;br /&gt;F— отображение множества допустимых альтернатив в множество критериальных оценок (исходы);&lt;br /&gt;G — система предпочтений эксперта;&lt;br /&gt;D — решающее правило, отражающее систему предпочтений.&lt;br /&gt;Любой из элементов этого набора может служить классификационным признаком принятия решений.&lt;br /&gt;Рассмотрим традиционные классификации:&lt;br /&gt;1. По виду отображения F. Отображение множества А и К может иметь детерминированный характер, вероятностный или неопределенный вид, в соответствии с которым задачи принятия решений можно разделить на задачи в условиях риска и задачи в условиях неопределенности.&lt;br /&gt;2. Мощность множества К. Множество критериев выбора может содержать один элемент или несколько. В соответствии с этим задачи принятия решений можно разделить на задачи со скалярным критерием и задачи с векторным критерием (многокритериальное принятие решений).&lt;br /&gt;3. Тип системы G. Предпочтения могут формироваться одним лицом или коллективом, в зависимости от этого задачи принятия решений можно классифицировать на задачи индивидуального принятия решений и задачи коллективного принятия решений.&lt;br /&gt;Задачи принятия решений в условиях определенности. К этому классу относятся задачи, для решения которых имеется достаточная и достоверная количественная информация. В этом случае с успехом применяются методы математического программирования, суть которых состоит в нахождении оптимальных решений на базе математической модели реального объекта. Основные условия применимости методов математического программирования следующие:&lt;br /&gt;1. Задача должна быть хорошо формализована, т. е. имеется адекватная математическая модель реального объекта.&lt;br /&gt;2. Существует некоторая единственная целевая функция (критерий оптимизации), позволяющая судить о качестве рассматриваемых альтернативных вариантов.&lt;br /&gt;3. Имеется возможность количественной оценки значений целевой функции.&lt;br /&gt;4. Задача имеет определенные степени свободы (ресурсы оптимизации), т. е. некоторые параметры функционирования системы, которые можно произвольно изменять в некоторых пределах в целях улучшения значений целевой функции.&lt;br /&gt;Задачи в условиях риска. В тех случаях, когда возможные исходы можно описать с помощью некоторого вероятностного распределения, получаем задачи принятия решений в условиях риска. Для построения распределения вероятностей необходимо либо иметь в распоряжении статистические данные, либо привлекать знания экспертов. Обычно для решения задач этого типа применяются методы теории одномерной или многомерной полезности. Эти задачи занимают место на границе между задачами принятия решений в условиях определенности и неопределенности. Для решения этих задач привлекается вся доступная информация (количественная и качественная).&lt;br /&gt;Задачи в условиях неопределенности. Эти задачи имеют место тогда, когда информация, необходимая для принятия решений, является неточной, неполной, неколичественной, а формальные модели исследуемой системы либо слишком сложны, либо отсутствуют. В таких случаях для решения задачи обычно привлекаются знания экспертов. В отличие от подхода, принятого в экспертных системах, для решения ЗПР знания экспертов обычно выражены в виде некоторых количественных данных, называемых предпочтениями.&lt;br /&gt;Выбор и нетривиальность задач принятия решений. Следует отметить, что одним из условий существования задачи принятия решений является наличие нескольких допустимых альтернатив, из которых следует выбрать в некотором смысле лучшую. При наличии одной альтернативы, удовлетворяющей фиксированным условиям или ограничениям, задача принятия решений не имеет места.&lt;br /&gt;Задача принятия решений называется тривиальной, если она характеризуется исключительно одним критерием К и всем альтернативам Аi приписаны конкретные числовые оценки в соответствии со значениями указанного критерия (рис. 1.1 а).&lt;/p&gt;
						&lt;p&gt;Классификация методов принятия решений&lt;/p&gt;
						&lt;p&gt;Существует множество классификаций методов принятия решений, основанных на применении различных признаков [10, 19 — 23]. В табл. 1.1 приведена одна из возможных классификаций, признаками которой являются содержание и тип получаемой экспертной информации. 	&lt;/p&gt;
						&lt;p&gt;	Таблица 1.1&lt;/p&gt;
						&lt;p&gt;Классификация методов принятия решений&lt;br /&gt;№ п/п	Содержание информации	Тип информации	Метод принятия решений&lt;br /&gt;1	Экспертная информация не требуется&amp;#160; &amp;#160; Метод доминирования [24, 25]&lt;br /&gt;Метод на основе глобальных критериев [26, 27]&lt;br /&gt;2&lt;br /&gt;	Информация о предпочтениях на множестве критериев&lt;br /&gt;	Качественная информация&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Количественная оценка предпочтительности критериев&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Количественная информация о замещениях&lt;br /&gt;	Лексикографическое упорядочение [24,25] &lt;br /&gt;Сравнение разностей критериальных оценок [22,24] &lt;br /&gt;Метод припасовывания [24] &lt;br /&gt;Методы &amp;quot;эффективность-стоимость&amp;quot; [24,28] &lt;br /&gt;Методы свертки на иерархии критериев [29,30] &lt;br /&gt;Методы порогов [24, 31] &lt;br /&gt;Методы идеальной точки [24] &lt;br /&gt;Метод кривых безразличия [10,24] Методы теории ценности [10, 24]&lt;/p&gt;
						&lt;p&gt;3&lt;br /&gt;	Информация о предпочтительности альтернатив&lt;br /&gt;	Оценка предпочтительности парных сравнений&lt;br /&gt;	Методы математического программирования [32,33] &lt;br /&gt;Линейная и нелинейная свертка при интерактивном способе определения ее параметров [34]&lt;/p&gt;
						&lt;p&gt;4&lt;/p&gt;
						&lt;p&gt;	Информация о предпочтениях на множестве критериев и о последствиях альтернатив&lt;/p&gt;
						&lt;p&gt;	Отсутствие информации о предпочтениях; количественная и/или интервальная информация о последствиях. Качественная информация о предпочтениях и количественная о последствиях&lt;/p&gt;
						&lt;p&gt;Качественная (порядковая) информация о предпочтениях и последствиях&lt;br /&gt;Количественная информация о предпочтениях и последствиях&lt;br /&gt;	Методы с дискретизацией неопределенности [8,26]&lt;br /&gt;Стохастическое доминирование [8,10,22]&lt;br /&gt;Методы принятия решений в условиях риска и неопределенности на основе глобальных критериев [8, 35]&lt;br /&gt;Метод анализа иерархий [36] &lt;br /&gt;Методы теории нечетких множеств [7, 13, 14, 15, 17, 37] &lt;br /&gt;Метод практического принятия решений [8, 24]&lt;br /&gt;Методы выбора статистически ненадежных решений [8,38] &lt;br /&gt;Методы кривых безразличия для принятия решений в условиях риска и неопределенности [8] &lt;br /&gt;Методы деревьев решений [8,37] &lt;br /&gt;Декомпозиционные методы теории ожидаемой полезности [8, 10,11]&lt;/p&gt;
						&lt;p&gt;Используемый принцип классификации позволяет достаточно четко выделить четыре большие группы методов, причем три группы относятся к принятию решений в условиях определенности, а четвертая — к принятию решений в условиях неопределенности. Из множества известных методов и подходов к принятию решений наибольший интерес представляют те, которые дают возможность учитывать многокритериальность и неопределенность, а также позволяют осуществлять выбор решений из множеств альтернатив различного типа при наличии критериев, имеющих разные типы шкал измерения (эти методы относятся к четвертой группе).&lt;br /&gt;В свою очередь, среди методов, образующих четвертую группу, наиболее перспективными являются декомпозиционные методы теории ожидаемой полезности, методы анализа иерархий и теории нечетких множеств. Данный выбор определен тем, что эти методы в наибольшей степени удовлетворяют требованиям универсальности, учета многокритериальности выбора в условиях неопределенности из дискретного или непрерывного множества альтернатив, простоты подготовки и переработки экспертной информации.&lt;br /&gt;Охарактеризовать достаточно полно все методы принятия решений, относящиеся к четвертой группе, в рамках данной работы невозможно, поэтому в дальнейшем рассматриваются только три подхода к принятию решений в условиях неопределенности, которые получили наиболее широкое воплощение в системах компьютерной поддержки, а именно: подходы, основанные на методах теории полезности, анализа иерархий и теории нечетких множеств.&lt;/p&gt;
						&lt;p&gt;&lt;em class=&quot;bbuline&quot;&gt;&lt;strong&gt;Классификация методов системного анализа&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;Метод системного анализа - это путь, способ решения проблемы. Другими словами, это некоторая формализация, позволяющая получить такое решение. &lt;br /&gt; Классификация методов системного анализа тесно связана с понятием уровней научного познания. Различают два таких уровня: эмпирический (дословно – воспринимаемый посредством органов чувств) и теоретический.&lt;br /&gt; Эмпирический уровень научного познания характеризуется непосредственным исследованием научного реально существующих, чувственно воспринимаемых объектов. Соответствующие методы можно разделить на две погруппы: &lt;br /&gt;&amp;#160; &amp;#160;– методы вычленения и исследования эмпирического объекта;&lt;br /&gt;&amp;#160; &amp;#160;– методы обработки и систематизации полученного эмпирического знания;&lt;br /&gt; Теоретический уровень научного познания характеризуется опосредствованным исследованием действительности с помощью систем абстракций «высшего порядка» - таких как понятия, умозаключения, законы, категории, принципы и другие формы «мыслительных операций». Системный анализ как прикладная дисциплина, имеет отношение лишь к подгруппе теоретических методов нижнего уровня – методов построения и исследования идеализированного объекта.&lt;br /&gt;&amp;#160; &amp;#160;Выделяя в научном исследовании указанные два различных уровня не следует, однако, их отрывать друг от друга и противопоставлять. Ведь эмпирический и теоретический уровни познания взаимосвязаны между собой. Эмпирический уровень выступает в качестве основы, фундамента теоретического. Гипотезы и теории формируются в процессе теоретического осмысления научных фактов, статических данных, получаемых на эмпирическом уровне. Эмпирическое исследование, выявляя с помощью наблюдений и экспериментов новые данные, стимулирует теоретическое познание (которое их обобщает и объясняет), ставит перед ним новые более сложные задачи. С другой стороны, теоретическое познание, развивая и конкретизируя на базе эмпирии новое собственное содержание, открывает новые, более широкие горизонты для эмпирического познания, ориентирует и направляет его в поисках новых фактов, способствует совершенствованию его методов и средств и т.д. Эмпирический уровень научного познания не может существовать без достижений теоретического уровня. Эмпирическое исследование обычно опирается на определенную теоретическую конструкцию, которая определяет направление этого исследования, обуславливает и обосновывает применяемые при этом методы.&lt;br /&gt; Методы системного анализа имеют свои преимущества и недостатки, определяющие их область применения как по отношению к типу проблемы, так и к этапу ее решения. Для принятия решений в условиях большей определенности, что обычно имеет место на нижнем уровне иерархии экономических систем, успешно применяются формальные математические методы (разновидность языкового моделирования). По мере перехода на более высокие уровни иерархии количественная определенность в постановке и решении проблем уменьшается, цели, и другие элементы системного анализа приобретают все более качественный характер. Соответственно, все большее число задач решается в условиях повышенного риска и неопределенности. Как следствие, возрастающее значение приобретают субъективные методы анализа, оперирующие с мысленными моделями, тогда как чисто математические методы начинают играть вспомогательную роль.&lt;br /&gt;&amp;#160; &amp;#160;Преимуществом методов системного анализа уровня модельного эксперимента выше является возможность проводить исследования какого-либо объекта без непосредственного обращения к нему.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Fri, 11 Nov 2011 18:57:55 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=109#p109</guid>
		</item>
		<item>
			<title>36.	Компоненты для отображения табличной информации. Свойства, события</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=108#p108</link>
			<description>&lt;p&gt;Табличное представление данных &lt;br /&gt;Втр, 06/29/2010 - 09:42 — Кузьма&lt;br /&gt;Делфи для професионалов&lt;br /&gt;&lt;a href=&quot;http://delphi.uz/delfi-dlya-profesionalov/tablichnoe-predstavlenie-dannykh.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://delphi.uz/delfi-dlya-profesional &amp;#8230; nnykh.html&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Компонент TDBGrid &lt;/p&gt;
						&lt;p&gt;Этот компонент инкапсулирует двумерную таблицу, в которой строки представляют собой записи, а столбцы — поля набора данных.&lt;/p&gt;
						&lt;p&gt;Компонент TDBGrid является потомком классов TDBCustomGrid И TCustomGrid. &lt;/p&gt;
						&lt;p&gt;От класса TCustomGrid наследуются все функции отображения и управления работой двумерной структуры данных. Класс TDBCustomGrid обеспечивает визуализацию и редактирование полей из набора данных, причем TDBGrid только публикует свойства и методы класса TDBCustomGrid, не добавляя собственных. &lt;/p&gt;
						&lt;p&gt;В компоненте TDBGrid можно отображать произвольное подмножество полей используемого набора данных, но число записей ограничить нельзя — в компоненте всегда присутствуют все записи связанного набора данных. Требуемый набор полей можно составить при помощи специального Редактора столбцов, который открывается при двойном щелчке на компоненте, перенесенном на форму, или кнопкой свойства columns в Инспекторе объектов. &lt;/p&gt;
						&lt;p&gt;Новая колонка добавляется при помощи кнопки Add New, после этого ее название появляется в списке колонок (рис. 15.2). Для выбранной в списке колонки доступные для редактирования свойства появляются в Инспекторе объектов. Колонки в списке можно редактировать, удалять, менять местами. &lt;/p&gt;
						&lt;p&gt;При помощи кнопки Add All Fields в сетку можно добавить все поля набора данных. &lt;/p&gt;
						&lt;p&gt;Каждая колонка компонента TDBGrid описывается специальным классом TColumn, а совокупность колонок доступна через свойство columns компонента, оно имеет тип TDBGridColumns и представляет собой индексированный список объектов колонок. Поле набора данных связывается с конкретной колонкой при помощи свойства FieldName класса TColumn. При этом в колонку автоматически переносятся все необходимые параметры поля, в частности заголовок поля, настройки шрифтов, ширина поля. После ручного изменения параметров первоначальные значения восстанавливаются методами соответствующих объектов Icolumn. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Рис. 15.2. Редактор колонок компонента TDBGrid &lt;/p&gt;
						&lt;p&gt; При метода метода DefaultDrawColumnCell и метода- обработчика OnDraw-CoiumnCell можно управлять процессом отображения данных в ячейках. &lt;/p&gt;
						&lt;p&gt;Метод DefauitorawDataCelll предназначен только для обеспечения обратной совместимости по коду с более ранними версиями. &lt;/p&gt;
						&lt;p&gt;Настройка параметров компонента TDBGrid, от которых зависит его внешний вид и некоторые функции, осуществляется при помощи свойства options (табл. 15.2). Текущая позиция в двумерной структуре данных может быть определена свойствами SelectedField, SelectedRows, Selectedlndex. &lt;/p&gt;
						&lt;p&gt;При необходимости разработчик может использовать разнообразные методы-обработчики событий. Среди них есть как стандартные методы, присущие всем элементам управления, так и специфические. &lt;/p&gt;
						&lt;p&gt;Например, при помощи метода-обработчика OnEditButtonClick можно предусмотреть вызов специализированной формы при щелчке на кнопке в ячейке: &lt;/p&gt;
						&lt;p&gt;procedure TForml.DBGridlEditButtonClick(Sender: TObject);&amp;#160; &lt;/p&gt;
						&lt;p&gt;begin &lt;/p&gt;
						&lt;p&gt;if DBGridl.Selectedlndex = 2 then SomeForm.ShowModal;&amp;#160; &lt;/p&gt;
						&lt;p&gt;end; &lt;/p&gt;
						&lt;p&gt;Примечание &lt;/p&gt;
						&lt;p&gt;Объект колонки TColumn имеет свойство ButtonStyle. Если ему присвоить значение cbsEllipsis, то при активизации ячейки этой колонки в правой части ячейки появляется кнопка. &lt;/p&gt;
						&lt;p&gt;Таблица 15.2. Свойства и методы компонента WBGrid &lt;/p&gt;
						&lt;p&gt;Объявление - Тип - Описание&lt;br /&gt;Свойства &lt;/p&gt;
						&lt;p&gt;property Columns: TDBGridColumns; - Pb - Содержит коллекцию объектов TColumn, описывающих колонки компонента &lt;/p&gt;
						&lt;p&gt;property DefaultDrawing: Boolean; - Pb - Определяет способ визуализации данных в сетке. При значении True данные отображаются автоматически. При значении False используется метод-обработчик OnDrawColumnCell &lt;/p&gt;
						&lt;p&gt;property FieldCount: Integer; - Ro - Возвращает число видимых колонок сетки &lt;/p&gt;
						&lt;p&gt;property Fields [Index: Integer] : TField; - Ro - Массив объектов полей набора данных, отображаемых в компоненте &lt;/p&gt;
						&lt;p&gt;TDBGridOption = (dgEditing, dgAlwaysShowEditor, dgTitles, dglndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit, dgMultiSelect) ;&lt;br /&gt; TDBGridOptions = set of TDBGridOption; - Pb - Определяет особенности визуализации и поведения компонента: &lt;br /&gt; dgEditing — данные можно редактировать; &lt;br /&gt; dgAlwaysShowEditor — данные в сетке всегда в режиме редактирования; &lt;br /&gt; dgTitles — видны заголовки колонок; &lt;br /&gt; dglndicator — в начале строки виден номер текущей колонки; &lt;br /&gt; dgColumnResize — колонки можно перемещать и менять их ширину; &lt;br /&gt; dgColLines — видны линии между колонками; &lt;br /&gt; dgRowLines — видны линии между строками; &lt;br /&gt; dgTabs — для перемещения по строкам можно использовать клавиши &amp;lt;Таb&amp;gt; и + &lt;br /&gt; dgRowSelect — можно выделять целые строки, при этом игнорируются установки dgEditing И dgAlwaysShowEditor; &lt;br /&gt; dgAlwaysShowSelection — выделение текущей ячейки сохраняется, даже если сетка не активна; &lt;br /&gt; dgConfirmDelete — при удалении строк появляется запрос о подтверждении операции; &lt;br /&gt; dgCancelOnExit — созданные пустые строки при уходе из сетки не сохраняются;&lt;br /&gt; dgMultiSelect — можно выделять несколько строк одновременно &lt;/p&gt;
						&lt;p&gt;property SelectedField: TField; - Pu - Содержит объект текущего поля &lt;/p&gt;
						&lt;p&gt;property Selectedlndex: Integer; - Pu - Содержит номер текущей колонки в массиве свойства Columns &lt;/p&gt;
						&lt;p&gt;property SelectedRows: TBookmarkList; - Ro - Набор закладок на записи набора данных, соответствующих выделенным строкам сетки &lt;/p&gt;
						&lt;p&gt;property TitleFont: TFont; - Pb - Шрифт заголовков колонок &lt;/p&gt;
						&lt;p&gt;property EditorMode: Boolean; - Pu - Показывает, можно ли редактировать текущую ячейку &lt;/p&gt;
						&lt;p&gt;property FixedColor: TColor; - Pb - Цвет фона неподвижных ячеек сетки &lt;/p&gt;
						&lt;p&gt;Методы &lt;/p&gt;
						&lt;p&gt;procedure DefaultDrawColumnCell (const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) ; - Pu - Перерисовывает текст в ячейке колонки с номером DataCol. Ячейка задается прямоугольником Rect на канве сетки. Параметр state определяет состояние ячейки после перерисовки. Параметр Column содержит экземпляр класса колонки, которой принадлежит ячейка &lt;/p&gt;
						&lt;p&gt;procedure DefaultDrawDataCell (const Rect: TRect; Field: TField; State: TGridDrawState); - Pu - Перерисовывает текст в ячейке колонки, определяемой параметром Field, содержащим связанный с колонкой объект поля. Ячейка задается прямоугольником Rect на канве сетки. Параметр State определяет состояние ячейки после перерисовки &lt;/p&gt;
						&lt;p&gt;procedure Def aultHandler (var Msg); override; - Pu - Вызывает всплывающее меню для колонки, которой соответствуют текущие координаты мыши. Компонент должен обрабатывать сообщение WM RBUTTONUP &lt;/p&gt;
						&lt;p&gt;function ExecuteAction (Action: TBasicAction): Boolean; override; - Pu - Выполняет действие, заданное параметром Action, по отношению к данному компоненту &lt;/p&gt;
						&lt;p&gt;procedure ShowPopupEditor (Column: I TColumn; X: Integer = Low (Integer); Y: Integer = Low (Integer) ); dynamic; - Pu - Открывает набор данных, связанный с передаваемой параметром Column колонкой в новом окне. Работает только для типов данных абстрактный и набор данных. Параметры X и Y определяют положение нового окна &lt;/p&gt;
						&lt;p&gt;function | ValidFieldlndex (Fieldlndex: Integer) : Boolean; - Pu - Возвращает значение True, если колонка с номером Fieldlndex связана с полем набора данных &lt;/p&gt;
						&lt;p&gt;type TGridCoord = record X: Longint;Y: Longint; end;&lt;br /&gt; function MouseCoord(X, Y: Integer): TGridCoord; ; - Pu - Возвращает номера строки и столбца, соответствующие ячейке, которой принадлежат экранные координаты X и Y &lt;/p&gt;
						&lt;p&gt;Методы-обработчики событий &lt;/p&gt;
						&lt;p&gt;type TDBGridClickEvent = procedure (Column: TColumn) 1 of object;&lt;br /&gt; property OnCellClick: TDBGridClickEvent; - Pb - Вызывается при щелчке мышью на ячейке. Параметр Column содержит колонку, которой принадлежит ячейка &lt;/p&gt;
						&lt;p&gt;property OnColEnter: TNotifyEvent; - Pb - Вызывается при переносе фокуса на новую колонку сетки &lt;/p&gt;
						&lt;p&gt;property OnColExit: TNotifyEvent; - Pb - Вызывается перед переносом фокуса из текущей колонки &lt;/p&gt;
						&lt;p&gt;type TMovedEvent = procedure (Sender: TObject; Froinlndex, Tolndex: Longint) of object;&lt;br /&gt; property OnColumnMoved:&lt;br /&gt; TMovedEvent ; - Pb - Вызывается при переносе колонки в сетке на новое место при помощи мыши. Параметр Fromindex возвращает номер старого положения колонки. Параметр Tolndex возвращает номер нового положения колонки &lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt; TDrawColumnCellEvent = procedure (Sender: TObject; const Rect : TRect; DataCol : State: TGridDrawState) of object;&lt;br /&gt; property OnDrawColurnnCell : TDrawColumnCellEvent; - Pb - Вызывается при перерисовке ячейки. &lt;/p&gt;
						&lt;p&gt;Параметр Rect определяет ячейку по координатам прямоугольника на канве.&lt;br /&gt; Параметр DataCol возвращает номер колонки в сетке.&lt;br /&gt; Параметр Column содержит объект колонки.&lt;br /&gt; Параметр State возвращает состояние колонки &lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt; TDrawDataCellEvent = procedure (Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState) of object;&lt;br /&gt; property OnDrawDataCell: TDrawDataCellEvent; - Pb - I Вызывается при перерисовке ячейки | перед обработчиком OnDrawCoiumnCell, если свойство Columns. State =csDefault. &lt;/p&gt;
						&lt;p&gt;Этот метод лучше не применять, т. к. он используется только для обеспечения обратной совместимости с ранними версиями &lt;/p&gt;
						&lt;p&gt;property OnEditButtonClick: TNotifyEvent; - Pb - 1 Вызывается при щелчке мышью на кнопке в ячейке &lt;/p&gt;
						&lt;p&gt;type TDBGridClickEvent = procedure (Column: TColumn) of object;&lt;br /&gt; property OnTitleClick: TDBGridClickEvent; - Pb - | Вызывается при щелчке мышью на заголовке колонки. Колонка определяется параметром Column &lt;/p&gt;
						&lt;p&gt;В работе компонента TDBGrid важную роль играет класс TColumn, который инкапсулирует свойства колонки или столбца сетки (табл. 15.3). Его основным назначением является правильное отображение данных из поля набора данных, связанного с этой колонкой. Поэтому объект колонки обладает свойствами и методами, которые позволяют произвольным образом задавать параметры отображения данных (цвет, шрифт, ширину и т. д.). Первоначальные значения берутся из связанных с колонками полей. Измененные свойства можно восстановить при помощи группы специальных методов (DefauitColor, DefaultFont И др.). &lt;/p&gt;
						&lt;p&gt;Свойство Assignedvalues позволяет в любой момент определить, какие первоначальные настройки были изменены. &lt;/p&gt;
						&lt;p&gt;За отображение заголовка колонки отвечает свойство Title, представляющее собой ссылку на экземпляр объекта TColumnTitie. Здесь можно задать текст заголовка, параметры шрифта текста заголовка и цвет фона заголовка. По умолчанию текст заголовка берется из свойства DispiayLabel объекта TField (CM. гл. 13). &lt;/p&gt;
						&lt;p&gt;Каждой колонке можно придать список, который разворачивается при щелчке на кнопке в активной ячейке колонки. Выбранное в списке значение автоматически заносится в ячейку. Для реализации этой возможности применяется свойство pickList типа TStrings. Достаточно лишь заполнить список значениями во время разработки или выполнения (рис. 15.3). &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Рис. 15.3. Список колонки в компоненте TDBGrid &lt;/p&gt;
						&lt;p&gt;Таблица 15.3. Свойства и методы класса TColumn &lt;/p&gt;
						&lt;p&gt;Объявление - Тип - Описание&lt;br /&gt;Свойства &lt;/p&gt;
						&lt;p&gt;property Alignment: TAlignment; - Pb - Определяет выравнивание данных в колонке &lt;/p&gt;
						&lt;p&gt;type&lt;br /&gt; TColumnValue = (cvColor, cvWidth, cvFont, cvAlignment, cvReadOnly, cvTitleColor, cvTitleCaption, cv&#039;i&#039;itleAlignment, cvTitleFont, cvImeMode, cvImeName) ; TColuinnValues = set of TColumnValue;&lt;br /&gt; property AssignedValues: TColuranValues ; - Ro - Возвращает набор атрибутов колонки, которые были изменены по сравнению с первоначальными &lt;/p&gt;
						&lt;p&gt;type TColumnButtonStyle = (cbsAuto, cbsEllipsis, cbsNone) ;&lt;br /&gt; property ButtonStyle: TColumnButtonStyle; - Pb - Задает способ редактирования данных в колонке: &lt;br /&gt; cbsAuto — кнопка в редактируемой ячейке появляется, если связанное поле является полем синхронного просмотра; &lt;br /&gt; cbsEllipsis — кнопка в редактируемой ячейке появляется всегда, щелчок на кнопке вызывает обработчик OnEditButtonClick; &lt;br /&gt; cbsNone — при редактировании ячейки кнопка не появляется &lt;/p&gt;
						&lt;p&gt;property Color: TColor; - Pb - Цвет фона колонки &lt;/p&gt;
						&lt;p&gt;property DisplayName: string; - Pu - Название колонки в списке Редактора столбцов &lt;/p&gt;
						&lt;p&gt;property DropDownRows: Cardinal; - Pb - Определяет число строк разворачивающегося списка ячейки &lt;/p&gt;
						&lt;p&gt;property Expandable: Boolean; - Pu - В значении True разрешает показ связанных с полем колонки дочерних полей абстрактного, ссылочного типов и массивов &lt;/p&gt;
						&lt;p&gt;property Expanded: Boolean; - Pb - При значении True каждое дочернее поле отображается в новой колонке. При значении False дочерние поля отображаются через точку с запятой и не доступны для редактирования &lt;/p&gt;
						&lt;p&gt;property FieldName: string; - Pb - Название поля, связанного с колонкой &lt;/p&gt;
						&lt;p&gt;property Font: TFont; - Pb - Шрифт данных в колонке &lt;/p&gt;
						&lt;p&gt;property Grid: TCustomDBGrid; - Ro - Определяет сетку, содержащую эту колонку &lt;/p&gt;
						&lt;p&gt;property ParentColumn: TColumn; - Ro - Определяет колонку-владельца текущей колонки. Используется для дочерних полей &lt;/p&gt;
						&lt;p&gt;property PickList: TStrings; - Pb - Содержит разворачивающийся список, используемый при редактировании данных &lt;/p&gt;
						&lt;p&gt;property PopupMenu: TPopupMenu; - Pb - Связывает с колонкой всплывающее меню &lt;/p&gt;
						&lt;p&gt;property Showing: Boolean; - Ro - Возвращает значение True, если колонка видима &lt;/p&gt;
						&lt;p&gt;property Title: TColumnTitle; - Pb - Задает текст заголовка и его параметры &lt;/p&gt;
						&lt;p&gt;property Visible: Boolean; - Pb - Задает видимость колонки &lt;/p&gt;
						&lt;p&gt;property Width: Integer; - pb - Задает ширину колонки в пикселах &lt;/p&gt;
						&lt;p&gt;Методы &lt;/p&gt;
						&lt;p&gt;procedure Assign (Source: TPersistent); override; - Pu - Копирует колонку Source в текущую колонку &lt;/p&gt;
						&lt;p&gt;function Def aultAlignment: TAlignment; - Pu - Возвращает первоначальное значение выравнивания колонки &lt;/p&gt;
						&lt;p&gt;function DefaultColor: TColor; - Pu - Возвращает первоначальный фоновый цвет колонки &lt;/p&gt;
						&lt;p&gt;function DefaultFont: TFont; - Pu - Возвращает первоначальный шрифт данных в колонке &lt;/p&gt;
						&lt;p&gt;type TIraeMode = (imDisable, iraClose, imOpen, imDontCare, imSAlpha, imAlpha, imHira, imSKata, irnKata, imChinese, imSHanguel, imHanguel); function DefaultlmeMode: TImeMode; - Pu - Возвращает первоначальный способ ввода символов &lt;/p&gt;
						&lt;p&gt;type TImeName = type string;&lt;br /&gt; function DefaultlmeName: TImeName; - Pu - Возвращает первоначальное имя редактора способа ввода символов &lt;/p&gt;
						&lt;p&gt;function DefaultReadOnly: Boolean; - Pa - : Возвращает первоначальный режим редактирования данных &lt;/p&gt;
						&lt;p&gt;function DefaultWidth: Integer; - Pu - Возвращает первоначальную ширину колонки в пикселах &lt;/p&gt;
						&lt;p&gt;function Depth: Integer; - Pu - ; Возвращает число непосредственных предков колонки &lt;/p&gt;
						&lt;p&gt;procedure RestoreDefaults; virtual; - Pu - i Восстанавливает первоначальные настройки колонки &lt;/p&gt;
						&lt;p&gt;При работе с компонентом TDBGrid все операции с отдельными колонками осуществляются при помощи экземпляра класса TDBGridColumns, который инкапсулирует список объектов колонок (свойство Columns компонента TDBGrid). Доступ к колонкам осуществляется при помощи свойства items. Нумерация колонок начинается с нуля. &lt;/p&gt;
						&lt;p&gt;При помощи свойств и методов класса TDBGridColumns можно изменять настройки полей компонента TDBGrid во время выполнения (табл. 15.4). &lt;/p&gt;
						&lt;p&gt;Свойство state определяет способ создания колонок. Его значение устанавливается автоматически. При создании колонок для всех полей сразу (кнопка Add All Fields Редактора столбцов) устанавливается значение csDefault. &lt;/p&gt;
						&lt;p&gt;При любом ручном изменении свойств устанавливается значение csCustomized. При программном изменении значения свойства во время выполнения все существующие колонки удаляются. &lt;/p&gt;
						&lt;p&gt;Все данные из существующих колонок можно сохранить в файле или потоке при помощи методов SaveToFile и saveToStream, а затем загрузить их обратно методами LoadFromFile И LoadFromStream. &lt;/p&gt;
						&lt;p&gt;Таблица 15.4. Свойства и методы класса TDBGridColumns &lt;/p&gt;
						&lt;p&gt;Объявление - Тип - Описание&lt;br /&gt;Свойства &lt;/p&gt;
						&lt;p&gt;property Grid: TCustomDBGrid; - Ro - Возвращает ссылку на сетку, владеющую данным объектом &lt;/p&gt;
						&lt;p&gt;property Items [Index: Integer] : TColumn default; - Pu - Индексный список объектов колонок сетки: &lt;/p&gt;
						&lt;p&gt;type TDBGridColumnsState = (csDefault, csCustomized) ;&lt;br /&gt; property State: TDBGridColumnsState; - Pu - Определяет способ создания колонок сетки: &lt;br /&gt;csDefault — колонки создаются динамически с параметрами, соответствующими связанным полям; &lt;br /&gt; csCustomized — параметры колонок определены разработчиком и могут отличаться от параметров полей &lt;/p&gt;
						&lt;p&gt;property Count: Integer; - Pu - Возвращает общее число колонок &lt;/p&gt;
						&lt;p&gt;Методы &lt;/p&gt;
						&lt;p&gt;function Add: TColumn; - Pu - Добавляет новый объект TColumn &lt;/p&gt;
						&lt;p&gt;procedure LoadFromFile (const Filename: string); - Pu - Загружает данные в объект из файла FileName &lt;/p&gt;
						&lt;p&gt;procedure LoadFromStream(S: TStream) ; - Pu - Загружает данные в объект из потока s &lt;/p&gt;
						&lt;p&gt;procedure RebuildColumns; - Pu - Удаляет существующие колонки и создает новые, основываясь на параметрах полей набора данных &lt;/p&gt;
						&lt;p&gt;procedure RestoreDefaults; - Pu - Восстанавливает первоначальные настройки колонок &lt;/p&gt;
						&lt;p&gt;procedure SaveToFiie (const Filename: string); - Pu - Сохраняет данные из колонок в файле FileName &lt;/p&gt;
						&lt;p&gt;procedure SaveToStream(S: TStream) ; - Pu - Сохраняет данные из колонок в потоке s&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 23:22:27 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=108#p108</guid>
		</item>
		<item>
			<title>35.	Рисование в Delphi (Canvas, Font, Pen, Brush). Свойства, события и</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=107#p107</link>
			<description>&lt;p&gt;Графические возможности Delphi. Canvas.&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;http://www.beluch.ru/progr/100comp/4_2.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.beluch.ru/progr/100comp/4_2.htm&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.beluch.ru/progr/100comp/3_1.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.beluch.ru/progr/100comp/3_1.htm&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.delphisources.ru/pages/faq/base/gdi_delphi_graphic.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.delphisources.ru/pages/faq/b &amp;#8230; aphic.html&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Property Brush: TBrush&lt;/p&gt;
						&lt;p&gt; Применимо к&lt;br /&gt;TQRShape&lt;br /&gt;Использование&lt;br /&gt;Используется для установки кисти для компоненты TQRShape при печати квадратов и кругов. Более подробная информация имеется в справочной системе Delphi.&lt;br /&gt;Задачи&lt;br /&gt;• Для стирания фона установите свойство Brush.Style в bsClear&lt;br /&gt;• Для заполнения цветом установите свойство Brush.Color в нужный цвет&lt;/p&gt;
						&lt;p&gt;ИМЯ	ОПИСАНИЕ&lt;br /&gt;Pen	Используется для рисования простых линий. Обычно применяется для функции LineTo или при рисовании рамки для определённой фигуры (например для функции Rectangle).&lt;/p&gt;
						&lt;p&gt;Canvas обеспечивает пространство (холст, канву) для создания, хранения и модификации графических объектов. Canvas является основой графической подсистемы Delphi. Канва обеспечивает:&lt;/p&gt;
						&lt;p&gt;&amp;#216;&amp;#160; Загрузку и хранение графических изображений&lt;/p&gt;
						&lt;p&gt;&amp;#216;&amp;#160; Создание новых и изменение хранимых изображений с помощью пера, кисти, шрифта&lt;/p&gt;
						&lt;p&gt;&amp;#216;&amp;#160; Рисование и закраску различных фигур, линий, текстов&lt;/p&gt;
						&lt;p&gt;&amp;#216;&amp;#160; Комбинирование различных изображений&lt;/p&gt;
						&lt;p&gt;Система координат&lt;/p&gt;
						&lt;p&gt;Для того, чтобы мы могли что-либо нарисовать на форме или компоненте (Canvas поддерживают многие компоненты), нам нужно уметь задавать положение на экране того, что мы рисуем. Для этого с канвой связывается система координат следующего вида:&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Обратите внимание. Точка (0,0) находится в левом верхнем углу. Привычная для нас система координат “перевернута”&lt;/p&gt;
						&lt;p&gt;Каждая точка на самом деле представляет собой очень маленький прямоугольник (И поскольку это не совсем точка, то используются термин — “пиксел”).&lt;/p&gt;
						&lt;p&gt;Основные методы Canvas&lt;/p&gt;
						&lt;p&gt;Рассмотрим часть методов, при помощи которых можно создавать простые рисунки.&lt;/p&gt;
						&lt;p&gt;Arc&lt;/p&gt;
						&lt;p&gt;Рисует дугу окружности или эллипса&lt;/p&gt;
						&lt;p&gt;Arc(x1,y1,x2,y2,x3,y3,x4,y4: Integer)&lt;/p&gt;
						&lt;p&gt;Метод Arc рисует дугу окружности или эллипса с помощью текущих параметров пера Pen (эти параметры мы рассмотрим чуть ниже). Точки (x1,y1) и (x2,y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x3,y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x4,y4). Дуга рисуется против часовой стрелки от начальной до конечной точки.&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;Image1.Canvas.Arc(0,0, 200,200, 200,0, 0,0);&lt;/p&gt;
						&lt;p&gt;Image2.Canvas.Arc(0,0, 200,200, 0,0, 200,0);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;Chord&lt;/p&gt;
						&lt;p&gt;Рисует заполненную замкнутую фигуру, ограниченную дугой окружности или эллипса и хордой&lt;/p&gt;
						&lt;p&gt;Chord (x1,y1,x2,y2,x3,y3,x4,y4:Integer);&lt;/p&gt;
						&lt;p&gt;Метод Chord рисует замкнутую фигуру: дугу окружности или эллипса, замкнутую хордой, с помощью текущих параметров пера Pen. Фигура заполняется текущим значением Brush (рассмотрим чуть ниже). Точки (x1,y1) и (x2,y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x3,y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x4,y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Хорда соединяет точки(x3,y3) и (x4,y4).&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;Image1.Canvas.Chord(0,0, 200,200, 200,0, 0,0);&lt;/p&gt;
						&lt;p&gt;Image2.Canvas.Chord(0,0, 200,200, 0,0, 200,0);&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Draw&lt;/p&gt;
						&lt;p&gt;Рисует графическое изображение в указанную позицию канвы&lt;/p&gt;
						&lt;p&gt;Draw (x,y:Integer;Graphic:TGraphic);&lt;/p&gt;
						&lt;p&gt; Метод Draw рисует изображение, содержащееся в объекте, указанном параметром Graphic, сохраняя исходный размер изображеня в его источнике и перенося изображение в область канвы объекта TCanvas, верхний левый угол которой определяется параметрами x и y. Источник изображения может быть битовой матрицей, пиктограммой или метафайлом.&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;Form1.Canvas.Draw(10,10,Bitmap1);&lt;/p&gt;
						&lt;p&gt;Рисует на канве формы Form1 изображение из компонента Bitmap1 в область с координатами левого верхнего угла (10,10).&lt;/p&gt;
						&lt;p&gt;DrawFocusRect&lt;/p&gt;
						&lt;p&gt;Рисует изображение прямоугольника в виде, используемом для отображения рамки фокуса, операцией XOR&lt;/p&gt;
						&lt;p&gt;DrawFocusRect (const Rect:TRect);&lt;/p&gt;
						&lt;p&gt;Метод DrawFocusRect рисует на канве в области Rect изображение прямоугольника в виде, используемом обычно для отображения рамки фокуса, т.е. точками. При рисовании используется операция XOR, что позволяет удалить изображение прямоугольника его повторной прорисовкой.&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;Следующая совокупность обработчиков событий, связанных с мышью, рисует на канве компонента Image1 прямоугольную рамку размером 10 на 10 вокруг курсора и перетаскивает еепри перемещении мыши с нажатой кнопкой:&lt;/p&gt;
						&lt;p&gt;Var x0,y0:Integer;&lt;/p&gt;
						&lt;p&gt;Const drag:Boolean=False;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;Procedure TForm1.Image1MouseDown(Sender: TObject;Button: TMouseButton;Shift: TShiftState;X, Y: Integer);&lt;/p&gt;
						&lt;p&gt;Begin&lt;/p&gt;
						&lt;p&gt;{рисование рамки}&lt;/p&gt;
						&lt;p&gt;Image1.Canvas.DrawFocusRect(Rect(x-5,y-5,x+5,y+5));&lt;/p&gt;
						&lt;p&gt;{запоминание координат курсора}&lt;/p&gt;
						&lt;p&gt;X0:=x;&lt;/p&gt;
						&lt;p&gt;Y0:=y;&lt;/p&gt;
						&lt;p&gt;{включение флажка режима перемещения рамки}&lt;/p&gt;
						&lt;p&gt;Drag:=True;&lt;/p&gt;
						&lt;p&gt;End;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;Procedure TForm1.Image1MouseMove(Sender: TObject;Shift: TShiftState;X,Y: Integer);&lt;/p&gt;
						&lt;p&gt;Begin&lt;/p&gt;
						&lt;p&gt;If not drag then exit;&lt;/p&gt;
						&lt;p&gt;{стирание рамки}&lt;/p&gt;
						&lt;p&gt;Image1.Canvas.DrawFocusRect(Rect(X0-5,Y0-5,X0+5,Y0+5));&lt;/p&gt;
						&lt;p&gt;{рисование рамки}&lt;/p&gt;
						&lt;p&gt;Image1.Canvas.DrawFocusRect(Rect(X-5,Y-5,X+5,Y+5));&lt;/p&gt;
						&lt;p&gt;{запоминание координат курсора}&lt;/p&gt;
						&lt;p&gt;X0:=X;&lt;/p&gt;
						&lt;p&gt;Y0:=Y;&lt;/p&gt;
						&lt;p&gt;End;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;Procedure TForm1.Image1MouseUp(Sender: TObject;Button: TMouseButton;Shift: TShiftState;X,Y: Integer);&lt;/p&gt;
						&lt;p&gt;Begin&lt;/p&gt;
						&lt;p&gt;If not drag then exit;&lt;/p&gt;
						&lt;p&gt;{стирание рамки}&lt;/p&gt;
						&lt;p&gt;Image1.Canvas.DrawFocusRect(Rect(X0-5,Y0-5,X0+5,Y0+5));&lt;/p&gt;
						&lt;p&gt;{выключение флажка режима перемещения рамки}&lt;/p&gt;
						&lt;p&gt;drag:=false;&lt;/p&gt;
						&lt;p&gt;End;&lt;/p&gt;
						&lt;p&gt;При нажатии кнопки мыши рисуется первая рамка, запоминаются координаты курсора и включается режим перемещения рамки (переменная drag = True). При перемещении мыши в режиме перемещения рамки стирается прежняя рамка, рисуется рамка в новой позиции и запоминаются новые координаты курсора. При отпускании кнопки мыши стирается рамка и выключается режим перемещения рамки.&lt;/p&gt;
						&lt;p&gt;Ellipse&lt;/p&gt;
						&lt;p&gt;Рисует заполненную окружность или эллипс&lt;/p&gt;
						&lt;p&gt;Ellipse (x1,y1,x2,y2:Integer);&lt;/p&gt;
						&lt;p&gt;Метод Ellipse рисует окружность или эллипс с помощью текущих параметров пера Pen. Фигура заполняется текущим значением Brush. Точки (x1,y1) и (x2,y2) определяют прямоугольник, описывающий эллипс.&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;With Image1.Canvas do //в операторных скобках перед каждой строкой добавляет Image1.Canvas.&lt;/p&gt;
						&lt;p&gt; Begin&lt;/p&gt;
						&lt;p&gt;&amp;#160; Brush.Color := clRed;&lt;/p&gt;
						&lt;p&gt;&amp;#160; Brush.Style := bsDiagCross;&lt;/p&gt;
						&lt;p&gt;&amp;#160; Ellipse(0, 0, Image1.Width, Image1.Height);&lt;/p&gt;
						&lt;p&gt; End;&lt;/p&gt;
						&lt;p&gt;FillRect&lt;/p&gt;
						&lt;p&gt;Заполняет указанный прямоугольник канвы, используя текущее значение Brush.&lt;/p&gt;
						&lt;p&gt;FillRect(const: TRect);&lt;/p&gt;
						&lt;p&gt;Метод FillRect заполняет прямоугольник канвы, указанный параметром Rect, используя текущее значение Brush. Заполняемая область включает верхнюю и левую стороны прямоугольника, но не включает правую и нижнюю стороны.&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;Image1.Canvas.FillRect(Rect(0,0,Width,Height));&lt;/p&gt;
						&lt;p&gt;Очищает всю канву компонента Image1, заполняя ее фоном, если он установлен в свойстве Brush.&lt;/p&gt;
						&lt;p&gt;FloodFill&lt;/p&gt;
						&lt;p&gt;Закрашивает текущей кистью замкнутую область канвы, определенным цветом.&lt;/p&gt;
						&lt;p&gt;Type TFillStyle = (fsSurfase, fsBorder);&lt;/p&gt;
						&lt;p&gt;Procedure FloodFill (x,y:Integer;Color:TColor;FillStyle:TFillStyle);&lt;/p&gt;
						&lt;p&gt;Метод FloodFill закрашивает текущей кистью Brush замкнутую область канвы, определенным цветом и начальной точкой закрашивания (x,y). Точка с координатами x и y является произвольной внутренней точкой заполняемой области, которая может иметь произвольную форму. Граница этой области определяется сочетанием параметров Color и FillStyle. Параметр Color указывает цвет, который используется при определении границы закрашиваемой области, а параметр FillStyle определяет, как именно по этому цвету определяется граница. Если FillStyle = fsSurface, то заполняется область, закрашенная цветом Color, а на других цветах метод останавливается. Если FillStyle = fsBorder, то наоборот, заполняется область окрашенная любыми цветами, не равными Color, а на цвете Color метод останавливается.&lt;/p&gt;
						&lt;p&gt;Примеры.&lt;/p&gt;
						&lt;p&gt;1.&lt;/p&gt;
						&lt;p&gt;With Image1.Canvas do begin&lt;/p&gt;
						&lt;p&gt; Brush.Color:=clWhite;&lt;/p&gt;
						&lt;p&gt; FloodFill(X,Y,Pixels[X,Y],fsSurface);&lt;/p&gt;
						&lt;p&gt;End;&lt;/p&gt;
						&lt;p&gt;Приведенные операторы закрашивают белым цветом на канве компонента Image1 все пиксели, прилегающие к пикселю с координатами (x,y) и имеющие тот же цвет, что и этот пиксель.&lt;/p&gt;
						&lt;p&gt;2.&lt;/p&gt;
						&lt;p&gt;With Image1.Canvas do begin&lt;/p&gt;
						&lt;p&gt; Brush.Color:=clWhite;&lt;/p&gt;
						&lt;p&gt; FloodFill(X,Y,clBlack, fsBorder);&lt;/p&gt;
						&lt;p&gt;End;&lt;/p&gt;
						&lt;p&gt;Приведенные операторы закрашивают белым цветом на канве компонента Image1 все пиксели, прилегающие к пикселю с координатами (x,y) и имеющие цвет, отличный от черного. При достижении черной границы области закраска останавливается.&lt;/p&gt;
						&lt;p&gt;FrameRect&lt;/p&gt;
						&lt;p&gt;Рисует на канве текущей кистью прямоугольную рамку.&lt;/p&gt;
						&lt;p&gt;FrameRect(const Rect:TRect);&lt;/p&gt;
						&lt;p&gt;Метод FrameRect рисует на канве прямоугольную рамку вокруг области Rect, используя установку текущей кисти Brush. Толщина рамки — 1 пиксель. Область внутри рамки кистью не закрашивается. Отличается от метода Rectangle тем, что рамка рисуется цветом кисти (в методе Rectangle — цветом пера Pen) и область не закрашивается (в методе Rectangle закрашивается).&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;With Form1.Canvas do &lt;/p&gt;
						&lt;p&gt; Begin&lt;/p&gt;
						&lt;p&gt; Brush.Color:=clBlack;&lt;/p&gt;
						&lt;p&gt;FrameRect(Rect(10,10,100,100));&lt;/p&gt;
						&lt;p&gt;End;&lt;/p&gt;
						&lt;p&gt;Рисует на канве формы Form1 черную рамку.&lt;/p&gt;
						&lt;p&gt;LineTo&lt;/p&gt;
						&lt;p&gt;Рисует на канве прямую линию, начинающуюся с текущей позиции пера и кончающуюся указанной точкой.&lt;/p&gt;
						&lt;p&gt;LineTo (x,y:Integer);&lt;/p&gt;
						&lt;p&gt;Метод LineTo рисует на канве прямую линию, начинающуюся с текущей позиции пера PenPos и кончающуюся точкой (x,y). Текущая позиция пера PenPos перемещается и кончающуюся точкой (x,y), исключая саму точку (x,y). Текущая позиция пера PenPos перемещается в точку (x,y). При рисовании используются текущие установки пера Pen.&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;Form1.Canvas.MoveTo(x1,y1);&lt;/p&gt;
						&lt;p&gt;Form1.Canvas.LineTo(x2,y2);&lt;/p&gt;
						&lt;p&gt;Form1.Canvas.LineTo(x3,y3);&lt;/p&gt;
						&lt;p&gt;Рисует кусочно-ломаную прямую, соединяющую точки (x1,y1), (x2,y2) и (x3,y3).&lt;/p&gt;
						&lt;p&gt;MoveTo&lt;/p&gt;
						&lt;p&gt;Изменяет текущую позицию пера на заданную, ничего не рисуя при этом.&lt;/p&gt;
						&lt;p&gt;MoveTo(x,y:Integer);&lt;/p&gt;
						&lt;p&gt;Метод MoveTo изменяет текущую позицию пера на заданную точкой (x,y). Это эквивалентно непосредственной установке свойства PenPos. При перемещении пера методом MoveTo ничего не рисуется.&lt;/p&gt;
						&lt;p&gt;Pie&lt;/p&gt;
						&lt;p&gt;Рисует заполненную замкнутую фигуру — сегмент окружности или эллипса.&lt;/p&gt;
						&lt;p&gt;Pie (x1,y1,x2,y2,x3,y3,x4,y4:Longint);&lt;/p&gt;
						&lt;p&gt;Метод Pie рисует замкнутую фигуру — сектор окружности или эллипса, с помощью текущих параметров пера Pen. Фигура заполняется текущим значением Brush. Точки (x1,y1) и (x2,y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящейчерез его центр и точку (x3,y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (x4,y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Рисуются прямые, ограничивающие сегмент и проходящие через центр эллипса и точки (x3,y3) и (x4,y4).&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;Image1.Canvas.Pie(0,0, 200,200, 200,0, 0,0);&lt;/p&gt;
						&lt;p&gt;Image2.Canvas.Pie(0,0, 200,200, 0,0, 200,0);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;Polygon&lt;/p&gt;
						&lt;p&gt;Рисует на канве текущим пером замкнутую фигуру (многоугольник) по заданному множеству угловых точек, замыкая первую и последнюю точки и закрашивая внутреннюю область фигуру текущей кистью.&lt;/p&gt;
						&lt;p&gt;Polygon (Points: array of TPoint);&lt;/p&gt;
						&lt;p&gt;Метод Polygon рисует на канве замкнутую фигуру (полигон, многоугольник) по множеству угловых точек, заданному массивом Points. Первая из указанных точек соединяется прямой с последней. Этим метод Polygon отличается от метода Polyline, который не замыкает конечные точки. Рисование проводится текущим пером Pen. Внутренняя область фигуры закрашивается текущей кистью Brush.&lt;/p&gt;
						&lt;p&gt;Примеры.&lt;/p&gt;
						&lt;p&gt;1&lt;/p&gt;
						&lt;p&gt;Form1.Canvas.Polygon([Point(10,10),Point(30,10),Point(130,30),Point(240, 120)]);&lt;/p&gt;
						&lt;p&gt;Рисует на канве формы четырехугольник по точкам, заданным функциями Point.&lt;/p&gt;
						&lt;p&gt;2&lt;/p&gt;
						&lt;p&gt;Form1.Canvas.Polygon(PointArray);&lt;/p&gt;
						&lt;p&gt;Рисует на канве формы многоугольник по точкам, хранящимся в массиве PointArray, который может быть объявлен, например, следующим образом:&lt;/p&gt;
						&lt;p&gt;Var PointArray:array[1..100] of TPoint;&lt;/p&gt;
						&lt;p&gt;3&lt;/p&gt;
						&lt;p&gt;Form1.Canvas.Polygon(Slice(PointArray, 10));&lt;/p&gt;
						&lt;p&gt;Рисует на канве формы многоугольник по первым 10 точкам, хранящимся в массиве PointArray из предыдущего примера.&lt;/p&gt;
						&lt;p&gt;Polyline&lt;/p&gt;
						&lt;p&gt;Рисует на канве текущим пером кусочно-линейную кривую по заданному множеству точек.&lt;/p&gt;
						&lt;p&gt;Polyline(Points: array of TPoint);&lt;/p&gt;
						&lt;p&gt;Метод Polyline рисует на канве кусочно-линейную кривую по множеству точек, заданному массивом Points. Отличие метода Polyline от метода Polygon заключается в том, что метод Polygon замыкает конечные точки, а метод Polyline — нет. Рисование проводится текущим пером Pen. Метод не изменяет текущей позиции PenPos пера Pen.&lt;/p&gt;
						&lt;p&gt;Метод позволяет рисовать кусочно-линейный график функции, хранящийся в массиве типа TPoint. Если желательно использовать для рисования только часть точек массива, это можно сделать с помощью функции Slice. Если надо нарисовать кривую всего по нескольким точкам, то передавать их в метод Polyline удобно с помощью функции Point.&lt;/p&gt;
						&lt;p&gt;То что делает метод Polyline, можно сделать и с помощью методов MoveTo и LineTo, подведя сначало перо к первой точке, а затем последовательно выполняя LineTo. Различие будет заключаться в том, что метод Polyline не изменит текущую пера, а методы MoveTo и LineTo изменят.&lt;/p&gt;
						&lt;p&gt;Примеры.&lt;/p&gt;
						&lt;p&gt;1&lt;/p&gt;
						&lt;p&gt;Form1.Canvas. Polyline([Point(10,10),Point(30,10),Point(130,30),Point(240, 120)]);&lt;/p&gt;
						&lt;p&gt;Рисует кусочно-линейную кривую по четырем точкам, заданным функциями Point.&lt;/p&gt;
						&lt;p&gt;2&lt;/p&gt;
						&lt;p&gt;var PointArray:array[0..100] of TPoint;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;var i,X,Y:word;&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt; for i:=0 to 100 do begin&lt;/p&gt;
						&lt;p&gt;&amp;#160; X:=Image1.ClientWidth*i div 100;&lt;/p&gt;
						&lt;p&gt;&amp;#160; Y:=trunc((Image1.ClientHeight div 2)*(1+sin(4*Pi*X/Image1.ClientWidth)));&lt;/p&gt;
						&lt;p&gt;&amp;#160; PointArray[i]:=Point(X,Y);&lt;/p&gt;
						&lt;p&gt; end;&lt;/p&gt;
						&lt;p&gt;end;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button2Click(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt; Image1.Canvas.PolyLine(PointArray);&lt;/p&gt;
						&lt;p&gt;end;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button3Click(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt; Image1.Canvas.PolyLine(Slice(PointArray,25));&lt;/p&gt;
						&lt;p&gt;end;&lt;/p&gt;
						&lt;p&gt;Первая процедура Button1Click заполняет массив PointArray точками, описывающими график функции sin(x) на протяжении двух периодов (4). Вторая процедура Button2Click по точкам из этого массива рисует график на канве компонента Image1. Третья процедура Button3Click использует для рисования графика первые 25 точек этого массива.&lt;/p&gt;
						&lt;p&gt;Rectangle&lt;/p&gt;
						&lt;p&gt;Рисует на канве текущим пером прямоугольник и закрашивает его текущей кистью.&lt;/p&gt;
						&lt;p&gt;Rectangle(x1,y1,x2,y2:Integer);&lt;/p&gt;
						&lt;p&gt;Метод Rectangle рисует на канве текущим пером Pen прямоугольник, верхний левый угол которого имеет координаты (x1,y1), а нижний правый — (x2,y2). Прямоугольник закрашивается текущей кистью Brush. Рисование прямоугольника без рамки можно осуществить методом FillRect. Прямоугольник со скругленными углами рисуется методом RoundRect. Прямоугольникбез внутренней закраски рисуется методом FrameRect.&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;Image1.Canvas.Rectangle(10,10,210,110);&lt;/p&gt;
						&lt;p&gt;RoundRect&lt;/p&gt;
						&lt;p&gt;Рисует на канве прямоугольную рамку со скругленными углами.&lt;/p&gt;
						&lt;p&gt;RoundRect(x1,y1,x2,y2,x3,y3:Integer);&lt;/p&gt;
						&lt;p&gt;Метод RoundRect рисует на канве прямоугольную рамку со скругленными углами, используя текущие установки пера Pen и заполняя площадь фигуры текущей кистью Brush. Рамка определяется прямоугольником с координатами углов (x1,y1) и (x2,y2). Углы скругляются с помощью эллипсов с шириной x3 и высотой y3.&lt;/p&gt;
						&lt;p&gt;Если задать ширину эллипса x3 x2-x1, то верхняя и нижняя границы рамки окажутся целиком скругленными (без прямолинейной части). Если y3 y2-y1, то же самое произойдет с левой и правой границами рамки. Если же оба измерения эллипса не меньше размеров рамки, то будет рисоваться просто эллипс. Но, конечно, для рисования эллипса лучше использовать метод Ellipse. Если один из размеров эллипса задать нулевым, то будет рисоваться прямоугольная рамка, а для получения такой рамки лучше использовать метод Rectangle.&lt;/p&gt;
						&lt;p&gt;Пример.&lt;/p&gt;
						&lt;p&gt;Набор следующих операторов вызывает изображения, позанные на приведенномниже рисунке:&lt;/p&gt;
						&lt;p&gt;with Image1.Canvas do&lt;/p&gt;
						&lt;p&gt; begin&lt;/p&gt;
						&lt;p&gt;&amp;#160; RoundRect(10,10,110,210,50,100);&lt;/p&gt;
						&lt;p&gt;&amp;#160; RoundRect(160,10,260,210,100,100);&lt;/p&gt;
						&lt;p&gt;&amp;#160; RoundRect(310,10,410,210,50,200);&lt;/p&gt;
						&lt;p&gt;&amp;#160; RoundRect(460,10,560,210,100,200);&lt;/p&gt;
						&lt;p&gt; end;&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Основные свойства Canvas&lt;/p&gt;
						&lt;p&gt;Brush&lt;/p&gt;
						&lt;p&gt;Определяет цвет и стиль заполнения фона окна. Доступен только для чтения.&lt;/p&gt;
						&lt;p&gt;Brush: TBrush;&lt;/p&gt;
						&lt;p&gt;Свойство Brush (кисть) присуще многим оконным объектам, включая Canvas. Его можно читать, чтобы определить цвет и стиль заполнения фона окна. Это свойство только для чтения. Однако, атрибуты объекта Brush можно изменять, используя свойства Color и Style.&lt;/p&gt;
						&lt;p&gt;Color&lt;/p&gt;
						&lt;p&gt;Цвет фона компонента, цвет текста, объекта, TFont и др.&lt;/p&gt;
						&lt;p&gt;Color: TColor;&lt;/p&gt;
						&lt;p&gt;Свойство Color определяет цет фона компонента. Значение цвета может задаваться как значение, определяющее интенсивности красного, зеленого и синего цветов в формате RGB (Например: Form1.Canvas.Brush.Color:= RGB (88, 87, 104)) или равным одной из предопределенных в Delphi констант. Ниже приведены некоторые из них.&lt;br /&gt;Константа	&lt;br /&gt;Значение цвета&lt;/p&gt;
						&lt;p&gt;clBlack	&lt;br /&gt;Черный&lt;/p&gt;
						&lt;p&gt;clMaroon	&lt;br /&gt;Темно-бордовый&lt;/p&gt;
						&lt;p&gt;clGreen	&lt;br /&gt;Зеленый&lt;/p&gt;
						&lt;p&gt;clOlive	&lt;br /&gt;Оливково-зеленый&lt;/p&gt;
						&lt;p&gt;clNavy	&lt;br /&gt;Темно-синий&lt;/p&gt;
						&lt;p&gt;clPurple	&lt;br /&gt;Пурпурный&lt;/p&gt;
						&lt;p&gt;clTeal	&lt;br /&gt;Морской воды&lt;/p&gt;
						&lt;p&gt;clGray	&lt;br /&gt;Серый&lt;/p&gt;
						&lt;p&gt;clSilver	&lt;br /&gt;Серебряный&lt;/p&gt;
						&lt;p&gt;clRed	&lt;br /&gt;Красный&lt;/p&gt;
						&lt;p&gt;clLime	&lt;br /&gt;Лимонно-зеленый&lt;/p&gt;
						&lt;p&gt;clBlue	&lt;br /&gt;Синий&lt;/p&gt;
						&lt;p&gt;clYellow	&lt;br /&gt;Желтый&lt;/p&gt;
						&lt;p&gt;clFuchsia	&lt;br /&gt;Сиреневый&lt;/p&gt;
						&lt;p&gt;clAqua	&lt;br /&gt;Голубой&lt;/p&gt;
						&lt;p&gt;clWhite	&lt;br /&gt;Белый&lt;/p&gt;
						&lt;p&gt;clBackground	&lt;br /&gt;Текущий цвет фона стола Windows&lt;/p&gt;
						&lt;p&gt;clScrollBar	&lt;br /&gt;Текущий цвет полос прокрутки&lt;/p&gt;
						&lt;p&gt;Style&lt;/p&gt;
						&lt;p&gt;Style: TBrushStyle default bsSolid;&lt;/p&gt;
						&lt;p&gt;Свойство Style определяет шаблон, которым кисть заполняет фон объекта. Возможные значения свойста Style:&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Pen&lt;/p&gt;
						&lt;p&gt;Определяет свойства пера, используемые при рисовании линий и фигур на канве. &lt;/p&gt;
						&lt;p&gt;Основные свойста:&lt;/p&gt;
						&lt;p&gt;Color — цвет пера. По умолчанию clBlack.&lt;/p&gt;
						&lt;p&gt;Style — определяет режимрисования линий.&lt;br /&gt;psSolid	&lt;br /&gt;Сплошная линия&lt;/p&gt;
						&lt;p&gt;psDash	&lt;br /&gt;Штриховая линия&lt;/p&gt;
						&lt;p&gt;psDot	&lt;br /&gt;Пунктирная линия&lt;/p&gt;
						&lt;p&gt;psDashDot	&lt;br /&gt;Штрих-пунктирная линия&lt;/p&gt;
						&lt;p&gt;psDashDotDot	&lt;br /&gt;Линия, чередующая штрих и два пунктира&lt;/p&gt;
						&lt;p&gt;psClear	&lt;br /&gt;Отсутствующая линия&lt;/p&gt;
						&lt;p&gt;psInsideFrame	&lt;br /&gt;Сплошная линия, но при width &amp;gt; 1 допускающая цвета, отличные от палитры windows.&lt;/p&gt;
						&lt;p&gt;Width — определяет толщину линии в пикселях. Тип Integer. Влияет на Style.&lt;/p&gt;
						&lt;p&gt;Пример использования Canvas.&lt;/p&gt;
						&lt;p&gt;Задание: нарисовать ель.&lt;/p&gt;
						&lt;p&gt;Программный код:&lt;/p&gt;
						&lt;p&gt;Procedure TForm1.FormPaint(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;Begin&lt;/p&gt;
						&lt;p&gt;With Form1.Canvas do // к каждой последующей строке добавлять Form1.Canvas.&lt;/p&gt;
						&lt;p&gt; Begin&lt;/p&gt;
						&lt;p&gt; Pen.Width:=1; //установка полщины пера&lt;/p&gt;
						&lt;p&gt; Pen.Color:=clGreen; //установка цвета пера&lt;/p&gt;
						&lt;p&gt; Brush.Color:=clGreen; //установка цвета заливки&lt;/p&gt;
						&lt;p&gt; {Рисование елки}&lt;/p&gt;
						&lt;p&gt; PolyGon([Point(350,90),Point(330,90),Point(400,160),Point(380,160),&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; Point(470,250),Point(130,250),Point(220,160),Point(200,160),&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; Point(270,90),Point(250,90),Point(300,40)]);&lt;/p&gt;
						&lt;p&gt; Pen.Color:=RGB(128,64,0); //установка цвета пера (оттенок коричневого)&lt;/p&gt;
						&lt;p&gt; Brush.Color:=RGB(128,64,0); //установка цвета заливки (оттенок коричневого)&lt;/p&gt;
						&lt;p&gt; {Рисование ствола}&lt;/p&gt;
						&lt;p&gt; PolyGon([Point(350,251),Point(350,301),Point(250,301),Point(250,251)]);&lt;/p&gt;
						&lt;p&gt; End;&lt;/p&gt;
						&lt;p&gt;Font — шрифт отображения текста в компонентах&lt;/p&gt;
						&lt;p&gt;Во всех компонентах ввода и отображения текстовой и цифровой информации шрифт текста, его размер, стиль (жирный, курсив и т.п.) определяются свойством Font. Это свойство в свою очередь является объектом типа TFont, который имеет множество подсвойств, устанавливаемых в процессе проектирования или программно во время выполнения приложения. Основные свойства шрифта следующие: Charset	Определяет набор символов шрифта. &lt;br /&gt;Color	Определяет цвет текста. &lt;br /&gt;Height	Характеризует высоту шрифта в пикселях. &lt;br /&gt;Name	Вид (имя) шрифта. &lt;br /&gt;Pitch	Определяет способ установки ширины символов. &lt;br /&gt;Size	Размер шрифта в кеглях (пунктах). &lt;br /&gt;Style	Стиль шрифта: полужирный — fsBold, курсив — fsItalic, подчеркнутый — fsUnderline, перечеркнутый — fsStrikeout. &lt;/p&gt;
						&lt;p&gt;Если система не может найти шрифта с заданной комбинацией свойств Name, Charset, Pitch и Size, Windows использует другой, близкий по характеристикам шрифт. &lt;/p&gt;
						&lt;p&gt;Основное свойство шрифта — Name. Если заданный именем Name шрифт недоступен в системе, Windows заменит его другим шрифтом. По умолчанию для всех компонентов Delphi, начиная с Delphi 2, задается имя шрифта MS Sans Serif и размер 8. Delphi 1 задает имя шрифта System и размер 10. Можно рекомендовать без особой нужды не изменять Name, так как заданные по умолчанию шрифты есть на любом компьютере с Windows, а другой шрифт может отсутствовать на компьютере пользователя вашей программы. &lt;/p&gt;
						&lt;p&gt;Свойства Size и Height определяют размер шрифта. Свойство Size определяет его в кеглях (пунктах, принятых в Windows), a свойство Height — в пикселях. Если значение Size задано отрицательным, то в размер входит верхний пиксель каждой строки. Если значение Size задано положительным, то этот пиксель не учитывается. &lt;/p&gt;
						&lt;p&gt;Значение Size связано со свойствами Height и PixelsPerInch (число пикселей на дюйм) соотношением: &lt;br /&gt;Font.Size = -Font.Height * 72 / Font.PixelsPerInch&lt;/p&gt;
						&lt;p&gt;Из соотношения, в частности, видно, что задание положительного значения Size ведет к отрицательному значению Height и наоборот. &lt;/p&gt;
						&lt;p&gt;Свойство Pitch обычно имеет значение fpDefault, при котором ширина устанавливается равной по умолчанию, т.е. описанной в шрифте заданного вида Name. Свойство может принимать также значения fpFixed — установка одинаковой ширины всех символов и fpVariable — установка различной ширины символов. Задание значения отличного от fpDefault заставляет Windows искать наилучший способ удовлетворить всем заданным характеристикам шрифта. Иногда это может привести к замене шрифта на шрифт другого, близкого вида, а иногда может вообще не повлиять на шрифт — все зависит от конкретного вида шрифта и даже от его версии. &lt;/p&gt;
						&lt;p&gt;Свойство Charset определяет набор символов шрифта. Каждый вид шрифта, определяемый его именем, поддерживает один или более наборов символов. Какие именно значения Charset поддерживает тот или иной шрифт можно установить из документации на него или экспериментальным путем, в частности, с помощью приведенного далее в этом разделе тестового приложения. Для шрифтов, поддерживающих несколько наборов символов, важно правильно задать Charset. &lt;/p&gt;
						&lt;p&gt;В Delphi предопределено много констант, соответствующих стандартным наборам символов. Большинство из них, относящихся к японскому, корейскому, китайскому и другим языкам, вряд ли представляют интерес для наших читателей. Поэтому отметим только одно значение — 204, обозначаемое также константой RUSSIAN_CHARSET, которое соответствует символам кириллицы. &lt;/p&gt;
						&lt;p&gt;По умолчанию в объектах типа TFont задается значение Charset, равное 1 или DEFAULT_CHARSET. При этом шрифт выбирается только по его имени Name и размеру Size. Если описанный шрифт недоступен в системе, то Windows заменит его другим шрифтом. Для имен шрифтов, принятых в Delphi по умолчанию, это обычно нормальный вариант. Но в ряде случаев полезно для отображения русских текстов с другими шрифтами заменить это значение на RUSSIAN_CHARSET. Это позволит отобразить символы кириллицы для тех шрифтов, для которых при DEFAULT_CHARSET символы кириллицы не отображаются нормально. &lt;/p&gt;
						&lt;p&gt;Свойство Style, задающее стиль, представляет собой множество или пустое, или содержащее одно или более из возможных значений. Ниже приведены примеры операторов, устанавливающих стиль шрифта: &lt;br /&gt;Label1.Font.Style := [ ]; 	&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;{Обычный стиль}&lt;br /&gt;Label1.Font.Style := [fsBold]; 	&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;{Полужирный}&lt;br /&gt;Label1.Font.Style := [fsBold, fsItalic]; {Полужирный курсив}&lt;/p&gt;
						&lt;p&gt;Значения свойств объекта Font можно присваивать по отдельности, как это сделано в приведенных выше операторах для свойства Style. Но чаще они задаются все сразу методом Assign, который записывает значения всех свойств одного объекта в другой. Пусть, например, на форме имеется компонент Memo1 (см. раздел 3.3.4), в котором расположен некоторый текст, компонент FontDialog1 — диалог выбора шрифта (см. раздел 8.4), и меню с разделом выбора шрифта, названным MFont. Для того, чтобы пользователь мог выбрать имя и атрибуты шрифта текста, отображаемого в Memo1, в обработчик события OnClick раздела меню MFont надо вставить оператор: &lt;br /&gt;if (FontDialog1.Execute)	&lt;br /&gt;&amp;#160; then Memo1.Font.Assign(FontDialog1.Font);&lt;/p&gt;
						&lt;p&gt;Если пользователь сменил атрибуты в диалоговом окне выбора шрифта, то метод FontDialog1.Execute (см. раздел 8.1) возвращает true и атрибуты шрифта компонента Memo1 устанавливаются равными выбранным пользователем. &lt;/p&gt;
						&lt;p&gt;Для того, чтобы продемонстрировать доступные в системе шрифты и исследовать влияние на них свойств Pitch и Charset, можно построить тестовое приложение, показанное на рис. 3.1 В нем используются компоненты MainMenu, Button, ComboBox, SpinEdit и Memo, которые будут рассмотрены позднее в разделах 6.1, 5.2, 3.3.5, 3.4.2 и 3.3.4. Поэтому те, кто не знаком с этими компонентами, могут пока пропустить данный пример и вернуться к нему позднее. &lt;br /&gt;Рис. 3.1&lt;br /&gt; Тестовое приложение свойств шрифта	&lt;/p&gt;
						&lt;p&gt;Разместите на форме многострочное окно редактирования Memo (см. раздел 3.3.4), в который поместите какой-нибудь текст, например, тест латинских и русских символов, показанный на рис. 3.1. Перенесите на форму выпадающий список ComboBox (см. раздел 3.3.5), в который будут загружаться имена шрифтов, доступных системе на данном компьютере. Назовите этот компонент CBName. Разместите еще один компонент ComboBox, который будет содержать возможные значения свойства Pitch. Назовите его CBPitch и занесите в его свойство Items строки «fpDefault», «fpFixed» и «fpVariable». Разместите на форме также компонент SpinEdit (см. раздел 3.4.2), в котором можно будет задавать численные значения свойства Charset, и кнопку Button (см. раздел 5.2), нажатие которой будет передавать значение, введенное пользователем в SpinEdit, в свойство шрифта Charset. Разместите на форме компонент главного меню MainMenu (см. раздел 6.1) и введите в меню один раздел — &amp;quot;Шрифт&amp;quot;, при выборе которого пользователь сможет в диалоге выбирать атрибуты шрифта, в частности, его размеры и стиль. Чтобы обеспечить диалог выбора шрифта разместите на форме также компонент FontDialog (см. раздел 8.4). &lt;/p&gt;
						&lt;p&gt;Расположение всех компонентов может примерно соответствовать приведенному на рис. 3.1. Далее надо написать обработчики событий: события OnCreate при созданий формы (FormCreate), выбора раздела меню (MFontClick), изменений в списке CBName (CBNameClick) и в списке CBPitch (CBPitchChange) и щелчка на кнопке Button1 (Button1Click). Ниже приведен текст всех этих обработчиков. &lt;br /&gt;procedure&amp;#160; TForm1.FormCreate(Sender: TObject);&lt;br /&gt;var	&lt;br /&gt;i: integer;	&lt;br /&gt;begin&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; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;&lt;br /&gt;// Загрузка в CBName всех шрифтов системы&lt;br /&gt; for i := 0 to Screen.Fonts.Count - 1 do&lt;br /&gt;&amp;#160; &amp;#160;CBName.Items.Add(Screen.Fonts[i]);&amp;#160; &amp;#160;&lt;br /&gt; CBName.ItemIndex := 0;&amp;#160; &amp;#160; &amp;#160; &lt;br /&gt; CBPitch.ItemIndex := 0;&lt;br /&gt; // Загрузка в Memo1 имени первого шрифта&lt;br /&gt; Memo1.Font.Name := CBName.Items[CBName.ItemIndex];&lt;br /&gt;end; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.MFontClick(Sender: TObject); &lt;br /&gt;begin&lt;br /&gt;// Задание диалогу текущих атрибутов шрифта Memo1&lt;br /&gt; FontDialog1.Font.Assign(Memo1.Font);	&lt;br /&gt; if (FontDialog1.Execute)&lt;br /&gt;&amp;#160; then begin&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; // Задание атрибутов шрифта, выбранных в диалоге пользователем	&lt;br /&gt;&amp;#160; &amp;#160; Memo1.Font.Assign(FontDialog1.Font); &lt;br /&gt;&amp;#160; &amp;#160; CBName.Text:=Memo1.Font.Name;&amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; SpinEdit1.Value:=FontDialog1.Font.CharSet; &lt;br /&gt;&amp;#160; end&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; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;end; &lt;br /&gt;&amp;#160; &amp;#160;&lt;br /&gt;procedure TForm1.CBNameChange(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;// Изменение свойства Name&lt;br /&gt;&amp;#160; Memo1.Font.Name := CBName.Items[CBName.ItemIndex];&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.CBPitchChange(Sender: TObject);&lt;br /&gt;begin	&lt;br /&gt;// Изменение свойства Pitch&lt;br /&gt;&amp;#160; case CBPitch.ItemIndex of&lt;br /&gt;&amp;#160; &amp;#160; 0: Memo1.Font.Pitch := fpDefault;&lt;br /&gt;&amp;#160; &amp;#160; 1: Memo1.Font.Pitch := fpFixed;&lt;br /&gt;&amp;#160; &amp;#160; 2: Memo1.Font.Pitch := fpVariable;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin	&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;// Изменение свойства CharSet &lt;br /&gt;Memo1.Font.CharSet := SpinEdit1.Value;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Комментарии в тексте поясняют отдельные операции. Запустите приложение и исследуйте шрифты, зарегистрированные в системе, и влияние на них свойств Pitch и Charset.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 23:20:21 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=107#p107</guid>
		</item>
		<item>
			<title>34.	Компоненты: TrackBar, ProgressBar и Gauge. Основные свойства и мет</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=106#p106</link>
			<description>&lt;p&gt;Ползунки и полосы прокрутки — компоненты TrackBar и ScrollBar&lt;/p&gt;
						&lt;p&gt;Компонент TrackBar представляет собой элемент управления в виде ползунка, который пользователь может перемещать курсором мыши или клавишами во время выполнения. Таким образом, пользователь может управлять какими-то процессами: громкостью звука, размером изображения и т.п. На рис. 5.3 приведены различные формы отображения ползунка. Как видно из рисунка, он может располагаться горизонтально, вертикально, иметь шкалу с различных сторон, иметь какой-то выделенный диапазон шкалы. &lt;br /&gt;Рис. 5.3&lt;br /&gt; Различные варианты ползунков	&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;http://www.beluch.ru/progr/100comp/5_6.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.beluch.ru/progr/100comp/5_6.htm&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.beluch.ru/progr/100comp/4_8_1.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.beluch.ru/progr/100comp/4_8_1.htm&lt;/a&gt;&lt;br /&gt;Основное свойство компонента — Position. Это свойство можно задавать во время проектирования или программно во время выполнения. При перемещении пользователем ползунка можно прочитать значение Position, характеризующее позицию, в которую пользователь переместил ползунок. Для возможности такого чтения служит событие OnChange. В обработчике этого события можно прочитать значение Position и использовать его для управления каким-то компонентом. &lt;/p&gt;
						&lt;p&gt;Свойство Position — целое, значение которого может изменяться в пределах, задаваемых свойствами Min и Мах. По умолчанию Min = 0, Мах = 10, так что Position может принимать только 11 значений — от 0 до 10. Если задать большее значение Мах, соответственно увеличится количество возможных значений Position в диапазоне Min — Мах. &lt;/p&gt;
						&lt;p&gt;Свойство Orientation определяет ориентацию ползунка: trHorizontal — горизонтальная, trVertical — вертикальная. &lt;/p&gt;
						&lt;p&gt;Свойство TickMarks указывает размещение шкалы относительно компонента и может принимать значения: tmBottomRight — снизу или справа в зависимости от ориентации компонента (верхний и правый компоненты на рис. 5.3), tmTopLeft — сверху или слева в зависимости от ориентации компонента (нижний компонент на рис. 5.3), tmBoth — с обеих сторон (средний компонент на рис. 5.3). &lt;/p&gt;
						&lt;p&gt;Свойство TickStyle определяет способ изображения шкалы. Оно может принимать значения: tsAuto — автоматическая прорисовка шкалы, tsNone — отсутствие шкалы, tsManual — программное рисование шкалы с помощью метода SetTick(Value: Integer), который помещает метку шкалы в позицию, соответствующую величине Value. Метки, соответствующие началу и концу шкалы автоматически размещаются и в случае TickStyle = tsManual. &lt;/p&gt;
						&lt;p&gt;При TickStyle = tsAuto частота меток шкалы определяется свойством Frequency. Это свойство задает, сколько возможных значений Position лежит между метками. Например, если Frequency = 2, то метки будут соответствовать только каждому второму возможному значению позиции (такое значение Frequency задано в верхнем компоненте на рис. 5.3). &lt;/p&gt;
						&lt;p&gt;Свойства LineSize и PageSize определяют, насколько смещается ползунок, если пользователь управляет им с помощью соответственно клавиш со стрелками или клавишами PageUp и PageDown. &lt;/p&gt;
						&lt;p&gt;Свойства SelStart и SelEnd позволяют визуально выделить на шкале некоторый диапазон (см. средний компонент на рис. 5.3), который о чем-то говорит пользователю, например, рекомендуемый диапазон значений. При этом ничто не мешает пользователю выйти за пределы этого диапазона. &lt;/p&gt;
						&lt;p&gt;Похож на ползунок по своим функциям и компонент ScrollBar, хотя выглядит он иначе и предназначен по замыслу для других целей. Этот компонент представляет собой стандартную линейку прокрутки Windows. Однако, он может использоваться и для целей прокрутки (впрочем, многие оконные компоненты Delphi имеют собственные полосы прокрутки), и для управления, подобного компоненту TrackBar. &lt;/p&gt;
						&lt;p&gt;Основные свойства ScrollBar — Position, Min и Мах те же, что у компонента TrackBar. Свойство Kind, определяющее горизонтальное или вертикальное расположение полосы и принимающее соответственно значения sbHorizontal или sbVertical, аналогично свойству Orientation компонента TrackBar. &lt;/p&gt;
						&lt;p&gt;Имеются два свойства, отсутствующие у TrackBar: SmallChange и LargeChange. Они определяют соответственно «малый» сдвиг при щелчке на кнопке в конце полосы или нажатии клавиши со стрелкой, и «большой» сдвиг при перемещении на страницу щелчком рядом с бегунком или нажатии клавиш PageUp или PageDown. &lt;/p&gt;
						&lt;p&gt;Событие, соответствующее перемещению пользователем бегунка полосы прокрутки — OnScroll. В процедуру обработчика этого события передается по ссылке параметр ScrollPos — позиция бегунка, которую можно читать, но можно и изменять, и передается параметр ScrollCode, характеризующий вид перемещения бегунка. Этот параметр может иметь значения: scLineUp, scLineDown	«Малый» сдвиг: перемещение соответственно вверх или налево и вниз или вправо после нажатия кнопки полосы прокрутки или клавиши со стрелкой &lt;br /&gt;scPageUp, scPageDown	«Большой» сдвиг: перемещение на страницу щелчком рядом с бегунком или нажатием клавиш PageUp или PageDown &lt;br /&gt;scPosition	Пользователь переместил и освободил бегунок &lt;br /&gt;scTrack	Пользователь перемещает бегунок &lt;br /&gt;scTop, scBottom	Бегунок перемещен соответственно в крайнюю верхнюю или левую позицию и в крайнюю нижнюю или правую позицию &lt;br /&gt;scEndScroll	Окончание перемещения &lt;/p&gt;
						&lt;p&gt;В обработке события ScrollPos можно поместить операторы, перемещающие требуемую область формы или компонент, а можно поместить операторы, которые управляют некоторым компонентом, используя значение позиции бегунка ScrollPos.&lt;/p&gt;
						&lt;p&gt;Рассмотрим компоненты ProgressBar со страницы библиотеки &amp;quot;Win32&amp;quot; и Gauge со страницы &amp;quot;Samples&amp;quot;, предназначенные для отображения в стиле Windows 95/98 хода процессов, занимающих заметное время, например, копирования больших файлов, настройку приложения, установку приложения на компьютере и т.п. Пример возможных вариантов отображения хода процесса компонентами ProgressBar и Gauge приведен на рис. 4.20. &lt;br /&gt;Рис. 4.20&lt;br /&gt; Пример отображения хода процесса компонентами ProgressВar и Gauge	&lt;/p&gt;
						&lt;p&gt;Основные свойства этих компонентов очень схожи, различаясь только именами: Свойство ProgressBar	Свойство Gauge	Описание &lt;br /&gt;Max	MaxValue	Максимальное значение позиции (Position, Progress), которое соответствует завершению отображаемого процесса. По умолчанию задается в процентах — 100. &lt;br /&gt;Min	MinValue	Начальное значение позиции (Position, Progress), которое соответствует началу отображаемого процесса. &lt;br /&gt;Position	Progress	Позиция, которую можно задавать по мере протекания процесса, начиная со значения Min или MinValue в начале процесса, и кончая значением Мах или MaxValue в конце. Если минимальное и максимальное значения выражены в процентах, то позиция — это процент завершенной части процесса. &lt;br /&gt;Smooth	—	Непрерывное (при значении true) или дискретное отображение процесса. На рис. 4.20 в горизонтальном компоненте ProgressBar задано Smooth = true, а в вертикальном — false. &lt;br /&gt;Step	—	Шаг приращения позиции, используемый в методе StepIt. Значение по умолчанию — 10. &lt;br /&gt;Orientation	—	Ориентация шкалы компонента: pbHorizontal — горизонтальная, pbVertical — вертикальная. Если задана ориентация pbVertical, то компонент надо вытянуть по вертикали (см. на рис. 4.20 компонент слева). &lt;br /&gt;—	ForeColor	Цвет заполнения. &lt;br /&gt;—	ShowText	Текстовое отображение процента выполнения на фоне диаграммы. &lt;br /&gt;—	Kind	Тип диаграммы: gkHorizontalBar — горизонтальная полоса, gkVerticalBar — вертикальная полоса, gkPie — круговая диаграмма, gkNeedle — секторная диаграмма, gkText — отображение текстом. &lt;/p&gt;
						&lt;p&gt;Отображение хода процесса можно осуществлять, задавая значение позиции — Position в ProgressBar или Progress в Gauge. Например, если полная длительность процесса характеризуется значением целой переменной Count (объем всех копируемых файлов, число настроек, количество циклов какого-то процесса), а выполненная часть — целой переменной Current, то задавать позицию диаграммы в случае, если используются значения минимальной и максимальной позиции по умолчанию (т.е. 0 и 100), можно операторами &lt;br /&gt;ProgressBar1.Position := 100 * Current div Count;&lt;br /&gt;или &lt;br /&gt;Gauge1.Progress := 100 * Current div Count;&lt;br /&gt;соответственно для ProgressBar и Gauge. &lt;/p&gt;
						&lt;p&gt;Можно поступать иначе: задать сначала значение максимальной величины равным Count, а затем в ходе процесса задавать позицию равной Current. Например: &lt;br /&gt;Gauge1.MaxValue := Count;&lt;br /&gt;Gauge1.Progress := Current;&lt;/p&gt;
						&lt;p&gt;Компонент ProgressBar имеет два метода, которыми тоже можно воспользоваться для отображения процесса: StepBy(Delta: Integer) — увеличение позиции на заданную величину Delta и StepIt — увеличение позиции на один шаг, величина которого задается свойством Step.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 23:13:23 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=106#p106</guid>
		</item>
		<item>
			<title>33.	Компоненты: Image, Shape. Основные свойства, события и методы.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=105#p105</link>
			<description>&lt;p&gt;Компонент Shape только условно может быть отнесен к средствам отображения графической информации, поскольку просто представляет собой различные геометрические фигуры, соответствующим образом заштрихованные. Основное свойство этого компонента — Shape (форма), которое может принимать значения: stRectangle	прямоугольник &lt;br /&gt;stRoundRect	прямоугольник со скругленными углами &lt;br /&gt;stEllipse	эллипс &lt;br /&gt;stSquare	квадрат &lt;br /&gt;stRoundSquare	квадрат со скругленными углами &lt;br /&gt;stCircle	круг &lt;/p&gt;
						&lt;p&gt; Примеры этих форм показаны на рис. 4.7. &lt;br /&gt;Рис. 4.7&lt;br /&gt; Примеры компонента Shape	&lt;/p&gt;
						&lt;p&gt;Другое существенное свойство компонента — Brush (кисть). Это свойство является объектом типа TBrush, имеющим ряд подсвойств, в частности: цвет (Brush.Color) и стиль (Brush.Style) заливки фигуры. Заливку при некоторых значениях Style вы можете видеть на рис. 4.7. Третье из специфических свойство компонента Shape — Pen (перо), определяющее стиль линий. Это свойство, как и свойство Brush, уже рассматривались в разделе 4.2. Справочные данные об этих свойствах вы можете найти в главе 10*.&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;http://www.beluch.ru/progr/100comp/4_5.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.beluch.ru/progr/100comp/4_5.htm&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Графические возможности Delphi. Image.&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Этот компонент служит для размещения на форме одного из трех поддерживаемых Delphi типов изображений: растровой картинки, пиктограммы или метафайла. Любой из этих типов изображения содержится в центральном свойстве компонента — picture. В свойстве canvas содержится канва, с помощью которой при необходимости программа может отредактировать растровое изображение (но не пиктограмму или метафайл!).&lt;/p&gt;
						&lt;p&gt;Свойства компонента:&lt;br /&gt;property Center: Boolean;	&lt;br /&gt;Указывает, надо ли центрировать изображение в границах компонента. Игнорируется, если Autosize=True или если Stretch =True и изображение не является пиктограммой (ICO) &lt;/p&gt;
						&lt;p&gt;property Canvas : TCanvas;	&lt;br /&gt;Содержит канву для прорисовки изображения&lt;/p&gt;
						&lt;p&gt;property Transparent: Boolean;	&lt;br /&gt;Запрещает/разрешает накладывать собственный фон изображения на фон компонента&lt;/p&gt;
						&lt;p&gt;property Proportional: Boolean; property Stretch: Boolean;	&lt;br /&gt;Разрешает/запрещает изменять размер изображения так, чтобы оно целиком заполнило клиентскую область компонента.&lt;/p&gt;
						&lt;p&gt;property Picture: TPicture;	&lt;br /&gt;Разрешает/запрещает пропорционально уменьшать высоту и ширину изображения, если оно не может целиком уместиться в рабочей зоне компонента&lt;/p&gt;
						&lt;p&gt;property IncrementalDisplay: Boolean;	&lt;br /&gt;Разрешает/запрещает показ большого изображения по мере его загрузки Центральное свойство класса. Служит контейнером изображения&lt;/p&gt;
						&lt;p&gt;Методы компонента:&lt;/p&gt;
						&lt;p&gt;Никаких специальных методов у Image нет.&lt;/p&gt;
						&lt;p&gt;Описание использования:&lt;/p&gt;
						&lt;p&gt;Иллюстрацию, которая будет выведена в поле компонента image, можно задать как во время разработки формы приложения, так и во время работы программы.&lt;/p&gt;
						&lt;p&gt;Во время разработки формы иллюстрация задается установкой значения свойства picture путем выбора файла иллюстрации в стандартном диалоговом окне, которое появляется в результате щелчка на командной кнопке Load окна Picture Editor. Чтобы запустить Image Editor, нужно в окне Object Inspector выбрать свойство Picture и щелкнуть на кнопке с тремя точками.&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Если размер иллюстрации больше размера компонента, то свойству strech нужно присвоить значение True и установить значения свойств width и Height пропорционально реальным размерам иллюстрации.&lt;/p&gt;
						&lt;p&gt;Чтобы вывести иллюстрацию в поле компонента image во время работы программы, нужно применить метод LoadFromFile к свойству Picture, указав в качестве параметра имя файла иллюстрации. Например, инструкция&lt;/p&gt;
						&lt;p&gt;Form1.Image1.Picture.LoadFromFile(&#039;e:\temp\bart.bmp&#039;)&lt;/p&gt;
						&lt;p&gt;загружает иллюстрацию из файла bart.bmp и выводит ее в поле вывода иллюстрации (imagel).&lt;/p&gt;
						&lt;p&gt;Метод LoadFromFile позволяет отображать иллюстрации различных графических форматов: BMP, WMF, JPEG (файлы с расширением jpg).&lt;/p&gt;
						&lt;p&gt;Пример использования.&lt;/p&gt;
						&lt;p&gt;Написать программу-фотоальбом, которая позволяет просматривать фотографии и оставлять к ним записи.&lt;/p&gt;
						&lt;p&gt;Реализация.&lt;/p&gt;
						&lt;p&gt;Замечание. Для работоспособности программы необходимо создать в папке программы текстовый файл comment.txt и сменить ему расширение на .dat (comment.dat); также необходимо разместить 10 графических файлов с расширением .bmp и имеющих имена от 1 до 10.&lt;/p&gt;
						&lt;p&gt;Данная программа представляет собой прототип программы-фотоальбома. Она представлена для ознакомления принципа использования Image.&lt;/p&gt;
						&lt;p&gt;Интерфейс:&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Вид инспектора объектов:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;Программный код.&lt;/p&gt;
						&lt;p&gt;Для Panel1.Visible:=False;&lt;/p&gt;
						&lt;p&gt;Type mas=array [1..10] of String;&lt;/p&gt;
						&lt;p&gt;Var n:Integer;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; log_f:TextFile;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; a:mas;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.BitBtn2Click(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt;Form1.BitBtn2.Caption:=&#039;Вперед&#039;;&lt;/p&gt;
						&lt;p&gt;n:=n+1;&lt;/p&gt;
						&lt;p&gt;If n=11 then n:=1;&lt;/p&gt;
						&lt;p&gt;Form1.Image1.Picture.LoadFromFile(IntToStr(n)+&#039;.bmp&#039;);&lt;/p&gt;
						&lt;p&gt;Form1.BitBtn3.Visible:=True;&lt;/p&gt;
						&lt;p&gt;Form1.GroupBox1.Visible:=True;&lt;/p&gt;
						&lt;p&gt;Form1.BitBtn4.Visible:=True;&lt;/p&gt;
						&lt;p&gt;Form1.Label1.Caption:=a[n];&lt;/p&gt;
						&lt;p&gt;If a[n]=&#039;&#039; then Form1.BitBtn4.Caption:=&#039;Добавить&#039;&lt;/p&gt;
						&lt;p&gt;else Form1.BitBtn4.Caption:=&#039;Изменить&#039;;&lt;/p&gt;
						&lt;p&gt;end;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;var i:byte;&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt;n:=0;&lt;/p&gt;
						&lt;p&gt;Form1.BitBtn3.Visible:=False;&lt;/p&gt;
						&lt;p&gt;Form1.BitBtn4.Visible:=False;&lt;/p&gt;
						&lt;p&gt;Form1.GroupBox1.Visible:=False;&lt;/p&gt;
						&lt;p&gt;Form1.BitBtn2.Caption:=&#039;Просмотр&#039;;&lt;/p&gt;
						&lt;p&gt;Form1.Panel1.Visible:=False;&lt;/p&gt;
						&lt;p&gt;AssignFile(log_f,&#039;comment.dat&#039;);&lt;/p&gt;
						&lt;p&gt;Try&lt;/p&gt;
						&lt;p&gt;Reset(log_f);&lt;/p&gt;
						&lt;p&gt;For i:=1 to 10 do&lt;/p&gt;
						&lt;p&gt;ReadLn(log_f,a[i]);&lt;/p&gt;
						&lt;p&gt;CloseFile(log_f);&lt;/p&gt;
						&lt;p&gt;except&lt;/p&gt;
						&lt;p&gt;ShowMessage(&#039;Файл comment.dat не найден!&#039;+#13#10+&lt;/p&gt;
						&lt;p&gt;&#039;Программа завершит свою работу.&#039;);&lt;/p&gt;
						&lt;p&gt;Form1.Close;&lt;/p&gt;
						&lt;p&gt;end;&lt;/p&gt;
						&lt;p&gt;end;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.BitBtn3Click(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt;n:=n-1;&lt;/p&gt;
						&lt;p&gt;If n=0 then n:=10;&lt;/p&gt;
						&lt;p&gt;Form1.Image1.Picture.LoadFromFile(IntToStr(n)+&#039;.bmp&#039;);&lt;/p&gt;
						&lt;p&gt;Form1.Label1.Caption:=a[n];&lt;/p&gt;
						&lt;p&gt;If a[n]=&#039;&#039; then Form1.BitBtn4.Caption:=&#039;Добавить&#039;&lt;/p&gt;
						&lt;p&gt;else Form1.BitBtn4.Caption:=&#039;Изменить&#039;;&lt;/p&gt;
						&lt;p&gt;end;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.BitBtn1Click(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;Var j:byte;&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt;ReWrite(log_f);&lt;/p&gt;
						&lt;p&gt;For j:=1 to 10 do&lt;/p&gt;
						&lt;p&gt;WriteLn(log_f,a[j]);&lt;/p&gt;
						&lt;p&gt;CloseFile(log_f);&lt;/p&gt;
						&lt;p&gt;Form1.Close;&lt;/p&gt;
						&lt;p&gt;end;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.BitBtn4Click(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt;Form1.Memo1.Clear;&lt;/p&gt;
						&lt;p&gt;Form1.BitBtn6.Caption:=Form1.BitBtn4.Caption;&lt;/p&gt;
						&lt;p&gt;If Form1.BitBtn6.Caption=&#039;Добавить&#039; then Form1.Label2.Caption:=&#039;Добавление комментария&#039;&lt;/p&gt;
						&lt;p&gt;else&lt;/p&gt;
						&lt;p&gt; Begin&lt;/p&gt;
						&lt;p&gt; Form1.Memo1.Text:=a[n];&lt;/p&gt;
						&lt;p&gt; Form1.Label2.Caption:=&#039;Изменение комментария&#039;;&lt;/p&gt;
						&lt;p&gt; End;&lt;/p&gt;
						&lt;p&gt;Panel1.Visible:=True;&lt;/p&gt;
						&lt;p&gt;end;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.BitBtn5Click(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt;Form1.Panel1.Visible:=False;&lt;/p&gt;
						&lt;p&gt;end;&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;
						&lt;p&gt;procedure TForm1.BitBtn6Click(Sender: TObject);&lt;/p&gt;
						&lt;p&gt;begin&lt;/p&gt;
						&lt;p&gt;a[n]:=Form1.Memo1.Text;&lt;/p&gt;
						&lt;p&gt;Form1.Label1.Caption:=a[n];&lt;/p&gt;
						&lt;p&gt;Form1.Panel1.Visible:=False;&lt;/p&gt;
						&lt;p&gt;end;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 23:06:09 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=105#p105</guid>
		</item>
		<item>
			<title>32.	Списки в Delphi. Основные свойства, события и методы.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=104#p104</link>
			<description>&lt;p&gt;Простой и комбинированный списки&lt;/p&gt;
						&lt;p&gt;Список представляет собой упорядоченную совокупность взаимосвязанных элементов, являющихся текстовыми строками.&lt;/p&gt;
						&lt;p&gt;Простой список представляет собой прямоугольную область, в которой располагаются его строковые элементы. Для работы с простым списком в Delphi предназначен компонент ListBox.&lt;/p&gt;
						&lt;p&gt;Если количество строк больше, чем их может поместиться в видимой области списка, то у области отображения появляется полоса прокрутки. Ориентация полосы прокрутки, а также число столбцов в области списка зависят от свойства Columns. &lt;/p&gt;
						&lt;p&gt;При работе со списком можно управлять номером элемента, который в видимой области списка отображается верхним. Это обеспечивается свойством TopIndex, который доступен на этапе выполнения приложения.&lt;/p&gt;
						&lt;p&gt;Список может иметь обычную рамку или не иметь. Наличие рамки определяется свойством BorderStyle&lt;/p&gt;
						&lt;p&gt;Комбинированный список объединяет поле редактирования и список. Пользователь может выбирать значение из списка или вводить его непосредственно в поле. Для работы с комбинированным списком служит компонент ComboBox.&lt;/p&gt;
						&lt;p&gt;В отличие от простого, комбинированный список не может иметь горизонтальную полосу прокрутки и допускает выбор только одного значения.&lt;/p&gt;
						&lt;p&gt;Свойство Style определяет внешний вид и поведение комбинированного списка.&lt;/p&gt;
						&lt;p&gt;Свойство DropDownCount определяет количество строк, которые одновременно отображаются в раскрывающемся списке (по умолчанию имеет значение 8). &lt;/p&gt;
						&lt;p&gt;Свойство DroppedDown логического типа позволяет определить, раскрыт ли список. Если это свойство имеет значение True, то список отображается в раскрытом виде. По умолчанию список свернут.&lt;br /&gt;При работе с комбинированным списком генерируются следующие события:&lt;br /&gt;- OnDropDown (открытие списка);&lt;br /&gt;- OnCloseUp (закрытие списка);&lt;br /&gt;- OnSelect (выбор элемента);&lt;br /&gt;- OnChange (изменение текста в поле редактирования).&lt;/p&gt;
						&lt;p&gt;Пример:&lt;br /&gt;procedure TForm1.ComboBox1Select(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;Edit1.Text:=ComboBox1.Text;&lt;br /&gt;end;&lt;/p&gt;
						&lt;p&gt;Простой и комбинированный списки во многом похожи и имеет много общих свойств, методов и событий.&lt;/p&gt;
						&lt;p&gt;Они отличаются друг от друга прежде всего тем, что ListBox только отображает данные и позволяет пользователю выбрать из них то, что ему надо, a ComboBox позволяет также редактировать данные. Кроме того различается форма отображения списков. ListBox отображает список в раскрытом виде и автоматически добавляет в список полосы прокрутки, если все строки не помещаются в окне компонента. ComboBox позволяет отображать список, как в развернутом виде, так и в виде выпадающего списка, что обычно удобнее, так как экономит площадь окна приложения.&lt;/p&gt;
						&lt;p&gt;Основным для списков является свойство Items, которое содержит элементы списка и представляет собой массив строк.&lt;/p&gt;
						&lt;p&gt;Элементы списка можно отсортировать в алфавитном порядке. Наличие или отсутствие сортировки определяется свойством Sorted. При значении False (по умолчанию) элементы в списке располагаются в порядке в порядке их поступления в список. В противном случае, элементы автоматически сортируются по алфавиту в порядке возрастания. Действие этого свойства является статическим. Это означает, что при добавлении к отсортированному списку новых строк они размещаются на указанной позиции или в конце списка. Чтобы отсортировать список, нужно сбросить значение свойства в False, а затем снова установить значение true.&lt;/p&gt;
						&lt;p&gt;Пользователь может выбирать отдельные строки списка. Выбранный в списке элемент определяется свойством ItemIndex &lt;/p&gt;
						&lt;p&gt;Edit1.Text:=IntToStr(ListBox1.ItemIndex);&lt;/p&gt;
						&lt;p&gt;Начальное значение ItemIndex невозможно задать во время проектирования. По умолчанию ItemIndex = -1. Это означает, что ни один элемент списка не выбран. &lt;/p&gt;
						&lt;p&gt;По умолчанию в списке можно выбрать только один элемент. Для выбора двух и более элементов свойство MultiSelect, управляющее возможностью выбора нескольких строк, устанавливается в значение True.&lt;/p&gt;
						&lt;p&gt;Число выбранных элементов в списке возвращает свойство SelCount. &lt;/p&gt;
						&lt;p&gt;Для определения номеров выбранных строк можно просмотреть значения свойства Selected, представляющего собой массив логических значений.&lt;/p&gt;
						&lt;p&gt;ListBox1.Selected[2]:=True;&lt;/p&gt;
						&lt;p&gt;При выборе элементов списка происходит событие OnClick, которое можно использовать для обработки выбранных строк.&lt;/p&gt;
						&lt;p&gt;Edit1.Text:=ListBox1.Items[ListBox1.itemindex];&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Структура проекта в среде Delphi Описание главного модуля проекта Описание модулей форм проекта Переключатели и флажки в Delphi Работа с кнопками Опиание классов в Delphi 7 Поля, свойства и методы класса Одномерные и многомерные массивы (задание 1) Одномерные и двумерные массивы (задание 2) Одномерные и двумерные массивы (задание 3)&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 23:01:33 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=104#p104</guid>
		</item>
		<item>
			<title>31.	Компоненты. Флажки и переключатели. Основные свойства, события и м</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=103#p103</link>
			<description>&lt;p&gt;Переключатели и флажки в Delphi&lt;/p&gt;
						&lt;p&gt;Переключатель (зависимый переключатель) позволяет выбрать единственное значение из определенного множества значений, представленного группой переключателей. Он может находиться в выбранном или не выбранном состоянии. Одновременно можно выбрать только один переключатель в группе.&lt;/p&gt;
						&lt;p&gt;Флажок (независимый переключатель) отличается от переключателя тем, что в группе флажков одновременно можно установить флажки в любой комбинации. Флажок может находиться в установленном или сброшенном состоянии.&lt;/p&gt;
						&lt;p&gt;Флажок представлен компонентом ChekBox. Он выглядит как прямоугольник с текстовым заголовком. Если в нем есть галочка, то опция включена (флажок отмечен). &lt;/p&gt;
						&lt;p&gt;Для определения состояния флажка используется свойство Checked логического типа (по умолчанию – False, флажок снят).&lt;/p&gt;
						&lt;p&gt;Пользователь может переключать состояние флажка щелчком мыши. Что отражается на свойстве Checked. Флажок можно переключить с помощью клавиши пробел, при условии, что компонент находится в фокусе ввода.&lt;br /&gt;При каждом щелчке пользователя на индикаторе его состояние изменяется, проходя в общем случае последовательно через три значения: выделение (появление черной галочки), промежуточное (серое окно индикатора и серая галочка) и не выделенное (пустое окно индикатора). Этим трем состояниям соответствуют три значения свойства компонента State: &lt;br /&gt;- cbChecked;&lt;br /&gt;- cbGrayed; &lt;br /&gt;- cbUnchecked. &lt;/p&gt;
						&lt;p&gt;Эти три состояния допускаются только при значении другого свойства AllowGrayed равном true. Если же AllowGrayed = false (значение по умолчанию), то допускается только два состояния: выделенное и не выделенное. &lt;/p&gt;
						&lt;p&gt;Промежуточное состояние обычно используется, если индикатор применяется для отображения какой-то характеристики объекта. Например, если индикатор призван показать, какой регистр использовался при написании какого-то фрагмента текста, то в случае, если весь текст написан в верхнем регистре индикатор может принимать выделенное состояние, если в нижнем — не выделенное, а если использовались оба регистра — промежуточное. &lt;/p&gt;
						&lt;p&gt;В индикаторе CheckBox надпись задается свойством Caption, а ее размещение по отношению к индикатору – свойством Alignment. &lt;/p&gt;
						&lt;p&gt;Переключатель представлен компонентом RadioButton, который отображается в виде кружка с текстовым заголовком (при выбранном состоянии в кружке появляется черная точка).&lt;/p&gt;
						&lt;p&gt;Свойство Caption содержит надпись, появляющуюся около кнопки. Значение свойства Alignment определяет, с какой стороны от кнопки появится надпись. Свойство Checked определяет, выбрана ли данная кнопка пользователем, или нет. Поскольку в начале выполнения приложения обычно надо, чтобы одна из кнопок группы была выбрана по умолчанию, ее свойство Checked надо установить в true в процессе проектирования. &lt;/p&gt;
						&lt;p&gt;Переключатели обычно располагаются по группам (форма Form, панель Panel, группа GroupBox). Выбор переключателя является взаимоисключающим, т.е. при выборе одного переключателя другие становятся не выбранными.&lt;/p&gt;
						&lt;p&gt;Когда в группе выбран один их переключателей, то его состояние нельзя поменять повторным щелчком, как для флажков. Отмена выбора происходит только при выборе другого переключателя из этой же группы.&lt;/p&gt;
						&lt;p&gt;В Delphi есть специализированный компонент RadioGroup, представляющий собой группу переключателей RadioButton. &lt;/p&gt;
						&lt;p&gt;Управлением числом и названиями переключателей производится с помощью свойства Items. Доступ к отдельному переключателю можно получить через свойство ItemIndex (позиция переключателя). &lt;/p&gt;
						&lt;p&gt;Свойство Columns задает число столбцов, на которое разбиваются переключатели при расположении в группе.&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Свойства компонента Form&amp;#160; События компонента Form&amp;#160; Структура проекта в среде Delphi Описание главного модуля проекта Описание модулей форм проекта Работа с кнопками Простой и комбинированный списки Опиание классов в Delphi 7 Поля, свойства и методы класса Одномерные и многомерные массивы (задание 1)&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 22:59:13 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=103#p103</guid>
		</item>
		<item>
			<title>30.	Компоненты. Кнопки (Button, BitBtn, SpeedButton). Основные свойств</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=102#p102</link>
			<description>&lt;p&gt;Управляющие кнопки Button и BitBtn&lt;br /&gt;&lt;a href=&quot;http://www.beluch.ru/progr/100comp/5_2.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.beluch.ru/progr/100comp/5_2.htm&lt;/a&gt;&lt;br /&gt;Простейшей и, пожалуй, наиболее часто используемой кнопкой является кнопка Button (см. на рис. 5.1 в верхнем левом углу формы), расположенная на странице библиотеки &amp;quot;Standard&amp;quot;. Реже используется кнопка BitBtn (см. на рис. 5.1 под кнопкой Button), отличающаяся, прежде всего, возможностью отобразить на ее поверхности изображение. Большинство свойств, методов и событий у этих видов кнопок одинаковы. &lt;/p&gt;
						&lt;p&gt;Основное с точки зрения внешнего вида свойство кнопки — Caption (надпись). В надписях кнопок можно предусматривать использование клавиш ускоренного доступа, выделяя для этого один из символов надписи. Перед символом, который должен соответствовать клавише ускоренного доступа, ставится символ амперсанта «&amp;amp;». Этот символ не появляется в надписи, а следующий за ним символ оказывается подчеркнутым. Тогда пользователь может вместо щелчка на кнопке нажать в любой момент клавишу Alt совместно с клавишей выделенного символа. &lt;/p&gt;
						&lt;p&gt;Например, если в вашем приложении имеется кнопка выполнения какой-то операции, вы можете задать ее свойство Caption равным «&amp;quot;&amp;amp;Выполнить&amp;quot;». На кнопке эта надпись будет иметь вид «&amp;quot;Выполнить&amp;quot;». И если пользователь нажмет клавиши Alt-В, то это будет эквивалентно щелчку на кнопке. &lt;/p&gt;
						&lt;p&gt;Основное событие любой кнопки — OnClick, возникающее при щелчке на ней. Именно в обработчике этого события записываются операторы, которые должны выполняться при щелчке пользователя на кнопке. Помимо этого есть еще ряд событий, связанных с различными манипуляциями клавишами и кнопками мыши. &lt;/p&gt;
						&lt;p&gt;Свойство Cancel, если его установить в true, определяет, что нажатие пользователем клавиши Esc будет эквивалентно нажатию на данную кнопку. Это свойство целесообразно задавать равным true для кнопок «&amp;quot;Отменить&amp;quot;» в различных диалоговых окнах, чтобы можно было выйти из диалога, нажав на эту кнопку или нажав клавишу Esc. &lt;/p&gt;
						&lt;p&gt;Свойство Default, если его установить в true, определяет, что нажатие пользователем клавиши ввода Enter будет эквивалентно нажатию на данную кнопку, даже если данная кнопка в этот момент не находится в фокусе. Правда, если в момент нажатия Enter в фокусе находится другая кнопка, то все-таки сработает именно кнопка в фокусе. &lt;/p&gt;
						&lt;p&gt;Еще одно свойство — ModalResult используется в модальных формах, рассмотрение которых выходит за рамки данной книги. В обычных приложениях значение этого свойства должно быть равно mrNone. &lt;/p&gt;
						&lt;p&gt;Из методов, присущих кнопкам, имеет смысл отметить один — Click. Выполнение этого метода эквивалентно щелчку на кнопке, т.е. вызывает событие кнопки OnClick. Этим можно воспользоваться, чтобы продублировать какими-то другими действиями пользователя щелчок на кнопке. Пусть, например, вы хотите, чтобы при нажатии пользователем клавиши с символом «С» или «с» в любой момент работы с приложением выполнялись операции, предусмотренные в обработчике события OnClick кнопки Button1. Поскольку неизвестно, какой компонент будет находиться в фокусе в момент этого события, надо перехватить его на уровне формы. Такой перехват осуществляется, если установить свойство формы KeyPreview в true. Тогда в обработчике события формы OnKeyPress можно написать оператор &lt;br /&gt;if (key=&#039;C&#039; or key=&#039;c&#039;) then Button1.Click;&lt;/p&gt;
						&lt;p&gt;Если пользователь ввел символ «С» или «с», то в результате будет выполнен обработчик щелчка кнопки Button1. &lt;/p&gt;
						&lt;p&gt;Все сказанное выше в равной степени относится и к Button, и к BitBtn. Рассмотрим теперь особенности кнопки с пиктограммой BitBtn. Изображение на этой кнопке задается свойством Glyph. При нажатии кнопки с многоточием в строке свойства Glyph в Инспекторе Объектов вызывается окно, представленное на рис. 5.2. Нажав в нем кнопку &amp;quot;Load&amp;quot; вы перейдете в обычное окно открытия файла рисунка и можете выбрать файл битовой матрицы .bmp, содержащий желаемое изображение. В частности, с Delphi поставляется большое количество изображений для кнопок. Они расположены в каталоге \Images\Buttons, а сам каталог Images в Delphi 5 и 4 расположен в каталоге \program files\common files\borland shared, а в других версиях Delphi — в каталоге \program files\borland\delphi... . &lt;br /&gt;Рис. 5.2&lt;br /&gt; Окно редактора пиктограммы	&lt;/p&gt;
						&lt;p&gt;После того, как вы выбрали изображение, нажмите &amp;quot;OK&amp;quot; и выбранное изображение появится на вашей кнопке левее надписи. &lt;/p&gt;
						&lt;p&gt;Файл изображения для кнопки может содержать до четырех изображений пиктограмм размера 16x16. Самое левое соответствует отжатой кнопке. Второе слева соответствует недоступной кнопке, когда ее свойство Enabled равно false. Третье слева изображение используется при нажатии пользователя на кнопку при ее включении. Четвертое слева изображение используется в кнопках с фиксацией SpeedButton, о которых будет сказано позднее, для изображения кнопки в нажатом состоянии. Большинство изображений для кнопок использует две пиктограммы. Число пиктограмм вы можете узнать из свойства кнопки NumGlyphs, которое после загрузки изображения покажет вам число пиктограмм в нем. &lt;/p&gt;
						&lt;p&gt;Расположение изображения и надписи на кнопке определяется свойствами Margin, Layout и Spacing. Если свойство Margin равно -1 (значение по умолчанию), то изображение и надпись размещаются в центре кнопки. При этом положение изображения но отношению к надписи определяется свойством Layout, которое может принимать значения: blGlyphLeft (слева, это значение принято по умолчанию), blGlyphRight (справа), blGlyphТор (вверху), blGlyphBottom (внизу). Если же Margin &amp;gt; 0, то в зависимости от значения Layout изображение и надпись смещаются к той или иной кромке кнопки, отступая от нее на число пикселей, заданное значением Margin. &lt;/p&gt;
						&lt;p&gt;Свойство Spacing задает число пикселей, разделяющих изображение и надпись на поверхности кнопки. По умолчанию Spacing = 4. Если задать Spacing = 0, изображение и надпись будут размещены вплотную друг к другу. Если задать Spacing = -1, то текст появится посередине между изображением и краем кнопки. &lt;/p&gt;
						&lt;p&gt;Еще одно свойство BitBtn — свойство Kind определяет тип кнопки. По умолчанию значение этого свойства равно bkCustom — заказная. Но можно установить и множество других предопределенных типов: bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose, bkAbort, bkRetry, bkIgnore, bkAll. В этих типах уже сделаны соответствующие надписи, введены пиктограммы, заданы еще некоторые свойства. Обычно все-таки лучше ими не пользоваться. Во-первых, надписи все равно надо переводить на русский язык. Во-вторых, предопределенные рисунки обычно выбиваются из общего стиля конкретного приложения. И главное — предопределение некоторых свойств, не учтенных вами, может иногда приводить к странным результатам работы. Уж лучше использовать заказные кнопки и самому устанавливать в них все необходимые свойства&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 22:57:52 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=102#p102</guid>
		</item>
		<item>
			<title>29.	Компоненты. Текстовое поле (Edit, LebeledEdit, StaticText, MaskEdi</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=101#p101</link>
			<description>&lt;p&gt;Окна редактирования Edit и MaskEdit&lt;br /&gt;&lt;a href=&quot;http://www.beluch.ru/progr/100comp/3_3_3.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.beluch.ru/progr/100comp/3_3_3.htm&lt;/a&gt;&lt;br /&gt;На рис. 3.5 вы можете увидеть примеры окон редактирования. Внешнее оформление окон редактирования определяется свойством BorderStyle, влияние которого на вид компонента вы можете увидеть на том же рисунке. &lt;br /&gt;Рис. 3.5&lt;br /&gt; Примеры окон редактирования	&lt;/p&gt;
						&lt;p&gt;В компонентах Edit и MaskEdit вводимый и выводимый текст содержится в свойстве Text. Это свойство можно устанавливать в процессе проектирования или задавать программно. Выравнивание текста, как это имело место в метках и панелях, невозможно. Перенос строк тоже невозможен. Текст, не помещающийся по длине в окно, просто сдвигается и пользователь может перемещаться по нему с помощью курсора. Свойство AutoSize в окнах редактирования имеет смысл, отличный от смысла аналогичного свойства меток: автоматически подстраивается под размер текста только высота, но не ширина окна. &lt;/p&gt;
						&lt;p&gt;Окна редактирования снабжены многими функциями, свойственными большинству редакторов. Например, в них предусмотрены типичные комбинации «горячих» клавиш: Ctrl-C — копирование выделенного текста в буфер обмена &amp;quot;Clipboard&amp;quot; (команда &amp;quot;Copy&amp;quot;), Ctrl-X — вырезание выделенного текста в буфер &amp;quot;Clipboard&amp;quot; (команда &amp;quot;Cut&amp;quot;), Ctrl-V — вставка текста из буфера &amp;quot;Clipboard&amp;quot; в позицию курсора (команда &amp;quot;Paste&amp;quot;), Ctrl-Z — отмена последней команды редактирования. Правда, пользователи часто не догадываются об этих возможностях редактирования. Так что полезно напоминать им об этом соответствующими подсказками. &lt;/p&gt;
						&lt;p&gt;Свойство AutoSelect определяет, будет ли автоматически выделяться весь текст при передаче фокуса в окно редактирования. Его имеет смысл задавать равным true в случаях, когда при переключении в данное окно пользователь будет скорее заменять текущий текст, чем исправлять его. Имеются также свойства только времени выполнения SelLength, SelStart, SelText, определяющие соответственно длину выделенного текста, позицию перед первым символом выделенного текста и сам выделенный текст. Например, если в окне имеется текст «выделение текста» и в нем пользователь выделил слово «текста», то SelLength = 6, SelStart = 10 и SelText = &#039;текста&#039;. Если выделенного текста нет, то свойство SelStart просто определяет текущее положение курсора. &lt;/p&gt;
						&lt;p&gt;Окна редактирования можно использовать и просто как компоненты отображения текста. Для этого надо установить в true их свойство ReadOnly и целесообразно установить AutoSelect в false. В этом случае пользователь не сможет изменять отображаемый текст и окно редактирования становится подобным меткам, рассмотренным в разделе 3.3.2. Но имеются и определенные отличия. Во-первых, окна редактирования оформлены несколько иначе (сравните рис. 3.4 и 3.5.). А главное — окна редактирования могут вмещать текст, превышающий их длину. В этом случае пользователь может прокручивать этот текст, перемещая курсор в окне. Такими особенностями не обладает ни одна метка. &lt;/p&gt;
						&lt;p&gt;При использовании окон редактирования для вывода, ввода и редактирования чисел необходимо использовать функции взаимного преобразования строк и чисел. Для вывода это описанные при рассмотрении меток функции FloatToStr и IntToStr. При вводе это функции StrToFloat — преобразование строки в значение с плавающей запятой, и StrToInt — преобразование строки в целое значение. Если вводимый текст не соответствует числу (например, содержит недопустимые символы), то функции преобразования генерируют исключение EConvertError. Поэтому в программе необходимо предусмотреть обработку этого исключения. Например: &lt;br /&gt;var A: integer;&lt;br /&gt;try&lt;br /&gt;&amp;#160; A := StrToInt(Edit1.Text);&lt;br /&gt;&amp;#160; &amp;#160;...{операторы,&amp;#160; &amp;#160;использующие переменную А}&lt;br /&gt;except on EConvertError do&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; ShowMessage(&#039;Вы&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;ввод&#039;);&lt;/p&gt;
						&lt;p&gt;Этот код обеспечивает сообщение пользователю об ошибке ввода и предотвращает ошибочные вычисления. Впрочем, это не лучший вариант предотвратить ошибочный ввод, поскольку пользователь узнает о своей ошибке только после того, как программа пытается использовать введенные данные. Лучше, если пользователь просто не сможет ввести неправильные символы. Например, если вы хотите, чтобы пользователь мог вводить в окно редактирования Edit только цифры и символ точки, вы можете в обработчик события OnKeyPress этого компонента вставить оператор: &lt;br /&gt;if not (Key in [&#039;0&#039;..&#039;9&#039;, &#039;,&#039;]) then Key := #0;&lt;/p&gt;
						&lt;p&gt;Этот оператор подменит все символы, кроме цифр и запятой, нулевым символом, который не занесется в текст окна Edit. &lt;/p&gt;
						&lt;p&gt;Свойство MaxLength определяет максимальную длину вводимого текста. Если MaxLength = 0, то длина текста не ограничена. В противном случае значение MaxLength указывает максимальное число символов, которое может ввести пользователь. &lt;/p&gt;
						&lt;p&gt;Свойство Modified, доступное только во время выполнения, показывает, проводилось ли редактирование текста в окне. Если вы хотите использовать это свойство, то в момент начала работы пользователя с текстом Modified надо установить в false. Тогда при последующем обращения к этому свойству можно по его значению (true или false) установить, было или не было произведено редактирование. &lt;/p&gt;
						&lt;p&gt;Свойство PasswordChar позволяет превращать окно редактирования в окно ввода пароля. По умолчанию значение PasswordChar равно #0 — нулевому символу. В этом случае это обычное окно редактирования. Но если в свойстве указать иной символ (например, символ звездочки «*»), то при вводе пользователем текста в окне будут появляться именно эти символы, а не те, которые вводит пользователь (см. рис. 3.5). Тем самым обеспечивается секретность ввода пароля. &lt;/p&gt;
						&lt;p&gt;Компонент MaskEdit отличается от Edit тем, что в нем можно задать строку маски в свойстве EditMask. Маска состоит из трех разделов, между которыми ставится точка с запятой (;). В первом разделе — шаблоне записываются специальным образом символы (см. таблицу 3.2), которые можно вводить в каждой позиции, и символы, добавляемые самой маской; во втором разделе записывается 1 или 0 в зависимости от того, надо или нет, чтобы символы, добавляемые маской, включались в свойство Text компонента; в третьем разделе указывается символ, используемый для обозначения позиций, в которых еще не осуществлен ввод. Прочитать результат ввода можно или в свойстве Text, которое в зависимости от вида второго раздела маски включает или не включает в себя символы маски, или в свойстве EditText, содержащем введенный текст вместе с символами маски. Таблица 3.2. Символы шаблона маски&lt;/p&gt;
						&lt;p&gt;!	Наличие символа «!» означает, что в EditText недостающие символы предваряются пробелами, а отсутствие символа «!» означает, что пробелы размещаются в конце. &lt;br /&gt;&amp;gt;	Символ «&amp;gt;» означает, что все последующие за ним символы должны вводиться в верхнем регистре, пока не кончится маска или пока не встретится символ «&amp;lt;». &lt;br /&gt;&amp;lt;	Символ «&amp;lt;» означает, что все последующие за ним символы должны вводиться в нижнем регистре, пока не кончится маска или пока не встретится символ «&amp;gt;». &lt;br /&gt;&amp;lt;&amp;gt;	Символы «&amp;lt;&amp;gt;» означают, что анализ регистра не производится. &lt;br /&gt;\	Символ «\» означает, что следующий за ним символ является буквенным, а не специальным, характерным для маски. Например, символ «&amp;gt;» после символа «\» воспримется как знак &amp;gt;, а не как символ, указывающий на верхний регистр. &lt;br /&gt;L	Символ «L» означает, что в данной позиции должна бытъ буква. &lt;br /&gt;l	Символ «l» означает, что в данной позиции может быть только буква или ничего. &lt;br /&gt;A	Символ «А» означает, что в данной позиции должна быть буква или цифра. &lt;br /&gt;a	Символ «а» означает, что в данной позиции может быть буква, или цифра, или ничего. &lt;br /&gt;C	Символ «С» означает, что в данной позиции должен быть любой символ. &lt;br /&gt;c	Символ «с» означает, что в данной позиции может быть любой символ или ничего. &lt;br /&gt;0	Символ «0» означает, что в данной позиции должна быть цифра. &lt;br /&gt;9	Символ «9» означает, что в данной позиции может быть цифра или ничего. &lt;br /&gt;#	Символ «#» означает, что в данной позиции может быть цифра, знак «+», знак «-» или ничего. &lt;br /&gt;:	Символ «:» используется для разделения часов, минут и секунд. &lt;br /&gt;/	Символ «/» используется для разделения месяцев, дней и годов в датах. &lt;br /&gt; 	Символ « » означает автоматическую вставку в текст пробела. &lt;/p&gt;
						&lt;p&gt;Вводить маску можно непосредственно в свойство EditMask. Но удобнее пользоваться специальным редактором масок, вызываемым при нажатии кнопки с многоточием в строке свойства EditMask в Инспекторе Объектов. Окно редактора масок имеет вид, представленный на рис. 3.6. &lt;/p&gt;
						&lt;p&gt;В редакторе масок окно &amp;quot;Sample Masks&amp;quot; содержит наименования стандартных масок и примеры ввода с их помощью. В окно &amp;quot;Input Mask&amp;quot; надо ввести маску. Если вы выбираете одну из стандартных масок, то окно &amp;quot;Input Mask&amp;quot; автоматически заполняется и вы можете, если хотите, отредактировать эту маску. &lt;/p&gt;
						&lt;p&gt;Окно &amp;quot;Character for Blanks&amp;quot; определяет символ, используемый для обозначения позиций, в которых еще не осуществлен ввод (третий раздел маски). Индикатор &amp;quot;Save Literal Characters&amp;quot; определяет второй раздел маски: установлен, если второй раздел равен 1, и не установлен, если второй раздел равен 0. &lt;br /&gt;Рис. 3.6&lt;br /&gt; Окно редактора масок с загруженными файлами стандартных масок: американским (а) и российским (6) 	a)	 &lt;br /&gt;	b)	&lt;/p&gt;
						&lt;p&gt;Кнопка &amp;quot;Masks&amp;quot; позволяет выбрать и загрузить какой-либо другой файл стандартных масок. К сожалению, среди файлов стандартных масок, поставляемых с Delphi, отсутствует маска, соответствующая российским стандартам. Но вы легко можете сами сделать себе такой файл стандартных масок. Он делается в обычном текстовом редакторе и должен сохраняться как «только текст» с расширением .dem. Чтобы редактор масок Delphi видел этот файл, его надо сохранить в каталоге Delphi BIN. Каждая строка файла состоит из трех частей, разделяемых символом вертикальной черты. Первая часть состоит из пояснительного текста, появляющегося в левой панели окна &amp;quot;Sample Masks&amp;quot; редактора масок. Вторая часть — пример, который появляется в правой панели окна &amp;quot;Sample Masks&amp;quot; редактора масок. А третья часть — сама маска. Например, я сделал себе файл с текстом, приведенным ниже, и сохранил его с именем ru.dem. &lt;br /&gt;Телефон | 5551212 | !000-00-00;0;_&lt;br /&gt;Телефон с кодом страны | 0955551212 | !\(999\) 000-00-00;0;_&lt;br /&gt;Почтовый индекс | 123456 | !000000;1;_&lt;br /&gt;Паспорт| VII123456 | !L-LL 999999;0;_&lt;br /&gt;Дата с указанием дня | 270694 | !99/99/00;1;_&lt;br /&gt;Дата без указания дня | 0694 | !99/00;1;_&lt;br /&gt;Время с секундами | 210515 | ! 90:00:00;1;_&lt;br /&gt;Время без секунд | 1345 | !90:00;1;_&lt;/p&gt;
						&lt;p&gt;На рис. 3.6 б вы можете видеть его в работе, а на рис. 3.5 вы можете видеть ввод в окна с масками телефона и даты. &lt;/p&gt;
						&lt;p&gt;Рассмотрим примеры масок. В приведенном выше файле маска для ввода номера телефона имеет вид: &lt;br /&gt;!\(999\) 000-00-00;0;_&lt;br /&gt;В этой маске символ 9 означает, что в соответствующей позиции может быть только цифра. Символ 0 означает, что в данной позиции должна быть цифра. Символ подчеркивания в конце маски будет заполнять пустые позиции. Таким образом, пользователю для ввода в окне будет отображен шаблон (см. рис. 3.5): &lt;br /&gt;(___)___-__-__&lt;/p&gt;
						&lt;p&gt;Поскольку второй раздел маски равен 0, то при чтении введенных пользователем значений свойства EditText и Text будут различаться. Свойство EditText для примера рис. 3.5 будет равно (095) 123-45-67, а свойство Text будет равно 0951234567. Если второй раздел маски сделать равным 1, то значения обоих свойств будут равны (095) 123-45-67. &lt;/p&gt;
						&lt;p&gt;Рассмотрим еще пример. Если с помощью EditMask надо ввести, например, целое число без знака, состоящее не более, чем из двух цифр, можно задать маску 99;0; . Если число обязательно должно быть двузначным, то маска должна иметь вид 00;0; &lt;br /&gt;&lt;a href=&quot;http://www.maksakov-sa.ru/TeorDelphi/VizualKomponDelphi/RedSimvolInform/LabelEditDelphi/index.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.maksakov-sa.ru/TeorDelphi/Vi &amp;#8230; index.html&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Строка ввода с меткой класса TLabeledEdit (вкладка Additional палитры инструментов) совмещает в себе два компонента: редактор TEdit и метку TLabel, которая располагается над редактором. Эти редакторы имеют идентичные свойства (единственное уникальное свойство EditLabel компонента LabeledEdit используется для настройки метки, связанной с этим редактором). Работа с данным компонентом ничем не отличается от работы с компонентом класса TEdit. Отличие состоит лишь во внешнем виде.&lt;/strong&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic&quot;&gt;&lt;br /&gt;Отображение текста в надписях компонентов Label, StaticText и Panel&lt;/p&gt;
						&lt;p&gt;Для отображения различных надписей на форме используются в основном компоненты Label, StaticText (появившийся только в Delphi 3) и Panel. Первые два из этих компонентов — метки, специально предназначенные для отображения текстов. Основное назначение панели Panel другое: компоновка компонентов в окне формы. Однако, панель можно использовать и для вывода текстов. &lt;/p&gt;
						&lt;p&gt;Примеры вывода текста в компоненты приведены на рис. 3.4. &lt;/p&gt;
						&lt;p&gt;Тексты, отображаемые в перечисленных компонентах, определяются значением их свойства Caption. Его можно устанавливать в процессе проектирования или задавать и изменять программно во время выполнения приложения. Например: &lt;br /&gt;Label1.Caption := &#039;Новый текст&#039;;&lt;/p&gt;
						&lt;p&gt;Если требуется отобразить числовую информацию, можно воспользоваться функциями FloatToStr и IntToStr, переводящими соответственно числа с плавающей запятой и целые в строку. Для формирования текста, состоящего из нескольких фрагментов, можно использовать операцию «+», которая для строк означает их склеивание (конкатенацию). Например, если в программе имеется целая переменная I, отображающая число сотрудников некоторой организации, то вывести в метку Label1 информацию об этом можно оператором: &lt;br /&gt;Label1.Caption := &#039;Число сотрудников: &#039;+IntToStr(I);&lt;/p&gt;
						&lt;p&gt;Во всех компонентах цвет фона определяется свойством Color, а цвет надписи — подсвойством Color свойства Font. Например, в большинстве меток (кроме верхней) на рис. 3.4 а и в правых метках на рис. 3.4 б задан цвет фона равным clWhite — белый. Если цвет специально не задавать, то цвет фона обычно сливается с цветом контейнера, содержащего метку, так что фон просто не заметен. &lt;/p&gt;
						&lt;p&gt;Для метки Label цвет и шрифт — единственно доступные элементы оформления надписи. Компоненты StaticText и Panel имеют кроме того свойство BorderStyle, определяющее рамку текста — бордюр. На рис. 3.4 б вы можете видеть влияние бордюра на вид метки StaticText. При стиле sbsNone метка StaticText по виду не отличается от метки Label. Вероятно, если уж использовать бордюр, то наиболее приятный стиль sbsSunken. &lt;br /&gt;Рис. 3.4&lt;br /&gt; Примеры вывода текста в компоненты Label (а), StaticText (б) и Panel (в)	а)	&lt;br /&gt;	б)	&lt;br /&gt;	в)	&lt;/p&gt;
						&lt;p&gt;Компонент Panel кроме свойства BorderStyle имеет еще свойства BevelInner, BevelOuter, BevelWidth, BorderWidth, которые предоставляют богатые возможности оформления надписи, как вы можете видеть на рис. 3.4 в. Таким образом, с точки зрения оформления выводимого текста максимальные возможности дает Panel и минимальные — Label. &lt;/p&gt;
						&lt;p&gt;Размещение всех рассматриваемых компонентов на форме определяется, в частности, свойствами Тор (координата верхнего края), Left (координата левого края), Height (высота), Width (ширина). Имеются также свойства, определяющие изменение размера компонента при изменении пользователем во время выполнения приложения размеров окна. Это общие свойства всех оконных компонентов: Align (выравнивание компонента по всей верхней, левой, правой, нижней частям контейнера или по всей его клиентской области), Anchors (привязка сторон компонента к сторонам контейнера), Constraints (ограничения допустимых изменений размеров). Учтите, что использование в свойстве Anchors одновременной привязки компонента к противоположным сторонам контейнера приведет к растягиванию или сжатию компонента при изменении пользователем размеров окна. При этом в метках в ряде случаев наблюдаются неприятности, связанные с перемещением надписей (если они, например, выровнены по центру). Чтобы избежать этих неприятностей, надо в обработку события формы OnResize вставить операторы, перерисовывающие компоненты методом Repaint, например: &lt;br /&gt;StaticText1.Repaint;&lt;/p&gt;
						&lt;p&gt;Размер меток Label и StaticText определяется также свойством AutoSize. Если это свойство установлено в true, то вертикальный и горизонтальный размеры компонента определяются размером надписи. Если же AutoSize равно false, то выравнивание текста внутри компонента определяется свойством Alignment, которое позволяет выравнивать текст по левому краю, правому краю или центру клиентской области метки. В панели Panel также имеется свойство AutoSize, но оно не относится к размерам надписи Caption. Однако, свойство выравнивания Alignment работает и для панели. &lt;/p&gt;
						&lt;p&gt;В метке Label имеется свойство Wordwrap — допустимость переноса слов длинной надписи, превышающей длину компонента, на новую строчку. Чтобы такой перенос мог осуществляться, надо установить свойство WordWrap в true, свойство AutoSize в false (чтобы размер компонента не определялся размером надписи) и сделать высоту компонента такой, чтобы в нем могло поместиться несколько строк (см. пример правой нижней метки на рис. 3.4 а). Если WordWrap не установлено в true при AutoSize равном false, то длинный текст, не помещающийся в рамке метки, просто обрезается (см. пример левой нижней метки на рис. 3.4 а). &lt;/p&gt;
						&lt;p&gt;В метке StaticText перенос длинного текста осуществляется автоматически, если значение AutoSize установлено в false и размер компонента достаточен для размещения нескольких строк. Для того, чтобы в StaticText осуществлялся перенос при изменении пользователем размеров окна, надо осуществлять описанную выше перерисовку компонента методом Repaint в обработчике события формы OnResize. &lt;/p&gt;
						&lt;p&gt;В панели размещение надписи в нескольких строках невозможно. &lt;/p&gt;
						&lt;p&gt;Можно отметить еще одно свойство меток Label и StaticText, превращающее их в некоторое подобие управляющих элементов. Это свойство FocusControl — фокусируемый компонент. Если в свойстве метки Caption поместить перед одним из символов символ амперсант «&amp;amp;», то символ, перед которым поставлен амперсант, отображается в надписи метки подчеркнутым (сам амперсант вообще не отображается). Если после этого обратиться к свойству метки FocusControl, то из выпадающего списка можно выбрать элемент, на который будет переключаться фокус, если пользователь нажмет клавиши ускоренного доступа: клавишу Alt + подчеркнутый символ. Подобные клавиши ускоренного доступа предусмотрены в управляющих элементах: разделах меню (см. раздел 6.1) и кнопках (см. раздел 5.2). Благодаря свойству FocusControl метки могут обеспечить клавишами ускоренного доступа иные элементы, например, окна редактирования (см. раздел 3.3.3), в которых такие клавиши не предусмотрены. Только для того, чтобы клавиши ускоренного доступа в метках срабатывали, необходимо установить свойство ShowAccelChar этих меток в true. &lt;/p&gt;
						&lt;p&gt;Для отображения текстовой информации, и даже с дополнительной возможностью прокрутки длинных текстов, можно использовать также окна редактирования Edit и MaskEdit в режиме Readonly.&lt;/span&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 22:56:24 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=101#p101</guid>
		</item>
		<item>
			<title>28.	Компоненты. Текстовый редактор (Memo, RichEdit). Основные свойства</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=100#p100</link>
			<description>&lt;p&gt;Многострочные окна редактирования Memo и RichEdit&lt;/p&gt;
						&lt;p&gt;Компоненты Memo и RichEdit (см. пример на рис. 3.7) являются окнами редактирования многострочного текста. Они так же, как и окно Edit, снабжены многими функциями, свойственными большинству редакторов. В них предусмотрены типичные комбинации «горячих» клавиш: Ctrl-C — копирование выделенного текста в буфер обмена &amp;quot;Clipboard&amp;quot; (команда &amp;quot;Copy&amp;quot;), Ctrl-X — вырезание выделенного текста в буфер &amp;quot;Clipboard&amp;quot; (команда &amp;quot;Cut&amp;quot;), Ctrl-V — вставка текста из буфера &amp;quot;Clipboard&amp;quot; в позицию курсора (команда &amp;quot;Paste&amp;quot;), Ctrl-Z — отмена последней команды редактирования. &lt;br /&gt;Рис. 3.7&lt;br /&gt; Примеры компонентов Memo и RichEdit	&lt;/p&gt;
						&lt;p&gt;В компоненте Memo формат (шрифт, его атрибуты, выравнивание) одинаков для всего текста и определяется свойством Font. Если вы сохраните в файле текст, введенный или отредактированный пользователем, то будет создан текстовый файл, содержащий только символы и не содержащий элементов форматирования. При последующем чтении этого файла в Memo формат будет определяться текущим состоянием свойства Font компонента Memo, а не тем, в каком формате ранее вводился текст. &lt;/p&gt;
						&lt;p&gt;Компонент RichEdit работает с текстом в обогащенном формате RTF. При желании изменить атрибуты вновь вводимого фрагмента текста вы можете задать свойство SelAttributes. Это свойство типа TTextAttributes, которое в свою очередь имеет подсвойства: Color (цвет), Name (имя шрифта), Size (размер), Style (стиль) и ряд других. Например, введите на форму компонент RichEdit, диалог выбора шрифта FontDialog (см. раздел 8.4) и кнопку Button, которая позволит пользователю менять атрибуты текста. В обработчик щелчка кнопки можно было бы ввести текст: &lt;br /&gt;if FontDialog1.Execute then&lt;br /&gt; with RichEdit1.SelAttributes do&lt;br /&gt;&amp;#160; begin&lt;br /&gt;&amp;#160; &amp;#160;Color:=FontDialog1.Font.Color;&lt;br /&gt;&amp;#160; &amp;#160;Name:=FontDialog1.Font.Name;&lt;br /&gt;&amp;#160; &amp;#160;Size:=FontDialog1.Font.Size;&lt;br /&gt;&amp;#160; &amp;#160;Style:=FontDialog1.Font.Style;&lt;br /&gt;&amp;#160; end;&lt;br /&gt;RichEdit1.SetFocus;&lt;/p&gt;
						&lt;p&gt;В приведенном коде присваивается поочередно значение каждого свойства. Но этот текст можно кардинально сократить, воспользовавшись тем, что объекты SelAttributes и Font совместимы по типу. Поэтому можно присвоить сразу все свойства одного объекта другому: &lt;br /&gt;if FontDialog1.Execute then&lt;br /&gt; RichEdit1.SelAttributes.Assign(FontDialog1.Font);&lt;br /&gt;RichEdit1.SetFocus;&lt;/p&gt;
						&lt;p&gt;Запустите приложение и увидите, что вы можете менять атрибуты текста, выполняя отдельные фрагменты различными шрифтами, размерами, цветами, стилями. Устанавливаемые атрибуты влияют на выделенный текст или, если ничего не выделено, то на атрибуты нового текста, вводимого начиная с текущей позиции курсора (позиция курсора определяется свойством SelStart). &lt;/p&gt;
						&lt;p&gt;В компоненте имеется также свойство DefAttributes, содержащее атрибуты по умолчанию. Эти атрибуты действуют до того момента, когда изменяются атрибуты в свойстве SelAttributes. &lt;/p&gt;
						&lt;p&gt;Но значения атрибутов в DefAttributes сохраняются и в любой момент эти значения могут быть методом Assign присвоены атрибутам свойства SelAttributes, чтобы вернуться к прежнему стилю. &lt;/p&gt;
						&lt;p&gt;Свойство DefAttributes доступно только во время выполнения. Поэтому его атрибуты при необходимости можно задавать, например, в обработчике события OnCreate. &lt;/p&gt;
						&lt;p&gt;За выравнивание, отступы и т.д. в пределах текущего абзаца отвечает свойство Paragraph типа TParaAttributes. Этот тип в свою очередь имеет ряд свойств: Alignment	Определяет выравнивание текста. Может принимать значения taLeftJustify (влево), taCenter (по центру) или taRightJustify (вправо). &lt;br /&gt;FirstIndent	Число пикселей отступа красной строки. &lt;br /&gt;Numbering	Управляет вставкой маркеров, как в списках. Может принимать значения nsNone — отсутствие маркеров, nsBullet — маркеры ставятся. &lt;br /&gt;LeftIndent	Отступ в пикселях от левого поля. &lt;br /&gt;RightIndent	Отступ в пикселях от правого поля. &lt;br /&gt;TabCount	Количество позиций табуляции. &lt;br /&gt;Tab	Значения позиций табуляции в пикселях. &lt;/p&gt;
						&lt;p&gt;Значения подсвойств свойства Paragraph можно задавать только в процессе выполнения приложения, например, в событии создания формы или при нажатии какой-нибудь кнопки. Значения подсвойств свойства Paragraph относятся к тому абзацу, в котором находится курсор. Например, каждый из следующих операторов осуществит соответственное выравнивание текущего абзаца: &lt;br /&gt;RichEdit1.Paragraph.Alignment:=taLeftJustify; // Влево&lt;br /&gt;RichEdit1.Paragraph.Alignment:=taCenter;&amp;#160; &amp;#160; &amp;#160; // По центру&lt;br /&gt;RichEdit1.Paragraph.Alignment:=taRightJustify;// Вправо&lt;/p&gt;
						&lt;p&gt;Следующий оператор приведет к тому, что текущий абзац будет отображаться как список, т.е. с маркерами: &lt;br /&gt;RichEdit1.Paragraph.Numbering:=nsBullet;&lt;/p&gt;
						&lt;p&gt;Уничтожение списка в текущем абзаце осуществляется оператором &lt;br /&gt;RichEdit1.Paragraph.Numbering:=nsNone;&lt;/p&gt;
						&lt;p&gt;В целом, если с помощью компонента ActionList (см. раздел 9.2) определено некоторое действие ввода и уничтожения списка, названное ABullet, то операторы обработки соответствующего действия могут иметь вид: &lt;br /&gt;if (ABullet.Checked) then&lt;br /&gt; RichEdit1.Paragraph.Numbering:=nsNone&lt;br /&gt;else RichEdit1.Paragraph.Numbering :=nsBullet;&lt;br /&gt;ABullet.Checked:=not ABullet.Checked;&lt;/p&gt;
						&lt;p&gt;Они обеспечивают переключение соответствующей быстрой кнопки и раздела меню из нажатого состояния (отмеченного) в ненажатое с соответствующим изменением вида текущего абзаца. &lt;/p&gt;
						&lt;p&gt;Свойства TabCount и Tab имеют смысл при вводе текста только при значении свойства компонента WantTabs = true. Это свойство разрешает пользователю вводить в текст символ табуляции. Если WantTabs = false, то нажатие пользователем клавиши табуляции просто переключит фокус на очередной компонент и символ табуляции в текст не введется. &lt;/p&gt;
						&lt;p&gt;Мы рассмотрели основные отличия Memo и RichEdit. Теперь остановимся на общих свойствах этих окон редактирования. &lt;/p&gt;
						&lt;p&gt;Свойства Alignment и WordWrap имеют тот же смысл, что, например, в метках, и определяют выравнивание текста и допустимость переноса длинных строк. Установка свойства ReadOnly в true задает текст только для чтения. Свойство MaxLength определяет максимальную длину вводимого текста. Если MaxLength = 0, то длина текста не ограничена. Свойства WantReturns и WantTab определяют допустимость ввода пользователем в текст символов перевода строки и табуляции. &lt;/p&gt;
						&lt;p&gt;Свойство ScrollBars определяет наличие полос прокрутка текста в окне. По умолчанию ScrollBars = ssNone, что означает их отсутствие. Пользователь может в этом случае перемещаться по тексту только с помощью курсора. Можно задать свойству ScrollBars значения ssHorizontal, ssVertical или ssBoth, что будет соответственно означать наличие горизонтальной, вертикальной или обеих полос прокрутки. &lt;/p&gt;
						&lt;p&gt;В качестве примера на рис. 3.8 приведен пример текстового редактора, использующего описанные выше свойства компонента RichEdit. Текст в окне редактора частично поясняет атрибуты шрифта, использованные при его написании. &lt;br /&gt;Рис. 3.8&lt;br /&gt; Пример редактора на основе компонента RichEdit 	 &lt;/p&gt;
						&lt;p&gt;Основное свойство окон Memo и RichEdit — Lines, содержащее текст окна в виде списка строк и имеющее тип TStrings. Начальное значение текста можно установить в процессе проектирования, нажав кнопку с многоточием около свойства Lines в окне Инспектора Объектов. Перед вами откроется окно редактирования списков строк, представленное на рис. 3.9. Вы можете редактировать или вводить текст непосредственно в этом окне, или нажать кнопку &amp;quot;CodeEditor&amp;quot; и работать в обычном окне Редактора Кода. В этом случае, завершив работу с текстом, выберите из контекстного меню, всплывающего при щелчке правой кнопкой мыши, команду &amp;quot;Close Page&amp;quot; и ответьте утвердительно на вопрос, хотите ли вы сохранить текст в соответствующем свойстве окна редактирования. &lt;/p&gt;
						&lt;p&gt;В Delphi 1 аналогичное окно имеет еще кнопки, позволяющие загрузить текст из файла или сохранить его в файле. &lt;br /&gt;Рис. 3.9&lt;br /&gt; Окно редактирования списков строк 	 &lt;/p&gt;
						&lt;p&gt;Во время выполнения приложения вы можете заносить текст в окно редактирования с помощью методов свойства Lines типа TStrings. Этот тип широко используется в свойствах многих компонентов и его описание вы можете найти в во встроенной справке Delphi. Здесь коротко укажем только на его основные свойства и методы, используемые в свойстве Lines. &lt;/p&gt;
						&lt;p&gt;Весь текст, представленный одной строкой типа String, внутри которой используются разделители типа символов возврата каретки и перевода строки, содержится в свойстве Text. &lt;/p&gt;
						&lt;p&gt;Доступ к отдельной строке текста вы можете получить с помощью свойства Strings[Index: Integer]. Индексы, как и везде в Delphi, начинаются с 0. Так что Memo1.Lines.Strings[0] — это текст первой строки. Учтите, что если окно редактирования изменяется в размерах при работе с приложением и свойство WordWrap = true, то индексы строк будут изменяться при переносах строк, так что в этих случаях индекс мало о чем говорит. &lt;/p&gt;
						&lt;p&gt;Свойство только для чтения Count указывает число строк в тексте. &lt;/p&gt;
						&lt;p&gt;Для очистки текста в окне надо выполнить процедуру Clear. Этот метод относится к самому окну, а не к его свойству Lines. &lt;/p&gt;
						&lt;p&gt;Для занесения новой строки в конец текста окна редактирования можно воспользоваться методами Add или Append свойства Lines. Для загрузки текста из файла применяется метод LoadFromFile. Сохранение текста в фале осуществляется методом SaveToFile. &lt;/p&gt;
						&lt;p&gt;Пусть, например, в вашем приложении имеется окно редактирования Edit1, в котором пользователь вводит имя сотрудника, и есть кнопка, при щелчке на которой в окно Memo1 должна занестись шапка характеристики этого сотрудника, после чего пользователь может заполнить текст характеристики. &lt;/p&gt;
						&lt;p&gt;Обработчик щелчка на кнопке может иметь вид: &lt;br /&gt;Memo1.Clear;&lt;br /&gt;Memo1.Lines.Add (&#039;Х А Р А К Т Е Р И С Т И К А&#039;);&lt;br /&gt;Memo1.Lines.Add(&#039;Сотрудник &#039;+Edit1.Text) ;.&lt;br /&gt;Memo1.SetFocus;&lt;/p&gt;
						&lt;p&gt;Загрузка в окно Memo1 текста из файла (например, хранящейся в файле характеристики сотрудника) может осуществляться командой &lt;br /&gt;Memo1.Lines.LoadFromFile (&#039;text.txt&#039;);&lt;/p&gt;
						&lt;p&gt;Сохранение текста в файле может осуществляться командой &lt;br /&gt;Memo1.Lines.SaveToFile(&#039;text.txt&#039;);&lt;/p&gt;
						&lt;p&gt;Свойство SelStart компонентов Memo и RichEdit указывает позицию курсора в тексте или начало выделенного пользователем текста. Свойство CaretPos указывает на запись, поле X которой содержит индекс символа в строке, перед которым расположен курсор, а поле Y — индекс строки, в которой находится курсор (встроенная справка Delphi утверждает другое — что свойство CaretPos содержит координаты курсора в пикселях; но, к счастью, это не так). Таким образом, учитывая, что индексы начинаются с 0, значения Memo1.CaretPos.Y+1 и Memо1.CaretPos.X+1 определяют соответственно номер строки и символа в ней, перед которым расположен курсор. В редакторе на рис. 3.8 именно эти значения (только не для Memo, а для RichEdit) использованы, чтобы отображать в строке состояния (см. раздел 7.6) позицию курсора.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 22:48:00 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=100#p100</guid>
		</item>
		<item>
			<title>27.	Способы звукового оформления приложения в Delphi</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=99#p99</link>
			<description>&lt;p&gt;В этой статье я постараюсь рассмотреть три процедуры для воспроизведения звука. Использование этих процедур вместо компонента TMediaPlayer существенно сэкономит ресурсы системы. С помощью этих процедур можно решать довольно широкий круг задач. Итак, начнем рассмотрение этих процедур с самой простой.&lt;/p&gt;
						&lt;p&gt;Процедура Beep&lt;/p&gt;
						&lt;p&gt;Эта процедура не имеет никаких параметров. Ее объявление выглядит довольно-таки просто:&lt;/p&gt;
						&lt;p&gt;Beep;&lt;/p&gt;
						&lt;p&gt;Суть этой процедуры - воспроизводить стандартный звуковой сигнал, установленный в Windows, если имеется звуковая карта и настроен стандартный звук, если же нет, то звук поступит через динамик компьютера в виде короткого щелчка. Ее можно использовать, например, при вводе пользователем не тех данных, или при закрытии формы:&lt;br /&gt;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);&lt;br /&gt;begin&lt;br /&gt;Beep;&lt;br /&gt;end; &lt;/p&gt;
						&lt;p&gt;С первой процедурой мы разобрались. Теперь посмотрим вторую... &lt;/p&gt;
						&lt;p&gt;Функция MessageBeep &lt;/p&gt;
						&lt;p&gt;Эта функция является более серьезной, она определена как:&lt;/p&gt;
						&lt;p&gt;function MessageBeep(uType:word) : boolean; &lt;/p&gt;
						&lt;p&gt;Параметр uType указывает воспроизводимый звук, как идентификатор раздела [sounds] реестра, в котором записаны звуки, сопровождающие те, или иные события Windows. Параметр uType может принимать следующие значения:&lt;/p&gt;
						&lt;p&gt;MB_ICONASTERISK - проигрывает звук &amp;quot;Звездочка&amp;quot; (SystemAsterisk) &lt;/p&gt;
						&lt;p&gt;MB_ICONEXCLAMATION - проигрывает звук &amp;quot;Восклицание&amp;quot; (SystemExclamation) &lt;/p&gt;
						&lt;p&gt;MB_ICONHAND - проигрывает звук &amp;quot;Критическая ошибка&amp;quot; (SystemHand) &lt;/p&gt;
						&lt;p&gt;MB_ICONQUESTION - проигрывает звук &amp;quot;Вопрос&amp;quot; (SystemQuestion) &lt;/p&gt;
						&lt;p&gt;MB_OK - проигрывает звук &amp;quot;Стандартный звук&amp;quot; (SystemDefault) &lt;/p&gt;
						&lt;p&gt;Надо отметить, что эта функция воспроизводит звук асинхронно, т.е. во время воспроизведения звука Ваше приложение продолжает работать. После запроса звука функция MessageBeep передает управление вызвавшей ее функции. &lt;/p&gt;
						&lt;p&gt;Если невозможно воспроизвести указанный звук, то функция попытается воспроизвести стандартный системный звук, установленный по умолчанию, если и это невозможно, то будет воспроизведен стандартный сигнал через динамик.&lt;/p&gt;
						&lt;p&gt;Ну и наконец, осталась самая интересная и полезная функция воспроизведения звука, о ней мы сейчас и поговорим.&lt;/p&gt;
						&lt;p&gt;Функция PlaySound&lt;/p&gt;
						&lt;p&gt;Эта функция может воспроизводить любые волновые звуки, а не только звуки событий Windows. Функция API Windows, параметры которой описаны в модуле mmsystem. Поэтому для использования этой функции в Ваших программах, необходимо включить в раздел uses модуль mmsystem. Функция PlaySound определена так:&lt;/p&gt;
						&lt;p&gt;function PlaySound(pszSound:PChar; hmod:HINST; fdwSound:Cardinal):boolean; &lt;/p&gt;
						&lt;p&gt;Параметр pszSound является нуль терминированной строкой (последний символ строки имеет нулевой код), он определяет воспроизводимый звук. Параметр hmod используется в случае, когда звук берется из ресурса, поскольку мы этого делать не будем, то можно этот параметр задавать равным 0 или nil.&lt;/p&gt;
						&lt;p&gt;Последний параметр fdwSound является множеством, которое определяет как будет воспроизводиться звук (режим воспроизведения). Приведу наиболее важные значения этого множества для воспроизведения произвольных волновых флагов.&lt;/p&gt;
						&lt;p&gt;SND_ASYNC - Звук воспроизводится асинхронно и функция возвращается сразу же после начала воспроизведения. Чтобы прекратить воспроизведение нужно вызвать функцию PlaySound с параметром pszSound, равным 0. &lt;/p&gt;
						&lt;p&gt;SND_LOOP - воспроизведение звука постоянно повторяется, одновременно надо установить флаг SND_ASYNC. &lt;/p&gt;
						&lt;p&gt;SND_NOSTOP - Если заданный звук не может быть воспроизведен из-за занятости ресурсов, то функция немедленно вернет false (и звук не будет воспроизведен). Если же данный флаг не указан, то функция попытается остановить воспроизведение другого звука, чтобы освободить ресурсы. &lt;/p&gt;
						&lt;p&gt;SND_PURGE - Останавливает воспроизведение любых звуков, вызванных в данной задаче. &lt;/p&gt;
						&lt;p&gt;SND_SYNC - Синхронное воспроизведение звука события. Функция PlaySound возвращается только после окончания воспроизведения. &lt;/p&gt;
						&lt;p&gt;Важно: флаги можно комбинировать операцией or. &lt;/p&gt;
						&lt;p&gt;Указанный параметром pszSound звук, должен подходить для установленного драйвера устройства воспроизведения волновых файлов, а также должен помещаться в доступную память.&lt;/p&gt;
						&lt;p&gt;Прервать воспроизведение звука можно выполнив оператор&lt;/p&gt;
						&lt;p&gt;PlaySound(0, 0, SND_PURGE); &lt;/p&gt;
						&lt;p&gt;или путем задания нового звука.&lt;/p&gt;
						&lt;p&gt;Например, чтобы многократно и асинхронно проиграть какой-нибудь звук, выбранный с помощью OpenDialog, можно написать такой код:&lt;/p&gt;
						&lt;p&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var PCh: PChar;&lt;br /&gt;begin&lt;br /&gt;if OpenDialog1.Execute then&lt;br /&gt;begin&lt;br /&gt;StrPCopy(PCh,OpenDialog1.FileName);&lt;br /&gt;PlaySound(Pch,0,SND_ASYNC or SND_LOOP);&lt;br /&gt;end;&lt;br /&gt;end; &lt;/p&gt;
						&lt;p&gt;Ну вот, надеюсь все ясно! В следующий раз будет что-нибудь посложнее и поинтереснее!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 22:45:41 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=99#p99</guid>
		</item>
		<item>
			<title>26.	Стандартные диалоги, выбор цвета.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=98#p98</link>
			<description>&lt;p&gt;Компонент ColorDialog вызывает диалоговое окно выбора цвета, представленное на рис. 8.9. В нем пользователь может выбрать цвет из базовой палитры или, нажав кнопку &amp;quot;Определить цвет&amp;quot;, раскрыть дополнительную панель (на рис. 8.9 она раскрыта), позволяющую синтезировать цвет, отличный от базовых. Синтезированный цвет можно добавить кнопкой &amp;quot;Добавить в набор&amp;quot; в палитру дополнительных цветов на левой панели и использовать его в дальнейшем.&lt;/p&gt;
						&lt;p&gt;Основное свойство компонента ColorDialog — Color. Это свойство соответствует тому цвету, который выбрал в диалоге пользователь. Если при вызове диалога желательно установить некоторое начальное приближение цвета, это можно сделать, установив Color предварительно во время проектирования или программно. Свойство CustomColors типа TStrings позволяет задать заказные цвета дополнительной палитры. Каждый цвет определяется строкой вида&lt;/p&gt;
						&lt;p&gt;=;&lt;/p&gt;
						&lt;p&gt;Имена цветов задаются от ColorA (первый цвет) до ColorP (шестнадцатый, последний). Например, строка&lt;/p&gt;
						&lt;p&gt;ColorA=808022&lt;/p&gt;
						&lt;p&gt;задает первый заказной цвет. При задании цвета 2 младших разряда описывают интенсивность красного цвета, следующие 2 — зеленого, старшие — синего.&lt;/p&gt;
						&lt;p&gt;Свойство Options содержит множество следующих опций:&lt;br /&gt;cdFullOpen Отображать сразу при открытии диалогового окна панель определения заказных цветов&lt;br /&gt;cdPreventFullOpen Запретить появление в диалоговом окне кнопки &amp;quot;Определить цвет&amp;quot;, так что пользователь не сможет определять новые цвета&lt;br /&gt;cdShowHelp Добавить в диалоговое окно кнопку &amp;quot;Справка&amp;quot;&lt;br /&gt;cdSolidColor Указать Windows использовать сплошной цвет, ближайший к выбранному (это обедняет палитру)&lt;br /&gt;cdAnyColor Разрешать пользователю выбирать любые не сплошные цвета (такие цвета могут быть не ровными)&lt;/p&gt;
						&lt;p&gt;По умолчанию все опции выключены.&lt;/p&gt;
						&lt;p&gt;Приведем пример применения компонента ColorDialog. Если вы хотите, чтобы пользователь мог задать цвет какого-то объекта, например, цвет фона компонента Memo1, то это можно реализовать оператором&lt;/p&gt;
						&lt;p&gt;if ColorDialog1.Execute then&lt;br /&gt; Memo1.Color := ColorDialog1.Color;&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;http://delphi-guru.org.ua/components/58-dialog-vybora-cveta-komponent-colordialog.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://delphi-guru.org.ua/components/58 &amp;#8230; ialog.html&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 22:41:36 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=98#p98</guid>
		</item>
		<item>
			<title>25.	Стандартные диалоги, выбрать шрифт.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=97#p97</link>
			<description>&lt;p&gt;Компонент FontDialog вызывает диалоговое окно выбора атрибутов шрифта, представленное на рис. 8.8. В нем пользователь может выбрать имя шрифта, его стиль (начертание), размер и другие атрибуты. &lt;br /&gt;Рис. 8.8&lt;br /&gt; Диалоговое окно выбора атрибутов шрифта	&lt;/p&gt;
						&lt;p&gt;Основное свойство компонента — Font типа TFont (см. раздел 3.1), в котором вы можете задать при желании начальные установки атрибутов шрифта и в котором вы можете прочесть значения атрибутов, выбранные пользователем в процессе диалога. &lt;/p&gt;
						&lt;p&gt;Свойства MaxFontSize и MinFontSize устанавливают ограничения на максимальный и минимальный размеры шрифта. Если значения этих свойств равны 0 (по умолчанию), то никакие ограничения на размер не накладываются. Если же значения свойств заданы (обычно это целесообразно делать исходя из размеров компонента приложения, для которого выбирается шрифт), то в списке &amp;quot;Размер&amp;quot; диалогового окна (см. рис. 8.8) появляются только размеры, укладывающиеся в заданный диапазон. При попытке пользователя задать недопустимый размер ему будет выдано предупреждение вида «Размер должен лежать в интервале ...» и выбор пользователя отменится. Свойства MaxFontSize и MinFontSize действуют только при включенной опции fdLimitSize (см. ниже). &lt;/p&gt;
						&lt;p&gt;Свойство Device определяет, из какого списка возможных шрифтов будет предложен выбор в диалоговом окне: fdScreen — из списка экрана (по умолчанию), fdPrinter — из списка принтера, fdBoth — из обоих. &lt;/p&gt;
						&lt;p&gt;Свойство Options содержит множество опций: fdAnsiOnly	Отображать только множество шрифтов символов Windows, не отображать шрифтов со специальными символами &lt;br /&gt;fdApplyButton	Отображать в диалоге кнопку &amp;quot;Применить&amp;quot; независимо от того, предусмотрен ли обработчик события OnApply &lt;br /&gt;fdEffects	Отображать в диалоге индикаторы специальных эффектов (подчеркивание и др.) и список &amp;quot;Цвет&amp;quot; &lt;br /&gt;fdFixedPitchOnly	Отображать только шрифты с постоянной шириной символов &lt;br /&gt;fdForceFontExist	Позволять пользователю выбирать шрифты только из списка, запрещать ему вводить другие имена &lt;br /&gt;fdLimitSize	Разрешить использовать свойства MaxFontSize и MinFontSize, ограничивающие размеры шрифта &lt;br /&gt;fdNoFaceSel	Открывать диалоговое окно без предварительно установленного имени шрифта &lt;br /&gt;fdNoOEMFonts	Удалять из списка шрифтов шрифты OEM &lt;br /&gt;fdScalableOnly	Отображать только масштабируемые шрифты, удалять из списка не масштабируемые (шрифты bitmap) &lt;br /&gt;fdNoSimulations	Отображать только шрифты и их начертания, напрямую поддерживаемые файлами, не отображая шрифты, в которых жирный стиль и курсив синтезируется &lt;br /&gt;fdNoSizeSel	Открывать диалоговое окно без предварительно установленного размера шрифта &lt;br /&gt;fdNoStyleSel	Открывать диалоговое окно без предварительно установленного начертания шрифта &lt;br /&gt;fdNoVectorFonts	Удалять из списка векторные шрифты (типа Roman или Script для Windows 1.0) &lt;br /&gt;fdShowHelp	Отображать в диалоговом окне кнопку &amp;quot;Справка&amp;quot; &lt;br /&gt;fdTrueTypeOnly	Предлагать в списке только шрифты TrueType &lt;br /&gt;fdWysiwyg	Предлагать в списке только шрифты, доступные и для экрана, и для принтера, удаляя из него аппаратно зависимые шрифты &lt;/p&gt;
						&lt;p&gt;По умолчанию все эти опции, кроме fdEffects, отключены. &lt;/p&gt;
						&lt;p&gt;Если установить опцию fdApplyButton, то при нажатии пользователем кнопки &amp;quot;Применить&amp;quot; возникает событие OnApply, в обработчике которого вы можете написать код, который применит выбранные пользователем атрибуты, не закрывая диалогового окна. &lt;/p&gt;
						&lt;p&gt;Приведем примеры применения компонента FontDialog. Пусть ваше приложение включает окно редактирования Memo1, шрифт в котором пользователь может выбирать командой меню &amp;quot;Шрифт&amp;quot;. Вы ввели в приложение компонент FontDialog, имя которого по умолчанию FontDialog1. Тогда обработчик команды &amp;quot;Шрифт&amp;quot; может иметь вид: &lt;br /&gt;if FontDialog1.Execute then&lt;br /&gt;&amp;#160; Memo1.Font.Assign(FontDialog1.Font);&lt;/p&gt;
						&lt;p&gt;Приведенный оператор вызывает диалог выбора атрибутов шрифта и, если пользователь произвел выбор, то значения всех выбранных атрибутов, содержащиеся в свойстве FontDialog1.Font, присваиваются атрибутам окна редактирования, содержащимся в свойстве Memo1.Font. Шрифт в окне редактирования немедленно изменится. &lt;/p&gt;
						&lt;p&gt;Если вы установите в компоненте FontDialog1 опцию fdApplyButton, то можете написать обработчик события OnApply: &lt;br /&gt;Memo1.Font.Assign(FontDialog1.Font);&lt;/p&gt;
						&lt;p&gt;Тогда пользователь может наблюдать изменения в окне Memo1, нажимая в диалоговом окне кнопку &amp;quot;Применить&amp;quot; и не прерывая диалога. Это очень удобно, так как позволяет пользователю правильно подобрать атрибуты шрифта. &lt;/p&gt;
						&lt;p&gt;Если в качестве окна редактирования в вашем приложении вы используете RichEdit, то можете предоставить пользователю выбирать атрибуты шрифта для выделенного фрагмента текста или для вновь вводимого текста. Тогда выполнение команды меню &amp;quot;Шрифт&amp;quot; может осуществляться операторами: &lt;br /&gt;if FontDialog1.Execute then&lt;br /&gt;&amp;#160; RichEdit1.SelAttributes.Assign(FontDialog1.Font);&lt;/p&gt;
						&lt;p&gt;Вы можете разрешить пользователю изменять шрифт не только отдельных компонентов, но и всех компонентов и надписей на форме. Это осуществляется оператором: &lt;br /&gt;if FontDialog1.Execute then&lt;br /&gt;&amp;#160; Font.Assign(FontDialog1.Font);&lt;/p&gt;
						&lt;p&gt;В этом операторе свойство Font без ссылки на компонент подразумевает шрифт формы.&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;http://www.beluch.ru/progr/100comp/8_4.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.beluch.ru/progr/100comp/8_4.htm&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 22:39:50 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=97#p97</guid>
		</item>
		<item>
			<title>24.	Стандартные диалоги, сохранить файл.</title>
			<link>https://pp09.rolka.me/viewtopic.php?pid=96#p96</link>
			<description>&lt;p&gt;Компоненты OpenDialog — диалог «Открыть файл» и SaveDialog — диалог «Сохранить файл как...», пожалуй, используются чаще всего, в большинстве приложений. Примеры открываемых ими диалоговых окон приведены на рис. 8.1 и 8.2. &lt;br /&gt;Рис. 8.1&lt;br /&gt; Диалоговое окно открытия файла	&lt;/p&gt;
						&lt;p&gt;Рис. 8.2&lt;br /&gt; Диалоговое окно сохранения файла	&lt;/p&gt;
						&lt;p&gt;Все свойства этих компонентов одинаковы, только их смысл несколько различен для открытия и закрытия файлов. Основное свойство, в котором возвращается в виде строки выбранный пользователем файл, — FileName. Значение этого свойства можно задать и перед обращением к диалогу. Тогда оно появится в диалоге как значение по умолчанию в окне &amp;quot;Имя файла&amp;quot; (см. рис. 8.1, 8.2). &lt;/p&gt;
						&lt;p&gt;Типы искомых файлов, появляющиеся в диалоге в выпадающем списке &amp;quot;Тип файла&amp;quot; (рис. 8.1, 8.2), задаются свойством Filter. В процессе проектирования это свойство проще всего задать с помощью редактора фильтров, который вызывается нажатием кнопки с многоточием около имени этого свойства в Инспекторе Объектов. При этом открывается окно редактора, вид которого представлен на рис. 8.3. В его левой панели &amp;quot;Filter Name&amp;quot; вы записываете тот текст, который увидит пользователь в выпадающем списке &amp;quot;Тип файла&amp;quot; диалога. А в правой панели &amp;quot;Filter&amp;quot; записываются разделенные точками с запятой шаблоны фильтра. В примере рис. 8.3 задано два фильтра: текстовых файлов с расширениями .txt и .doc и любых файлов с шаблоном *.*. &lt;br /&gt;Рис. 8.3&lt;br /&gt; Окно редактора фильтров	&lt;/p&gt;
						&lt;p&gt;После выхода из окна редактирования фильтров заданные вами шаблоны появятся в свойстве Filter в виде строки вида: &lt;br /&gt;текстовые (*.txt, *.doc)|*.txt; *.doc|все&amp;#160; файлы|*.*&lt;/p&gt;
						&lt;p&gt;В этой строке тексты и шаблоны разделяются вертикальными линиями. В аналогичном виде, если требуется, можно задавать свойство Filter программно во время выполнения приложения. &lt;/p&gt;
						&lt;p&gt;Свойство FilterIndex определяет номер фильтра, который будет по умолчанию показан пользователю в момент открытия диалога. Например, значение FilterIndex = 1 задает по умолчанию первый фильтр. &lt;/p&gt;
						&lt;p&gt;Свойство InitialDir определяет начальный каталог, который будет открыт в момент начала работы пользователя с диалогом. Если значение этого свойства не задано, то открывается текущий каталог или тот, который был открыт при последнем обращении пользователя к соответствующему диалогу в процессе выполнения данного приложения. &lt;/p&gt;
						&lt;p&gt;Свойство DefaultExt определяет значение расширения файла по умолчанию. Если значение этого свойства не задано, пользователь должен указать в диалоге полное имя файла с расширением. Если же задать значение DefaultExt, то пользователь может писать в диалоге имя без расширения. В этом случае будет принято заданное расширение. &lt;/p&gt;
						&lt;p&gt;Свойство Title позволяет вам задать заголовок диалогового окна. Если это свойство не задано, окно открывается с заголовком, определенным в системе (например, «Открытие файла» в окне на рис. 8.1). Но вы можете задать и свой заголовок, подсказывающий пользователю ожидаемые действия. Например, «Укажите имя открываемого файла». &lt;/p&gt;
						&lt;p&gt;Свойство Options определяет условия выбора файла. Множество опций, которые вы можете установить программно или во время проектирования, включает: ofAllowMultiSelect	Позволяет пользователю выбирать несколько файлов &lt;br /&gt;ofCreatePrompt	В случае, если пользователь написал имя несуществующего файла, появляется замечание и запрос, надо ли создать файл с заданным именем &lt;br /&gt;ofEnableIncludeNotify	Разрешает посылать в диалог сообщения &lt;br /&gt;ofEnableSizing	Разрешает пользователю изменять размер диалогового окна &lt;br /&gt;ofExtensionDifferent	Этот флаг, который можно прочитать после выполнения диалога, показывает, что расширение файла, выбранного пользователем, отличается от DefaultExt &lt;br /&gt;ofFileMustExist	В случае, если пользователь написал имя несуществующего файла, появляется сообщение об ошибке &lt;br /&gt;ofHideReadOnly	Удаляет из диалога индикатор &amp;quot;Открыть только для чтения&amp;quot; &lt;br /&gt;ofNoChangeDir	После щелчка пользователя на кнопке &amp;quot;OK&amp;quot; восстанавливает текущий каталог, независимо от того, какой каталог был открыт при поиске файла &lt;br /&gt;ofNoDereferenceLinks	Запрещает переназначать клавиши быстрого доступа в диалоговом окне &lt;br /&gt;ofNoLongNames	Отображаются только не более 8 символов имени и трех символов расширения &lt;br /&gt;ofNoNetworkButton	Убирает из диалогового окна кнопку поиска в сети. Действует только если флаг ofOldStyleDialog включен &lt;br /&gt;ofNoReadOnlyReturn	Если пользователь выбрал файл только для чтения, то генерируется сообщение об ошибке &lt;br /&gt;ofNoTestFileCreate	Запрещает выбор в сети защищенных файлов и не доступных дисков при сохранении файла &lt;br /&gt;ofNoValidate	Не позволяет писать в именах файлов неразрешенные символы, но не мешает выбирать файлы с неразрешенными символами &lt;br /&gt;ofOldStyleDialog	Создает диалог выбора файла в старом стиле (см. рис. 8.4) &lt;br /&gt;ofOverwritePrompt	В случае, если при сохранении файла пользователь написал имя существующего файла, появляется замечание, что файл с таким именем существует, и запрашивается желание пользователя переписать существующий файл &lt;br /&gt;ofPathMustExist	Генерирует сообщение об ошибке, если пользователь указал в имени файла несуществующий каталог &lt;br /&gt;ofReadOnly	По умолчанию устанавливает индикатор &amp;quot;Открыть только для чтения&amp;quot; при открытии диалога &lt;br /&gt;ofShareAware	Игнорирует ошибки нарушения условий коллективного доступа и разрешает, несмотря на них, производить выбор файла &lt;br /&gt;ofShowHelp	Отображает в диалоговом окне кнопку &amp;quot;Справка&amp;quot; &lt;/p&gt;
						&lt;p&gt;По умолчанию все перечисленные опции, кроме ofHideReadOnly, выключены. Но, как видно из их описания, многие из них полезно включить перед вызовом диалогов. &lt;/p&gt;
						&lt;p&gt;Если вы разрешаете с помощью опции ofAllowMultiSelect множественный выбор файлов, то список выбранных файлов можно прочитать в свойстве Files типа TStrings. &lt;/p&gt;
						&lt;p&gt;В приведенной таблице даны опции, используемые в 32-разрядных версиях Delphi. В Delphi 1 диалоговое окно имеет вид, представленный на рис. 8.4. Аналогичный вид имеет диалог и в 32-разрядных версиях Delphi при включении опции ofOldStyleDialog. В примере рис. 8.4 диалог открыт с заданным значением свойства Title и заданный текст отображается в заголовке окна. Кроме того, в этом примере выключена опция ofHideReadOnly (в Delphi 1 она выключена по умолчанию), что привело к появлению индикатора «&amp;quot;Только чтение&amp;quot;». &lt;br /&gt;Рис. 8.4&lt;br /&gt; Диалог в старом стиле при включенной опции ofOldStyleDialog и выключенной опции ofHideReadOnly	&lt;/p&gt;
						&lt;p&gt;В компонентах диалогов открытия и сохранения файлов предусмотрена возможность обработки ряда событий. Такая обработка может потребоваться, если рассмотренных опций, несмотря на их количество, не хватает, чтобы установить все диктуемые конкретным приложением ограничения на выбор файлов. Событие OnCanClose возникает при нормальном закрытии пользователем диалогового окна после выбора файла. При отказе пользователя от диалога — нажатии кнопки &amp;quot;Отмена&amp;quot;, клавиши Esc и т.д. событие OnCanClose не наступает. В обработке события OnCanClose вы можете произвести дополнительные проверки выбранного пользователем файла и, если по условиям вашей задачи этот выбор недопустим, вы можете известить об этом пользователя и задать значение false передаваемому в обработчик параметру CanClose. Это не позволит пользователю закрыть диалоговое окно. &lt;/p&gt;
						&lt;p&gt;Можно также написать обработчики событий OnFolderChange — изменение каталога, OnSelectionChange — изменение имени файла, OnTypeChange — изменение типа файла. В этих обработчиках вы можете предусмотреть какие-то сообщения пользователю. &lt;/p&gt;
						&lt;p&gt;Теперь приведем примеры использования диалогов OpenDialog и SaveDialog. Пусть ваше приложение включает окно редактирования Memo1, в которое по команде меню &amp;quot;Открыть&amp;quot; вы хотите загружать текстовый файл, а после каких-то изменений, сделанных пользователем, — сохранять по команде &amp;quot;Сохранить&amp;quot; текст в том же файле, а по команде &amp;quot;Сохранить как...&amp;quot; — в файле с другим именем. &lt;/p&gt;
						&lt;p&gt;Введите на форму компоненты — диалоги OpenDialog и SaveDialog. Предположим, что вы оставили их имена по умолчанию — OpenDialog1 и SaveDialog1. Поскольку после чтения файла вам надо запомнить его имя, чтобы знать под каким именем потом его сохранять, вы можете определить для этого имени переменную, назвав ее, например, FName: &lt;br /&gt;var FName: string;&lt;/p&gt;
						&lt;p&gt;Тогда обработка команды &amp;quot;Открыть&amp;quot; может сводиться к следующему оператору: &lt;br /&gt;if OpenDialog1.Execute then&lt;br /&gt; begin&lt;br /&gt;&amp;#160; FName := OpenDialog1.FileName;&lt;br /&gt;&amp;#160; Memo1.Lines.LoadFromFile(FName);&lt;br /&gt; end;&lt;/p&gt;
						&lt;p&gt;Этот оператор вызывает диалог, проверяет, выбрал ли пользователь файл (если выбрал, то функция Execute возвращает true), после чего имя выбранного файла (OpenDialog1.FileName) сохраняется в переменной FName и файл загружается в текст Memo1 методом LoadFromFile. &lt;/p&gt;
						&lt;p&gt;Обработка команды &amp;quot;Сохранить&amp;quot; выполняется оператором &lt;br /&gt;Memo1.Lines.SaveToFile(FName);&lt;/p&gt;
						&lt;p&gt;В данном случае нет необходимости обращаться к какому-то диалогу, поскольку имя файла известно: оно хранится в переменной FName. &lt;/p&gt;
						&lt;p&gt;Обработка команды &amp;quot;Сохранить как...&amp;quot; выполняется операторами: &lt;br /&gt;SaveDialog1.FileName := FName;&lt;br /&gt;if SaveDialog1.Execute then&lt;br /&gt; begin&lt;br /&gt;&amp;#160; FName := SaveDialog1.FileName;&lt;br /&gt;&amp;#160; Memo1.Lines.SaveToFile(FName);&lt;br /&gt; end;&lt;/p&gt;
						&lt;p&gt;Первый из этих операторов присваивает свойству FileName компонента SaveDialog1 запомненное имя файла. Это имя по умолчанию будет предложено пользователю при открытии диалога &amp;quot;Сохранить как...&amp;quot;. Следующий оператор открывает диалог и, если пользователь выбрал в нем файл, запоминает новое имя файла и сохраняет в файле с этим именем текст компонента Memo1. &lt;/p&gt;
						&lt;p&gt;Мы рассмотрели диалоги открытия и сохранения файлов произвольного типа. Начиная с Delphi 3 в библиотеке имеются специализированные диалоги открытия и закрытия графических файлов: OpenPictureDialog и SavePictureDialog. Диалоговые окна, открываемые этими файлами, приведены на рис. 8.5 и 8.6. От окон, открываемых компонентами OpenDialog и SaveDialog (рис. 8.1, 8.2), они отличаются удобной возможностью просматривать изображения в процессе выбора файла. &lt;br /&gt;Рис. 8.5&lt;br /&gt; Диалоговое окно открытия файла изображения	&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Рис. 8.6&lt;br /&gt; Диалоговое окно сохранения файла изображения	&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Свойства компонентов OpenPictureDialog и SavePictureDialog ничем не отличаются от свойств компонентов OpenDialog и SaveDialog. Единственное отличие — заданное значение по умолчанию свойства Filter в OpenPictureDialog и SavePictureDialog. В этих компонентах заданы следующие фильтры: All (*.jpg; *.jpeg; *.bmp; *.ico; *.emf; *.wmf)	*.jpg; *.jpeg; *.bmp; *.ico; *.emf; *.wmf &lt;br /&gt;JPEG Image File (*.jpg)	*.jpg &lt;br /&gt;JPEG Image File (*.jpeg)	*.jpeg &lt;br /&gt;Bitmaps (*.bmp)	*.bmp &lt;br /&gt;Icons (*.ico)	*.ico &lt;br /&gt;Enhanced Metafiles (*.emf)	*.emf &lt;br /&gt;Metafiles (*.wmf)	*.wmf&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;http://www.beluch.ru/progr/100comp/8_2.htm&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.beluch.ru/progr/100comp/8_2.htm&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DjeromG)</author>
			<pubDate>Thu, 02 Jun 2011 22:38:25 +0400</pubDate>
			<guid>https://pp09.rolka.me/viewtopic.php?pid=96#p96</guid>
		</item>
	</channel>
</rss>
