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

Сайт Польоту
 

Елементи керування
Крутилка - SpinEdit (Модуль Ctl)

Крутилка - це те саме поле вводу, тільки призначене виключно для вводу чисел. По-перше, воно не пропускає ніяких символів крім цифр. А по-друге, воно також містить кнопочки для того, щоб юзер міг міняти число мишкою (за них це поле і прозвали крутилкою).



Створити крутилку
Function SpinEdit_Create(Prog:PProg; 
  VMin,VMax,VStep,VValue:Integer): PControl;
  • VMin, VMax - мінімальне та максимальне можливе значення числа у полі.
  • VStep - крок, з яким змінюється число у полі, оли юзер клікає мишкою по стрілочкам вгору та вниз (або натискає відповідні стрілки на клавіатурі).
  • VValue - початкове значення числа у полі.


Установити обробник зміни значення у полі
Procedure SpinEdit_SetOnChange(Me:PControl;
  VOnChange:TCtlHandler);
VOnChange - обробник. На відміну від аналогічного обробника поля вводу InpLine, тут ми не отримуємо введений символ і не можемо міняти його; обробник викликається після внесення змін у поле.



Намалювати крутилку
Procedure SpinEdit_Paint(Me:PControl; 
  VX1,VY1,VX2:Integer);
VX1, VY1, VX2 - координати поля (висота дорівнює 20 пікселям).



Отримати число у полі
Function SpinEdit_GetValue(Me:PControl): Integer;


Наш приклад буде зовсім-зовсім простим. У вікні програмки буде крутилка та канва. Канва буде справа зафарбовуватись синім кольором до координати у крутилці. Отже, Майстер програм - TestSed - "Зробити заготовку" та поїхали:
SedX, CanGauge: PControl;
Створюємо:
SedX:=Ctl.SpinEdit_Create(Me, 10, 100, 10, 50);
Ctl.SpinEdit_SetOnChange(SedX, OnXChange);
CanGauge:=Ctl.Canvas_Create(Me, False);
Для зручності заводимо окрему процедуру для оновлення канви:
Procedure DrawCanvas(Me:PProg);
Var
  SedValue: Integer;
Begin
  With Me^, TTestSedData(Me^) Do
  Begin
    Ctl.Canvas_BeginPaint(CanGauge);
    With CanGauge^.Place Do
    Begin
      Gfx.Rectangle(X1, Y1, X2, Y2);
      SedValue:=Ctl.SpinEdit_GetValue(SedX);
      Gfx.Bar(X1+1, Y1+1, X1+SedValue, Y2-1, clBlue);
      Gfx.Bar(X1+SedValue+1, Y1+1, X2-1, Y2-1,
        Kernel.ClrWinBG)
    End;
    Kernel.EndPaint
  End
End;
Малюємо все:
Procedure OnPaint(Me:PProg);
Begin
  With Me^, TTestSedData(Me^), ClientRect Do
  Begin
    Ctl.SpinEdit_Paint(SedX, 10, 10, 100);
    Ctl.Canvas_Paint(CanGauge, 10, 40, 100, 60);
    DrawCanvas(Me)
  End
End;
Ну і пишемо наш обробник зміни SedX:
Procedure OnXChange(Me:PProg; Control:PControl);
Begin
  With Me^, TTestSedData(Me^)
    If D.InRange(Ctl.SpinEdit_GetValue(SedX), 10, 100) Then
      DrawCanvas(Me)
End;