Об ошибке составления пути к текущей директории ...и не только
Как сделать независимость от места установки программы,
что бы она работала даже с дисковода "А"
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
peremDirperemDir = 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
ObpabErrIf Dir(peremDir
& "\" & "Form1.frm") <> ""
ThenMsgBox "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) = "\"
ThenperemDir = Left(peremDir, Len(peremDir) -
1)End
If
Теперь путь к
текущей директории будет однозначно задан переменной
peremDir, но всегда без "\". И мы не будем задумываться какая у нас директория - корневая или
простодиректория, style="mso-ansi-language: EN-US">и где находится наша
программа. Cледующая проверка всегда положительна и без
срабатывания Error:
If Dir(peremDir &
"\" & "Form1.frm") <> ""
ThenMsgBox "Теперь всегда правильно заданный "
& vbNewLine & "текущий путь (App.Path) к файлу:" &
vbNewLine & (peremDir & "\" & "Form1.frm"), vbInformation,
""End
If
Это еще
удобнее и тогда, когда переменная будет
обявлена
Public peremDir As
String
когдамы ее используем длязадания текущей директории различным элементам
управления. Например, очень удобно cделать привязку нахождения БД к текущей
директории. например:
Это даст
независимость места установки программы, хоть на Дисководе
"A".
Что ранее не
мог я сделать
Теперь оставьте
на форме и используйте всегда такой код:
В модуле или
разделе Option Explicitобявите
переменную PublicperemDir As String:
Option
ExplicitPublic peremDir As
String
style="mso-ansi-language: EN-US">
Private Sub
Form_Load()peremDir = App.Path ' <-- это всегда текущая
директорияIf
Right(peremDir, 1) = "\"
ThenperemDir = Left(peremDir, Len(peremDir) -
1)End
If If
Dir(peremDir & "\" & "Form1.frm") <>
""
ThenMsgBox
"Теперь всегда будетправильно
заданный " & 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">