OczywiÅ›cie istniejÄ… także odpowiednie metody sÅ‚użące do odczytywania obiektów, Å‚aÅ„­cuchów znaków i bajtów; sÄ… to: ReadObject, ReadString oraz Read.
Na razie te informacje o klasie CArchive w zupeÅ‚noÅ›ci Ci wystarczÄ…. KÅ‚opoty zaczynajÄ… siÄ™ bowiem dopiero w momencie, gdy chcesz, aby klasa CArchive zostaÅ‚a użyta do re­prezentacji czegoÅ› naprawdÄ™ dziwnego, jak na przykÅ‚ad plik zaszyfrowany, baza danych albo gniazdo sieciowe. Do tych tematów wrócimy w dalszej części rozdziaÅ‚u.
 
Tajniki poleceń służących do otwierania i zapisywania plików
Gdy tworzysz programy za pomocÄ… kreatora App Wizard, to w jakiÅ› cudowny sposób doskonale one wiedzÄ…, jak należy odczytywać i zapisywać pliki. Twoim jedynym zadaniem jest stworzenie schematycznej metody Serialize w klasie dokumentu. RozwiÄ…zanie ta­kie jest bardzo wygodne, o ile chcesz zapisywać dane do pliku o okreÅ›lonym formacie. Jednak gdy chcesz zrobić coÅ› innego, to jak zwykle bÄ™dziesz musiaÅ‚ polegać wyÅ‚Ä…cznie na sobie. Zanim zaczniesz zastanawiać siÄ™ nad rozwiÄ…zaniami alternatywnymi, zapoznaj siÄ™ ze sposobem obsÅ‚ugi polecenia Plik^Otwórz (tabela 2.2).
 
Tabela 2.2. Obsługa polecenia Plik -> Otwórz
MFC wywołuje Przesłoń gdy
CWinApp::OnFileOpen Chcesz wszystko zrobić samemu
CWinApp::OpenDocumentFile Chcesz aby MFC pobrało jedynie nazwę pliku
CDocTemplate::OpenDocumentFile Chcesz aby MFC pobrało plik i wybrało odpowiedni
wzorzec dokumentu
CDocTemplate::OnOpenDocument Chcesz aby MFC pobrało plik, wybrało odpowiedni wzorzec dokumentu i stworzyło obiekty dokumentu, widoku i ramki
CDocument::Serialize Chcesz aby MFC zrobiło za Ciebie całą robotę
włącznie z otworzeniem pliku i skojarzeniem go z obiektem archiwum
Opcji menu Plik ^Otwórz odpowiada zazwyczaj identyfikator ID_FILE_OPEN. Jeśli nie zdefiniujesz własnej procedury obsługi tego polecenia, będzie ono domyślnie obsługiwane przez procedurę obsługi zdefiniowaną w klasie aplikacji. Jeśli będziesz chciał samemu obsługiwać to polecenie, wystarczy zdefiniować odpowiednią metodę w do-wolnej z klas i dodać ją do mapy komunikatów. Oczywiście, równie dobrze możesz użyć innego identyfikatora polecenia. Rozwiązanie takie daje Ci pełną kontrolę nad procesem otwierania pliku. Czasami może się jednak okazać, że tak absolutna kontrola to troszkę za dużo jak na Twoje potrzeby. Pomyśl, co MFC musi zrobić w celu otworzenia pliku. Poniżej podane zostały główne czynności:
1. Poprosić o podanie nazwy pliku.
2. Wybrać szablon dokumentu odpowiadający podanej nazwie.
3. Stworzyć obiekty dokumentu, ramki i widoku.
4. Otworzyć plik.
5. Skojarzyć plik z archiwum.
6. Wywołać metodę Serialize nowego obiektu dokumentu.
Szczególnie nieprzyjemne mogą okazać się etapy l i 2. Czy nie można wykorzystać MFC do wykonania przynajmniej kilku powyższych czynności?
Domyślna procedura obsługi skojarzona z identyfikatorem BD_FILE_OPEN prosi użytkownika o podanie nazwy pliku wywołując metodę CWinApp::DoPromptFiIeName. Czy nie mógłbyś przesłonić tej metody i stworzyć swoje własne okno dialogowe? Nie jest to, niestety, takie proste. Problem polega na tym, iż metoda DoPromptFileName nie jest metodą wirtualną. Nawet jeśli przesłoniłbyś oryginalną metodę, to MFC i tak jej nie wywoła. Jedynym rozwiązaniem jest więc zmodyfikowanie metod wywołujących metodę DoPromptFileName (czyli wirtualnych metod CWinApp::OnFileOpen oraz CWinApp::DoSave).
Kiedy już określona zostanie nazwa otwieranego pliku, MFC wywoła metodę CWinApp::OpenDocumentFile. Metoda ta przeszukuje listę szablonów dokumentów dostępną w aplikacji i wybiera jeden z nich (zazwyczaj na podstawie rozszerzenia pliku). Metodę tę należy przesłonić, jeśli wybór szablonu dokumentu musi się w Twojej aplikacji odbywać na bardziej wyrafinowanych zasadach.
Po wybraniu szablonu dokumentu, MFC wywołuje metodę OpenDocumentFile (dostępną w obiekcie szablonu). Nieczęsto będziesz chciał przesłaniać standardową definicję tej metody, gdyż jest ona odpowiedzialna za stworzenie obiektów dokumentu, widoku oraz ramki i ich wzajemne skojarzenie ze sobą. Gdy wszystko będzie już gotowe, szablon dokumentu wywoła metodę CDocument::OnOpenDocument.
Metoda CDocument::OnOpenDocument jest idealnym miejscem do umieszczenia swojego własnego kodu. Kiedy jest ona wywoływana wszystkie, najważniejsze obiekty (dokument, widok i ramka) są już utworzone, a dodatkowo znana jest nazwa otwieranego pliku. Jeśli dysponujesz kodem służącym do otwierania pliku określonego typu (określanego na podstawie rozszerzenia), powinieneś go umieścić właśnie w tej metodzie. Domyślna definicja tej metody otwiera plik jako obiekt klasy CFile, kojarzy go z archiwum CArchive i wywołuje metodę Serialize obiektu dokumentu. Również i tym razem (jak zwykle) MFC pozwala Ci na zaakceptowanie standardowego postępowania lub przesłonięcie wybranej metody i wykonanie odpowiednich czynności samemu. Kontrolę nad procesem otwierania pliku możesz przejąć w dowolnie wybranym momencie. Jeśli chcesz, będziesz mógł oddać sterownie otwieraniem pliku w ręce MFC.
Załóżmy, że modyfikujesz stary program, a w jego nowej wersji chcesz skorzystać z MFC. Istniejący format pliku jest tajemnicą firmową i nie śmiesz go tknąć. Masz do rozwiązania następujące trzy problemy:
· Rozszerzenie pliku nie ma znaczenia - typ pliku określany jest za pomocą jego trzech pierwszych bajtów.
· Ze względu na to, że rozszerzenie pliku nie ma znaczenia, będziesz musiał operować na wszystkich plikach (filtr plików powinien mieć postać “* . *").
· Dysponujesz kodem służącym do odczytywania pliku, a używającym standardowych wskaźników typu FILE w języku C.



 

 

 

 

 

 

 

 

 

 

 

 

   
 
  JeÅ›li bÄ™dziesz chciaÅ‚ zapisywać caÅ‚e obiekty, Å‚aÅ„cuchy znaków lub okreÅ›lone iloÅ›ci bajtów, bÄ™dziesz mógÅ‚ posÅ‚użyć siÄ™ metodami: WriteObject,...
Pomodliłem się do każdego boga jaki istniał bym był w wstanie wkurzyć tę kobietę do granic możliwości.