Относительные пути до файла на MapBasic - как?

MapInfo, MapBasic
Ответить
tems-ya
Интересующийся
Сообщения: 39
Зарегистрирован: 28 янв 2015, 22:07
Репутация: 1
Откуда: Воронеж

Относительные пути до файла на MapBasic - как?

Сообщение tems-ya » 02 сен 2015, 17:16

В папке MAP лежат две подпапки 1)Data - данные 2)Program - мои скомпилированные программы на MapBasic

+MAP
|_____ DATA
|_____ Program

В своей программе на MapBasic я сейчас открываю таблицу aaa с данными так:

Код: Выделить всё

Open Table "D:\MAP\Data\aaa"  Interactive
хотелось бы что-то типа

Код: Выделить всё

Open Table "..\Data\aaa"  Interactive
т.е. полностью отвязанное от фиксированных путей. Возможно-ли? Если да, то как?

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

Re: Относительные пути до файла на MapBasic - как?

Сообщение ginpetr » 03 сен 2015, 09:22

Функция ApplicationDirectory$( )
Назначение:
Возвращает строку с указанием каталога, в котором находится приложение MapBasic, выполняющееся в данный момент. Вы можете запустить данную функцию из окна MapBasic в среде MapInfo Professional.
Синтаксис:
ApplicationDirectory$( )
...
см. справку
из этой функции вычесть каталог Program и добавить Data
Лучше, правда, чтобы программа выше данных лежала.

tems-ya
Интересующийся
Сообщения: 39
Зарегистрирован: 28 янв 2015, 22:07
Репутация: 1
Откуда: Воронеж

Re: Относительные пути до файла на MapBasic - как?

Сообщение tems-ya » 03 сен 2015, 12:07

Т.е. полноценно парсить текстовую строку с помощью функций работы со строками - я правильно понял?

Не весело это как-то. Других вариантов нет?

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Относительные пути до файла на MapBasic - как?

Сообщение Boris » 04 сен 2015, 03:49

А что вот так не работает?

Код: Выделить всё

Open Table ApplicationDirectory$( ) + "\..\Data\aaa.tab"  Interactive 

tems-ya
Интересующийся
Сообщения: 39
Зарегистрирован: 28 янв 2015, 22:07
Репутация: 1
Откуда: Воронеж

Re: Относительные пути до файла на MapBasic - как?

Сообщение tems-ya » 07 сен 2015, 08:33

Работает так

Код: Выделить всё

'------------------------------------------------------------------------------
'    Функция возвращает полный путь до каталога с данными
' 
'  Структура папки с картами должна быть строго следующего вида:
'
'  + MAP - (главный каталог может иметь любое имя и расположение)
'     |- +Program     - каталог с исполняемыми программами  *.mbx
'     |- +DATA  - каталог с файлами данных *.tab
'
'     При вызове ф-ии из программы, лежащей в папке ...MAP\Program\,  
'     функция вернет полный путь до папки ...MAP\DATA\
'------------------------------------------------------------------------------
Function getPatchToDirData( ) as string

    Dim Programs_dir as string
    Dim Data_dir     as string
    Dim s1,s2,s3     as string
    Dim n            as integer
    
  Programs_dir = "Program"       'D:\MAP\Program\ 
  Data_dir     = "DATA"    'D:\MAP\DATA\

  'полный путь до директории исполняемой программы s1 = D:\MAP\Program\ 
  s1 = ApplicationDirectory$( )

  'номер позиции с которой начинается искомая строка
  n = InStr(1, s1, Programs_dir)
    
  'если строка не пустая, исключаем имя каталога программ 
  If n<>0 Then  
      s2 = Left$(s1, n-1)          'полный путь до корневого каталога с картами   s2 = D:\MAP\
      s3 = s2 + Data_dir + "\"     'полный путь до директории c данными  s3 = D:\MAP\DATA
      getPatchToDirData = s3
  Else
      Note "Не корректная структура каталогов!"
      getPatchToDirData = ""
  End If
    
  'Print s3

End Function

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

Re: Относительные пути до файла на MapBasic - как?

Сообщение ginpetr » 07 сен 2015, 14:56

А почему в одну строку не пишите?
Left$(ApplicationDirectory$( ),instr(1,ApplicationDirectory$( ),"/Program")-1)+"/DATA"
Разве есть большая нужда делать функцию да ещё без аргументов на входе? Или я что-то пропустил?

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Относительные пути до файла на MapBasic - как?

Сообщение Boris » 07 сен 2015, 20:54

ginpetr писал(а):А почему в одну строку не пишите?
Left$(ApplicationDirectory$( ),instr(1,ApplicationDirectory$( ),"/Program")-1)+"/DATA"
Разве есть большая нужда делать функцию да ещё без аргументов на входе? Или я что-то пропустил?
С точки зрения хорошего системного программирования, тем более на стадии наполнения багажа знаний по языку программирования, такое формальное описание функции, дело вполне нормальное, и я бы даже сказал похвальное. Потом, когда уже все в руках будет "гореть" можно и сократить до одной строки.
Тем более, что разница в MapBasic'е между "все в одну строку" и "каждый чих в отдельной функции" - с точки зрения производительности интерпретатора, минимальна. Не ассемблер, однако. :wink:
А так получилось - полпути к объектному программированию: на каждый вопрос - свой отдельный ответ. :)

ericsson
Гуру
Сообщения: 3321
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 748
Ваше звание: Вредитель полей

Re: Относительные пути до файла на MapBasic - как?

Сообщение ericsson » 07 сен 2015, 22:23

Я только поправлю пару мелочей, которые не влияют на результат, но бросаются в глаза:

"...MAP\DATA\" - нонсенс. В Windows ".." означает родительский каталог.

И "некорректный" в этом случае пишется вместе (это слово уже становится словом-паразитом, но половина тех, кто его использует, не знают, как это делать правильно).

Ответить

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

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

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