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]
Poniżej podajemy omówienie poszczególnych elementów formatu definicji instrukcji Open:
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 zgodnie z poniższym schematem:
[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 VI.2 Użycie kodu z Wydruku VI.3
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
Visual 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.3 Dojście do katalogu
ChDrive „Z:\”
ChDir „\MojePliki”
Przykład VI.4 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.5 Wybranie określonego dysku
drvDysk.Drive = "z:\"
Przykład VI.6 Ustawienie wybranego powyżej dysku jako domyślnego
ChDrive drvDysk.Drive
Przykład VI.7 Ustawienie ścieżki dostępu do pliku
dirKatalog.Path = drvDysk.Drive
Przykład VI.8 zamiana bieżącego katalogu na wybrany przez użytkownika
ChDir dirKatalog.Path
Przykład VI.9 Filtrowanie plików
filPliki.Pattern = "*.frm:*.vbp"
Czasami pomocna jest zmienna ListIndex , pozwalająca na odwołanie się do innego poziomu plików:
|
-2 |
katalog zawierający wybrany katalog itd. |
|
-1 |
wybrany katalog |
ListIndex = |
0 |
pierwszy podkatalog wybranego katalogu |
|
1 |
podkatalog pierwszego podkatalogu wybranego katalogu |
|
2 |
itd. |
Rys. VI.1. Projekt formy Plik
Projekt formy Plik służącej jako przeglądarka plików:
(Uwaga! Jako pole listy wybieramy ze skrzynki narzędziowej ListBox
)
Kontrolka, właściwość |
|
Wartość |
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 tła |
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 MS Windows (*.DOC)|*.doc|Wszystkie pliki (*.*)|*.* |
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), a w nim w formie Property Pages (Properties) ustawiamy odpowiednie parametry (np. jak na Rys.VI.2).
Rys. VI.2 Właściwość Custom kontrolki okna dialogowego
Wydruk VI.5 Wczytywanie pliku w pole listy
1 Private Sub Form_Resize()
2 'Jeśli użytkownik zmieni rozmiar formy,
3 'zmień wielkość pola listy.
4 'Używana jest także, gdy forma wczytywana jest po raz pierwszy
5
6 Dim intOdp As Integer 'odpowiedź z MsgBox()
7
8 'Sprawdź, czy forma nie jest zbyt mała mała,
9 'by wyświetlić pole listy
10 If (frmPlik.Width < 400) _
11 Or (frmPlik.Height < 3500) Then
12 'Ukryj pole listy i poucz co robić
13 lstPlik.Visible = False
14 intOdp = MsgBox("Okno za małe. Powiększ je", vbCritical)
15 Else 'Wyświetl listę (na wszelki wypadek)
16 lstPlik.Visible = True
17 'Dopasuj rozmiar pola listy i położenie przycisku
18 'do wielkości okna formy
19 lstPlik.Width = frmPlik.Width - 360
20 lstPlik.Height = frmPlik.Height - 1200
21 plcKolor.Top = frmPlik.Height - 1100
22 End If
23 End Sub
24
25 Private Sub mnuPlikKoniec_Click()
26 'Zakończ aplikację
27 Beep
28 End
29 End Sub
30
31 Private Sub mnuPlikOtwórz_Click() Dim strLiniaPliku As String
32 'Ustaw błąd kliknięcia Anuluj
33 On Error GoTo ObsługaBłędu
34 odOtwórz.CancelError = True
35
36 'Wyświetl okno dialogowe Otwórz
37 odOtwórz.ShowOpen
38
39 'Otwórz wybrany plik
40 Open odOtwórz.Filename for Input As #1
41
42 'Zrób miejsce na nowy plik
43 lstPlik.Clear Do Until (EOF(1))
44 Line Input #1, strLiniaPliku
45 lstPlik.AddItem strLiniaPliku
46 Loop
47
48 'Zamknij plik
49 Close
50
51 ObsługaBłędu:
52 'Jeśli użytkownik kliknął Anuluj, to nie rób nic
53 End Sub
54
55 Private Sub plcKolor_Click()
56 'Wybór koloru tła pola listy
57 odOtwórz.CancelError = False
58 odOtwórz.ShowColor
59 lstPlik.BackColor = odOtwórz.Color
60 End Sub
Format instrukcji Line Input #:
Line Input #intNumerPLiku, strLiniaTekstu
UKO Użytkowanie Komputerów, Lab 6
Visual Basic Lab 6.doc 9/9