Логические типы, конструкции и компоненты
Контейнеры для флажков и радиокнопок
Можно конечно, пользоваться и единичными компонентами TCheckBox и TRadioButton, однако куда проще использовать для этого контейнеры, особенно когда флажков и радиокнопок много. Для флажков используется контейнер TCheckGroup, а для радиокнопок - TRadioGroup. Оба компонента располагаются на вкладке Standard Палитры компонентов. Чтобы не мучаться с изменением дизайна и кода нашего проекта, будет проще этот проект закрыть, и создать новый.
Свойство Name формы переименуйте сразу в fMain, в свойстве Caption впишите текст
Выборы
Свойство BorderStyle имеет смысл перевести в bsDialog, а Position - в poDesktopCenter. Далее, сохраните проект под именем election в папку 07-02, модулю главной формы дайте имя Main.
Теперь можем заняться контейнерами:
Слева на форму установите контейнер для радиокнопок TRadioGroup. Выделите его, и измените свойство Name на RG1. Свойство Caption контейнера формирует общий заголовок, впишем там слово Кандидаты.
Теперь обратите внимание на свойство Items. Это сложное свойство, содержит текст всех радиокнопок (набор строк). Щелкните по кнопке "…" правее свойства:
Откроется простой текстовый редактор, где вы можете указать текст ваших радиокнопок. Текст каждой радиокнопки должен располагаться на отдельной строке. Как и в прошлом случае, введите такие строки:
Путин Медведев Жириновский Зюганов Прохоров
Обратите внимание: если вы будете увеличивать высоту контейнера, расстояние между полученными радиокнопками будет увеличиваться. И наоборот. Подберите наиболее оптимальное расстояние между ними.
Правее этого контейнера установите контейнер для флажков TCheckGroup. Его свойство Name переименуйте в ChG1, а в свойстве Caption напишите Города. Этот контейнер также имеет сложное свойство Items, которое содержит текст всех флажков. Щелкните по кнопке "…" правее этого свойства, и в Диалоге ввода строк запишите такие строки:
Москва Санкт-Петербург Воронеж Саратов Уфа
В нашем проекте это будут проголосовавшие города. Ниже контейнеров установите кнопку, в свойстве Caption которой напишите Результат. Окончательный вид окна у вас должен быть примерно таким:
Теперь, прежде чем мы приступим к программированию события нажатия на кнопку, разберем еще кое-что. Контейнер флажков TCheckGroup имеет свойство Checked, которое будет доступно при работе программы. Это свойство логического типа, оно указывает, включен ли флажок. А чтобы разобраться, какой именно флажок включен, после свойства, в квадратных скобках, указывают индекс флажка. Индексы начинаются с нуля, поэтому, чтобы узнать, включен ли первый флажок, нужно выполнить код
if ChG1.Checked[0] then …
Не забывайте - индексы флажков всегда начинаются с нуля!
Контейнер радиокнопок TRadioGroup имеет свойство ItemIndex. Это свойство указывает, какую именно радиокнопку пользователь выбрал, индексация у них также начинается с нуля. По умолчанию, свойство равно -1. Это означает, что никакая радиокнопка не выбрана. Таким образом, чтобы выполнить действие для первой радиокнопки, мы должны проверить, выбрана ли она:
if RG1.ItemIndex = 0 then …
Чтобы повторить предыдущий пример, укажем 0 в свойстве ItemIndex (здесь индексы тоже начинаются с нуля) - радиокнопка Путин окажется выбранной по умолчанию. Не забывайте после ввода в свойства каких-то значений нажимать <Enter>, чтобы подтвердить изменения.
Теперь, когда мы знаем, как определить, какие флажки включены и какая радиокнопка выбрана, займемся программированием события нажатия на кнопку.
procedure TfMain.Button1Click(Sender: TObject); var s: String; //для формирования строки с проголосовавшими городами begin //сначала укажем победителя: if RG1.ItemIndex = 0 then ShowMessage('Вы выбрали Путина') else if RG1.ItemIndex = 1 then ShowMessage('Вы выбрали Медведева') else if RG1.ItemIndex = 2 then ShowMessage('Вы выбрали Жириновского') else if RG1.ItemIndex = 3 then ShowMessage('Вы выбрали Зюганова') else ShowMessage('Вы выбрали Прохорова'); //теперь нужно что-то присвоить переменной s, чтобы инициализировать //ее. присвоим просто пустую строку: s:= ''; //теперь будем собирать строку s, в зависимости от включенных флажков //после каждой строки будем вставлять знак перехода на новую строку if ChG1.Checked[0] then s:= s + 'Москва проголосовала' + #13; if ChG1.Checked[1] then s:= s + 'Санкт-Петербург проголосовал' + #13; if ChG1.Checked[2] then s:= s + 'Воронеж проголосовал' + #13; if ChG1.Checked[3] then s:= s + 'Саратов проголосовал' + #13; if ChG1.Checked[4] then s:= s + 'Уфа проголосовала' + #13; //Если хоть один флажок был включен, то строка s не пуста. //покажем ее в этом случае: if s <> '' then ShowMessage(s); end;
Комментарии исчерпывающие, каких то затруднений с кодом у вас возникнуть не должно. Единственное, замечу, что если не проинициализировать вначале переменную s, то есть, не присвоить ей какое-то значение, хоть и пустую строку, в окне сообщений при компиляции может выйти напоминание:
Warning: Local variable "s" does not seem to be initialized
Дело в том, что дальше мы пытаемся использовать значение строки s:
… s:= s + 'Москва проголосовала' + #13;
А компилятор не знает, имеется ли там что-то, или просто мусор? Ошибки не будет, но все равно, переменные желательно вначале инициализировать: строковым присваивать пустую строку, числовым - значение 0 (обнулять). Логические по умолчанию сами принимают значение False.
Сохраните проект и запустите его на выполнение.