Фрагмент объекта "КЛАВИТУРА", отвечающий за программное стробирование
Подобная структура, написанная для Delphi используется в редакторе
swe
(*--------------------------------------------*)
(* Блок определений для системы стробирования *)
(*--------------------------------------------*)
const kbMStrobPhase = 5; (* вообще-то 3 достаточно *)
kbMStrobScenar = 7;
type TkbStrobPhase = record (* фаза "сценария стробирования" *)
aDelay : byte; (* задержка (в мс) *)
NRep : byte; (* число повторений фазы *)
end;
TStrobScenario = array[0..kbMStrobPhase] of TKbStrobPhase;
TAStrobScenario = array[0..kbMStrobScenar] of TStrobScenario;
(*----------------------------------------------------------------------*)
(* Фрагмент объекта "Клавиатура", описывающий программное стробирование *)
(*----------------------------------------------------------------------*)
type
TKeyb = Class(TObject)
if Keyb.LastKey <> 0 then begin
(* ................ *)
(* глобальные переменные, запоминаемые между вызовами *)
LastKey : word; (* код клавиши в "нашем" формате *)
LastKeyDown: word; (* в формате Form.KeyDown *)
LastFun : char; (* последняя ф-ия *)
LastStb : byte; (* схема стробирования *)
(* УПРАВЛЕНИЕ СТРОБИРОВАНИЕМ *)
QSWStrob : boolean; (* Строб уже был ? *)
Delay0 : integer; (* интервалы для *)
Delay1 : integer; (* "мягкого" стробирования *)
IStrobScen : byte;
StrobLevel : byte;
IStrobRep : byte;
Strobs : TAStrobScenario;
(* ................ *)
procedure StrobsInit; (* определение сценариев *)
procedure StrobsReset(IStrobScen0:integer); (* загрузка сценария *)
procedure StrobStep; (* шаг сценария *)
procedure StrobsNextLevel(I0:integer); (* уровень I0 сценария *)
end; (* TKeyb *)
implementation
uses UClock; (* главные часы программы *)
procedure TKeyb.StrobsInit;
begin
(* ввод символов *)
Strobs[0,0].ADelay := 192; Strobs[0,0].NRep := 1;
Strobs[0,1].ADelay := 24; Strobs[0,1].NRep := 5;
Strobs[0,2].ADelay := 12; Strobs[0,2].NRep := 255;
(* движение курсора *)
Strobs[1,0].ADelay := 96; Strobs[1,0].NRep := 1;
Strobs[1,1].ADelay := 24; Strobs[1,1].NRep := 3;
Strobs[1,2].ADelay := 12; Strobs[1,2].NRep := 5;
Strobs[1,3].ADelay := 8; Strobs[1,3].NRep := 8;
Strobs[1,4].ADelay := 3; Strobs[1,4].NRep := 255;
(* Enter, Esc и т.п. - однократные действия *)
Strobs[2,0].ADelay := 255; Strobs[2,0].NRep := 255;
end;
procedure TKeyb.StrobsNextLevel(I0:integer); (* смена "фазы" сценария стробирования *)
begin
StrobLevel := I0;
IStrobRep := Strobs[IStrobScen,StrobLevel].NRep; (* ск.раз повторять *)
Delay0 := Strobs[IStrobScen,StrobLevel].aDelay; (* задержка шага *)
if Delay0 < 255 then tmKeyb.AlArm(Delay0) (* загрузим её в часы *)
else tmKeyb.AlArm($7FFFFFFF); (* бесконечная задержка *)
end;
procedure TKeyb.StrobsReset(IStrobScen0:integer); (* загрузка сценария *)
begin
IStrobScen := IStrobScen0;
StrobsNextLevel(0);
end;
procedure TKeyb.StrobStep; (* шаг сценария *)
begin
if IStrobRep = 255 then Exit; (* т.е. далее повторяем до бесконечности *)
dec(IStrobRep);
if (IStrobRep <= 0) then begin (* переходим на следующий шаг сценария *)
if StrobLevel < kbMStrobPhase
then StrobsNextLevel(StrobLevel+1)
else IStrobRep := 255; (* обеспечивает зацикливание *)
end;
end;
(* ................ *)
Вернуться к теме программное стробирование
Вернуться к теме проект редактора SWE
(с) Можаровский С.Г. // mailto:mozharovskys@mail.ru // swHome page