On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

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

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


style="mso-bidi-font-family: Tahoma">Ситуация 1:

Cоздав однажды программу в какой-то директории-имя этойдиректории style="mso-bidi-font-family: Tahoma">будет тянуться вплоть до инсталляционных дискет, что не всегда удобно.Это вызвано, например, тем что в начальный период составления приложениямы естественно в Properties элемента управления Data1 базы данных делаемпривязку к директории разработки программы из окна формы..Этим самымв Data1.DatabaseName мы забиваем адрес текущей директории - раз и навсегда связываем себе руки. Ситуация 2:
Иногда нам необходимо один и то же элемент управления типа Data1 переключать на разные базы данных, меняя при этом также и наименование Data1.Recordsourse!!!Т.е. попутно стоит задача: "Как избавиться от постоянных изменений адреса Data1.DatabaseName и имени Recordsourse в исходнике? Многие делают эти изменения программно и также через Properties элемента Data1,т.е. возлагаяэту задачу на приложение, читающего путь к новой текущей директорииприложению и БД.Нового в этом ничего нет - все эти свойства заложены в VB и этим пользуются программисты. А начинающие должны еще только это изучить. style="mso-spacerun: yes">
Долго пользовался этим приемом и я, но вдруг споткнулся, запустив файл ехес дискеты "А".Программа выдает Error - не видит наличие файлов в текущей директории!!! Когда я проблему решил сам, то решил поделиться на сайте, описав все по порядку в своем изложении для предупреждения новичков в ошибке мышления программиста. Ниже приводится варианты объяснений и пример как это устранить style="mso-ansi-language: EN-US"> В каталоге, например,DEMO -разместите чистую форму с кодом: Private Sub Form_Load() Dim peremDir peremDir = App.Path ' <-- это всегда текущая директория Запусти приложение через F8 (кстати, это пошаговое исполнение)подведите на App.Path мышку и убедитесь (кто, еще незнает) какее читает комп. Если это просто директория, то читаетсяона, например, так ' "C:\DEMO" или "А:\DEMO".В конце строки не стоит "\"
И так, если директория не корневая то будет правильно выражение и  style="mso-ansi-language: RU; mso-fareast-font-family: Times New Roman; mso-fareast-language: EN-US; mso-bidi-language: AR-SA">при проверке наличия файла и не сработаетOn Error Goto ObpabErr:  On Error GoTo ObpabErr If Dir(peremDir & "\" & "Form1.frm") <> ""  Then MsgBox "Tекущая директория на диске не корневая, то она" & vbNewLine & "не имеет в конце '\' .
Но Вы смотрите правильно заданный путь" & vbNewLine & "к файлу:" & (peremDir & "\" &
                          "Form1.frm"), vbInformation, "" Exit Sub
style="COLOR: blue; mso-ansi-language: RU; mso-fareast-font-family: Times New Roman; mso-fareast-language: EN-US; mso-bidi-language: AR-SA">End If style="mso-bidi-font-family: Tahoma">Иначе если мыразместите чистую форму с кодом: в корневой директории,  например,"C:\",тогда выражение:
If Dir(peremDir & "\" & "Form1.frm") <> "" Then будет неверным  style="mso-bidi-font-family: Tahoma">C:\\Form1.frm и сработает On Error GoTo ObpabErr с переходом на следующую строку:
ObpabErr: style="mso-bidi-font-family: Tahoma">MsgBox "Мы находимся в текущей корневой директории " & vbNewLine & "то она уже имеет в конце '\' , см.: -" & peremDir & vbNewLine & "Значит путь к файлу нами написан неправильно! - " & peremDir & "\" & "Form1.frm" & vbNewLine & "Вы обратили внимание в чем неправильно???" & vbNewLine & "Далее приведен кодкак исправить положение (см. код):", vbExclamation, "" style="mso-bidi-font-family: Tahoma"> style="mso-bidi-font-family: Tahoma">Если Вы разместите форму приложения на диске "А" в директории "А:\DEMO", lang=RU>то также все будет нормально в строке пути:
                                            peremDir & "\" & DEMO & "\"& "Form1.frm" А теперь для убеждения разметите форму в корневой директории диска "А:\" и сновазапустите приложение через F8и Вы убедитесь, что мы предложили компу неверный путь к файлу Form1.frm таков:= "А:\\Form1.frm", значит попытка чтения наличия файла в текущей директории: If Dir(peremDir & "\" & "Form1.frm") <> "" Then'будет также неверная!!! Чтобы убедиться в правоте моего обяснения - наведите мышку на переменную peremDir = она будет равна "А:\". style="color: blue; mso-ansi-language: EN-US; mso-fareast-font-family: Times New Roman; mso-fareast-language: EN-US; mso-bidi-language: AR-SA">   End Sub Чтобы закончить наш разговор, то надо раз и навсегда принять правило приводить  lang=RU>переменную значения текущей директории к формуле безокончания на "\". Как это сделать, вот так:
If Right(peremDir, 1) = "\"  Then peremDir = Left(peremDir, Len(peremDir) - 1) End If

Теперь путь к текущей директории будет однозначно задан переменной  peremDir, но всегда без "\". И мы не будем задумываться какая у нас директория - корневая или простодиректория, style="mso-ansi-language: EN-US">и где находится наша программа.  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 style="mso-ansi-language: EN-US"> 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

'и так далее,другие строки кода
style="color: blue; mso-ansi-language: EN-US; mso-fareast-font-family: Times New Roman; mso-fareast-language: EN-US; mso-bidi-language: AR-SA">  


Языки программирования: разное