Создание классификатора

MapInfo, MapBasic
Варя
Интересующийся
Сообщения: 42
Зарегистрирован: 08 окт 2007, 06:00
Репутация: 0

Создание классификатора

Сообщение Варя » 01 дек 2014, 23:22

Добрый день! Нужна помощь! Пишу курсовик по разработке классификатора для СТП. В программировании почти новичок. На данный момент почти получилось сделать диалог сохранения по шаблону, но никак не получается по нажатию на кнопку Button сформировать список слоев (сейчас у меня вместо этого PopupMenu). Очень бы помогло, если бы поизучать код стандартной утилиты MapInfo "создание новой таблицы". Может быть знаете, где его можно посмотреть или м.б. есть подобный код.

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Проекты: 1
Репутация: 28
Откуда: Новосибирск

Re: Создание классификатора

Сообщение Sibit » 02 дек 2014, 07:28

Честно говоря, не уловил суть вопроса. Попробуйте описать проблему подробнее. Вам нужно интерфейс приложения написать на MapBasic? А версия MapInfo какая?
Варя писал(а):Очень бы помогло, если бы поизучать код стандартной утилиты MapInfo "создание новой таблицы". Может быть знаете, где его можно посмотреть или м.б. есть подобный код.
Что-то мне подсказывает, что нигде. Вполне возможно что это часть системы. А чем она вам поможет?

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 277
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 108
Откуда: Орск
Контактная информация:

Re: Создание классификатора

Сообщение ginpetr » 02 дек 2014, 07:37

Чтобы создать новую таблицу в нужном каталоге, нужно получить путь с помощью FileSaveAsDlg( ) и выполнить Create Table, где задаётся всё остальное (структура и т.п.). Если структура не фиксирована, придётся делать диалог редактирования структуры таблицы.
В чём сложности создания списка слоёв?

thegeo
Активный участник
Сообщения: 154
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 73

Re: Создание классификатора

Сообщение thegeo » 02 дек 2014, 13:56

М.б. полезно
Программирование_для_MapInfo.zip
(3.41 МБ) 219 скачиваний
Пример программы
classifier.rar
(590.75 КБ) 221 скачивание

Варя
Интересующийся
Сообщения: 42
Зарегистрирован: 08 окт 2007, 06:00
Репутация: 0

Re: Создание классификатора

Сообщение Варя » 02 дек 2014, 23:34

Попытаюсь объяснить подробнее) На данном этапе создаю диалоговое окно, которое бы загружало шаблон (пока что это просто слой, потом может быть попробую так называемые "сшитые таблицы") и по этому шаблону формируется новая таблица с возможностью добавления и удаления полей. За основу взяла как раз из того учебника, что мне скинули (программирование для MI) пример кода "диалог с использованием элементов ListBOX и PopupMenu". Поменяла его, но никак не получается заменить popupmenu, где указывается тип слоя (мне это совсем не нужно) на button, которая бы запускала просто загрузку слоя (слоев) в следующий элемент диалога - ListBox. Там дело в том, что применяется функция ReadControlValue(1002)-1 (а она для button) не работает. Не могу понять, чем ее заменить. В общем. Могу код сбросить, но может быть кто-нибудь сможет так сказать, в чем может быть проблема или, где можно почитать. Цель-то у меня понять, а не просто утилиту написать. Очень жду предложений.

Варя
Интересующийся
Сообщения: 42
Зарегистрирован: 08 окт 2007, 06:00
Репутация: 0

Re: Создание классификатора

Сообщение Варя » 02 дек 2014, 23:37

Ах, да, работаю в MI 12.0, в качестве среды разработки использую MapBasic IDE.

thegeo
Активный участник
Сообщения: 154
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 73

Re: Создание классификатора

Сообщение thegeo » 03 дек 2014, 00:32

О построении диалога:
1. Удалите все, что касается выбора типа слоя.
2. Вставьте в начало кода вызов CreateListLayerNames. Предварительно отредактируйте эту функцию – исключите проверку на тип слоя.
3. Никакой дополнительной кнопки не требуется. При загрузке диалога формируется список слоев активной карты и заполняется соответствующий ListBox.

Варя
Интересующийся
Сообщения: 42
Зарегистрирован: 08 окт 2007, 06:00
Репутация: 0

Re: Создание классификатора

Сообщение Варя » 03 дек 2014, 22:07

Ура! Получилось. Хотя, честно говоря, пыталась и раньше удалить, но он мне почему-то бесконечные ошибки выдавал. В этот раз, видимо, помог Ваш совет)

Варя
Интересующийся
Сообщения: 42
Зарегистрирован: 08 окт 2007, 06:00
Репутация: 0

удаление элемента массива

Сообщение Варя » 07 дек 2014, 21:47

Вопросы продолжаются(. Пытаюсь теперь добавить в тот же диалог создания таблицы по шаблону кнопки удалить и добавить поля. Точнее пока что пытаюсь только удалить. Как я поняла удалять мне нужно из массива, в котором хранится список полей. Попыталась взять процедуру, которая заполняет этот массив и переписать ее смещая элементы массива. Ошибок при компиляции нет, а вот при использовании диалога ничегошеньки не происходит( Где ошибка понять не могу. может вообще все не правильно или есть какая-нибудь функция, которая удаляет указанный элемент массива?
Код выглядит так:

Sub fild_delete
dim z as smallint
Dim iColNum as SmallInt
Dim fild_count As Integer
Dim tp,Fwidth,Fdecplaces As smallint
dim sType, sCol as string
Dim d As Integer
fild_count = NumCols(Untitled2)
d = fild_count-1
ReDim fildames(fild_count)
ReDim fildtype(fild_count)
ReDim filditog(fild_count)
z = ReadControlValue(1003)
if z = 0 then
exit sub
else
For iColNum = z to d
sCol="COL" & Str$(iColNum+1)
fildames(iColNum) = ColumnInfo("Untitled2", sCol, COL_INFO_NAME)
tp = ColumnInfo("Untitled2", sCol, COL_INFO_TYPE)
Fwidth = ColumnInfo("Untitled2", sCol, COL_INFO_WIDTH)
Fdecplaces = ColumnInfo("Untitled2", sCol, COL_INFO_DECPLACES)
Do case tp
case COL_TYPE_CHAR
sType="Char" & " " & "(" & Fwidth & ")"
case COL_TYPE_DECIMAL
sType="Decimal" & " " & "(" & Fwidth & "," & Fdecplaces & ")"
case COL_TYPE_FLOAT
sType="Float"
'ну и т.д.
case Else
sType="Не определен"
end Case
fildtype (iColNum)= sType
filditog (iColNum)= fildames(iColNum) & " " & fildtype (iColNum)
Next
end if
End Sub

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 277
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 108
Откуда: Орск
Контактная информация:

Re: Создание классификатора

Сообщение ginpetr » 08 дек 2014, 08:01

Вы кажется про alter control забыли... или не знали.
Я к тому, что не разобравшись как что работает, используя куски чужого кода Вам долго придётся создавать классификатор. Пишите лучше самостоятельно, читайте справку, понимайте и применяйте! А уж если в справке что-то непонятно, тогда спрашивайте.
Успехов!

Варя
Интересующийся
Сообщения: 42
Зарегистрирован: 08 окт 2007, 06:00
Репутация: 0

Re: Создание классификатора

Сообщение Варя » 08 дек 2014, 09:25

ginpetr писал(а):Вы кажется про alter control забыли... или не знали.
Я к тому, что не разобравшись как что работает, используя куски чужого кода Вам долго придётся создавать классификатор. Пишите лучше самостоятельно, читайте справку, понимайте и применяйте! А уж если в справке что-то непонятно, тогда спрашивайте.
Успехов!
Добрый день) Вы ошибаетесь, я не просто использую чужой код, но и еще и читаю учебники, какие нашла и справку. Про alter control знаю и он в коде есть. С помощью участка кода (который указан выше), я пыталась сформировать массив (измененный вариант, из которого удалено выбранное поле), который и будет использоваться в операторе Alter Control. Мне нужно понять, правильно ли я делаю, что формирую новый массив и верно ли написала процедуру (потому что вроде как получается, что он формируется с элемента, который удаляется).

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 277
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 108
Откуда: Орск
Контактная информация:

Re: Создание классификатора

Сообщение ginpetr » 08 дек 2014, 09:54

Удалите выбранное поле с помощью
Alter Table "имя_таблицы" ( drop поле )
запустите опять процедуру построения массива полей таблицы и
alter control

Варя
Интересующийся
Сообщения: 42
Зарегистрирован: 08 окт 2007, 06:00
Репутация: 0

Re: Создание классификатора

Сообщение Варя » 08 дек 2014, 11:06

ginpetr писал(а):Удалите выбранное поле с помощью
Alter Table "имя_таблицы" ( drop поле )
запустите опять процедуру построения массива полей таблицы и
alter control
Пробовала так сделать) Но только мне же ведь не нужно удалять поле таблицы-шаблона (по которой я создаю новый слой) ведь Alter Table именно это и сделает, на сколько я понимаю. А мне нужно удалить поле в процессе создания новой таблицы. Или вы предлагаете создать новую таблицу из нее удалить поле и сохранить изменения?

sysrepos
Активный участник
Сообщения: 125
Зарегистрирован: 07 окт 2012, 16:25
Репутация: 20
Откуда: Москва

Re: Создание классификатора

Сообщение sysrepos » 08 дек 2014, 17:29

вот мой вариант программы "Классификатор", (с исходным кодом, может что то пригодится)
кратко: программа позволяет изменять вид объекта(объектов) в соответствии с классификатором и/или атрибут в соответствии с классификатором.
Классификаторы должны храниться в папке с программой (папка "классификаторы"). Классификаторы можно (и нужно) создавать в самой программе.
Чтобы начать работу: запустите программу, выделите объект и нажмите на кнопку "К" на панели. Подробная инструкция в архиве.

Писал где то год назад, вроде все ошибки отловил, но наверно могут быть ошибки, которые я не успел заметить.
Вложения
программа классификатор_v50.7z
(63.67 КБ) 203 скачивания

thegeo
Активный участник
Сообщения: 154
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 73

Re: Создание классификатора

Сообщение thegeo » 08 дек 2014, 22:44

Формирование новой таблицы на базе существующей с удалением выбранных полей.
Вложения
editTbDel.zip
(1.92 КБ) 172 скачивания

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость