InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Об ошибке составления пути к текущей директории ...и не только


Или
Как сделать независимость от места установки программы, что бы она работала даже с дисковода "А"


Ситуация 1:

Cоздав однажды программу в какой-то директории-имя этойдиректориибудет тянуться вплоть до инсталляционных дискет, что не всегда удобно.Это вызвано, например, тем что в начальный период составления приложениямы естественно в Properties элемента управления Data1 базы данных делаемпривязку к директории разработки программы из окна формы..Этим самымв Data1.DatabaseName мы забиваем адрес текущей директории - раз и навсегда связываем себе руки.

Ситуация 2:
Иногда нам необходимо один и то же элемент управления типа Data1 переключать на разные базы данных, меняя при этом также и наименование Data1.Recordsourse!!!
Т.е. попутно стоит задача: "Как избавиться от постоянных изменений адреса Data1.DatabaseName и имени Recordsourse в исходнике? Многие делают эти изменения программно и также через Properties элемента Data1,т.е. возлагаяэту задачу на приложение, читающего путь к новой текущей директорииприложению и БД.Нового в этом ничего нет - все эти свойства заложены в VB и этим пользуются программисты. А начинающие должны еще только это изучить.
Долго пользовался этим приемом и я, но вдруг споткнулся, запустив файл ехе
с дискеты "А".Программа выдает Error - не видит наличие файлов в текущей директории!!! Когда я проблему решил сам, то решил поделиться на сайте, описав все по порядку в своем изложении для предупреждения новичков в ошибке мышления программиста.

Ниже приводится варианты объяснений и пример как это устранить

В каталоге, например,DEMO -разместите чистую форму с кодом:

Private Sub Form_Load()

Dim peremDir

peremDir = App.Path ' <-- это всегда текущая директория

Запусти приложение через F8 (кстати, это пошаговое исполнение)подведите на App.Path мышку и убедитесь (кто, еще незнает) какее читает комп. Если это просто директория, то читаетсяона, например, так ' "C:\DEMO" или "А:\DEMO".В конце строки не стоит "\"
И так, если директория не корневая то будет правильно выражение и при проверке наличия файла и не сработаетOn Error Goto ObpabErr: 

On Error GoTo ObpabErr

If Dir(peremDir & "\" & "Form1.frm") <> "" Then

MsgBox "Tекущая директория на диске не корневая, то она" & vbNewLine & "не имеет в конце '\' .
Но Вы смотрите правильно заданный путь" & vbNewLine & "к файлу:" & (peremDir & "\" &
                          "Form1.frm"), vbInformation, ""

Exit Sub
End If

Иначе если мыразместите чистую форму с кодом: в корневой директории,  например,"C:\",тогда выражение:
If Dir(peremDir & "\" & "Form1.frm") <> "" Then будет неверным 
C:\\Form1.frm и сработает On Error GoTo ObpabErr с переходом на следующую строку:
ObpabErr:MsgBox "Мы находимся в текущей корневой директории " & vbNewLine & "то она уже имеет в конце '\' , см.: -" & peremDir & vbNewLine & "Значит путь к файлу нами написан неправильно! - " & peremDir & "\" & "Form1.frm" & vbNewLine & "Вы обратили внимание в чем неправильно???" & vbNewLine & "Далее приведен кодкак исправить положение (см. код):", vbExclamation, ""

Если Вы разместите форму приложения на диске "А" в директории "А:\DEMO",то также все будет нормально в строке пути:
                                            peremDir & "\" & DEMO & "\"& "Form1.frm"

А теперь для убеждения разметите форму в корневой директории диска "А:\" и сновазапустите приложение через F8и Вы убедитесь, что мы предложили компу неверный путь к файлу Form1.frm таков:= "А:\\Form1.frm"значит попытка чтения наличия файла в текущей директории:

If Dir(peremDir & "\" & "Form1.frm") <> "" Then'будет также неверная!!! Чтобы убедиться в правоте моего обяснения - наведите мышку на переменную peremDir = она будет равна "А:\".

   End Sub

Чтобы закончить наш разговор, то надо раз и навсегда принять правило приводить переменную значения текущей директории к формуле безокончания на "\"Как это сделать, вот так:

If Right(peremDir, 1) = "\" Then

peremDir = Left(peremDir, Len(peremDir) - 1)

End If

Теперь путь к текущей директории будет однозначно задан переменной  peremDir, но всегда без "\"И мы не будем задумываться какая у нас директория - корневая или простодиректория, и где находится наша программа.  Cледующая проверка всегда положительна и без срабатывания Error:
If Dir(peremDir & "\" & "Form1.frm") <> "" Then

MsgBox "Теперь всегда правильно заданный " & vbNewLine &
           "текущий  путь    (App.Path) к файлу:" & vbNewLine & (peremDir &
           "\" & "Form1.frm"),  vbInformation, ""

End If

Это еще удобнее и тогда, когда переменная будет обявлена
Public peremDir As String 
когдамы ее используем длязадания текущей директории различным элементам управления. Например, очень удобно cделать привязку нахождения БД к текущей директории. например:
Data1.DatabaseName = peremDir & "\" & "BASEKOD_VB.mdb"

Data1.RecordSource = "AdrInet"

Data1.Refresh

Это даст независимость места установки программы, хоть на Дисководе "A".

Что ранее не мог я сделать

Теперь оставьте на форме и используйте всегда такой код:

В модуле или разделе Option Explicitобявите переменную Public peremDir As String:

Option Explicit

Public peremDir As String

Private Sub Form_Load()

peremDir = App.Path ' <-- это всегда текущая директория

   If Right(peremDir, 1) = "\" Then

peremDir = Left(peremDir, Len(peremDir) - 1)

End If 

   If Dir(peremDir & "\" & "Form1.frm") <> "" Then

MsgBox "Теперь всегда будетправильно заданный " & vbNewLine & "текущий путь
     (App.Path) к файлу:" & vbNewLine &  (peremDir & "\" & "Form1.frm"), vbInformation, ""

End If

и так далее,другие строки кода

             End Sub


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua