artykuły

Delphi - Strumienie - Wstęp

20:36
śro, 9 czerwiec 2004
Wprowadzenie do cyklu artykułów o strumieniach danych w Delphi.

#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:

Drzewo pochodzenia poszczególnych klas obsługujących strumienie.

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.

12345
Delphi - Strumienie - Wstęp Autor opinii: Czytelnicy, data przesłania: 0

Podobne artykuly:

Skomentuj

Aby zamieścić komentarz, proszę włączyć JavaScript - niestety roboty spamujące dają mi niezmiernie popalić.






Komentarze czytelników

    Nie ma jeszcze żadnych komentarzy.
    Dexter