Сайт о телевидении

Сайт о телевидении

» » Собственные и структурные типы данных Delphi. Математическое понятие множества

Собственные и структурные типы данных Delphi. Математическое понятие множества

В Delphi программистам очень часто приходится иметь дело с множествами, которые по своей сути являются наборами однотипных значений. Каждое множество имеет свою область значений, состоящую из набора всех возможных подмножеств, включающих его элементы.

Если проводить аналогию с математическим термином, то в программировании понятие множества имеет несколько особенностей. Например, оно конечно, то есть множество не может содержать бесконечное число элементов. Общее количество объектов, принадлежащих множеству, находится в пределах от 0 до 256. Если множеству не принадлежит ни один элемент, то оно называется пустым.

Стоит отметить тот факт, что в Delphi множества нельзя использовать для хранения каких-либо элементов (символов, чисел). Оно может лишь ответить на вопрос, принадлежит ли определенный элемент данному множеству или нет.

Delphi множества

На английском языке множество звучит, как set. Именно эта команда и используется в Delphi для его описания.

Например:

Type <имя типа> = set of <базовый тип>;
В этом случае <имя типа> выступает в качестве идентификатора. А <базовый тип> является одним из скалярных типов, он задается перечислением или определенным диапазоном. Среди стандартных типов в качестве базового можно использовать char, byte, boolean. Задать тип можно как в части описания программы, так и путем прямого указания в описании множества.

Например: Первый вариант.

Type abc = "c" .. "q"; // Описание типа abc type FG = set of abc; // Описание множественного типа FG с базовым типом abc
Второй вариант.

Type FGH = set of "c" .. "q"; // Прямое включение определения базового типа "c’ .. "q" в описание множественного типа FGH
Рассматривая в delphi множества, стоит отметить тот фат, что нет смысла говорить об упорядоченности. Например, если в определенное множество входит всего три объекта, то общее количество разных вариаций будет равно восьми.

После того, как множество будет определено, с ним можно выполнять разные операции. В delphi множества можно объединить, пересекать. Помимо этого, доступны такие операции, как разность и IN.

Сравнивая в Delphi множества нет смысла обращать внимание на порядок расположения элементов. Два множества будут равными, если в их состав входят одни и те же элементы.

В Delphi можно использовать операции принадлежности. Одно множество принадлежит другому, если все его элементы входят в состав другого множества.

Например, A >= B равно True, если все элементы множества В есть и во множестве А.

Для того, чтобы узнать. Принадлежит ли конкретный элемент множеству или нет, используется операция IN. С помощью данной операции можно очень эффективно выполнять достаточно сложные проверки условий принадлежности.

Помимо всего вышеперечисленного, в Delphi множества могут быть объединены в одно . В результате, получается третье множество, в состав которого входят элементы, как из А, так и из В.

Применение множеств в реализации той или иной программы, дает возможность программистам в значительной степени улучшить наглядность алгоритма, упростить оператор if, а также сэкономить немного времени. Использовать множества в Delphi очень просто, особенно, если брать за сравнение администрирование linux.

Федоренко Сергей

Введение

В Delphi разрешено определять тип объектов-множеств, элементами которых являются значения одного и того же базового типа. Базовый тип определяет перечень всех элементов, которые могут содержаться в данном множестве. Количество элементов, входящих в множество, может меняться в пределах от 0 до 256 (множество, не содержащее элементов, называется пустым).

Описание

Описание типа множества имеет вид:

type <имя типа> = set of <базовый тип>;

Здесь <имя типа> - идентификатор; <базовый тип> - один из скалярных типов, кроме вещественного. Базовый тип задаётся диапазоном или перечислением. Из стандартных типов в качестве базового типа множества могут быть указаны типы byte, char и boolean. Базовый тип вводится либо через предварительное определение в разделе описаний программы, либо с помощью прямого указания после слов set of в описании типа множества, например:

type letter = "a" .. "z"; // Описание ограниченного типа letter
type SL = set of letter; // Описание множественного типа SL с базовым типом letter

