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

Сайт Польоту
 

Елементи керування
Флажок - Check (модуль Ctl)

Флажок, або checkbox - маленька квадратна кнопочка з підписом. Він може мати один із двох станів - вибраний або не вибраний - та переключати їх кліком мишки. Чесно кажучи, елемент керування це простий як кут будинку :).



Створення флажка
Function Check_Create(Prog:PProg; VCaption:String;
  VChecked:Boolean): PControl;
  • VCaption - підпис флажка.
  • VChecked - стан флажка (True - вибраний, False - не вибраний).


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


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



Змінити підпис флажка
Procedure Check_SetCaption(Me:PControl; 
  VCaption:String);
Ніколи не користувався цією процедурою. Можливо, вона взагалі не працює :).
VCaption - новий підпис.



Встановити стан флажка
Procedure Check_SetState(Me:PControl; 
  VChecked:Boolean);
VChecked - новий стан флажка (True - вибраний, False - невибраний).



Отримати стан флажка
Function Check_GetState(Me:PControl): Boolean;
Основний прийом роботи з флажками :).



Для прикладу зробимо таку програмку. У нас буде 3 флажки - Alpha, Beta та Gamma, а також напис, що показуватиме вибрані зараз флажки. Тобто ми навісимо на флажки обробники кліку, що будуть оновлювати текст мітки. Робимо нову чисту заготовку програми та називаємо її TestChk. Починаємо зі змінних:
ChkAlpha, ChkBeta, ChkGamma, LabState: PControl;
Створюємо елементи керування:
ChkAlpha:=Ctl.Check_Create(Me, 'Alpha', False);
ChkBeta:=Ctl.Check_Create(Me, 'Beta', False);
ChkGamma:=Ctl.Check_Create(Me, 'Gamma', False);
LabState:=Ctl.Label_Create(Me, '', Nil, lsBeveled, alCenter);
Відразу ж після створення флажків призначаємо їм обробник кліку - один на всіх:
Ctl.Check_SetOnChange(ChkAlpha, OnCheckChange);
Ctl.Check_SetOnChange(ChkBeta, OnCheckChange);
Ctl.Check_SetOnChange(ChkGamma, OnCheckChange);
Тепер пишемо цей самий обробик (десь після OnPaint):
Procedure OnCheckChange(Me:PProg; Control:PControl);
Var
  TempStr: String;
Begin
  With Me^, TTestChkData(Data^) Do
  Begin
    TempStr:='';
    If Ctl.Check_GetState(GetkAlpha) Then
      TempStr:=TempStr+'Alpha ';
    If Ctl.Check_GetState(ChkBeta) Then
      TempStr:=TempStr+'Beta ';
    If Ctl.Check_GetState(ChkGamma) Then
      TempStr:=TempStr+'Gamma ';
    Ctl.Label_SetCaption(LabState, TempStr)
  End
End;
Ах да, мало не забув намалювати все це в OnPaint:
Ctl.Check_Paint(ChkAlpha, 10, 10);
Ctl.Check_Paint(ChkBeta, 10, 30);
Ctl.Check_Paint(ChkGamma, 10, 50);
Ctl.Label_Paint(LabState, 10, 70, X2-X1-10);
Тепер ніби все, можна запускати. Розумієте, як це працює? При зміні стану будь-якого з трьох флажків викликається наш обробник OnCheckChange. Він перевіряє стан усіх трьох флажків і додає у змінну TempStr імена вибраних зараз. Ну і після цього ми змінюємо текст напису LabState на TempStr.