Елементи керування
Крутилка - 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;