Поможет все тот же [sed..]. Тонкости работы в многопользовательском окружении



Posted by Аркадий Водяник (195.58.229.55) on December 19, 2001 at 10:28:21:

In Reply to: Re: Еще о длинных меню posted by Анатолий Таланин, г.Новосибирчк on December 19, 2001 at 09:06:47:

Анатолий Таланин пишет:


Предлагаемое решение в варианте меню произвольного размера - замечательное. К недостатку можно
отнести тот факт, что результатом функции [ia] является, условно говоря, субсчёт. Другими словами из
текста строки меню эта функция выделяет только первое слово. В просттых случаях этого достаточно.
Для более сложных меню, когда в строке располагается текстовое выражение, такое решение создаёт
проблемы идентьфикации строк по первому слову. С целью улучшения возможностей реализации такого
меню предлагаю создать новую функцию [in], которая в стандартном виде давала-бы порядковый номер
выбранного субсчёта, а в нашем случае - порядковый номер строки меню.

Спасибо, Анатолий, за оценку моего решения.

А ведь совсем необязательно идентифицировать строки "по первому слову".
Превратим всю строку позиции меню в одно длинное первое слово: вместо
пробелов будем использовать, например, знак подчеркивания.

Мой пример из 4006 преобразуем так:


*Показ меню произвольного размера и выбор из него
u=[user]
[sed u + 'menu', 3]
[sed u + 'menuhead', 'make choice']
s='p_p1_p2_p3'; [sed u + 'menu1', s]; [sed u + s, 1]
s='p_p2_p3_p4'; [sed u + 'menu2', s]; [sed u + s, 2]
s='p_p3_p2_p1'; [sed u + 'menu3', s]; [sed u + s, 3]
printstr [intsn [ged u + [ia menu]]]


*подготовка "показа списка субсчетов счета menu":
* форма MENU.RPT
u=[user]
s=[ged u + 'menuhead']
printstr s

for i=1 to [ged u + 'menu']
s=[ged u + 'menu' + [intsn i]]
printstr s

endfor

Понятно, что [user] нужен здесь для исключения вероятности
коллизий в extrd.dat между различными пользователями;
это, разумеется не поможет, если под одним именем
одновременно работают несколько пользователей.

А вызов "[ged u + [ia menu]]" выдаст _номер_ выбранной
позиции меню.

Что касается Ваших слов "предлагаю создать новую функцию
[in], которая в стандартном виде давала-бы порядковый номер
выбранного субсчёта, а в нашем случае - порядковый номер
строки меню"
:

Дело в том, что вызов [ia menu] в сетевой версии возвращает
не имя субсчета счета menu, а первое слово строки формы menu.rpt
Так что если эти первые слова неуникальны, у [in] тоже не будет
достаточно информации.

Я показал замену [in] строками:

[sed u + s, 1]
......
......
И здесь, конечно, тоже важно, чтобы все s были уникальны -
но когда речь идет не о первом слове, а о всей фразе, слова
которой соединены подчеркиванием - уникальность вполне ожидаема.


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