Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

Podobne dokumenty
- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Programowanie telefonów z Windows Phone 7, cz. 4

using System;... using System.Threading;

Programowanie telefonów z Windows Phone 7, cz. 2

Prosta książka telefoniczna z wykorzystaniem zapisu do pliku

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

msgbox("akcja: Początek, argument: " + argument.tostring()); Thread.Sleep(1000); //opóźnienie msgbox("akcja: Koniec"); return DateTime.Now.

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku

5.2. Pierwsze kroki z bazami danych

MVVM i XAML w Visual Studio 2015 / Jacek Matulewski. Gliwice, cop Spis treści

Wykład 8: klasy cz. 4

Wykład 12. Programowanie serwera MS SQL 2005 w C#

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Rozdział 2. Pierwsza aplikacja Windows Store.

Klasy i obiekty cz II

UWAGA!!! Przed przystąpieniem do zamknięcia roku proszę zrobić kopie bezpieczeństwa

Programowanie obiektowe

Programowanie obiektowe

Wykład 5 Okna MDI i SDI, dziedziczenie

BAZY DANYCH Panel sterujący

Laboratorium - Monitorowanie i zarządzanie zasobami systemu Windows XP

Instrukcja laboratoryjna cz.3

Programowanie obiektowe i zdarzeniowe wykład 1 Wprowadzenie do programowania zdarzeniowego

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Lokalizacja Oprogramowania

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wprowadzenie do projektu QualitySpy

Expo Composer Garncarska Szczecin tel.: info@doittechnology.pl. Dokumentacja użytkownika

Wykład 6 Dziedziczenie cd., pliki

Programowanie obiektowe

Informatyka II. Laboratorium Aplikacja okienkowa

PROBLEMY TECHNICZNE. Co zrobić, gdy natrafię na problemy związane z użytkowaniem programu DYSONANS

Laboratorium - Archiwizacja i odzyskiwanie danych w Windows Vista

Ekspert radzi. mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8. Ekspert radzi.

Materiały do zajęć VII

Użycie Visual Basic for Applications ("VBA")

Programowanie obiektowe i zdarzeniowe

Informatyka Edytor tekstów Word 2010 dla WINDOWS cz.1

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Laboratorium 7 Blog: dodawanie i edycja wpisów

Programowanie obiektowe

Visual Studio instalacja

Utworzenie aplikacji mobilnej Po uruchomieniu Visual Studio pokazuje się ekran powitalny. Po lewej stronie odnośniki do otworzenia lub stworzenia

Instrukcja użytkownika. Aplikacja dla WF-Mag

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

PHP 5 język obiektowy

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Mechanizm dziedziczenia

akademia androida Składowanie danych część VI

Programowanie obiektowe

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Laboratorium - Migracja danych w Windows Vista

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Instrukcja użytkownika. Aplikacja dla Comarch Optima

TEMAT : KLASY DZIEDZICZENIE

Informatyka I : Tworzenie projektu

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Laboratorium - Narzędzia linii uruchamiania w systemie Windows 7

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Windows 10 - Jak uruchomić system w trybie

Te i wiele innych cech sprawia, że program mimo swej prostoty jest bardzo funkcjonalny i spełnia oczekiwania większości klientów.

Program V-SIM tworzenie plików video z przebiegu symulacji

Wskaźniki do funkcji i metod

5.4. Tworzymy formularze

VComNet Podręcznik użytkownika. VComNet. Podręcznik użytkownika Wstęp

1 Zrób to inaczej. 1.1 Przechowywanie plików Zapisanie i otwieranie pliku do OneDrive w aplikacji Office

STWORZENIE BIBLIOTEKI SŁUŻĄCEJ DO WCZYTYWANIA

[1/15] Chmury w Internecie. Wady i zalety przechowywania plików w chmurze

Wykład 9 Kolekcje, pliki tekstowe, Przykład: Notatnik

HELIOS pomoc społeczna

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Instrukcja użytkownika. Aplikacja dla Comarch Optima

Tablet bezprzewodowy QIT30. Oprogramowanie Macro Key Manager

STWORZENIE MOBILNEJ APLIKACJI,

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS

Multimedia JAVA. Historia

Dodawanie i modyfikacja atrybutów zbioru

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Spis treści. Rozdział 2. Graficzna oprawa witryny...z Stosowanie motywu...s...s.. 19

Aplikacje WWW - laboratorium

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Leszek Stasiak Zastosowanie technologii LINQ w

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Konfiguracja współpracy urządzeń mobilnych (bonowników).

SZYBKI START. Tworzenie nowego połączenia w celu zaszyfrowania/odszyfrowania danych lub tekstu 2. Szyfrowanie/odszyfrowanie danych 4

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Zaawansowane aplikacje WWW - laboratorium

