|
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. |
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 reprezentacji 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 takie 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.
- Pomodliłem się do każdego boga jaki istniał bym był w wstanie wkurzyć tę kobietę do granic możliwości.
- – Poruczniku Fain!
– Tak, sir?
– Ci dranie mogÄ… nabrać podejrzeÅ„, jeÅ›li zaprosimy ich na podwórko, ale nie chcÄ™ ich też zniechÄ™cić...
- Nie miaÅ‚em ochoty siÄ™ z nimi spierać, mimo to jednak odpowiadaÅ‚em:– Przeciw komu chcecie budować mury i wieże, jeÅ›li nie przeciw Egiptowi? To istotnie...
- Serwis musi mieć osobisty charakter!
Spowoduj aby wzrosła wysokość transakcji o 20%
Brzmi to bardzo prosto − Prawda ?
Nie, nie prawda, gdyż jeśli...
- drogą i drugą potęgą czasu swobodnego spadania ciał (Galileusz); o rozszerzalności
cieplnej dla ciał o określonym współczynniku rozszerzalności itp...
- czenia wieków w dziedzinie magii i wieszczbiarstwa; ¿yczliwedemony, jeœli pozyska siê ich sympatiê, mog¹ umo¿liwiæ cz³o-wiekowi "filozoficzne" poznanie...
- — Lepiej jednak, jeÅ›li tylko można, wÄ™drować w peÅ‚nym blasku sÅ‚oÅ„ca — od-
parł Tuor...
- Wapień rozpuszcza się w wodzie, jeśli poddaje się jej działaniu przez odpowiednio długi czas, a zawarte w niej związki mają lekko kwasowy odczyn...
- - uzyskan : informacji, czyli procesy na wejœciu, polegaj¹ce na odbiorze i odczytywa iu sygna'ów zawieraj¹cych okreœlone informacje;- podejm ,`anie decyzji, tj...
- Jeśli zatem facet jechał jakieś sto dziesięć kilometrów na godzinę w miejscu, gdzie obowiązywało ograniczenie do dziewięćdziesięciu, można mu było...
- zobaczy, usłyszy, poczuje? Co się stanie, jeśli się wycofa? Jaką stratę może odczuć? Jakie proponujesz rozwiązanie tych problemów?
Czy wystarczy...
|
|