Політ: книга програмера  
0. Вступ
1. Особливості політівських програм
2. Події та їх обробники
3. Елементи керування: принципи, Button, Label, Check, Radio,
InpLine, PicCtl, Header, Progress, Track, TimerCtl, Notebook,
SpinEdit, PopupBtn, Switcher, MainMenu, Splitter, Memo, ListBox

Сайт Польоту
 

Елементи керування
Радіокнопка - Radio (модуль Ctl)

Радіокнопка дуже схожа на флажок. Відмінність у тому, що радіокнопки зустрічаються лише групами, причому в групі лише одна з радіокнопок вибрана. А всі інші, відповідно, невибрані. Коли юзер клікає на одній із радіокнопок, вона стає вибраною, а вибрана до цього стає невибраною. Наскільки я пам'ятаю, назвали їх за аналогією з перемикачем діапазонів на радіоприймачі, який вибирає один діапазон із кількох доступних. Через схожість радіокнопки на флажок я навіть тексти опису де можна просто копіював із опису флажка :).



Створення радіокнопки
Function Radio_Create(Prog:PProg; VCaption:String; 
  VSelected:Boolean; VGroup:Integer): PControl;
  • VCaption - підпис радіокнопки.
  • VSelected - стан радіокнопки (True - вибрана, False - не вибрана).
  • VGroup - індекс групи радіокнопок. Передбачений на випадок, коли в одному вікні буде кілька незалежних груп радіокнопок. Індекси ці можете вибирати як завгодно, головне щоб для кожної групи індекс цей був свій (унікальний). Наприклад, всім радіокнопкам першої групи вказуємо індекс 1, всім радіокнопкам другої - 2, третьої - 342 і так далі.


Установити обробник кліку на радіокнопці
Procedure Radio_SetOnChange(Me:PControl;
  VOnChange:TCtlHandler);
Призначити процедуру, яка викликатиметься при зміні стану радіокнопки. Якщо ви плануєте користуватись цим обробником, звичайно він встановлюється цією процедурою відразу після створення радіокнопки.



Намалювати радіокнопку
Procedure Radio_Paint(Me:PControl; VX1, VY1:Integer);
Так само, як і для флажка, вказуємо лише координати лівого верхнього краю радіокнопки. Її висота дорівнює 16 пікселям, а ширина залежить від ширини підпису.



Зробити радіокнопку вибраною
Procedure Radio_Select(Me:PControl);
Робить вказану радіокнопку вибраною в її групі. Попередньо знімає вибір із раніше вибраної в цій групі радіокнопки.



Отримати стан радіокнопки
Function Radio_Selected(Me:PControl): Boolean;
Основний прийом роботи з радіокнопками :).



Приклад розглянемо аналогічний прикладу із флажками. Хай у нас будуть дві групи радіокнопок, три штуки в одній та чотири в другій, а також мітка, що показуватиме вибрані зараз радіокнопки в обох групах. Робимо заготовку TestRad і починаємо додавати змінні:
RadQ, RadK, RadA: PControl;
Rad1, Rad2, Rad3, Rad4: PControl;
LabState: PControl;
Створюємо елементи (певен, ви уже знаєте, де саме):
RadQ:=Ctl.Radio_Create(Me, 'Дама', True, 1);
RadK:=Ctl.Radio_Create(Me, 'Король', False, 1);
RadA:=Ctl.Radio_Create(Me, 'Туз', Falsee, 1);
Rad1:=Ctl.Radio_Create(Me, 'Чирва', True, 2);
Rad2:=Ctl.Radio_Create(Me, 'Бубна', False, 2);
Rad3:=Ctl.Radio_Create(Me, 'Пiка', False, 2);
Rad4:=Ctl.Radio_Create(Me, 'Хрест', False, 2);
LabState:=Ctl.Label_Create(Me, 'Дама, Чирва', Nil,
  lsBeveled, alCenter);
Звернули увагу - у кожній із груп (1 і 2) вибрано рівно по одній радіокнопці. В принципі при їх створенні ніяких перевірок не робиться; можна зробити вибраними 0, 2.. радіокнопки. Але при першому ж кліку юзера справедливість буде відновлена - вибраною в групі залишиться тільки клікнута радіокнопка.
Отже, після цього призначаємо радіокнопкам обробник зміни стану:
Ctl.Radio_SetOnChange(RadQ, OnRadioChange);
Ctl.Radio_SetOnChange(RadK, OnRadioChange);
Ctl.Radio_SetOnChange(RadA, OnRadioChange);
Ctl.Radio_SetOnChange(Rad1, OnRadioChange);
Ctl.Radio_SetOnChange(Rad2, OnRadioChange);
Ctl.Radio_SetOnChange(Rad3, OnRadioChange);
Ctl.Radio_SetOnChange(Rad4, OnRadioChange);
Можна було б навіть запихати всі ці радіокнопки в масив і призначити їм всім обробник двома рядками, щось типу:
For I:=1 To 7 Do
  Ctl.Radio_SetOnChange(Rad[I], OnRadioChange);
Але це так, до слова. Отже, далі пишемо цей самий обробник OnRadioChange:
Procedure OnRadioChange(Me:PProg; Control:PControl);
Var
  TempStr: String;
Begin
  With Me^, TTestRadData(Data^) Do
  Begin
    If Radio_Selected(RadQ) Then TempStr:='Дама';
    If Radio_Selected(RadK) Then TempStr:='Король';
    If Radio_Selected(RadA) Then TempStr:='Туз';
    TempStr:=TempStr+', ';
    If Radio_Selected(Rad1) Then TempStr:=TempStr+'Чирва';
    If Radio_Selected(Rad2) Then TempStr:=TempStr+'Бубна';
    If Radio_Selected(Rad3) Then TempStr:=TempStr+'Пiка';
    If Radio_Selected(Rad4) Then TempStr:=TempStr+'Хрест';
    Ctl.Label_SetCaption(LabState, TempStr)
  End
End;
Працює це абсолютно так само, як і попередня програмка про флажки. При виборі будь-якої з радіокнопок викликається обробник OnRadioChange. Він дивиться, яка з радіокнопок вибрана у першій та у другій групах, та відповідно формує текст мітки.