Техника программирования.(Если долго мучиться...)



Posted by Анатолий, Херсон on April 05, 2000 at 01:30:18:

Вообще хорошая идея. в начале Subject писать тему ссобщения.
"Техника программирования" - и автору проще сортировка, и читателям проще ориентироваться.
Всем пишущим здесь можно взать за "правило хорошего тона".

Прием программирования выношу для общего использования (и/или обсуждения).
(Предыдущее сообщение удалено Автором из-за проблем с HTML тегами
приведенными в примере. Я подправил текст.)

Задача динамическое переопределение клавиш в отчетной форме
При вызове форм, часто параметры вызова формы зависят от контекста
текущей формы, и каждый раз клеить и писать ^^^^^ не удобно.
Если еще и числа указывать, то их надо переводить в строку по формату.
получается, что-то вроде
X=[ch 250]+[strip X]+'·'+[strip [sn R,17,2]]+.....
(и о типах помнить надо и о длине крыши ^^^^^^^^^)

Пример вызова (вымышленный фрагмент формы):


*******************
[p 1,'Enter','R _FDATA',IS,'1']; call KeyLine
Сведения о предприятии
* заметьте - разное кол-во аргументов, разные типы параметров
[p 1,'Enter','R #VAL-NR','67-2',1,2.15]; call KeyLine
Анализ налогового кредита
*******************

Текст подпрограмм в First.RPT(настоящий):


:KeyLine переопределение клавиш
ZL='N:'+[p 1]+':'+[p 2] клавиша + команда
ZH=[p 0] кол-во аргументов
if ZH >2 если есть аргументы
ZL=ZL+' ·'
for ZI=3 to ZH для всех парметров
if [type [p ZI]] ZL=ZL+[p ZI]+'·' если строка
elseif [ce [p ZI]]=0 ZL=ZL+[intsn [p ZI]]+'·' ели целое число
else ZL=ZL+[strip [sn [p ZI],20,4]] если дробное число
endif
endfor
* Далее вывод командной строки
* Способ 1 - простой
* ^ZL^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Способ 2 - универсальный
array f; [f 1,ZL]; call DisplayF
endif
return KeyLine

:DisplayF Экономичный вывод массива строк на экран
* [F N] массив строк
* [F 1] имя файла
ZY=[F 0]
for ZW=1 to ZY
ZL=[F ZW]
ZJ=[length ZL]
ZM=(ZJ-ZJ%5)/5+[ro (ZJ%5)/5+0.49]
for ZI=1 to ZM
ZP=ZI*5-4; ZS=[cp ZL,ZP,5]
^^ZS^\
endfor

endfor
return DisplayF

Прмер вывода текстов во внешний файл (фрагмент отчетной формы):


***HTML***************************************
* в тексте HTML в тегах произведена замена на круглые скобки
**********************************************
array F
FL=[user]+'.HTM'
[F 1,[dir 1]+FL]
[F [F 0]+1,'(HTML)']
[F [F 0]+1,'(META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=CP866")']
[F [F 0]+1,'(BODY}']
[F [F 0]+1,'(TABLE CELLSPACING=0 BORDER=0 CELLPADDING=4 WIDTH=623)']
[F [F 0]+1,'(TR)(TD WIDTH="23%" VALIGN="MIDDLE")']
.......
**************************************

А сама подпрограммка (в First.RPT):


:ExportF Экономичный вывод массива строк в файл
* [F N] массив строк
* [F 1] имя файла
ZF=[F 1] имя файла.
ZY=[F 0] размерность массива.
\>file ZF инициализация файла.
for ZW=2 to ZY
ZL=[F ZW]
ZJ=[length ZL]
ZM=(ZJ-ZJ%5)/5+[ro (ZJ%5)/5+0.49]
for ZI=1 to ZM
ZP=ZI*5-4; ZS=[cp ZL,ZP,5]
^^ZS^\>>file ZF
endfor
>>file ZF
endfor
return

Конечно, алгоритм вывода строк в DisplayF и ExportF не самый оптимальный,
тут я соглашусь с Борисом из Киева. 2241.htm
Но если не гнаться за скоростью, то по-моему получается весьма удобно.

С уважением,
Анатолий.



Пpишедшие ответы: