Страница 1 из 2
Создание классификатора
Добавлено: 01 дек 2014, 23:22
Варя
Добрый день! Нужна помощь! Пишу курсовик по разработке классификатора для СТП. В программировании почти новичок. На данный момент почти получилось сделать диалог сохранения по шаблону, но никак не получается по нажатию на кнопку Button сформировать список слоев (сейчас у меня вместо этого PopupMenu). Очень бы помогло, если бы поизучать код стандартной утилиты MapInfo "создание новой таблицы". Может быть знаете, где его можно посмотреть или м.б. есть подобный код.
Re: Создание классификатора
Добавлено: 02 дек 2014, 07:28
Sibit
Честно говоря, не уловил суть вопроса. Попробуйте описать проблему подробнее. Вам нужно интерфейс приложения написать на MapBasic? А версия MapInfo какая?
Варя писал(а):Очень бы помогло, если бы поизучать код стандартной утилиты MapInfo "создание новой таблицы". Может быть знаете, где его можно посмотреть или м.б. есть подобный код.
Что-то мне подсказывает, что нигде. Вполне возможно что это часть системы. А чем она вам поможет?
Re: Создание классификатора
Добавлено: 02 дек 2014, 07:37
ginpetr
Чтобы создать новую таблицу в нужном каталоге, нужно получить путь с помощью FileSaveAsDlg( ) и выполнить Create Table, где задаётся всё остальное (структура и т.п.). Если структура не фиксирована, придётся делать диалог редактирования структуры таблицы.
В чём сложности создания списка слоёв?
Re: Создание классификатора
Добавлено: 02 дек 2014, 13:56
thegeo
М.б. полезно
Пример программы
Re: Создание классификатора
Добавлено: 02 дек 2014, 23:34
Варя
Попытаюсь объяснить подробнее) На данном этапе создаю диалоговое окно, которое бы загружало шаблон (пока что это просто слой, потом может быть попробую так называемые "сшитые таблицы") и по этому шаблону формируется новая таблица с возможностью добавления и удаления полей. За основу взяла как раз из того учебника, что мне скинули (программирование для MI) пример кода "диалог с использованием элементов ListBOX и PopupMenu". Поменяла его, но никак не получается заменить popupmenu, где указывается тип слоя (мне это совсем не нужно) на button, которая бы запускала просто загрузку слоя (слоев) в следующий элемент диалога - ListBox. Там дело в том, что применяется функция ReadControlValue(1002)-1 (а она для button) не работает. Не могу понять, чем ее заменить. В общем. Могу код сбросить, но может быть кто-нибудь сможет так сказать, в чем может быть проблема или, где можно почитать. Цель-то у меня понять, а не просто утилиту написать. Очень жду предложений.
Re: Создание классификатора
Добавлено: 02 дек 2014, 23:37
Варя
Ах, да, работаю в MI 12.0, в качестве среды разработки использую MapBasic IDE.
Re: Создание классификатора
Добавлено: 03 дек 2014, 00:32
thegeo
О построении диалога:
1. Удалите все, что касается выбора типа слоя.
2. Вставьте в начало кода вызов CreateListLayerNames. Предварительно отредактируйте эту функцию – исключите проверку на тип слоя.
3. Никакой дополнительной кнопки не требуется. При загрузке диалога формируется список слоев активной карты и заполняется соответствующий ListBox.
Re: Создание классификатора
Добавлено: 03 дек 2014, 22:07
Варя
Ура! Получилось. Хотя, честно говоря, пыталась и раньше удалить, но он мне почему-то бесконечные ошибки выдавал. В этот раз, видимо, помог Ваш совет)
удаление элемента массива
Добавлено: 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
Re: Создание классификатора
Добавлено: 08 дек 2014, 08:01
ginpetr
Вы кажется про alter control забыли... или не знали.
Я к тому, что не разобравшись как что работает, используя куски чужого кода Вам долго придётся создавать классификатор. Пишите лучше самостоятельно, читайте справку, понимайте и применяйте! А уж если в справке что-то непонятно, тогда спрашивайте.
Успехов!
Re: Создание классификатора
Добавлено: 08 дек 2014, 09:25
Варя
ginpetr писал(а):Вы кажется про alter control забыли... или не знали.
Я к тому, что не разобравшись как что работает, используя куски чужого кода Вам долго придётся создавать классификатор. Пишите лучше самостоятельно, читайте справку, понимайте и применяйте! А уж если в справке что-то непонятно, тогда спрашивайте.
Успехов!
Добрый день) Вы ошибаетесь, я не просто использую чужой код, но и еще и читаю учебники, какие нашла и справку. Про alter control знаю и он в коде есть. С помощью участка кода (который указан выше), я пыталась сформировать массив (измененный вариант, из которого удалено выбранное поле), который и будет использоваться в операторе Alter Control. Мне нужно понять, правильно ли я делаю, что формирую новый массив и верно ли написала процедуру (потому что вроде как получается, что он формируется с элемента, который удаляется).
Re: Создание классификатора
Добавлено: 08 дек 2014, 09:54
ginpetr
Удалите выбранное поле с помощью
Alter Table "имя_таблицы" ( drop поле )
запустите опять процедуру построения массива полей таблицы и
alter control
Re: Создание классификатора
Добавлено: 08 дек 2014, 11:06
Варя
ginpetr писал(а):Удалите выбранное поле с помощью
Alter Table "имя_таблицы" ( drop поле )
запустите опять процедуру построения массива полей таблицы и
alter control
Пробовала так сделать) Но только мне же ведь не нужно удалять поле таблицы-шаблона (по которой я создаю новый слой) ведь Alter Table именно это и сделает, на сколько я понимаю. А мне нужно удалить поле в процессе создания новой таблицы. Или вы предлагаете создать новую таблицу из нее удалить поле и сохранить изменения?
Re: Создание классификатора
Добавлено: 08 дек 2014, 17:29
sysrepos
вот мой вариант программы "Классификатор", (с исходным кодом, может что то пригодится)
кратко: программа позволяет изменять вид объекта(объектов) в соответствии с классификатором и/или атрибут в соответствии с классификатором.
Классификаторы должны храниться в папке с программой (папка "классификаторы"). Классификаторы можно (и нужно) создавать в самой программе.
Чтобы начать работу: запустите программу, выделите объект и нажмите на кнопку "К" на панели. Подробная инструкция в архиве.
Писал где то год назад, вроде все ошибки отловил, но наверно могут быть ошибки, которые я не успел заметить.
Re: Создание классификатора
Добавлено: 08 дек 2014, 22:44
thegeo
Формирование новой таблицы на базе существующей с удалением выбранных полей.