www.map-info.ru :: Просмотр темы - Диалоги
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  

 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

В любом случае Всем огромное спасибо за участие в обсуждении этой темы.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Top.Mail.Ru