type SLR = set of "a" .. "z"; // Прямое включение определения базового типа "a .. "z" в описание множественного типа SLR

Если в программе используются переменные, значениями которых являются множества, то эти переменные описываются обычным образом:

type intset = set of byte;
var m1, m2: intset; // Переменные описаны через указание принадлежности ранее определённому типу
var m3: set of 1..20; // Определение типа переменной непосредственно включено в её описание

Задать значение переменной типа множества в программе можно с помощью оператора присваивания, в правой части которого в квадратных скобках перечислены через запятую элементы множества (так называемый конструктор множества). Примеры значений переменных множественного типа:

Пустое множество;
- множество, содержащее элементы 1, 3, 5, 6, .. 12;
["a" .. "p", "u", "z"] - множество, состоящее из перечисленных символов типа char.

Элементы типа множества могут задаваться в виде выражений, например: . Выражения должны иметь значения из заданного базисного множества порядкового типа. Область значений переменной множественного типа представляет собой набор всевозможных подмножеств, образованных из элементов базового типа.

В отличие от перечислений нельзя говорить о первом, втором и т.п. элементах множества, поскольку для множеств понятие упорядоченности не имеет смысла. Если множество содержит всего три элемента, то общее количество возможных комбинаций составляет 2 * 2 * 2 = 8. Зарезервированное слово set способно определять множество размерностью до 256 элементов, т.е. 1,1579208923731619542357098500869e+77 вариантов. На практике такое количество вариантов никогда не понадобится. В частности, разработчики Delphi рекомендуют использовать множество с количеством элементов не более 16.

Операции над множествами

Над переменными множественного типа могут выполняться те же операции, что и над обычными множествами:

1. Объединение (+);
2. Пересечение (*);
3. Разность (-).

Кроме того, определённые операции проверки принадлежности элемента множеству (in), проверки тождественности множеств (=), нетождественности, множеств (<>), определения принадлежности (вложенности) множеств (>= или <=). Примеры:

1. = // Результат True
2. ["a" .. "z"] = ["a" .. "p"] // Результат False
3. <> // Результат True
4. ["a", "b", "c"] <= ["a" .. "z"] // Результат True
5. ["a" .. "k"] >= ["a" .. "z"] // Результат False
6. + // Результат
7. * // Результат
8. - // Результат

Операция in позволяет определить, принадлежит ли элемент множеству или нет. Первым операндом, стоящим слева от слова in, является выражение базового типа. Второй операнд, стоящий справа от слова in, должен иметь множественный тип, например:

a in // Результат True
2 * 4 in // Результат True
"a" + "b" in ["ab", "cd", "ef"] // Результат True
5 in // Результат True
5 in // Результат False

При использовании операции in проверяемое на принадлежность значение и множество в квадратных скобках не требуют предварительного определения в разделе описаний, если они не заданы в виде конкретных значений.

Операция in позволяет проводить эффективно сложные проверки условий. Например, вместо:

(c >= "0") and (c <= "9") or (c >= "a") and (c <="z");

Проще записать:

c in ["0" .. "9", "a" .. "z"];

Причём последняя конструкция будет, как правило, более эффективной.

Операции (=) и (<>) позволяют проверить, равны ли два множества или нет. С помощью операций (>=) и (<=) можно определить, является ли одно множество подмножеством другого. Пример:

= // Результат False
<= // Результат True

Замечания:
1. Пустое множество является подмножеством любого другого множества независимо от базового типа его элементов.
2. Множества-операнды могут иметь непересекающиеся базовые типы. Располагая, например, множествами A: set of 1 .. 99 и B: set of 100 .. 150, можно в результате объединения A+B получить новое множество с базовым типом 1 .. 150.
3. Следует различать конструктор множества и отрезок порядкового типа X .. Y. При X > Y в первом случае речь идёт о пустом множестве, а во втором компилятор выдаст ошибку. Пример:

["a", "b"] = ["b" .. "a"] // Результат False

При проверке на подмножество выполняется тест на "меньше или равно", а не только проверка на собственное подмножество, т.е без "равно". Операции (<) и (>) не предусмотрены, поэтому при необходимости проверку на собственное подмножество для множеств A и B можно провести следующим образом:

