|
Вопрос # 2 160/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
У меня на форме 4 RadioButton(o1,o2,o3 и o4) и одна кнопка Button1.
В Button1Click я прописываю условие if o1.Checked then b=1 else b=0;
Есть переменная e:integer; она принимает значение от 1 до 4.
Вопрос в том как сделать так, чтобы если переменная e равна 3, то b равнялась бы единице если нажата o3, если e=4, то при нажатии o4?
 |
Вопрос задал: Ученый (статус: 8-ой класс)
Вопрос отправлен: 5 декабря 2008, 19:05
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: ANBsoft
Здравствуйте, Ученый!
b:=Byte(o1.Checked)+2*Byte(o2.Checked)+3*Byte(o3.Checked)+4*Byte(o4.Checked);
 |
Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 5 декабря 2008, 19:16
Оценка за ответ: 5
|
Ответ #2. Отвечает эксперт: Anderson N.N
Здравствуйте, Ученый!
// Думаю я тебе правильно понял
//Короче создаешь один обработчик для своих TRadioButton
//надеюсь умеешь это делать,
// дальше все просто
Приложение: Переключить в обычный режим- procedure TForm1.o1Click(Sender: TObject);
- begin
- if (TRadioButton(sender).Checked) then
- begin
- if (TRadioButton(sender).name='o1')
- then
- if (e=1) then
- begin
- b:=1;
- exit;
- end
- else b:=0;
- if (TRadioButton(sender).name='o2')
- then
- if (e=2) then
- begin
- b:=1;
- exit;
- end
- else b:=0;
- if (TRadioButton(sender).name='o3')
- then
- if (e=3) then
- begin
- b:=1;
- exit;
- end
- else b:=0;
- if (TRadioButton(sender).name='o1')
- then
- if (e=4) then
- begin
- b:=1;
- exit;
- end
- else b:=0;
- end;
- end;
 |
Ответ отправил: Anderson N.N (статус: 2-ой класс)
Время отправки: 6 декабря 2008, 15:34
Оценка за ответ: 4
Комментарий к оценке: Не рационально!
|
Мини-форум вопроса
Всего сообщений: 12; последнее сообщение — 5 декабря 2008, 21:27; участников в обсуждении: 4.
|
Ученый (статус: 8-ой класс), 5 декабря 2008, 19:19 [#1]:
Бубырь Александр Николаевич, что то я неувидил зависимости от переменной е?
|
|
ANBsoft (статус: Студент), 5 декабря 2008, 19:22 [#2]:
Немного непонятно сформулировано, возможно:
b:=Byte(e=(Byte(o1.Checked)+2*Byte(o2.Checked)+3*Byte(o3.Checked)+4*Byte(o4.Checked));
|
|
Ученый (статус: 8-ой класс), 5 декабря 2008, 19:26 [#3]:
Кажеться сам разобрался с этой проблемой, просто надобыло прописать:
case a of
1: if o1.Checked then b:=1 else b:= 0;
2: if o2.Checked then b:= 1 else b:= 0 ;
3: if o3.Checked then b:= 1 else b:= 0;
4: if o4.Checked then b:= 1 else b:= 0 ;
end;
Хотя и ваш вариант сейчас проверю.
|
|
Вадим К (статус: Академик), 5 декабря 2008, 19:27 [#4]:
а проще просто поставить RadioGroup. И никаких проблем
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Dron (статус: Студент), 5 декабря 2008, 19:29 [#5]:
case a of
1: if o1.Checked then b:=1 else b:= 0;
2: if o2.Checked then b:= 1 else b:= 0 ;
3: if o3.Checked then b:= 1 else b:= 0;
4: if o4.Checked then b:= 1 else b:= 0 ;
end;
можно модернизировать до:
if TCheckBox(FindComponent('o'+IntToStr(a))).Checked then b:=1 else b:=0;
С уважением.
|
|
Ученый (статус: 8-ой класс), 5 декабря 2008, 19:33 [#6]:
to Dron. Вот это как раз то что я и искал, спасибо!
|
|
ANBsoft (статус: Студент), 5 декабря 2008, 19:38 [#7]:
Один нюанс, если вдруг Е окажется вне пределов (1...4), то в 1 случае В будет неопределено, во втором выдаст ошибку что компонент не найден.
|
|
Ученый (статус: 8-ой класс), 5 декабря 2008, 19:40 [#8]:
Бубырь Александр Николаевич вы правы, но е точно определена, она имеет значения только от 1 до 4.
|
|
Ученый (статус: 8-ой класс), 5 декабря 2008, 19:46 [#9]:
То Бубырь Александр Николаевич, проанализировал ваш ответ и понял что в данном случае значение складывается как бы из нажатых RadioButton причем нажатие каждого имеет свою величину, но это не то что мне нужно. Возможно просто я не совсем понятно изложил проблему в вопросе и прошу за это извенение.
|
|
ANBsoft (статус: Студент), 5 декабря 2008, 20:02 [#10]:
b:=Byte(e=(Byte(o1.Checked)+2*Byte(o2.Checked)+3*Byte(o3.Checked)+4*Byte(o4.Checked));
Дает нужный Вам результат?
|
|
Ученый (статус: 8-ой класс), 5 декабря 2008, 20:11 [#11]:
Проверил и действительно дает нужный мне результат! Если вы дадите коментарий к этому коду буду очень благодарен.
|
|
ANBsoft (статус: Студент), 5 декабря 2008, 21:27 [#12]:
Коментарии:
1) Byte(Boolean) - возвращает 0 при False и 1 при True
2) ((Byte(o1.Checked)+2*Byte(o2.Checked)+3*Byte(o3.Checked)+4*Byte(o4.Checked)) возвращает 1 если o1.Checked, 2 если o2.Checked и так далее
3) b:=Byte(e=(Byte(o1.Checked)+2*Byte(o2.Checked)+3*Byte(o3.Checked)+4*Byte(o4.Checked)); если е равно вычисленному во 2 - вернет 1, иначе 0.
Все.
Преобразование Boolean в Integer, иногда бывает нужно.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|