Массивы в avenue

0 голосов
спросил 31 Март, 10 от dravig (1,240 баллов) в категории Программные продукты Esri
Подскажите как в Avenue обявить массив... Например для такой задачи: в диалоге есть какое-то число контролов, которые соответствуют полям в таблице атрибутов.  Как сделать так чтобы операцию присваивания значения контролу программа выполняла по единому образцу для всех элементов?

22 Ответы

0 голосов
ответил 01 Апр, 10 от dravig (1,240 баллов)
так... просто вытащить значение из таблицы у меня получается... проблема в том что поля таблицы у меня называются каждое по-своему...
и я объявил несколько переменных x1, x2... которые находят нужные поля по названиям.

чтобы закинуть значения по мере прочтения из таблице в цикле все равно придется ссылаться на x1, x2 ..... Как иначе организовать порядок прочтения записей в таблице?


или же есть какой-нибудь другой  способ?

+ вся эта ботва загнана в другой цикл который выбирает записи только для ReturnUserPoint

Если делать все без циклов и каждое действие для каждого контрола прописывать отдельно, то все получается, кроме условия заменять неугодные значения на единое текстовое оповещение....

Может я что-то не понял из предыдущего поста?

и еще мне не очень понятен смысл переменной aValue = lstValues.Get(i - 1)... По идее она должна возвращать нужное значение из таблицы?

0 голосов
ответил 01 Апр, 10 от TDenis (42,620 баллов)
Может я что-то не понял из предыдущего поста?и еще мне не очень понятен смысл переменной aValue = lstValues.Get(i - 1)... По идее она должна возвращать нужное значение из таблицы?

Где тут что про таблицу? Это обычное получение элемента списка по его индексу. Список заранее заполнен.
Либо заполнен, как я это сделал (я заполнил константами, у вас это будут переменные):
lstValues = {x1, x2,..., xN}

Либо вот так заполнен:
lstFieldNames = {"Field1", "Field2", ...}

lstValues = {}
for each aFieldName in lstFieldNames
aField = fTab.FindField(aFieldName)
aValue = fTab.ReturnValue(aField, rec)
lstValues.Add(aValue)
end


Когда он заполнен (любым способом), можно перебирать его элементы в цикле и, если элементы удовлетворяют условию, присваивать значения соответствующим контролам диалогового окна.
Я бы вообще наверное 3 скрипта сделал:
1. Заполнение списка индексов полей по их названиям, чтобы не делать каждый раз FindField;
2. Получение списка значений записи, в которую ткнул пользователь;
3. Проверка всяческих условий и заполнение контролов диалогового окна.
    
Либо вообще вписал бы в теги контролам соответствующие названия полей. Перебирал бы все контролы, вызывал бы для каждого GetTag, чтобы получить название соответствующего поля таблицы, и выписывал бы значение. Без списков и массивов.
    
0 голосов
ответил 02 Апр, 10 от dravig (1,240 баллов)
Спасибо. Все получилось)))

И еще вопрос: какой командой выгрузить окно диалога со всеми данными в текстовый файл?
0 голосов
ответил 02 Апр, 10 от TDenis (42,620 баллов)
Сериализовать диалоговое окно? А с какой целью? Потом надо будет восстанавливать?

-------
Насчёт предыдущего. Всё-таки через тэги или списки сделали?
0 голосов
ответил 02 Апр, 10 от dravig (1,240 баллов)
Списки.

А с целью, чтобы пользователь имел возможность сохранить данные в том виде в котором ему удобно... (в диалоге есть поля изменяемые)... ну и для вставок в отчет и т п....  Восстанавливать его не надо...
0 голосов
ответил 02 Апр, 10 от Lord (3,920 баллов)
    Списки это нормально, а через теги очень красивое решение.
0 голосов
ответил 02 Апр, 10 от TDenis (42,620 баллов)
чтобы пользователь имел возможность сохранить данные в том виде в котором ему удобно...

Встроенных механизмов сериализации нет.
Придётся всё делать руками. Гляньте объекты LineFile или TextFile.

Lord, спасибо.
0 голосов
ответил 05 Апр, 10 от dravig (1,240 баллов)
Как я понял, для выгрузки данных в txt  надо наполнение каждой строчки прописывать отдельно? (т е опять создавать список перемнных, который будет ссылаться на список контролов?)


0 голосов
ответил 05 Апр, 10 от TDenis (42,620 баллов)
Надо объявить линейный файл:
lf = LineFile.Make( "docs.txt".AsFileName, #FILE_PERM_WRITE )

Потом перебираете все контролы (текстбоксы) в цикле, и для каждого пишете что-то вроде:
lf.WriteElt(aTextBox.GetText)

Надеюсь не будет проблем с кодировкой, но надо смотреть.
0 голосов
ответил 05 Апр, 10 от dravig (1,240 баллов)
А если поля диалога изначально пустые, и заполняются с помощью скрипта, каким образом организовать обработку событий, чтобы в линейный файл выгружались не значения по умолчанию, а конечные значения после всех программных и пользовательских обработок?
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...