(A <= B) and (A >= B) или (A >= B) and (A <> B)

Для задания правильного порядка выполнения операций следует учитывать принятый порядок старшинства (приоритета) операций над множествами: пересечение (*) имеет тот же приоритет, что и арифметические операции умножения и деления; объединение (+) и разность (-) занимают следующий, более низкий уровень приоритета, аналогично арифметическим операциям сложения и вычитания; на самом нижнем уровне находятся операции сравнения множеств (=, <>, <=, >=) и проверки принадлежности элемента множеству (in). Операции одного приоритета выполняются слева направо. Для изменения порядка выполнения операций используются круглые скобки.

Использование множеств

Наиболее эффективно множество может быть использовано для замены операторов if, например, для проверки наличия некоторого ответа в списке разрешённых. Приведённая ниже программа ввода строки символов, содержащей латинские буквы, цифры и пробелы с контролем правильности введённых символов, может служить примером использования множеств:

program Project1;

{$APPTYPE CONSOLE}

var
str: string;
L: byte;
t: boolean;

Множества

Введение

От рассмотрения простых типов данных переходим к более сложным наборам данных. Следует вспомнить, что простые типы данных позволяют хранить одно-единственное значение в одной переменной. Структуры данных позволяют хранить сразу несколько значений, причём некоторые такие структуры теоретически вообще не имеют ограничения на количество значений - этот предел определяется лишь объёмом доступной памяти. Сегодня мы поговорим о множествах.

Математическое понятие множества.

Вспомним, как определяется множество в математике. Множество - это конечный или бесконечный набор определённых объектов, мыслимый как единое целое. Множество характеризуется своими элементами, а элементы имеют лишь одно свойство - принадлежность к данному множеству. Таким образом, мы можем только сказать, принадлежит элемент данному множеству или не приналдежит. Порядок расположения элементов в множестве никакой роли не играет.

Множества в Delphi.

Понятие множества в языке программирования несколько отличается от математического определения этого понятия, но смысл сохраняется. Основное отличие в том, что в программировании множество может содержать только конечное число элементов, т.е. не может состоять из бесконечного числа объектов. В математике же последнее допустимо. Например, мы можем определить множество натуральных чисел, которое бесконечно: N = {1, 2, 3, ...}

Следует понимать, что множество не предназначено для хранения каких-либо значений (чисел, символов и т.д.) - оно лишь может дать нам ответ на вопрос: присутствует конкретный элемент в множестве или его там нет.

Перейдём ближе к делу. Множество может быть построено на основе перечислимого типа данных (кто забыл - открываем предыдущий урок). Например, на основе символьного типа Char. По-английски множество называется set (набор) и именно этим словом описывается в Delphi:

приведёткошибке "Set base type out of range".

Задание множеств.

В математике множество обычно записывается в виде фигурных скобок, в которых через запятую перечисляются элементы, принадлежащие множеству. В Delphi вместо фигурных скобок используются квадратные.

Чтобы задать множество, мы можем воспользоваться операцией присваивания, где слева стоит переменная-множество, а справа - нужный нам набор. Например, в описанное выше множество A мы хотим поместить элементы-символы A, B, C, D. Тогда это запишется так:

Мы просто указали диапазон значений, который должен находиться во множестве. Результаты одинаковый, но вторая запись короче и красивее. Допустимы, конечно же, комбинации диапазонов и отдельных значений:

A:=["A","B","K".."N","R","X".."Z"];

Помните, что множество - это виртуальный набор элементов: множество нельзя ввести с клавиатуры и точно так же нельзя вывести на экран. Поэтому добавление элементов во множество делается только программным путём. Безусловно, вы каким-либо образом можете связать элементы интерфейса программы и операцию добавления элементов во множество, но напрямую ввести множество нельзя. Аналогично, вы можете показать множество на экране с помощью каких-либо элементов (например, флажков TCheckBox), но само множество "в чистом виде" вывести нельзя.

Операции над множествами.

В программировании, как и в математике, над множествами допустимы некоторые операции. Рассмотрим их.

Находится ли элемент во множестве?

Самая простая операция, для понятия смысла которой даже не нужно задумываться. Чтобы проверить, входит ли элемент во множество, следует использовать специальную конструкцию с оператором in. Слева от него указывается элемент, справа - множество. Результатом, как несложно догадаться, является логичное значение - истина или ложь. True - элемент принадлежит множеству, False - не принадлежит:

Несложно проверить, что сообщение в данном случае появится на экране.

Объединение множеств

Если есть два множества, определённые на одном и том же типе данных, то их можно объединить и получить таким образом новое множество.

Если изобразить множества в виде кругов, причём круги пересекаются в том случае, если у множеств есть одинаковые элементы, то объединение можно изобразить следующим образом:

В словесном описании операция объединения - результирующее множество содержит все те элементы, которые есть хотя бы в одном из двух исходных множеств.

Объединение записывается знаком плюс "+". Пример:

var A,B,C: set of Char; {...} A:=["A","B","C"]; B:=["X","Y","Z"]; C:=A+B; //C = ["A","B","C","X","Y","Z"]

Включение одного элемента во множество делается точно таким же образом, просто в этом случае включаемое множество содержит всего один элемент.

Пересечение множеств

Операция пересечения формирует множество только из тех элементов, которые одновременное присутствуют как в первом, так и во втором исходном множестве. Операция пересечения графически:

Пересечение обозначается звёздочкой "*". Пример:

Следует обратить внимание, что порядок множеств в данном случае важен, т.е. X-Y и Y-X - это разные множества.

Применение множеств.

Множества находят широкое применение. С помощью множеств удобно задавать набор опций, каждая из которых либо включена, либо выключена. К примеру, поместите на форму кнопку (TButton), перейдите в инспектор объектов, разверните свойство Font (шрифт) и найдите свойство Style. Вот это свойство как раз и реализовано множеством. Во множестве 4 элемента: fsBold, fsItalic, fsUnderline и fsStrikeOut, каждый из которых отвечает за стиль шрифта. Принадлежность элементов ко множеству задаётся указанием значения True или False для каждого из этих пунктов. В строке "Style" находится описание данного множества. Попробуйте изменять стиль и посмотреть, как меняется описание множества Style.

А теперь давайте сделаем простенький интерфейс для доступа к этому свойству. Пусть будет меняться стиль шрифта у этой кнопки (Button1). Поместим на форму 4 TCheckBox - для доступа ко всем значениям и дадим им соответствующие имена. Изменение стиля будем делать при нажатии на саму эту кнопку. Пример реализации:

Чтобы не повторять везде одно и то же "Button1.Font.", эту часть кода можно, что называется, вынести за скобку при помощи специального оператора with. Ранее речь о нём не шла, однако этот оператор очень удобен. Смысл его прост: то, что вынесено вперёд, автоматически применяется ко всему, что находится внутри данного блока. В нашем случае будет так:

Согласитесь, так гораздо удобнее. Используйте оператор with как можно чаще - с его помощью и код по объёму становится меньше и скорость работы увеличивается.

У большинства компонент среди свойств можно найти множества. Например, у диалога открытия файла TOpenDialog (вкладка Dialogs) множеством представлено свойство Options, которое содержит приличное число элементов:

Вы спросите - а что это за названия элементов у множеств? Ответ прост - это специально объявленный перечислимый тип данных, на основе которого и создано множество. Если немного покопать, то можно найти описание этого типа:

TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly, ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCreatePrompt, ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCreate, ofNoNetworkButton, ofNoLongNames, ofOldStyleDialog, ofNoDereferenceLinks, ofEnableIncludeNotify, ofEnableSizing, ofDontAddToRecent, ofForceShowHidden); TOpenOptions = set of TOpenOption;

Как видите, ничего сверхестественного здесь нет - вам всё уже знакомо.

Заключение