Kopiowanie ustawień SolidWorks

Tworzenie prezentacji w MS PowerPoint

Instrukcja użytkownika. Aplikacja dla Comarch ERP XL

Metody dostępu do danych

Laboratorium - Zabezpieczanie kont, danych i komputera w systemie Windows 7

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Spis treści. S t r o n a 2

Laboratorium - Archiwizacja i odzyskiwanie danych w Windows 7

Transkrypt:

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych Jacek Matulewski Materiały dla Podyplomowego Studium Programowania i Zastosowania Komputerów, sekcja Projektowanie i tworzenie aplikacji dla platformy.net (pod patronatem Microsoft) Cykl życia aplikacji. Wybór momentu zapisania stanu W przypadku aplikacji na ekran Start w systemie Windows 8 (aplikacje Modern UI) podlegają zarządzaniu, jaki znamy z systemów mobilnych. To nie użytkownik, a system decyduje kiedy powinny zostać zamknięte (w tym sensie nasz przycisk Zamknij, który dodaliśmy do aplikacji odbiega od standardów). System może również wstrzymać aplikację, jeżeli nie jest widoczna na ekranie, a użytkownik otwiera nowe aplikacje lub komputer przechodzi w stan niższego poboru energii. Wstrzymana aplikacja nadal znajduje się w pamięci, więc jej wznowienie jest szybkie. Dzięki przeniesieniu konroli nad cyklem życia aplikacji z rąk użytkownika do systemu, ten może sprawniej zarządzać pamięcią i użyciem procesora. Schemat cyklu życia aplikacji Modern UI widoczny jest na rysunku 3.1. Rysunek 3.1. Cykl życia aplikacji Modern UI (tłumaczenie rysunku z MSDN) (zob. http://msdn.microsoft.com/en-us/library/windows/apps/hh986968.aspx) Wstrzymanie i wznowienie aplikacji zasadniczo nie wymaga od programisty żadnych działań. Problemem jest natomiast możliwość zamknięcia aplikacji. Aby nie traciła ona swojego stanu, programista powinien zadbać, aby aplikacja potrafiła przechować ustawienia i zawartość kontrolek, lub jeszcze lepiej stan modelu (dane), na bazie którego tworzony jest widoczny w interfejsie widok (stan kontrolek). W naszej aplikacji będą to cztery liczby odpowiadające składowym R, G, B i A koloru lub po prostu obiekt typu Color. Co ciekawe zamykana aplikacja (bez względu na to, czy użyjemy dodanego przez nas przycisku, kombinacji klawiszy Alt+F4, czy gestu zamykającego aplikację), zostanie ona wpierw wstrzymana na 10 sekund, a dopiero potem zamknięta. Aplikacja nie jest powiadamiana o zamknięciu, a jedynie o wstrzymaniu. Zatem już wtedy powinna zadbać o zachowanie swojego stanu. I ma na to tylko 5 sekund.

Tyle teorii. W praktyce również zdarzenie towarzyszące wstrzymaniu aplikacji nie jest dobrym miejscem na zapisywanie danych. Raz, że czas od wstrzymania aplikacji do jej zamknięcia jest krótki, a dwa nie ma gwarancji, że metoda App.onSuspending zostanie w ogóle wywołana. Dlatego warto ważne dane zapisać już wcześniej. Można do tego wykorzystać np. zdarzenie VisibilityChanged okna wówczas dane zostaną zapisane w momencie, gdy okno aplikacji znika lub pojawia się z ekranu. Wiemy zatem kiedy mamy zapisywać dane. Odczytywać będziemy je przy tworzeniu strony, aby stan aplikacji był odtwarzany nie tylko w razie wstrzymania, ale również po zamknięciu w kolejnej instancji. Pozostaje zatem ustalić gdzie mają być zapisywane dane, i co tak właściwie mamy przechowywać. Na ostatnie pytanie najłatwiej odpowiedzieć stan naszej aplikacji określa kolor prostokąta. Od tego koloru, a konkretnie od jego składowych R, G, B i A zależą również pozycje suwaków. Do przechowywania danych użyjemy natomiast mechanizmu ustawień lokalnych. Implementuje go klasa Windows.Storage.ApplicationData.Current.LocalSettings typu ApplicationDataContainer. Pozwala on na przechowywanie danych w spersonalizowanym folderze danych aplikacji, podobnie jak to ma miejsce w przypadku mechanizmu ustawień z aplikacji desktopowych Windows Forms i WPF. W przypadku tego projektu Visual Studio stworzyło plik binarny Settings.dat w katalogu c:\users\jacek_000\appdata\local\packages\9648859e-db68-477e-a389-743c15e25923_n88mjzycwkygy\settings. Oprócz ustawień lokalnych (tj. ograniczonych do tego jednego komputera), aplikacja może również przechowywać ustawienia wspólne dla tej aplikacji i tego użytkownika na wielu komputerach (katalog Windows.Storage.ApplicationData.Current.RoamingSettings). Dane są wówczas przechowywane w chmurze. Więcej o tym w następnym rozdziale. **** Przekazywanie ustawień nie zawsze działa. Przygotujmy klasę statyczną Ustawienia, która w oparciu o ustawienia lokalne pozwoli na przechowanie i odtworzenie stanu aplikacji (koloru). Pokazuje ją listing 3.1. Zwróćmy uwagę, że przechowywanie danych polega na zapisywaniu ich do kolekcji Values nie ma w tym zatem niczego skomplikowanego. Listing 3.1. Klasa ustawień. Może być zdefiniowana gdziekolwiek, nawet jako klasa zagnieżdżona klasy Kolory.MainPage, ale ja umieściłem ją w osobnym pliku Ustawienia.cs. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Color = Windows.UI.Color; namespace Kolory static class Ustawienia private static Windows.Storage.ApplicationDataContainer ustawienia = Windows.Storage.ApplicationData.Current.LocalSettings; public static bool CzyObecne() return ustawienia.values.keys.contains("kolor_r") && ustawienia.values.keys.contains("kolor_g") && ustawienia.values.keys.contains("kolor_b") && ustawienia.values.keys.contains("kolor_a");

public static Color Czytaj() Color kolor; kolor.r = (byte)ustawienia.values["kolor_r"]; kolor.g = (byte)ustawienia.values["kolor_g"]; kolor.b = (byte)ustawienia.values["kolor_b"]; kolor.a = (byte)ustawienia.values["kolor_a"]; return kolor; public static void Zapisz(Color kolor) ustawienia.values["kolor_r"] = kolor.r; ustawienia.values["kolor_g"] = kolor.g; ustawienia.values["kolor_b"] = kolor.b; ustawienia.values["kolor_a"] = kolor.a; public static void Usun() ustawienia.values.remove("kolor_r"); ustawienia.values.remove("kolor_g"); ustawienia.values.remove("kolor_b"); ustawienia.values.remove("kolor_a"); Wywołajmy metodę Czytaj w konstruktorze klasy MainPage, a Zapisz w metodzie związanej ze zdarzeniem zmiany widoczności okna. Wiązanie metody ze zdarzeniem umieściliśmy również w konstruktorze klasy MainPage. Listing 3.2 pokazuje zarówno konstruktor, jak i metodę zdarzeniową. W efekcie aplikacja po ponownym uruchomieniu będzie znajdowała się w stanie, w jakim ją opuścimy. Listing 3.2. Odtwarzanie stanu aplikacji using Color = Windows.UI.Color; namespace Kolory /// <summary> /// An empty page that can be used on its own or navigated to within a Frame. /// </summary> public sealed partial class MainPage : Page private bool inicjacjazakonczona = false; public MainPage() this.initializecomponent();

if (Ustawienia.CzyObecne()) KolorProstokąta = Ustawienia.Czytaj(); Color kolor = KolorProstokąta; SliderR.Value = kolor.r; SliderG.Value = kolor.g; SliderB.Value = kolor.b; SliderA.Value = kolor.a; TextBlock1.Text = SkładoweKoloruDec(kolor) + "\n"; TextBlock1.Text += "HEX: " + SkładoweKoloruHex(kolor); Window.Current.VisibilityChanged += Current_VisibilityChanged; inicjacjazakonczona = true; void Current_VisibilityChanged(object sender, Windows.UI.Core.VisibilityChangedEventArgs e) if (!e.visible) Ustawienia.Zapisz(KolorProstokąta); O zapisaniu danych należy również pamiętać po kliknięciu przycisku, przed wywołaniem metody App.Current.Exit (listing 3.3). Listing 3.3. Zapisywanie ustawień przed wymuszeniem zamknięcia aplikacji private void Button_Click_1(object sender, RoutedEventArgs e) Ustawienia.Zapisz(KolorProstokąta); App.Current.Exit(); Model Możemy pójść o krok dalej. Do klasy Ustawienia dodajmy statyczną składową przechowujące aktualną wartość koloru ustalonego za pomocą suwaków i prezentowanego w prostokącie. W ten sposób klasa ta stworzy w pełni funkcjonalną warstwę danych. 1. Zacznijmy od dodania do klasy Ustawienia prywatnego pola kolor i udostępniającej go własności Kolor (listing 3.4). Pole będzie typu Nullable<Color> (co w skrócie można zapisać jako Color?) i zainicjowane wartością null świadczącą o tym, że jego wartość nie została jeszcze odczytana z ustawień. W sekcji get własności, której kod wykonywany jest w momencie odczytywania wartości własności, sprawdzamy czy wartość została już odczytana z ustawień i jeżeli nie, to to robimy. W ten sposób wartość zostanie zainicjowana automatycznie przy pierwszym odczytaniu. Listing 3.4. Przekształcania klasy pomocniczej służącej do przechowywania ustawień w model tworzący warstwę danych aplikacji static class Ustawienia private static Windows.Storage.ApplicationDataContainer ustawienia = Windows.Storage.ApplicationData.Current.LocalSettings; private static Color kolordomyslny = Color.FromArgb(255,0,100,0);

private static Color? kolor = null; public static Color Kolor get if (!kolor.hasvalue) if (CzyObecne()) Czytaj(); else kolor=kolordomyslny; return kolor.value; set kolor = value;... 2. Przy takim scenariuszu metody CzyObecne i Czytaj mogą zostać ukryte (ich modyfikator ustawiamy na private). Ponadto metoda Czytaj wymaga dodatkowym modyfikacji. Zamiast zwracać kolor będzie modyfikować stan ustawień (listing 3.5). Listing 3.5. Upraszczanie interfejsu klasy Ustawienia private static void Czytaj() Color kolor; kolor.r = (byte)ustawienia.values["kolor_r"]; kolor.g = (byte)ustawienia.values["kolor_g"]; kolor.b = (byte)ustawienia.values["kolor_b"]; kolor.a = (byte)ustawienia.values["kolor_a"]; Ustawienia.kolor = kolor; 3. Zmieniamy również metodę Zapisz tak, aby do ustawień przesyłana była wartość z pola kolor (w tej wersji metoda pozbawiona jest argumentu, zob. listing 3.6). Listing 3.6. Drobne modyfikacje w metodzie Zapisz public static void Zapisz() if (kolor.hasvalue) ustawienia.values["kolor_r"] = kolor.value.r; ustawienia.values["kolor_g"] = kolor.value.g; ustawienia.values["kolor_b"] = kolor.value.b; ustawienia.values["kolor_a"] = kolor.value.a;

4. Możemy teraz przejść do kodu klasy MainPage. Zmodyfikujmy konstruktor zgodnie ze wzorem z listingu 3.7. Listing 3.7. Zmiany w klasie strony public MainPage() this.initializecomponent(); if (Ustawienia.CzyObecne()) KolorProstokąta = Ustawienia.Kolor; Color kolor = KolorProstokąta; SliderR.Value = Ustawienia.Kolor.R; SliderG.Value = Ustawienia.Kolor.G; SliderB.Value = Ustawienia.Kolor.B; SliderA.Value = Ustawienia.Kolor.A; TextBlock1.Text = SkładoweKoloruDec(Ustawienia.Kolor) + "\n"; TextBlock1.Text += "HEX: " + SkładoweKoloruHex(Ustawienia.Kolor); Window.Current.VisibilityChanged += Current_VisibilityChanged; inicjacjazakonczona = true; void Current_VisibilityChanged(object sender, Windows.UI.Core.VisibilityChangedEventArgs e) if (!e.visible) Ustawienia.Zapisz(KolorProstokąta);... private void Button_Click_1(object sender, RoutedEventArgs e) Ustawienia.Zapisz(KolorProstokąta); App.Current.Exit(); 5. No i na koniec zmodyfikujmy metodę zdarzeniową związaną ze zmianą wartości suwaków zgodnie ze wzorem z listingu 3.8. Listing 3.8. Synchronizacja koloru prostokąta i stanu modelu private void Sliders_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) if (!inicjacjazakonczona) return; Ustawienia.Kolor = new Color() R = (byte)sliderr.value, G = (byte)sliderg.value, B = (byte)sliderb.value, A = (byte)slidera.value

; KolorProstokąta = Ustawienia.Kolor; TextBlock1.Text = SkładoweKoloruDec(Ustawienia.Kolor) + "\n"; TextBlock1.Text += "HEX: " + SkładoweKoloruHex(Ustawienia.Kolor); Uwaga! O ile użycie pola czyzainicjowane było wcześniej podyktowane tak naprawdę tylko względami estetycznymi, to teraz jest ono konieczne do prawidłowego działania aplikacji. Bez tego Ustawienia.Kolory byłyby niewłaściwie zmieniane przed właściwym uruchomieniem programu.