Delphi - Strumienie - Wstęp
Wed, 9 June 2004
#1 Wstęp
Witam wszystkich czytelników i tym miłym akcentem zapraszam
do cyklu artykułów o strumieniach danych. Od razu zaznaczam, że ów pierwsza
część jest niezwykle nudna i czytelników osłuchanych już z tematem poproszę
o przejście do kolejnych.
Na początek objaśnię, z czym macie do czynienia. Otóż strumienie to takie
badziewie ;), które możemy sobie wyobrazić jako pewien ciąg danych. Na ciągu
tym możemy wykonywać operację i zapisywać go do wielu różnych ośrodków
(np. do pliku czy pamięci). Strumienie najczęściej wykorzystuje się chyba
jednak w wyciąganiu plików z zasobów. Osoby trochę bardziej zaawansowane
wiedzą pewnie, o co mi chodzi (ale jeśli nie masz o tym pojęcia, nic się nie
dzieje :).
Jest to sposób prosty, przydatny i skuteczny, ale strumienie można wykorzystać
na wiele innych, często bardziej przydatnych sposobów. Jednym z nich może być
na przykład zapisywanie zawartości komponentu do pliku. Tak, wiem, że można
to zrobić zrobić przy użyciu jednej pętli i instrukcjiwriteln()znanej
wszystkim z poczciwego Pascala, ale w strumieniach masz okazję zapomnieć o pętli
(!). Możesz na razie przyjąć, że jest to coś w rodzaju znanej wszystkim z
komponentówTMemoiTRichEditfunkcjiSaveToFile()z tym, że strumienie prócz
tekstu zapisują również ustawienia komponentu. Wystarczy jedna instrukcja, a
cały komponent, jego ustawienia i aktualny tekst, który w sobie zawiera będą
zapisane do pliku. Z jednej strony genialne rozwiązanie - oszczędza nam
pisanie wielu linii kodu, z drugiej czasami nad wyraz uciążliwe. Wyobraźmy
sobie, że przy pomocy jednej z opisywanych w tym cyklu metod chcemy zapisać
tekst komponentuTEdit. Czynimy to ;), a następnie zmieniamy szerokość komponentu
TEdit. Wczytanie zapisanych wcześniej danych spowoduje wczytanie
tekstu + przywrócenie pierwotnej szerokości komponentu. Oczywiście są sposoby,
aby to obejść - ale wszystko w swoim czasie.
Na początek proponuję przyjrzenie się ilustracji pochodzenia klasy TStream i jej pochodnych na których będziemy operować. Narysowałem małe drzewko:

Jak widzimy, wszystkie strumienie dziedziczą po klasie TStream (ta z kolei po TObject - jak wszystkie klasy w Delphi [oprócz TObject :]). Oznacza to, że wszystkie klasy pochodne (te które są poniżej) mają te same funkcje i procedury co klasa TStream + kilka własnych.
Strumienie to bardzo praktyczny sposób na przechowywanie
informacji i operowanie na różnych rodzajach danych. Jeśli chodzi ściśle o
zapis informacji do pliku to najczęściej nie można go będzie potem odczytać przy użyciu readln() a to dlatego, że strumienie mają własny "sposób"
zapisywania informacji. Zobaczysz sam, otwierając zapisany w ten sposób plik
przy użyciu np. systemowego Notatnika. Twoim oczom ukażą się tzw.
"krzaczki". I wbrew pozorom nie jest to świetny sposób na
szyfrowanie informacji, jak początkowo mogłoby się wydawać. Często zawartość
tak "spreparowanego" pliku można odczytać na pierwszy rzut oka.
Przykładowo, zapisałem do pliku C:\plik.txt pewien tekst:
"To jest tekst zapisany do pliku"
Chcąc go odczytać za pomocą systemowego notatnika, bądź innego "szybkiego edytora tekstów" zobaczymy:
äüD
Jednak każdą zapisaną rzecz powinno się dać jakoś odczytać. Tak jest i w tym przypadku. Za pomocą jednej z omawianych w dalszych częściach funkcji z tych bazgrołów ;) da się odczytać z powrotem ten sam tekst:"To jest tekst zapisany do pliku".
Razem z Delphi do wykorzystania dostajemy 4 rodzaje (typy) strumieni:
- TStringStream
Za pomocą tego strumienia wykonamy operację na zmiennych tekstowych typu string. - TMemoryStream
Za pomocą tego strumienia wykonamy operację na (a właściwie w) pamięci komputera. Służą głównie do przechowywania informacji, z których chcemy szybko skorzystać/lub nie mamy do nich stałego dostępu. Dzięki nim możemy np. skrócić czas wykonywania operacji na pliku umieszczonym np. na bardzo wolnej dyskietce. W takiej sytuacji przenosimy plik do pamięci i już w pamięci wykonujemy na nim szereg operacji, które na zwykłej dyskietce byłyby bardzo czasochłonne, ze względu na małą "prędkość transmisji" i duży czas dostępu. - TFileStream
Za pomocą tego strumienia możemy modyfikować pliki i sprawnie zapisywać w nich dane swojego programu. Za jego pomocą możemy również skopiować plik podobnie jak za pomocą CopyFile() , z tym, że dostajemy tutaj nieco bardziej rozbudowane narzędzie pod względem kontroli zawartości. - TResourceStream
Za jego pomocą "wyciągniemy" dowolny plik z zasobów tzn. plik umieszczony w naszym EXE-ku lub pliku RES (plik z zasobami naszego programu)
Zakończenie
Jak widzicie nadają się one prawie (?) do wszystkiego. Począwszy od małych operacji na zmiennych typu string, poprzez operacje na pamięci i plikach, na operacjach na zasobach kończąc.





Podobne artykuly:
- Delphi - Budowa modułu
- Delphi - Transformacje grafiki - Wstęp
- Delphi - Strumienie - TFileStream
- Delphi - Strumienie - TStringStream
- Delphi - Strumienie - TMemoryStream
- Delphi - Strumienie - TResourceStream
- Delphi - Strumienie - Informacje dodatkowe