Перейти к содержимому

Фотография

MapBasic и все что с ним связаноМожет я не один такой?!


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 388

#81
Jismo

Jismo
  • Свой человек
  • 975 сообщений
Кстати, столкнулся с еще одной маленькой проблемкой, хотелось бы узнать, может кто нашел решение:
Если открывать таблицу с предложением Interactive и такая таблица не найдена, то вылазиет стандартный диалог открытия, так вот как поймать событие нажатия на кнопки "открыть" и "отмена" или закрытие окна "Х".

PS: If CommandInfo(CMD_INFO_DLG_OK) Then - не пашет :)
  • 0

#82
d_d_t

d_d_t
  • Завсегдатай
  • 239 сообщений

Может кто сталкивался и не знает как узнать открыта ли та или иная таблица. Я написал функцию, с помощью которой, Вы можете узнать это :smoke: :

Declare Function IsTableExist(MyTabName As String) As Logical

Function IsTableExist(MyTabName As String) As Logical
'******************************************************
	 Dim i, TabCount As Integer		 
	 TabCount = NumTables()	'Число открытых таблиц
	 IsTableExist = False
	 For i = 1 To TabCount	 'цикл по открытым таблицам
		  If TableInfo(i, TAB_INFO_NAME) = MyTabName Then
			   IsTableExist = True	
			   Exit For			
		  End If
	 Next
End Function


Есть еще один способ - с помощью обработчиков ошибок:
http://www.gis-news....lefunctions.htm
  • 0

#83
d_d_t

d_d_t
  • Завсегдатай
  • 239 сообщений

Кстати, столкнулся с еще одной маленькой проблемкой, хотелось бы узнать, может кто нашел решение:
Если открывать таблицу с предложением Interactive и такая таблица не найдена, то вылазиет стандартный диалог открытия, так вот как поймать событие нажатия на кнопки "открыть" и "отмена" или закрытие окна "Х".

PS: If CommandInfo(CMD_INFO_DLG_OK) Then - не пашет :smoke:


Можно вместо Open Interactive самому открывать стандартное диалоговое окно открытия файла с пом. функции FileOpenDlg(), а затем использовать возвращаемое ею значение в предложении Open, если пользователь нажал ОК (вернется путь и название файла), либо выполнять другие действия, если вернулась пустая строка (пользователь нажал отмену)

Сообщение отредактировал d_d_t: 03.06.2009, 14:27:34

  • 0

#84
Jismo

Jismo
  • Свой человек
  • 975 сообщений


Кстати, столкнулся с еще одной маленькой проблемкой, хотелось бы узнать, может кто нашел решение:
Если открывать таблицу с предложением Interactive и такая таблица не найдена, то вылазиет стандартный диалог открытия, так вот как поймать событие нажатия на кнопки "открыть" и "отмена" или закрытие окна "Х".

PS: If CommandInfo(CMD_INFO_DLG_OK) Then - не пашет :smoke:


Можно вместо Open Interactive самому открывать стандартное диалоговое окно открытия файла с пом. функции FileOpenDlg(), а затем использовать возвращаемое ей значения в предложении Open, если пользователь нажал ОК (вернется путь и название файла), либо выполнять другие действия, если вернулась пустая строка (пользователь нажал отмену)

Да нет это то понятно, я так и делаю, но всеже интересно было бы узнать как отловить это событие
  • 0

#85
swatch

swatch
  • Частый гость
  • 99 сообщений
Можно глупый вопрос? А зачем это нужно отловить?
После выполнения Open Table .... interactive можно проверить есть ли такая таблица в сеансе воспользовавшись функцией IsTableExist (см. выше), если вернет True, значит нажата была кнопа "открыть", если False, то соответственно "отмена" или "X".
Цель обработки не понятна...
  • 0

#86
Jismo

Jismo
  • Свой человек
  • 975 сообщений

Можно глупый вопрос? А зачем это нужно отловить?
После выполнения Open Table .... interactive можно проверить есть ли такая таблица в сеансе воспользовавшись функцией IsTableExist (см. выше), если вернет True, значит нажата была кнопа "открыть", если False, то соответственно "отмена" или "X".
Цель обработки не понятна...

:D
Ваша идея, конечно теоретически верна(этот вариант я тоже проверил прежде чем спросить здесь), но на практике ошибка происходит именно в строке открытия таблицы, а до строки проверки открыта она или нет она по просту не доходит
  • 0

#87
swatch

swatch
  • Частый гость
  • 99 сообщений
Значит только придется пользоваться обработчиком ошибок OnError:
Sub Sample
Dim tForOpen As Alias
	tForOpen = "TableForOpen"
	'Здесь включаем обработчик на случай отмены или X в диалоге открытия
	OnError GoTo Table_Not_Opened
	Open Table "Имя таблицы" as tForOpen Interactive
   	Print "Таблица открыта"
After_Error_Handler:
	'Если мы здесь, то либо ошибки не произошло, либо мы ее обработали
	'Выключаем обработчик ошибок
	OnError GoTo 0
	Exit Sub
Table_Not_Opened:
	'Если мы здесь значит произошла ошибка в диалоге открытия таблицы
	Note "Таблица должна быть открыта обязательно!"
	Resume After_Error_Handler
