Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Пн Май 25, 2015 12:20 am Заголовок сообщения: Диалоги |
|
|
Приветствую, уважаемая аудитория.
Случай, когда для Control PopupMenu объявляется массив в тексте программы MapBasic я уже на практике многократно реализую (помог мне в этом вопросе этот форум, спасибо)
Т.е.
Dim name(3) As String
Sub Main
name(1) = "Иванов"
name(2) = "Петров"
name(3) = "Сидоров"
...
Control PopupMenu
Title From Variable name
...
End Sub
Скажите пожалуйста, есть ли решение вот какой, новой для меня, задачи.
Таблица "T1.TAB" в зависимости от предшествующих над ней действий может содержать разные имена людей.
Для дальнейшей работы с конкретной группой этих имен используется функционал диалога: несколько PopupMenu, несколько ListBox или один MultiListBox (не принципиально пока).
Как сделать, чтобы массиву "name()" или переменной "name" присваивались записи не их окна MapBasic, а из "T1.TAB"
Потому что в MapBasic имена статичны, а в таблице "T1.TAB" они меняются в зависимости от условий заполнения таблицы "T1.TAB" данными.
Спасибо. |
|
Вернуться к началу |
|
|
thegeo
Зарегистрирован: 17.01.2012 Сообщения: 119
|
Добавлено: Пн Май 25, 2015 7:10 pm Заголовок сообщения: |
|
|
MapBasic достаточно архаичный язык, здесь нет развитой системы обработки событий, и обо всем нужно заботиться самому т.е. писать соответствующий код. Ниже приводится процедура считывания из таблицы tb поле fld всех непустых уникальных строк. Результат записывается в массив nms (контроль наличия таблицы, поля и т.д. опущен).
Некоторые, достаточно примитивные, функции обработки событий в MapBasic все же имеются (SelChangedHandler, WinChangedHandler, ForegroundTaskSwitchHandler и др.). Однако использование их проблематично. Поэтому лучше все же остановиться на ручном управлении. Например, можно повесить указанную процедуру на кнопку и по мере необходимости обновлять массив строк или определять массив при каждом открытии формы со списками.
sub readNames(byval tb as string,byval fld as string, nms() as string)
'(имя таблицы, имя поля, результирующий массив уникальных непустых строк)
dim i,j,nRow as integer
dim str,s1,s2,SelLayer as string
dim aa as alias
str="Select " & fld & " from " & tb & " where Len(" & fld & ")>0 order by " & fld
Run Command str
nRow =SelectionInfo(SEL_INFO_NROWS)
if nRow=0 then Exit Sub end if
SelLayer =SelectionInfo(SEL_INFO_SELNAME)
redim nms(nRow)
For i = 1 To nRow
Fetch Rec i From SelLayer
aa=SelLayer & "." & fld
s1=aa
if s1<>s2 then
s2=s1
j=j+1
nms(j)=s1
End If
nxt:
Next
if j<nRow then redim nms(j) end if
End Sub |
|
Вернуться к началу |
|
|
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Вт Май 26, 2015 9:45 am Заголовок сообщения: |
|
|
Спасибо за вариант решения задачи. Мудрёно как-то, но что поделаешь, буду разбираться. |
|
Вернуться к началу |
|
|
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Ср Май 27, 2015 9:11 am Заголовок сообщения: |
|
|
Коллеги, нашел, как мне кажется, более простое решение обсуждаемой задачи. С удовольствием делюсь им с Вами.
Оставайтесь благополучны!
Sub
Dim myArray() As String
Dim i As Integer
Open table "С:\CLA.TAB" As CLA
Fetch First from CLA
i = 0
While not EOT(CLA)
i = i + 1
ReDim myArray(Ubound(myArray)+1)
myArray(i) = CLA.Col(3)
Fetch Next From CLA
Wend
Close Table CLA
Dialog Title "Dialog"
Control ListBox
Title From Variable myArray
Control OKButton
Control CancelButton
End Sub |
|
Вернуться к началу |
|
|
thegeo
Зарегистрирован: 17.01.2012 Сообщения: 119
|
Добавлено: Ср Май 27, 2015 3:42 pm Заголовок сообщения: |
|
|
В данной реализации в список попадут и пустые строки и строки дубликаты.
Несколько мудрено определение ReDim myArray(Ubound(myArray)+1) наверное, проще ReDim myArray(i). |
|
Вернуться к началу |
|
|
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Ср Май 27, 2015 7:31 pm Заголовок сообщения: |
|
|
Вам профессионалам виднее.
Спасибо. |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Ср Май 27, 2015 8:05 pm Заголовок сообщения: |
|
|
Alex писал(а): |
Коллеги, нашел, как мне кажется, более простое решение обсуждаемой задачи. С удовольствием делюсь им с Вами.
|
Решение по сути совершенно идентичное: перебираем записи таблицы/выборки и вносим значения в массив. массив подставляем в контрол диалога.
Решение thegeo - универсальное, но из-за отсутствия форматирования и комментариев совершенно непонятное новичкам. |
|
Вернуться к началу |
|
|
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Пт Май 29, 2015 9:50 am Заголовок сообщения: |
|
|
В любом случае Всем огромное спасибо за участие в обсуждении этой темы. |
|
Вернуться к началу |
|
|
|