Obsługa plików
Pliki tekstowe
Język Delphi posługuje się kilkoma metodami obsługi plików tekstowych.
Zapis i odczyt z pliku tekstowego do pola Memo poprzez metody LoadFromFile i SaveToFile przedstawiony został już wcześniej przy okazji prezentacji pola Memo. Operacje na plikach udostępniają też komponenty OpenDialog i SaveDialog. Metoda ta będzie opisana bliżej przy prezentacji komponentów z karty Dialogs.
Poniżej przedstawiona zostanie metoda dostępu do pliku, podobnie jak w tradycyjnym Pascalu realizująca otwarcie i zamknięcie odpowiednimi procedurami, a zapis i odczyt przez bezpośrednie operowanie na wierszach pliku.
Kolejne czynności związane z obsługą plików tekstowych: |
Przykłady realizacji: |
Deklaracja zmiennej plikowej typu tekstowego i zmiennej łańcuchowej do operowania na wierszach pliku |
var Plik:TextFile; linia:String[80]; |
Przypisanie zadeklarowanej zmiennej plikowej do zbioru na dysku |
AssignFile(Plik,'C:\Nazwa.txt'); |
Otwarcie pliku |
Rewrite(Plik)lub Reset(Plik) lub Append(Plik) |
Operacje typu zapis, odczyt |
Writeln (Plik, linia), Write(Plik, linia), Readln(Plik, linia), Read(Plik, linia) |
Zamknięcie pliku |
CloseFile(Plik) |
Procedury i funkcje obsługi plików tekstowych
Nagłówek procedury lub funkcji |
Działanie |
var Plik:TextFile |
Deklaracja zmiennej plikowej |
AssignFile (var Plik:TextFile, Nazwa: string) |
Przypisanie zmiennej plikowej do zbioru |
Rewrite (var Plik: TextFile) |
Otwarcie po raz pierwszy - założenie pliku |
Rewrite (var Plik: TextFile, Dane) |
Zapis zawartości zmiennej Dane do pliku. Zmienna może być typu liczbowego lub łańcuchowego (ShortString) |
Reset(var Plik: TextFile) |
Otwarcie istniejącego pliku do odczytu |
Readln (var Plik: TextFile, Dane) |
Odczyt wiersza z pliku do zmiennej Dane |
CloseFile (var Plik:TextFile) |
Zamknięcie pliku |
Append (var Plik: TextFile) |
Otwarcie pliku tekstowego do dołączania |
Zadanie l
Napisz aplikację, która kopiuje istniejący plik tekstowy do pliku o nazwie podanej przez użytkownika.
Zadanie 2
Do aplikacji Dziennik przedstawiającej tabelki StringGrid na kartach notatnika dodaj możliwość wpisywania nazwisk z pliku tekstowego.
Zadanie 3
Napisz aplikację, która wpisuje do pliku kolejne wiersze podawane w polu Edit.
Pliki elementowe
Organizacja plików elementowych jest taka sama, jak w Pascalu. Poniżej, dla przypomnienia, przedstawione są podstawowe operacje w kolejności występowania w programach obsługujących pliki.
Kolejne czynności związane i obsługą plików elementowych: |
Przykłady realizacji: |
Deklaracja typu elementu pliku |
Type Prac=record Nazwisko:string[20]; //konieczne podanie długości łańcucha Pensja:Currency; end; |
Deklaracja zmiennej plikowej oraz zmiennej do komunikacji z plikiem |
var Plik:File of Prac; P1:Prac; |
Przypisanie zmiennej plikowej do zbioru na dysku |
AssignFile(Plik,'C:\Nazwa.ele') |
Otwarcie pliku |
Rewrite(Plik) lub Reset(Plik) |
Operacje typu: zapis przygotowanego rekordu do pliku, odczyt rekordu z pliku |
Write(Plik, P1) Read(Plik,P1) |
Zamkniecie pliku |
CloseFile(Plik) |
Procedury i funkcje wspomagające bezpośredni dostęp do elementów pliku
W poniższej tabelce Typ Pliku oznacza dowolny typ przedstawiający plik elementowy.
Nagłówek procedury: |
Działanie: |
function FileSize(var Plik: TypPliku): Integer |
Zwraca liczbę elementów w pliku |
function FilePos(var Plik: TypPliku): Integer |
Zwraca numer bieżącej pozycji wskaźnika pliku |
procedure Seek(var Plik: TypPliku; N: Longint) |
Ustawia wskaźnik pliku przed elementem o numerze N |
procedure Truncate(var Plik: TypPliku) |
Obcina plik na pozycji wskaźnika pliku |
Sposoby otwarcia pliku:
Rewrite(Plik) - tworzy plik o nazwie podanej w procedurze Assign; jeśli plik istnieje, zostanie wymazany
Reset(Plik) - otwiera plik do odczytu/dopisywania, wskaźnik pliku jest na początku pliku. Aby przejść do możliwości dopisywania elementów do pliku, należy wywołać procedurę: Seek(Plik, FileSize(Plik)). Spowoduje to ustawienie wskaźnika pliku na końcu pliku.
Do operacji związanych z plikiem należy dodawać obsługę błędu, aby brak pliku nie spowodował błędu wykonania |
Ćwiczenie 2.10
Zadanie aplikacji
Zapis i odczyt elementów z pliku elementowego. Typ elementu pliku:
Prac=record
nazwisko: String[20];
pensja: Currency;
end;
Na formularzu podstawowym, pełniącym rolę sterowania dla aplikacji, umieszczone są dwa przyciski Button Zapis do pliku i Odczyt z pliku. Przyciski te otwierają okna dialogowe utworzone na formularzach typu Dialogs. Pobieranie informacji od użytkownika i wyświetlanie zawartości pliku dokonuje się poprzez pola edycji w formularzach dialogowych.
Nowe umiejętności
Dodawanie formularzy typu Dialogs do aplikacji. Organizacja zapisu i odczytu z pliku elementowego.
Umieść na formularzu dwa przyciski: Zapis do pliku i Odczyt z pliku.
Wybierz z menu: FiIe->New, następnie kartę Dialogs i element Standard Dialog. Do aplikacji zostanie dołączony formularz o nazwie OKBottomDlg pełniący rolę okna dialogowego. W tym projekcie z formularzem związany jest moduł Unit2.pas. Sprawdź klawiszami Shift+F12 obecność formularza w projekcie.
Dodaj do formularza OKBottomDlg przycisk Button z napisem Koniec, dwa okna edycyjne Eidt do wprowadzania pól rekordu i dwie etykiety label do opisu okien. Umieść na etykietach napisy: Nazwisko i Pensja. Zmień właściwość Caption formularza na Zapis do pliku.
W module Unit2 wpisz w miejscu deklaracji typów:
Prac=record
Nazwisko:string[20];
Pensja:currency;
end;
W deklaracji zmiennych globalnych modułu (po słowie var przed słowem Implementation) wpisz deklarację zmiennej plikowej:
Plik: file of Prac;
Ustaw właściwość Caption przycisku OK na Zapisz. Dla zdarzenia OnClick wpisz procedurę, która zapisuje do pliku rekord o polach pobranych z pól edycji:
procedure TOKBottomDlg.OKBtnClick(Sender: TObject);
var
Pl:Prac;
begin
If Edit1.Text<>'' then
//zapis do pliku następuje w sytuacji, gdy okno edycyjne nie jest puste
begin
P1.Nazwisko:=Editl.Text;
P1.Pensja:=StrToCurr(Edit2.Text);
Write(Plik.P1);
Edit1.Text: = ''; //wyczyszczenie okna
Edit2.Text:='0';
end;
end;
Ustaw właściwość Caption przycisku Cancel na Anuluj. Dla zdarzenia OnCIick wpisz procedurę:
Procedure TOKBottomDlg.CancelBtnClick(Sender: TObject);
begin
Edit1.Text: ='' ; //wyczyszczenie okna
Edit2.Text: ='0';
end;
Dla zdarzenia OnActivate formularza OkBottomDlg wpisz procedurę, która otwiera plik do dopisywania:
procedure TOKBottomDlg.FormActivate(Sender: TObject); begin
AssignFile(Plik,'C:\Plik.ele');
try -
Reset(Plik);
except
Rewrite(Pli k);
end;
Seek(Plik,FileSize(Plik)); //przygotowanie pliku do dopisywania
Edit1.Text :=''; //wyczyszczenie pól edycji
Edit2.Text :='0';
end;
Brak pliku podczas pierwszego uruchomienia w środowisku kompilatora spowoduje zawieszenie programu (aby zadziałała obsługa błędu, należy uruchomić program poza środowiskiem). Można przy pierwszym uruchomieniu opatrzyć komentarzem instrukcję try i zastosować otwarcie pliku procedurą Rewrite. Przy następnych uruchomieniach wracamy do pierwotnej wersji programu. |
Do przycisku z napisem Koniec wpisz procedurę-zdarzenie:
procedure TOKBottomDlg.ButtonlClick(Sender: TObject); begin
CloseFile(Plik);
OkBottomDlg.Close; //zamknięcie formularza z dialogiem
end;
Dodaj do formularza podstawowego drugie okno dialogowe. Przyjmie ono nazwę OKBottomDlg1, a odpowiadający mu moduł Unit3.pas.
Ustaw właściwość Caption formularza OKBottomDlg1 na Odczyt z pliku.
Wpisz w module Unit3 po słowie uses deklarację korzystania z modułu Unit2.
Dodaj do formularza dwa okna edycyjne Edit do wyświetlania rekordów z pliku oraz dwie etykiety do opisu tych okien. Ustaw dla okien właściwość:
Enabled False //brak możliwości edycji przy przeglądaniu rekordów
Ustaw właściwość Caption przycisku OK na Następny. Dla zdarzenia OnClick wpisz procedurę:
procedure OKBottomDlgl.OKBtnClick(Sender: TObject);
var P1:Prac;
begin
If FilePos(Plik)<FileSize(Plik) then
//czytanie z pliku przebiega tylko wtedy, gdy jeszcze są rekordy
begin
Read(Plik.P1);
Edit1.Text:=P1.nazwisko;
Edit2.Text:=CurrToStr(P1.pensja):
//zamiana waluty na łańcuch
end;
end; "
Ustaw właściwość Caption przycisku Cancel na Koniec i wpisz procedurę-zdarzenie:
Procedure TOKBottomDlg1.CancelBtnClick(Sender: TObject);
begin
CloseFile(plik);
OkBottomDlg1.Close; //zamknięcie formularza z dialogiem
end;
Dla zdarzenia OnActivate dla formularza OKBottomDlg1 wpisz procedurę wyświetlającą pierwszy rekord:
Procedure TOKBottomD1gl.FormActivate(Sender: TObject):
Var Pl:Prac;
begin
AssignFile(Plik,'C:\plik.ele'):
try
Reset(Plik);
except
ShowMessage(`Brak pliku');
End;
If FilePos(P1ik)<FileSize(Plik) then
begin
Read(Plik.P1);
Edit1.Text:=Pl.Nazwisko;
Edit2.Text:=CurrToStr(P1.Pensja);
end;
end;
Przejdź do modułu Unit3.pas i w sekcji deklaracji modułów po słowie uses wpisz nazwę Dialogs. Jest to wymagane do korzystania z okna ShowMessage.
Dodaj przycisk Button z napisem Pierwszy. Na karcie Events, dla zdarzenia OnClick przycisku wybierz z listy procedurę FormActivate.
Przejdź do formularza Forml (Shift+F12). Wpisz treść procedur:
dla przycisku z napisem Zapis do pliku
OkBottomDlg.Show; //uwidocznienie formularza .......
dla przycisku z napisem Odczyt z pliku
OkBottomDlg1.Show;
Dodaj po słowie uses deklarację korzystania z modułów Unit2 i Unit3.
Uruchom aplikację i sprawdź działanie przycisków.
Ćwiczenie l
Dodaj do aplikacji obsługę błędu na wypadek zdarzenia, gdy operacje zapisu/odczytu pliku nie powiodą się. Użyj instrukcji try...except... finally, aby pozamykać otwarte pliki.
Ćwiczenie 2
Napisz aplikację, która zawiera listę wyboru z nazwiskami uczniów oraz przyciski opcji informujące, do której klasy chodzi dany uczeń. Tak wczytane informacje zapisz w pliku elementowym.
Ćwiczenie 3
Dodaj do zadania przedstawiającego zapis dostawy towarów w tabelkach StringGrid możliwość przekazania informacji z tabelki do pliku elementowego i odtwarzania formacji z pliku do tabelki.
Ćwiczenie 4
Zadanie zbierające informacje do aktualizacji kwestionariusza osobowego uzupełnij o zapis informacji do pliku i możliwość odtwarzania informacji z pliku.
6