Компоненты Delphi страницы Standart

Компонент Delphi RadioButton




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



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

   Если в начальный момент ни один из компонентов не выбран, то достаточно сделать такой выбор - щёлкнуть по одному из компонентов, и в дальнейшем можно только "переключать" компоненты, снять выбор уже невозможно. Хотя нет, есть способ - программно!

   Компонент Delphi RadioButton состоит из круглого окошка и текстовой строки. В окошке появляется отметка выбора данного компонента, текстовая строка поясняет его смысл. За изменение текстовой строки отвечает свойство Caption. Основное же свойство компонента Delphi RadioButton - Checked (т.е. "выбрано") типа Boolean, доступное как для чтения, так и для записи. У выбранного компонента свойство Checked равно True.

На данной Форме
   RadioButton1.Checked = True;
   RadioButton2.Checked = False;
   RadioButton13Checked = False;

Для выбора, например, компонента RadioButton2 достаточно написать
   RadioButton2.Checked := True;// отметка с RadioButton1 будет снята автоматически.

Для снятия выбора нужно в программе написать
   RadioButton1.Checked := False;// теперь ни один из компонентов не выбран. Вручную этого достичь невозможно.

   Основным событием компонента Delphi RadioButton является, естественно, OnClick, то есть щелчок мышкой. В этот момент могут быть выполнены процедуры, соответствующие выбору этого компонента.

ПРИМЕР. Пусть у нас есть несколько компонентов RadioButton, и пользователь производит выбор одного из них. Затем, при нажатии кнопки, нужно проанализировать выбор пользователя, и выполнить соответствующую этому выбору процедуру. Будем исходить из предположения, что компоненты имеют имена RadioButton1, 2, 3 и так далее, а соответствующие процедуры proc1, 2, 3 и так далее.
   Введём глобальную переменную, принимающую значение 1, 2, 3 и так далее, соответствующее выбранному компоненту RadioButton. Присваивать значение будем по событию OnClick. Соответственно, потребуется столько обработчиков этого события, сколько компонентов RadioButton у нас в программе.
   Однако, это затратно и утомительно, плодить множество аналогичных обработчиков. Ведь, использовав параметр Sender, определённый в обработчике события OnClick, можно обойтись и одним обработчиком! Только нужно выбрать его как обработчик события OnClick для всех компонентов RadioButton. Получается такая программа, состоящая из двух процедур:

var
  Form1: TForm1;
  V: Integer;

implementation

{$R *.dfm}

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
with (Sender as TRadioButton) do
  V:=StrToInt(copy(Name, 12, Length(Name)-11));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  case V of
   1: proc1;
   2: proc2;
   3: proc3;
   4: proc4;
   5: proc5;
   6: proc6;
  end;
end;


Обзор компонентов Delphi           В начало урока          Компонент Delphi ListBox

Уроки Delphi начинающим



Вопросы и комментарии (23)      Решение задач в Delphi

Илья, добавлено 28.12.11, 23:58:42 
подскажите пжл, у меня есть допустим 2 радиобатона и несколько чекбоксов, как сделать чтобы при выборе radiobutton1, все CheckBox становились неактивными, то есть их нельзя было выбрать, а при выборе radiobutton2 все чекбоксы становились активными?
Автор, добавлено 29.12.11, 00:46:11 
Есть свойство Enabled, отвечающее за активизацию компонента CheckBox. Есть свойство Checked, отвечающее за выбор компонента RadioButton. И есть условный оператор if, с помощью него анализируют условия.

if RadioButton1.Checked then CheckBox1.Enabled:=False;
if RadioButton2.Checked then CheckBox1.Enabled:=True;
Илья, добавлено 29.12.11, 08:29:00 
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
if (CheckBox2.Enabled:=False) then begin CheckBox9.Enabled:=False; CheckBox10.Enabled:=False; end;
end;

