Массивы в avenue

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

22 Ответы

0 голосов
ответил 31 Март, 10 от Lord (3,920 баллов)
уважаемый dravig!
Это же надо так ставить задачи, что ни один профессор
не разберется, что нужно делать.
Что такое контрол
Что такое элемент
а массив в Авеню это простой список
aMas={} это пустой массив
aMas.add(элемент) добавить элемент в массив

for each zap in amas обработка всех элементов
...                   массива
end
0 голосов
ответил 31 Март, 10 от dravig (1,240 баллов)
Прошу прощения... со своей аксессовской терминологией.... Контрол - любой элемент диалога (надпись, кнопка и т п)...

Прошу уточнить по поводу массива (немного непонятно синтаксически):

например у меня есть ряд переменных f1, f2....... f10
Как мне задать единую обработку для них?

обязательно каждый элемент добавлять через add? А если их слишком много?

И еще вопрос. Как задать метку в коде к которой можно вернуться?
0 голосов
ответил 31 Март, 10 от TDenis (42,620 баллов)
Нету массивов. Есть списки, словари.

Не очень понятно, откуда проблема - много или мало. Не хотите использовать циклы для получения значений из таблицы атрибутов, заполнения соответствующих списков и присвоения значений контролам?
Даёте контролам названия с индексами: Control1, Control2, Control3...
В цикле for each генерируете очередное название контрола: "Control" + i.AsString,
находите контрол с помощью Dialog.FindByName,
присваиваете соответствующее значение (i-й элемент списка).

Или можно записывать значения атрибутов в словарь, где ключом будет соответствующее название поля. И контролы называть по этим полям. Точно так же проходить по словарю, искать соответствующие контролы, присваивать значения.
Или я чего не понял?
0 голосов
ответил 31 Март, 10 от dindzilin (4,160 баллов)
По моему, проще задать имена контролов в соответствии с полями таблицы. И далее как уже сказано, Dialog.FindByName...
0 голосов
ответил 31 Март, 10 от TDenis (42,620 баллов)
Согласен, осмысленные названия будут лучше непонятных цифр.
0 голосов
ответил 01 Апр, 10 от dravig (1,240 баллов)
ммм... тогда такой вопрос: как обратиться ко всем контролам (или записям  из таблицы атрибутов) сразу, чтобы в  цикле прочесать их всех, выбрать те которые не соответствуют заданным условиям?



0 голосов
ответил 01 Апр, 10 от TDenis (42,620 баллов)
aDialog.FindByClass(Control)
0 голосов
ответил 01 Апр, 10 от TDenis (42,620 баллов)
или записям  из таблицы атрибутов

for each rec in fTab
0 голосов
ответил 01 Апр, 10 от dravig (1,240 баллов)
а если это ранее объявленные переменные?
например
x1, x2..x100 - переменные, которым присвоены значения полученные из таблицы атрибутов
y1,y2..y100 - переменные которым присвоены имена контролов (theDial.FindByName("control1"))

то как синтаксически правильно написать такой цикл:

for each j in 1..100
   if  x(j) удовлетворяет условиям then
       y(j).SetText (x(j).asstring)
   else
       y(j).SetText ("все плохо")
   end
end


0 голосов
ответил 01 Апр, 10 от TDenis (42,620 баллов)
Какие ещё переменные x1, x2..x100? Зачем?
Закидывайте их сразу в список по мере прочтения из таблицы. В цикле. Сможете?
Если не сможете - скажете. А если сможете, будет список например с названием lstValues.
Я его просто проинициализирую:

lstValues = {1, 2, "abc"}

aDlg = av.FindDialog("dlg1")
for each i in 1..(lstValues.Count)
aValue = lstValues.Get(i - 1)
aControl = aDlg.FindByName("Control" + i.AsString)
aControl.SetText(aValue.AsString)
end
aDlg.Open


Как-то так. Ну и условие своё нужно будет добавить.
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...