Każdy zdrowy człowiek jest leniwy! Programiści i użytkownicy ich programów również. Kiedy udostępniłem w sieci program, który każdy miał obowiązek przekopiować sobie na dysk lokalny - rzadko kto to wykonał i wiele osób odpalało program z lokalizacji sieciowej. Pomijam problem, że w tym układzie nie mogłem uaktualnić wersji, bo plik był w użyciu, to ciągnięcie programu z serwera jest rozwiązaniem bardzo nieefektywnym, zawodnym i wręcz nie do użytku w przypadku, gdy np. wykorzystujemy jakieś tymczasowe obiekty.
Poniższy kod wykrywa, czy program został wywołany z dysku sieciowego. Należy to sprawdzić przy starcie naszej aplikacji. W przypadku wykrycia lokalizacji sieciowej należy wyświetlić odpowiedni komunikat z prośbą o przekopiowanie pliku na komputer lokalny i zamknąć program.
A oto procedura, która wykrywa lokalizację sieciową bieżącej bazy:
Declare Function GetDriveType Lib "kernel32" Alias _
"GetDriveTypeA" (ByVal sDrive As String) As Long
Public Function DriveType(sDrive As String) As String
Dim sDriveName As String
On Error Resume Next
Const DRIVE_TYPE_UNDTERMINED = 0
Const DRIVE_ROOT_NOT_EXIST = 1
Const DRIVE_REMOVABLE = 2
Const DRIVE_FIXED = 3
Const DRIVE_REMOTE = 4
Const DRIVE_CDROM = 5
Const DRIVE_RAMDISK = 6
If sDrive = "\" Then
DriveType = "is a remote I.E Network drive."
Else
sDriveName = GetDriveType(sDrive & ":\")
Select Case sDriveName
Case DRIVE_TYPE_UNDTERMINED
DriveType = "has not been recognized"
Case DRIVE_ROOT_NOT_EXIST
DriveType = "specified doesn't exist"
Case DRIVE_CDROM
DriveType = "is a CD-ROM drive."
Case DRIVE_FIXED
DriveType = "cannot be removed I.E. Hard Disk"
Case DRIVE_RAMDISK
DriveType = "is a RAM disk."
Case DRIVE_REMOTE
DriveType = "is a remote I.E Network drive."
Case DRIVE_REMOVABLE
DriveType = "can be removed I.E. Floppy Disk."
End Select
End If
End Function
Public Function CzyNET() As Boolean
On Error Resume Next
CzyNET = False
If DriveType(Left(CurrentDb.Name, 1)) Like "*Network drive*" Then
CzyNET = True
End If
End Function
W celu sprawdzenia, czy uruchomiono program z sieci, można posłużyć się następującym kodem:
If CzyNET = True Then
MsgBox "Program wywołano z lokalizacji sieciowej. Przekopiuj plik na dysk lokalny.",48
DoCmd.Quit acQuitSaveNone
Else
'OK
End If
To jest dość rozbudowane rozpisanie funkcji GetDriveType, które miało na celu przedstawić
pozostałe typy dysków zwracane przez tę funkcję. W rzeczywistych zastosowaniach można całe sprawdzenie uprościć do kilku linijek,
zachęcam do prób.
K. P.