"Type of expression must be BOOLEAN" :(
п.с. немного про другое, если один чекбокс выключен, то остальные не активны...
Автор, добавлено 29.12.11, 11:31:32 
Илья, есть сравнение знак = и есть присваивание :=

На самом деле CheckBox.Enabled не нужно сравнивать с True или False - это уже свойство типа Boolean.

Короче, в условиях вы разбираетесь. Задайте своё.
Илья, добавлено 29.12.11, 14:15:45 
1. в вашем условии "if RadioButton1.Checked then CheckBox1.Enabled:=False;" стоит именно присваивание, я пытался делать по аналогии...
2. что значит "CheckBox.Enabled не нужно сравнивать с True или False - это уже свойство типа Boolean. "? опять таки пытался по аналогии сделать, не знаю как это еще можно...
3. не знаю реально как еще... сори за тупость, 11 класс, мы еще с паскаля не слезли :D (просто интересуюсь)
Автор, добавлено 29.12.11, 23:39:05 
Согласен, ошибка у меня. Не нужно слепо копировать - мозг никто не отменял. И английский тоже вкелючайте помаленьку.

Условие CheckBox.Enabled=True и CheckBox.Enabled (если компонент не заблокирован) это одно и то же, значение равно истина, True. Противоположное значение CheckBox.Enabled=False и (not CheckBox.Enabled).
Илья, добавлено 30.12.11, 07:45:46 
проба №:
1. if checkbox1.enabled then Not checkbox3.enabled;
if checkbox2.enabled then checkbox3.enabled;

ошибки: Declaration expected but 'IF' found

2. if (checkbox1.enabled=TRUE) then checkbox3.enabled=FALSE;
if (checkbox2.enabled=TRUE) then checkbox3.enabled=FALSE;

ошибки: Declaration expected but 'IF' found

3. procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if checkbox1.enabled then Not checkbox3.enabled;
end;

procedure TForm1.CheckBox2Click(Sender: TObject);
begin
if checkbox2.enabled then checkbox3.enabled;
end;

ошибки: Stateman expected, but expression of type 'Boolean' found

ну никак ничего не выходит :( Напишите пожалуйста готовый код...

Всех с наступающим новым годом !!!

Автор, добавлено 30.12.11, 11:01:57 
А вот чтобы переопределить значение, присваивание таки необходимо. После then.
Илья, добавлено 30.12.11, 19:10:07 
спасибо заработало, теперь вот еще что:
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
if checkbox2.enabled=TRUE then begin checkbox9.enabled:=TRUE; checkbox9.enabled:=TRUE; end
else begin checkbox9.enabled:=FALSE; checkbox9.enabled:=FALSE; end;
end;

тут ошибок не выдает, компилируется, но не работает :(, то есть нужно чтобы: если чекбокс1 нажат, то остальные активны, если не нажат, то остальные не активны, вроде все правильно, но на деле не работает (ошибок нет, просто все остается активно, когда снимаешь галку с чекбокс1)

и еще:
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
if (RadioButton1.Checked) then begin CheckBox1.Enabled:=False; CheckBox2.Enabled:=False;
CheckBox3.Enabled:=False; CheckBox4.Enabled:=False; CheckBox9.Enabled:=False;
CheckBox10.Enabled:=False; CheckBox11.Enabled:=False; CheckBox12.Enabled:=False; end;
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
if (RadioButton2.Checked) then begin CheckBox1.Enabled:=True; CheckBox2.Enabled:=True;
CheckBox3.Enabled:=True; CheckBox4.Enabled:=True; CheckBox9.Enabled:=True;
CheckBox10.Enabled:=True; CheckBox11.Enabled:=True; CheckBox12.Enabled:=True; end;
end;

тут тоже ошибок нет, но, если нажать один из чекбоксов, а потом нажать радиобатон1, то: чекбоксы становятся неактивными (это и нужно), но галка с нажатого чекбокса не снимается, не знаю будет ли он работать, но хотелось бы, чтобы он и не работал и галка снималась автоматом
Илья, добавлено 1.01.12, 20:35:53 
ответьте пжл :(
Автор, добавлено 2.01.12, 11:54:17 
Во-первых, когда чекбокс выделен, то свойство не Enabled а Checked.
Вовторых, нужно чтобы первоначально если первый не выделен, то второй уже был недоступен - то есть свойство Enabled=False. Лучше это сразу в Инспекторе Объектов сделать. Тогда получается. Пример: два чекбокса, при выделении первого второй становится доступен (первоначально недоступен), при снятии выделения опять недоступен.

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if checkbox1.checked
  then checkbox2.Enabled:=True
  else checkbox2.Enabled:=False;
end;

А то что галка не снимается, так вы её и не снимаете, везде пишете Enabled:=False и нигде Checked:=False.
кусака, добавлено 11.01.12, 17:21:32 
1 кнопка RadioButton
не срабатывает след код,
происхолит повтор RadioButton1Click

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
if RadioButton1.Checked = true
  then RadioButton1.Checked := false
  else RadioButton1.Checked := true ; //
Автор, добавлено 11.01.12, 19:52:51 
Нет, так ничего не выйдет. То что после then никак не может быть, а то что после else и так исполняется само но себе. Так что щелчком по компоненту вы его не сбросите. Используйте другой, например кнопку.
ГВОЗДЬ, добавлено 15.02.12, 19:44:05 
Подскажите как оформить множественный выбор из radiobutton?
через case {radiobutton} of// что сюда нужно написать?
1:getcursorpos(p);
...
end;
Автор, добавлено 15.02.12, 20:02:37 
Просто нужно воспользоваться компонентом CheckBox, он для множественного выбора.
ГВОЗДЬ, добавлено 15.02.12, 20:10:05 
Нет, вы не поняли, я хотел выбрать 1 из множества с помощью case of
Автор, добавлено 16.02.12, 12:05:37 
Для анализа можно ввести переменную, принимающую значение от 1 до например 5, по количеству компонентов. Присвоение значения переменной по событию OnClick компонента. Значит, потребуется 5 обработчиков. Но, использовав параметр Sender, можно обойтись и одним. К завтрашнему дню добавлю описание этого в основную статью.
Лора, добавлено 29.04.12, 17:37:22 
Доброго времени суток! Подскажите, пожалуйста, как сделать так, чтобы у меня текст в radiobutton мог переходить на другую строчку, если он превышает определенную длину?
Автор, добавлено 29.04.12, 19:42:58 
Посмотрите в свойствах компонента Label такую возможность. А потом проверьте в RadioButton, может у него аналогично. Точнее скажу завтра, сейчас без компа.

Ну вот, это свойство одинаковое и у Label и у RadioButton, называется WordWrap.
Лора, добавлено 2.05.12, 01:23:19 
Спасибо!
Ирина, добавлено 27.10.13, 15:08:43 
как с помощью CheckBox сделать RadioButton???
Нужно организовать группу CheckBox так, чтобы они вели себя как группа RadioButton, т. е.
1) при выборе одного пункта все остальные отменялись
2) нельзя было снять отметку
Первый пункт у меня получился, а второй никак...
procedure TStartForm.ClearCheckBox1(Sender: TObject);
begin
 if StartForm.CheckBox1.Checked then
 begin
  StartForm.CheckBox2.Checked:=False;
  StartForm.CheckBox3.Checked:=False;
 end;
end;
Автор, добавлено 27.10.13, 15:24:33 
У меня вот так получилось:

procedure TForm1.CheckBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
(Sender as TCheckBox).Checked:=True;
end;

procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
CheckBox1.Checked:=False;
CheckBox2.Checked:=False;
CheckBox3.Checked:=False;
end;

То есть по движению кнопки мыши вниз снимаем выделение со всех чекбоксов, по движению вверх - опять выделяем тот по которому щёлкали.
Ирина, добавлено 28.10.13, 20:00:39 
Спасибо огромное) а то из-за этого вопроса вся работа встала)))
Оставить комментарий:

Имя  

Текст комментария