Про помилку складання шляху до поточної директорії … і не тільки, Basic, Програмування, статті

Або
Як зробити незалежність від місця установки програми, що б вона працювала навіть з дисковода “А”

Ситуація
1:


Створений одного разу програму в якийсь директорії-ім’я цієїдиректоріїбуде тягнутися аж до інсталяційних дискет, що не завжди зручно.Це викликано, наприклад, тим що в початковий період складання програмими природно в 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
, Але завжди без “\”. І ми не будемо замислюватися яка у нас директорія – коренева або простодиректорія,і де знаходиться наша програма. Наступний перевірка завжди позитивна і без спрацьовування Error:

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

MsgBox “Тепер завжди правильно поставлене” & vbNewLine &

           “Поточний шлях (App.Path) до файлу:” & vbNewLine
& (peremDir &


          
“\” & “Form1.frm”),  vbInformation, “”

End
If

Це ще зручніше і тоді, коли змінна буде обявлени

Public
peremDir As String 

колими її використовуємо длязавдання поточної директорії різних елементів управління. Наприклад, дуже зручно Зробити прив’язку знаходження БД до поточної директорії. наприклад:

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*