Сегодня мы познакомились с множествами - наборами элементов. С помощью множеств реализованы свойства многих компонент. Множества не дают возможности хранить какие-либо значения - они просто позволяют создавать наборы из значений перечислимых типов данных. Но во многих случаях использование множеств - лучший и самый быстрый способ хранения некоторого набора параметров.

Из книги Информатика и информационные технологии: конспект лекций автора Цветкова А В

Из книги Язык программирования С# 2005 и платформа.NET 2.0. автора Троелсен Эндрю

Компиляция множества файлов В данном варианте приложение TestApp.exe использует один файл исходного кода *.cs. Вполне возможно, чтобы все типы.NET-приложения были представлены в одном файле *.cs, но большинство проектов компонуется из множества файлов *.cs, чтобы программный код

Из книги Delphi. Учимся на примерах автора Парижский Сергей Михайлович

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

8.1.9. Массивы как математические множества В большинстве языков множества напрямую не реализованы (Pascal составляет исключение). Но массивы в Ruby обладают некоторыми свойствами, которые позволяют использовать их как множества. В данном разделе мы рассмотрим эти свойства и

Из книги Технология XSLT автора Валиков Алексей Николаевич

Из книги Программирование на языке Пролог для искусственного интеллекта автора Братко Иван

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

11.3.1. Списковое представление множества кандидатов В нашей первой реализации этой идеи мы будем использовать следующее представление для множества путей-кандидатов. Само множество будет списком путей, а каждый путь - списком вершин, перечисленных в обратном порядке, т.е.

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

11.3.2. Древовидное представление множества кандидатов Рассмотрим теперь еще одно изменение нашей программы поиска в ширину. До сих пор мы представляли множества путей-кандидатов как списки путей. Это расточительный способ, поскольку начальные участки путей являются

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

26.6.1. Создание множества семафоров Для создания множества семафоров или подключения к уже существующему множеству используется системный вызов semget():int semget(key_t key, int nsems, int semflg);Первый аргумент - это ключ IPC, который, как обычно, создается системным вызовом ftok(). Он

Из книги Новый ум короля [О компьютерах, мышлении и законах физики] автора Пенроуз Роджер

Использование возможностей множества транзакций Клиент Firebird может запустить множество параллельных транзакций. Пользовательская работа с множеством задач в одном приложении может выполнять различные действия с теми же самыми (или перекрывающимися) наборами данных.

Из книги Разработка ядра Linux автора Лав Роберт

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

Из книги Язык программирования ABC PASCAL автора Цветков Александр Станиславович

Из книги автора

Множества объектов kset Множества kset представляют собой коллекции объектов kobject. Множество kset работает как базовый контейнерный класс для объектов, например, "все блочные устройства". Множества kset очень похожи на типы ktype, и возникает вопрос: "Для чего нужны два разных

Введение

От рассмотрения простых типов данных переходим к более сложным наборам данных. Следует вспомнить, что простые типы данных позволяют хранить одно-единственное значение в одной переменной. Структуры данных позволяют хранить сразу несколько значений, причём некоторые такие структуры теоретически вообще не имеют ограничения на количество значений - этот предел определяется лишь объёмом доступной памяти. Сегодня мы поговорим о множествах.

Математическое понятие множества

Вспомним, как определяется множество в математике. Множество - это конечный или бесконечный набор определённых объектов, мыслимый как единое целое. Множество характеризуется своими элементами, а элементы имеют лишь одно свойство - принадлежность к данному множеству. Таким образом, мы можем только сказать, принадлежит элемент данному множеству или не приналдежит. Порядок расположения элементов в множестве никакой роли не играет.

Множества в Delphi

Понятие множества в языке программирования несколько отличается от математического определения этого понятия, но смысл сохраняется. Основное отличие в том, что в программировании множество может содержать только конечное число элементов, т.е. не может состоять из бесконечного числа объектов. В математике же последнее допустимо. Например, мы можем определить множество натуральных чисел, которое бесконечно: N = {1, 2, 3, ...}

Следует понимать, что множество не предназначено для хранения каких-либо значений (чисел, символов и т.д.) - оно лишь может дать нам ответ на вопрос: присутствует конкретный элемент в множестве или его там нет.

Перейдём ближе к делу. Множество может быть построено на основе перечислимого типа данных (кто забыл - открываем предыдущий урок). Например, на основе символьного типа Char. По-английски множество называется set (набор ) и именно этим словом описывается в Delphi:

var A: set of Char ;

В данном примере мы объявили множество A на основе символьного типа Char.

Запомните: множество не может состоять более чем из 255 элементов!

Например, следующее описание:

var N: set of Integer ;

приведёт к ошибке "Set base type out of range ".

Задание множеств

В математике множество обычно записывается в виде фигурных скобок, в которых через запятую перечисляются элементы, принадлежащие множеству. В Delphi вместо фигурных скобок используются квадратные.

Чтобы задать множество, мы можем воспользоваться операцией присваивания, где слева стоит переменная-множество, а справа - нужный нам набор. Например, в описанное выше множество A мы хотим поместить элементы-символы A, B, C, D. Тогда это запишется так:

A:=[ "A" ,"B" ,"C" ,"D" ] ;

Теперь множество A содержит 4 элемента.

Если вспомнить, что тип данных Char упорядочен, то данную запись можно сократить следующим образом:

A:=[ "A" .."D" ] ;

Мы просто указали диапазон значений, который должен находиться во множестве. Результаты одинаковый, но вторая запись короче и красивее. Допустимы, конечно же, комбинации диапазонов и отдельных значений:

A:=[ "A" ,"B" ,"K" .."N" ,"R" ,"X" .."Z" ] ;

Помните, что множество - это виртуальный набор элементов: множество нельзя ввести с клавиатуры и точно так же нельзя вывести на экран. Поэтому добавление элементов во множество делается только программным путём. Безусловно, вы каким-либо образом можете связать элементы интерфейса программы и операцию добавления элементов во множество, но напрямую ввести множество нельзя. Аналогично, вы можете показать множество на экране с помощью каких-либо элементов (например, флажков TCheckBox), но само множество "в чистом виде" вывести нельзя.

Операции над множествами

В программировании, как и в математике, над множествами допустимы некоторые операции. Рассмотрим их.

Находится ли элемент во множестве?

Самая простая операция, для понятия смысла которой даже не нужно задумываться. Чтобы проверить, входит ли элемент во множество, следует использовать специальную конструкцию с оператором in . Слева от него указывается элемент, справа - множество. Результатом, как несложно догадаться, является логичное значение - истина или ложь. True - элемент принадлежит множеству, False - не принадлежит:

var A: set of Char ; {...} A:=[ "A" .."E" ,"X" ] ; if "D" in A then ShowMessage("Элемент В находится во множестве A." ) ;

Несложно проверить, что сообщение в данном случае появится на экране.

Если есть два множества, определённые на одном и том же типе данных, то их можно объединить и получить таким образом новое множество.

Если изобразить множества в виде кругов, причём круги пересекаются в том случае, если у множеств есть одинаковые элементы, то объединение можно изобразить следующим образом:

В словесном описании операция объединения - результирующее множество содержит все те элементы, которые есть хотя бы в одном из двух исходных множеств.

Объединение записывается знаком плюс "+ ". Пример:

var A,B,C: set of Char ; {...} A:=[ "A" ,"B" ,"C" ] ; B:=[ "X" ,"Y" ,"Z" ] ; C:=A+B; //C = ["A","B","C","X","Y","Z"]

Включение одного элемента во множество делается точно таким же образом, просто в этом случае включаемое множество содержит всего один элемент.

Операция пересечения формирует множество только из тех элементов, которые одновременное присутствуют как в первом, так и во втором исходном множестве. Операция пересечения графически:

Пересечение обозначается звёздочкой "* ". Пример:

var X,Y,Z: set of Byte ; {...} X:=[ 1 ,2 ,3 ,4 ,5 ] ; Y:=[ 4 ,5 ,6 ,7 ,8 ] ; Z:=X*Y; //Z =

Операция вычитания удаляет из первого множества те элементы, которые есть во втором множестве:

var X,Y,Z: set of Char ; {...} X:=[ "A" .."D" ] ; Y:=[ "D" .."F" ] ; Z:=X-Y; //Z = ["A".."C"]

Следует обратить внимание, что порядок множеств в данном случае важен, т.е. X-Y и Y-X - это разные множества.

Применение множеств

Множества находят широкое применение. С помощью множеств удобно задавать набор опций, каждая из которых либо включена, либо выключена. К примеру, поместите на форму кнопку (TButton), перейдите в инспектор объектов, разверните свойство Font (шрифт) и найдите свойство Style. Вот это свойство как раз и реализовано множеством. Во множестве 4 элемента: fsBold, fsItalic, fsUnderline и fsStrikeOut, каждый из которых отвечает за стиль шрифта. Принадлежность элементов ко множеству задаётся указанием значения True или False для каждого из этих пунктов. В строке "Style" находится описание данного множества. Попробуйте изменять стиль и посмотреть, как меняется описание множества Style.

А теперь давайте сделаем простенький интерфейс для доступа к этому свойству. Пусть будет меняться стиль шрифта у этой кнопки (Button1). Поместим на форму 4 TCheckBox - для доступа ко всем значениям и дадим им соответствующие имена. Изменение стиля будем делать при нажатии на саму эту кнопку. Пример реализации:

procedure TForm1.Button1Click (Sender: TObject ) ; begin Button1.Font .Style := ; //Сделали множество пустым if CheckBox1.Checked then Button1.Font .Style :=Button1.Font .Style +[ fsBold] ; if CheckBox2.Checked then Button1.Font .Style :=Button1.Font .Style +[ fsItalic] ; if CheckBox3.Checked then Button1.Font .Style :=Button1.Font .Style +[ fsUnderline] ; if CheckBox4.Checked then Button1.Font .Style :=Button1.Font .Style +[ fsStrikeOut] ; end ;

Чтобы не повторять везде одно и то же "Button1.Font .", эту часть кода можно, что называется, вынести за скобку при помощи специального оператора with . Ранее речь о нём не шла, однако этот оператор очень удобен. Смысл его прост: то, что вынесено вперёд, автоматически применяется ко всему, что находится внутри данного блока. В нашем случае будет так:

procedure TForm1.Button1Click (Sender: TObject ) ; begin with Button1.Font do begin Style:= ; //Сделали множество пустым //Теперь смотрим состояния флажков и добавляем нужные стили if CheckBox1.Checked then Style:=Style+[ fsBold] ; if CheckBox2.Checked then Style:=Style+[ fsItalic] ; if CheckBox3.Checked then Style:=Style+[ fsUnderline] ; if CheckBox4.Checked then Style:=Style+[ fsStrikeOut] ; end end ;

Согласитесь, так гораздо удобнее. Используйте оператор with как можно чаще - с его помощью и код по объёму становится меньше и скорость работы увеличивается.

У большинства компонент среди свойств можно найти множества. Например, у диалога открытия файла TOpenDialog (вкладка Dialogs) множеством представлено свойство Options, которое содержит приличное число элементов:

Вы спросите - а что это за названия элементов у множеств? Ответ прост - это специально объявленный перечислимый тип данных, на основе которого и создано множество. Если немного покопать, то можно найти описание этого типа:

TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly, ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCreatePrompt, ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCreate, ofNoNetworkButton, ofNoLongNames, ofOldStyleDialog, ofNoDereferenceLinks, ofEnableIncludeNotify, ofEnableSizing, ofDontAddToRecent, ofForceShowHidden) ; TOpenOptions = set of TOpenOption; Как видите, ничего сверхестественного здесь нет - вам всё уже знакомо.

Заключение

Сегодня мы познакомились с множествами - наборами элементов. С помощью множеств реализованы свойства многих компонент. Множества не дают возможности хранить какие-либо значения - они просто позволяют создавать наборы из значений перечислимых типов данных. Но во многих случаях использование множеств - лучший и самый быстрый способ хранения некоторого набора параметров.