обозначить набор правил построения и развития форм.
Семейство переменных
Семейство переменных, которые помогают в управлении пользовательским списком, представлено следующим перечнем:
,ixpub («R_karbeg», 1) row
,ixpub («L_karbeg», 10) curele
,ixpub («V_karbeg»,»») search value string
,ixpub («E_karbeg», 10) end of list
,ixpub («U_karbeg»,»») fierst element of list
,ixpub («N_karbeg»,»») next element of list
,ixpub («O_karbeg», «2») order index
Построение формы
Построение пользовательской формы начинается с разметки экрана.
Сначала экран делится на две зоны. Одна зона отводится под основной список, вторая под карточку и элемент управления списком.
Основная таблица и форма управления имеют, как правило, одинаковое наименование. Так, для таблицы KARBEG00.dbf создаётся одноимённая форма karbeg00.html. Исходный текст этой формы следующий:
<eval>
ixpub («R_karbeg», 1)
,ixpub («L_karbeg», 10)
,ixpub («V_karbeg»,»»)
,ixpub («E_karbeg», 10)
,ixpub («U_karbeg»,»»)
,ixpub («O_karbeg», «2»)
,[
<frameset cols=4,6>
<frame height=100% width=100% name=A marginwidth=0 marginheight=0>
<frame height=100% width=100% name=B src=karbeg002.html>
</frameset>
]
Разберём текст скрипта более подробно. В начале скрипта, который строит форму, идет тег <eval>, показывающей, что далее следует блок кода, который необходимо выполнить, а не просто отобразить на экране. Далее идет перечень инициализации глобальных переменных, которые будут использоваться при построении пользовательской формы:
ixpub («R_karbeg», 1)
,ixpub («L_karbeg», 10)
,ixpub («V_karbeg»,»»)
,ixpub («E_karbeg», 10)
,ixpub («U_karbeg»,»»)
,ixpub («O_karbeg», «2»)
За ним идёт разметка, с помощью которой строятся два фрейма с именами «A» и «B» соответственно.
<frameset cols=4,6>
<frame height=100% width=100% name=A marginwidth=0 marginheight=0>
<frame height=100% width=100% name=B src=karbeg002.html>
</frameset>
текст разметки помещён в строку с помощью дополнительных символов, принятых в системе CLIPPER, квадратных скобок.
Примечание.
Строковый константы в системе CLIPPER можно задавать с помощью трёх пар символов:
1) одинарные кавычки «это строка текста»;
2) двойные кавычки «это строка текста»;
3) квадратные скобки [это строка текста].
Во фрайме с именем «В» выводится элемент управления списком, который описан в форме karbeg002.html, и карточка.
Файл karbeg002.html
<frameset rows=56,* border=0>
<frame height=100% width=100% name=M src=karbeg0021.html marginwidth=0 marginheight=0>
<frame height=100% width=100% name=K src=karbeg0022.html>
</frameset>
Форма karbeg002.html, в свою очередь, строится из двух фраймов. Фрайм с именем «М» содержит элемент управления списком karbeg0021.html.
Фрайм с именем «К» содержит карточку элемента, выделенного в списке
Файл karbeg0021.html
<eval>
[<table width=100% cellpadding=0 cellspacing=0> <tr bgcolor= c0c0c0> <td>
<b> <a target=A href=naiarm001.html>
АРМ: ] +HB_oemToAnsi (NAIARM00-> (FieldGet (3))) + [
<tr bgcolor=e0e0e0> <td> <table> <tr bgcolor=c0d0c0>
<form name=F target=_top action=rezzak00.html method=get>
<td> <input name=karbeg onfocus=kS () onkeydown=kD(event.keyCode) onkeyup=kU(event.keyCode)>
<td> <input type=hidden name=R>
</td> </form>
<td> <a target=A href=karbeg001.html? V_karbeg:=«»> Home </a>
<td> <a target=A href=karbeg001.html? kC:=33> PgUp </a>
<td> <a target=A href=karbeg001.html? kC:=34> PgDn </a>
<td> <a target=A href=karbeg001.html? maxele > </a>
<td> <a target=A href=karbeg001.html? maxele++> ++ </a>
</table>
<tr> <td bgcolor=c0c0c0 height=4>
<tr> <td height=100% width=100%>
</table>
<script> F.karbeg.focus ();
function kD (kC) {
kV=F.karbeg.value;
if(F.R.value==l) {return;}
F.R.value=l;
if(kC==38){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? R_karbeg ';}
else if(kC==40){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? R_karbeg++';}
else if(kC==33){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? kC:='+kC;}
else if(kC==34){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? kC:='+kC;}
else if(kC==35){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? kC:='+kC;}
else if(kC==36){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? R_karbeg:=1»; }
else if (kC==27) {parent.parent.location.href='index.html;}
}
function kU(kC){window.status=kC;
kV=F.karbeg.value;
if(kC==120){location.href='imagix0021.html;}
else if(kC>40){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? kC:='+kC+», V_karbeg:=«»+kV+«"»; }
else if(kC==8){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? V_karbeg:=«»+kV+«"»; }
}
function kS(){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html;}
</script>
]
На что следует обратить внимание здесь? Элемент управления строится с помощью HTML разметки формы ввода
<form name=F target=_top action=rezzak00.html method=get>
<form name=F target=_top action=rezzak00.html method=get>
<td> <input name=karbeg onfocus=kS () onkeydown=kD(event.keyCode) onkeyup=kU(event.keyCode)>
<td> <input type=hidden name=R>
</td> </form>
Для организации механизма управления списком определены функции обработки событий:
получение фокуса формой onfocus=kS ();
нажатие клавиши в поле ввода onkeydown=kD(event.keyCode);
отжатие клавиши в поле ввода onkeydown=kU(event.keyCode).
При нажатии клавиши <ENTER> вызывается форма rezzak00.html и осуществляется переход к другому списку со всеми вытекающими отсюда последствиями.
Форма содержит вспомогательное поле R. С помощью этого поля регулируется скорость нажатия клавиш управления списком. Это поле, например, блокирует бесконечное нажатие одной клавиши без перевывода информации на экране.
Поле karbeg является активным, в нем принимаются нажатия всех клавиш и затем соответствующим образом обрабатываются.
Активное поле ввода нужно, в первую очередь, для отслеживания нажатия клавиш с целью:
передвижения по списку;
ввода ключевого слова поиска;
выполнения команды.
Обработка нажатия клавиш осуществляется с помощью кода, написанного на языке JavaScript.
Блок этого скрипта следующий:
<script> F.karbeg.focus ();
function kD (kC) {
kV=F.karbeg.value;
if(F.R.value==l) {return;}
F.R.value=l;
if(kC==38){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? R_karbeg ';}
else if(kC==40){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? R_karbeg++';}
else if(kC==33){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? kC:='+kC;}
else if(kC==34){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? kC:='+kC;}
else if(kC==35){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? kC:='+kC;}
else if(kC==36){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? R_karbeg:=1»; }
else if(kC==27){parent.parent.location.href='index.html;}
}
function kU(kC){window.status=kC;
kV=F.karbeg.value;
if(kC==120){location.href='imagix0021.html;}
else if(kC>40){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? kC:='+kC+», V_karbeg:=«»+kV+«"»; }
else if(kC==8){parent.parent.A.location.href='karbeg001]+O_karbeg+[.html? V_karbeg:=«»+kV+«"»; }
}
function kS () {parent.parent.A.location.href='karbeg001]+O_karbeg+[.html;}
</script>
Здесь представлена функция обработки нажатия клавиши kD (), отжатия клавиши kU () и получения фокуса kS ().
После того, как данная форма будет выведена на экран, активное поле ввода получит фокус с помощью команды
F.karbeg.focus ();
где F имя формы ввода значений;
karbeg имя активного поля формы.
Семейство файлов karbeg001*.html
Семейство файлов karbeg001]+O_karbeg+[.html представляет собой набор файлов, с помощью которых строится главный список.
Главный список имеет несколько ключей сортировок.
Номер ключа определяется переменной O_karbeg.
Построение списка
Рассмотрим построение списка на примере файла karbeg0012.html:
Файл karbeg0012.html
<eval>
,if (kC=35,R_karbeg:=maxele)
,if (kC=34,V_karbeg:=E_karbeg)
,if (kC=33,karbeg00-> (ordSetFocus (2),dbGoto (U_karbeg),dbSkip (-20),V_karbeg:=FieldGet (1)))
,if (kC=45,karbeg00-> (apprec (),scater ({V_karbeg,»», dtos (date ()),time ()})))
,if (R_karbeg <1,R_karbeg:=L_karbeg)
,if (R_karbeg> maxele, R_karbeg:=1)
,if (R_karbeg> L_karbeg, R_karbeg:=1)
,if ((maxele-R_karbeg) ==0, (R_karbeg ,V_karbeg:=N_karbeg))
,i:=1
,cb:= [
<table width=100%> <tr bgcolor=d0d0a0>
<th> <a target=M href=karbeg0021.html? ord:=«1»> Дата
<th> ixBase
<th> <a target=M href=karbeg0021.html? ord:=«4»> medlan
<td> <a target=M href=karbeg0021.html? ord:=«3»> <b> ФИО
],
karbeg00-> (ordSetFocus (2),dbfout (
{||cB+= [<tr bgcolor=] +if (R_karbeg=i, (K_K:=FieldGet (1), [e0b0b0]), [e0e0d0])
+ [> <td>] +substr (fieldget (2),1,10)
+ [<td align=center> <a href=karbeg001.html? R_karbeg:=] +ltrim (str (i)) + [>] +FieldGet (1)
+ [<td>] +fieldget (3)
+ [<td width=100%> <nobr>] +HB_OemToAnsi (fieldget (5))
,if (i==1,U_karbeg:=RecNo ())
,if (i==2,N_karbeg:=Fieldget (1))
,i++
}, [»»], [], [FieldGet (1)],V_karbeg, [.t.],.f.,maxele+1)
,E_karbeg:=fieldget (1)),kC:=0,L_karbeg:=i-1,
cb+= [<script>
parent.B.M.F.karbeg.focus ();
parent.B.M.F.R.value=r;
parent.B.K.location.href='karbeg0022.html;
</script>]
+ [<tr bgcolor=c0c0f0> <td height=3> <td> <td> <td> <tr bgcolor =d0d0a0> <th> Дата <td> Номер <td> Цена <td> Документ]
,REZZAK00-> (dbSeek (K_K)
,cb+ [<tr bgcolor=e0e0d0> <td>] +substr (FieldGet (3),1,10) + [<td>] +FieldGet (2) + [<td>] +FieldGet (4) + [<td>] +FieldGet (5)
)
Отображение списка состоит из частей:
блок обработки управления списком и элемент позиционирования в списке;
вывод основного списка;
стабилизация процессов;
вывод дополнительной информации.
Блок обработки управления списком и элемент позиционирования в списке проводит дополнительную обработку информации о нажатых клавишах.
Если есть необходимость, то проводится новое позиционирование в списке.
Основные операции со списком следующие:
перемещение в начало (код клавиши kC=36) R_karbeg:=1;
перемещение в конец (код клавиши kC=35) R_karbeg:=maxele;
перемещение вниз по списку R_karbeg++;
перемещение вверх по списку R_karbeg .
На этом пример реализации спецификаций заканчивается в надежде на то, что читатель сам попробует изменить данный или добавить новый фрагмент информационной системы, расширив таким образом функциональность информационной системы в целом себе на пользу.