UKO Użytkowanie Komputerów
Visual Basic Lab 6
Projekt Pliki daje okazję do zapoznania się z następującymi zagadnieniami pracy z Visual Basic'iem:
typy plików;
tryb dostępu bezpośredni i sekwencyjny;
numeracja plików i znajdowanie wolnego numeru pliku;
otwieranie plików;
polecenia Print #, Write #, Read #, Get #, Put #;
wykorzystanie kontrolek związanych z plikami.
Visual Basic obsługuje następujące typy plików:
o dostępie sekwencyjnym;
o dostępie swobodnym;
pliki binarne.
Do otwierania plików służy polecenie Open, które równocześnie rezerwuje specjalny uchwyt do czytania z i do pisania w pliku. Uchwyt pliku to unikatowa ścieżka do pliku połączona z numerem nadanym przez polecenie Open.
Format instrukcji Open jest następujący:
Open „Nazwa Pliku” [For Tryb]
[PrawaDostępu]
[RodzajZabezpieczenia]
As [#] intNumerPliku [Len = intDługośćRekordu]
Tabela VI.1. Wartości argumentu Tryb polecenia Open
Tryb |
Opis |
Append |
Otwiera plik z dostępem sekwencyjnym do pisania w trybie dołączania. Jeśli plik istnieje, to zapisuje na końcu pliku, jeśli nie to tworzy nowy plik. Dane nigdy nie są nadpisywane!
|
Binary |
Otwiera plik z dostępem binarnym. Można czytać i zapisywać pojedyncze bajty.
|
Input |
Otwiera plik z dostępem sekwencyjnym do czytania. Dane są czytane od początku w tej samej kolejności jak były zapisywane.
|
Output |
Otwiera plik z dostępem sekwencyjnym do pisania. Jeśli plik istnieje, to zapisuje od początku pliku, jeśli nie to tworzy nowy plik i też zapisuje od początku pliku. Dane są nadpisywane! |
|
|
Random |
Otwiera plik z dostępem bezpośrednim do czytania i pisania. Można czytać i zapisywać określone rekordy pliku. |
Objaśnienia:
Jeśli nie podaje się trybu w sposób jawny, to przyjmowany jest tryb Random.
Prawa dostępu określa się poprzez podanie słów kluczowych: Read, Write lub ReadWrite.
Argument RodzajZabezpieczenia przyjmuje następujące wartości: Shared, Lock Read, Lock Write oraz Lock ReadWrite.
Długość rekordu Len = intDługośćRekordu jest podawana w trybie dostępu bezpośredniego. Rzeczywiste położenie danego rekordu w pliku to N * Len = intDługośćRekordu, gdzie N jest numerem rekordu.
Wolny numer pliku znajduje instrukcja FreeFile[(intZakresNUmerów)].
Pliki zamyka instrukcja Close:
Close # intNumerPliku[,intNumerPliku2][...intNumerPlikuN]
Instrukcja Close bez argumentów zamyka wszystkie pliki.
Wydruk VI.1.
Kod znajduje dostępne wolne numery plików, otwiera dwa pliki z dostępem sekwencyjnym, jeden do czytania, drugi do pisania, a następnie je zamyka.
1 Dim intPlikDoCzytania As Integer
2 Dim intPlikDoPisania As Integer
3
4 'Otwórz plik do czytania
5 intPlikDoCzytania = FreeFile 'Weź pierwszy wolny numer
6 Open "PlikDanych.dat" For Input As intPlikDoCzytania
7
8 'Otwórz plik do pisania
9 intPlikdoPisania = FreeFile 'Weź następny numer
10 Open "PlikDocelowy.Dat" For Output As intPlikDoPisania
11
12 'Tu kod czytająco/piszący
13
14 'Zamknij pliki
15 Close intPlikDoPisania
16 Close intPlikDoCzytania
Przed jakimkolwiek użyciem pliku, należy go otworzyć. Do pisania najczęściej używa się polecenia
Print # IntNumerPliku, [Treść] lub
Write # IntNumerPliku, [Treść]
przy czym wszystkie dane wpisywane do pliku przez Write oddzielone są przecinkami., dane łańcuchowe ujmowane są w cudzysłowy, dane daty i czasu ogranicza znak #, wartości boolowskie zapisuje jako #TRUE# lub #FALSE#, podobnie #NULL# i #Error KodBłędu#.
Tabela VI.2. Treść polecenia Print
Tryb |
Opis |
Spc(intN1) |
Wstawia N1 spacji
|
Tab(intN2) |
Przesuwa punkt wstawiania do kolumny o numerze intN2. Tab bez argumentu przesuwa do początku następnej strefy drukowania (14 spacji)
|
Wyrażenie |
Wyrażenie typu łańcuch lub liczba
|
punktWstawiania |
Określa położenie wydrukowania następnego znaku: jeśli ma to nastąpić bezpośrednio po ostatnio zapisanym znaku użyj średnika |
Wydruk VI.2. Pisanie do pliku
1 Private Sub plcDrukujDoPliku_Click()
2 Dim intLicznik As Integer 'licznik pętli
3 Dim intNumerPliku As Integer 'numer pliku
4 Dim intOdp As Integer 'odpowiedź z MsgBox()
5
6 'Otwórz plik do pisania
7 intNumerPliku = FreeFile 'weź numer
8 'Jeśli chcesz, zmień ścieżkę
9 Open "Z:\Liczby.txt" For Output As intNumerPliku
10
11 'Pokaż, co zrobiłeś
12 intOdp = MsgBox("Otworzyłem plik Liczby.txt")
13
14 For intLicznik = 1 To 6
15 'Zapisz licznik pętli
16 Print #intNumerPliku, intLicznik
17 intOdp = MsgBox("Wpisałem " & intLicznik & _
18 " w pliku Liczby.txt")
19 Next intLicznik
20
21 'Zamknij plik i poinformuj
22 Close #intNumerPliku
23 intOdp = MsgBox("zamknąłem plik Liczby.txt")
24 End Sub
Zadanie VI.1.
Sprawdź, korzystając z powyższego kodu, jak działa instrukcja
Write #intNumerPliku, intLicznik;.
Wypróbuj tę instrukcję ze średnikiem oraz bez średnika i porównaj wyniki.
ÿ
Przypominamy, że przed jakimkolwiek użyciem pliku, należy go otworzyć. Do czytania najczęściej używa się polecenia
Input #IntNumerPliku, Zmienna1[,Zmienna2][... ZmiennaN]
W pracy z plikami o dostępie bezpośrednim polecenia Print # i Input # zastępują polecenia Get # i Put #.Mają one następujące formaty:
Put [#] intNumerPliku, intNumerRekordu] Zmienna
Get [#] intNumerPliku, intNumerRekordu] Zmienna
Numery rekordów zaczynają się od 1. Aby elementy tablic były również numerowane od 1, a nie od 0, jak to się przyjmuje domyślnie, należy w preambule modułu umieścić polecenie
Option Base 1
Zapisywane i odczytywane zmienne mogą być dowolnego typu.
Można również definiować własne typy:
[Private | Public] Type NazwaTypu
Zmienna1[(RozmiarTablicy)] As Istniejący typ [* DługośćStr]
Zmienna2[(RozmiarTablicy)] As Istniejący typ [* DługośćStr]
:
:
End Type
Wydruk VI.3 Deklaracja typu własnego
1 ` Ta deklaracja musi być w module projektu
2 Type DaneOsoby
3 strImię As String * 8
4 strNazwisko As String * 20
5 End Type
6 Public Osoba as DaneOsoby
Przykład użycia kodu z Wydruku VI.2
Osoba.strImię = Jan”
Osoba.strNazwisko = „Kowalski”
etkImię.Caption = „Imię: „ & Osoba.strImię
etkNazwisko.Caption = „Nazwisko: „ & Osoba.strNazwisko
* 8 i * 20 oznaczają, że rekordy Osoba.strImię i Osoba.strNazwisko mają odpowiednio długość 8 i 20 znaków. Jeśli znaków jest mniej, to dane są uzupełniane spacjami do zadeklarowanej długości rekordu. Typy można zagnieżdżać.
Wydruk VI.4 Praca z plikami o dostępie bezpośrednim
1 Private Sub plcUtwórz_Click() 'Ta procedura tworzy nowy plik
2 Dim intNumerPliku As Integer 'numer pliku
3 Dim intLicznik As Integer 'licznik pętli
4
5 intNumerPliku = FreeFile
6 Open "Z:\Swobodny.txt" For Random _
7 As #intNumerPliku Len = 5
8
9 'Zapisz liczby w pliku dla każdego przebiegu pętli
10 For intLicznik = 1 To 6
11 'Zapisz numer rekordu
12 Put #intNumerPliku, intLicznik, intLicznik
13 Next intLicznik
14
15 Close #intNumerPliku
16 End Sub
17
18 Private Sub plcZmień_Click() 'Zmienimy trzeci rekord
19 Dim intNumerPliku As Integer 'numer pliku
20
21 intNumerPliku = FreeFile
22 Open "Z:\Swobodny.txt" For Random _
23 As #intNumerPliku Len = 5
24
25 'Zapisz nową wartość w trzecim rekordzie
26 Put intNumerPliku, 3, 9
27 'nadajemy rekordowi 3 wartość 9
28
29 Close #intNumerPliku End Sub
30
31 Private Sub plcZmień_Click() 'Wyświetla zawartość pliku
32 DimintNumerPliku As Integer 'numer pliku
33 Dim intLicznik As Integer 'licznik pętli
34 Dim intWartość As Integer 'odczytana wartość
35 Dim intOdp As Integer 'odpowiedź z MsgBox()
36
37 'Otwórz plik
38 intNumerPliku = FreeFile
39 Open "Z:\Swobodny.txt" For Random _
40 As #intNumerPliku Len = 5
41
42 intOdp = MsgBox("Plik Swobodny.txt został otwarty")
43
44 'Przejdź po rekordach i czytaj z pliku
45 For intLicznik = 1 To 6
46 Get #intNumerPliku, intLicznik, intWartość
47 intOdp = MsgBox("Z pliku Swobodny.txt " _
48 & "odczytano wartość: " _
49 & intWartość)
50 Next intLicznik
51
52 Close #intNumerPliku
53 intOdp = MsgBox("Plik Swobodny.txt został zamknięty")
54 EndSub
Visul Basic udostępnia następujące kontrolki (tu: szczególne pola list) do zarządzania stacjami dysków, katalogami i plikami:
pole listy stacji dysków
pole listy katalogów
pole listy plików
Tabela VI.3 Polecenia dla stacji dysków i katalogów
Tryb |
|
Opis |
|
|
|
ChDir strDysk |
|
zmienia domyślną stację dysków na wskazaną w argumencie |
ChDir strFolder |
|
zmienia domyślny katalog na wskazany w argumencie |
Kill strPliki |
|
usuwa plik lub pliki reprezentowane przez znaki specjalne |
MkDir strPlik |
|
tworzy nowy katalog o wskazanej nazwie |
RmDir strPlik |
|
usuwa katalog o wskazanej nazwie |
Przykład VI.2 Dojście do katalogu
ChDrive „Z:\”
ChDir „\MojePliki”
Przykład VI.3 Sprawdzanie istnienia pliku
If UCase(Dir(„z:\Sprzedaż2002.dat”)) = „SPRZEDAŻ2002.DAT” Then
intOdp = MsgBox(„Plik istnieje”)
Else
intOdp = MsgBox(„Plik nie ma”)
End If
Funkcja Dir() może wystąpić bez argumentów (bez nawiasów i argumentów), jeśli została już poprzednio użyta. VB będzie zwracał nazwy plików pasujących do szablonu, aż do znalezienia ostatniego pliku. Kiedy Dir zwróci string zerowy (""), należy w kolejnym wywołaniu Dir() zawrzeć w kolejną specyfikację pliku, gdyż inaczej powstanie błąd.
Przykład VI.4 Wybranie określonego dysku
drvDysk.Drive = "z:\"
Przykład VI.5 Ustawienie wybranego powyżej dysku jako domyślnego
ChDrive drvDysk.Drive
Przykład VI.6 Ustawienie ścieżki dostępu do pliku
dirKatalog.Path = drvDysk.Drive
Przykład VI.7 zamiana bieżącego katalogu na wybrany przez użytkownika
ChDir dirKatalog.Path
Przykład VI.8 Filtrowanie plików
filPliki.Pattern = "*.frm:*.vbp"
|
-2 |
katalog zawierający wybrany katalog itd. |
|
-1 |
wybrany katalog |
ListIndex = |
0 |
pierwszy podkatalog wybranego katalogu |
|
1 |
podkatalog pierwszego podkatalogu wybranego katalogu |
|
2 |
itd. |
Projekt formy Pliki służącej jako przeglądarka plików
Forma, Name
Forma, Name |
frmPlik |
Forma, Caption |
Przeglądarka plików |
Forma, Height |
4500 |
Forma, Width |
7000 |
Pole listy, Name |
lstPlik |
Pole listy, Height |
3405 |
Pole listy, Left |
120 |
Pole listy, Top |
120 |
Pole listy, Width |
6615 |
Przycisk poleceń, Name |
plcKolor |
Przycisk poleceń, Caption |
&Zmień kolor pliku |
Element menu nr 1, Caption |
&Plik |
Element menu nr 1, Name |
mnuPlik |
Element menu nr 2, Caption |
&Otwórz |
Element menu nr 2, Name |
mnuPlikOtwórz |
Element menu nr 3, Caption |
- |
Element menu nr 3, Name |
mnuSeparator1 |
Element menu nr 1, Caption |
&Koniec |
Element menu nr 1, Name |
mnuPlikKoniec |
Okno dialogowe, Name |
odOtwórz |
Okno dialogowe, DialogTitle |
Otwórz |
Okno dialogowe, InitDir |
Z:\ |
Okno dialogowe, Filter |
Pliki tekstowe (*.TXT)|*.txt|Pliki wsadowe (*.BAT)|*.bat |
Okno dialogowe, CancelError |
True |
Okno dialogowe, MaxFileSize |
4096 |
Własciwości kontrolki typowego okna dialogowego ustawiamy w oknie dialogowym Project -> Components -> Microsoft Common Dialog Control 6.0 (SP 3), w nim w formie Property Pages (Properties -> Custom) korzystamy z właściwości Custom.
Rys. VI.2 Właściwość Custom kontrolki okna dialogowego
Wydruk VI.5 Wczytywanie pliku w pole listy
Private Sub Form_Resize()
`Jeśli użytkownik zmieni rozmiar formy,
`zmień wielkośc pola listy.
`Używana jest także, gdy forma wczytywana jest po raz pierwszy
Dim intOdp As Integer `odpowiedź z MsgBox()
`Sprawdź, czy forma nie jest zbyt mała mała,
`by wyświetlić pole listy
If (frmPlik.Width < 400) _
Or (frmPlik.Height < 3500) Then
`Ukryj pole listy i poucz co robić
lstPlik.Visible = False
intOdp = MsgBox(„Okno za małe. Powiększ je”, vbCritical)
Else
`Wyświetl listę (na wszelki wypadek)
lstPlik.Visible = True
`Dopasuj rozmiar pola listy i położenie przcisku
`do wielkości okna formy
lstPlik.Width= frmPlik.Width - 360
lstPlik.Height= frmPlik.Height - 1200
plcKolor.Top = frmPlik.Height - 1100
End If
End Sub
Private Sub mnuPlikKoniec_Click()
`Zakończ aplikację
End
End Sub
Private Sub mnuPlikOtwórz_Click()
Dim strLiniaPliku As String
„Ustaw bład kliknięci aAnuluj
On Error GoTo ObsługaBłędu
odOtwórz.CancelError = True
`Wyświetl okno dialogowe Otwórz
odOtwórz.ShowOpen
`Otwórz wybrany plik
Open odOtwórz.Filename for Input As #1
`Zrób miejsce na nowy plik
lstPlik.Clear
Do Until (EOF(1))
Line Input #1, strLiniaPliku
lstPlik.AddItem strLiniaPliku
Loop
`Zamknij plik
Close
ObsługaBłędu:
`Jeśli użytkownik kliknął Anuluj, to nie rób nic
End Sub
Private Sub plcKolor_Click()
`Wybór koloru tła pola listy
odOtwórz.CancelError = False
odOtwórz.ShowColor
lstlik.BackColor = odOtwórz.Color
End Sub
Format instrukcji Line Input #:
Line Input #intNumerPLiku, strLiniaTekstu
UKO Użytkowanie Komputerów, Lab 6
Visual Basic Lab 6.doc 4/9