End sub
Удачи в борьбе с КартБейсиком :dandy:
  • 0

#88
Jismo

Jismo
  • Свой человек
  • 975 сообщений
Тьфу ты блин я в своем коде забыл просто выход из процедуры сделать после выключения обработчика ошибок.

2Swatch спс за наглядность примера
  • 0

#89
Conkistador

Conkistador
  • Гость
  • 33 сообщений
Появился еще вопрос по связке с дотнетом... Ситуация такая: если после запуска программы на МБ, которая вызывает функцию дот нета при выборе точки, открыть любой слой через меню файл->открыть, то во время выбора точки получаю Ексепшен: System cannot find the file specified. Тоесть получается что нарушается условие в соответствии с которым dll с дотнетовским методом должна находиться в одной папке со скриптом, т.к. папкой по умолчанию становится та папка откуда был открыт последний слой.
Как изменить путь по умолчанию для МИ? Путем имперических исследований выяснено что если выполнить программы->запустить программу... то все начинает работать, НО если выполнить Run Application ... то все тотже ексепшен...
Может кто то сталкивался ? или как можно обойти эту проблему ?
  • 0

#90
Zulkar

Zulkar

    Читатель

  • В доску свой
  • 3 243 сообщений
На МБ не писал, но похожая проблема возникает где угодно. Это связано с тем, что при открытии файла через стандартный диалог FileOpen рабочим каталогом становится тот, где был открыт файл. И в дальнейшем при открытии файлов, если задается не полный путь естественно возникают ошибки. Решение одно - запоминать текущую директорию до вызова диалога открытия файла, и восстанавливать ее после закрытия.
  • 0

#91
Conkistador

Conkistador
  • Гость
  • 33 сообщений
в том то и дело что непонятно как её восстановить...
ошибка падает в тот момент когда МБ пытается вызвать процедуру описанную в dll. Связка с ней описана при обьявлении процедуры...
причем вызов Run Application НЕ МЕНЯЕТ путь по умолчанию... совсем уже непонятно как обойти эту особенность...
  • 0

#92
Zulkar

Zulkar

    Читатель

  • В доску свой
  • 3 243 сообщений

в том то и дело что непонятно как её восстановить...


GetCurrentDirectory/SetCurrentDirectory - неа?
  • 0

#93
Conkistador

Conkistador
  • Гость
  • 33 сообщений
если бы :smoke:
  • 0

#94
d_d_t

d_d_t
  • Завсегдатай
  • 239 сообщений

... получается что нарушается условие в соответствии с которым dll с дотнетовским методом должна находиться в одной папке со скриптом, т.к. папкой по умолчанию становится та папка откуда был открыт последний слой.


А если попробовать dll-ку и .mbx положить в один каталог с mapinfo.exe?
PS: сам не пробовал, но, вроде как, этот путь должен проверяться перед тем как mapInfo начнет ругаться.
  • 0

#95
Jismo

Jismo
  • Свой человек
  • 975 сообщений
Есть вопросец господа!
Как воспользоваться DotNet'овской функцией передающей массив в качестве параметра в программе на MB? Если можно то пример плиз!
  • 0

#96
swatch

swatch
  • Частый гость
  • 99 сообщений
Как описываете импорт из dll в МБ? какие пути указываете к dll? примерчик дайте
  • 0

#97
Jismo

Jismo
  • Свой человек
  • 975 сообщений
2Conkistador У меня в программах достаточно того чтобы MBX файл лежал в одной директории с DLLкой.
  • 0

#98
Jismo

Jismo
  • Свой человек
  • 975 сообщений

Как описываете импорт из dll в МБ? какие пути указываете к dll? примерчик дайте

Я вроде писал уже, а может только подумал что писал :rotate:

Первое условие которое необходимо для вызова .NET библиотеки из MB: метод должен быть статичным!!!

Это пример когда метод ничего не возвращает:
Declare Method ShowMsg
Class "Sample.Msg" Lib "Sample.dll" 
(ByVal str As String)


и внутри любого метода пишешь вызов:
Call ShowMsg("Привет")


результат: вылазиет окошко стандартное для .Net - MessageBox с текстом что ты написал в мапбэйсике.

А это когда возвращает значение:
Declare Method ShowMsg
Class "Sample.Msg" Lib "Sample.dll" 
(ByVal str As String) As Logical


и внутри метода пишешь вызов:
Dim mybool As Logical
mybool = ShowMsg("Привет")


результат: вылазиет окошко стандартное для .Net - MessageBox с текстом что ты написал в мапбэйсике и в переменную заносится True.

ЗЫ: Примеры образные, но рабочие. Да и еще кое что при объявлении класса в Мапбэйсике указывается и пространство имен и класс в данных примерах, пространство имен это Sample, а класс это Msg
  • 0

#99
swatch

swatch
  • Частый гость
  • 99 сообщений
2Jismo: у меня аналогично все работало.
Поэтому я и спрашиваю пример декларации сабов из DLL, мож там экзотично написано :rotate:
  • 0

#100
Jismo

Jismo
  • Свой человек
  • 975 сообщений
Да я и сам сталкнулся с траблом выше описано :rotate:
  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.