piątek, 19 marca 2010
Pliki BLOB w MS SQL
poniedziałek, 15 marca 2010
LINQ to XML
Nie wgłębiając się w filozoficzne zawiłości tego tematu spróbuje w prosty sposób opisać możliwości jakie daje LINQu podczas pracy z plikiem XML.
1. Utworzenie pliku XML
Zacznijmy od podstaw czyli od tego w jaki sposób utworzyć prosty plik XML. W tym miejscu mam nadzieję, że czytelnik zna strukturę i budowę plików XML. Jeżeli nie polecam zapoznać się z materiałem zawartym np na stronie http://www.w3schools.com/xml/default.asp.
Przejdźmy więc do utworzenia prostego dokumentu XML:
W komentarzach podałem alternatywne metody wykonania tego samego zadania. Należy pamiętać, że dane nie zostaną zapisane na dysk do pliku XML bez jawnego wywołania metody Save()!
8. Usuwanie elementów
Usuwanie elementów przebiega tak samo jak uaktualnianie czy też modyfikowanie. Wyszukujemy interesujący nas element a następnie wywołujemy metodę Remove():
sobota, 6 marca 2010
Praca z Menu w WPF
Menu w wygodny sposób można zaprojektować z użyciem XAMLa.
Praca z Bitmapami w WPF
1. Wczytywanie obrazka do kontrolki Image:
Zadanie to można wykonać na kilka sposobów: strumień, pobranie z żądanej lokalizacji sieciowej lub ścieżka. Najprostszą i najczęściej stosowaną opcją jest wczytanie ze ścieżki:
Zobaczmy na przykład:
Kod może trochę bardziej rozbudowany od znanego z WinForms ale za to działający znacznie szybciej. O ile szybciej? O tym przekonamy się podczas tego testu:
Jak widać czas wynosi około 42 ms co jest dużo lepszym rezultatem. Kolejne czasy na poziomie 9 - 13 ms są wynikiem używania przez WPF Intelligent Redrawing (więcej o tym narzędziu można poczytać na stronach msdn).
Jeżeli mowa o zamianie na skalę szarości nie można pominąć tego co sam framework oferuje. Dzięki klasie FormatConvertedBitmap mamy możliwość konwersji obrazka na dowolną skalę. Przykład:
Memento Pattern
W swoim aktualnym projekcie, potrzebowałem stworzyć mechanizm umożliwiający cofnięcie zmian wprowadzonych w obrazie. Dzięki wzorcowi Memento można w bardzo łatwy i szybki sposób uzyskać taką funkcjonalność.
Co nam daje Memento?
Pozwala na zachowanie całego stanu obiektu (lub tyle ile potrzebujemy), w celu późniejszego jego odtworzenia, bez naruszenia zasad enkapsulacji.
Spójrzmy na poniższy diagram klas:
Mamy tutaj 3 klasy:
Orginator - jest to obiekt którego stan wewnętrzny chcemy zachować. Poprzez metodę CreateMemennto() tworzy "kopię zapasową" samego siebie a dzięki metodzie SetMemento(Memento) może się odtworzyć z kopi.
Memento - obiekt który jest kopią oryginalnego obiektu. Dzięki metodą GetState() i SetState() pozwalają na odczyt i zapis stanu obiektu.
Caretaker - obiekt ten zarządza obiektami Memento
Przykłady zawsze lepiej działają na wyobraźnię, dlatego spójrzmy na oto taki przykład. Mamy aplikację w której użytkownik wypełnia jakieś pola. Niech to będzie Imię, Nazwisko i wiek. Przyjmijmy, że wygląda ona tak:
Przyjmijmy, że po naciśnięciu przycisku dane zapisują się do bazy danych. Teraz nasz użytkownik wpisuje swoje dane, wciska ok i nagle przypomina mu się że źle wpisał nazwisko. Są dwa wyjścia: wpisze wszystko od początku albo kliknie przycisk cofnij i wpisze poprawne dane. W tym konkretnym przypadku nie wiele będzie kosztowała go pomyłka, jeżeli jednak pól by było więcej to możliwość cofnięcia wprowadzonych danych będzie z pewnością bardzo przydatna. Kod aplikacji:
public class Person
{
private string _firstName;
private string _lastName;
private int _age;
public string FirstName
{
get
{
return _firstName;
}
set
{
_firstName = value;
}
}
public string LastName
{
get
{
return _lastName;
}
set
{
_lastName = value;
}
}
public int Age
{
get
{
return _age;
}
set
{
_age = value;
}
}
/// <summary>
/// Przywraca poprzedni stan obiektu
/// </summary>
/// <param name="memento"></param>
public void SetMemento(Memento memento)
{
this._age = memento.Age;
this._firstName = memento.FirstName;
this._lastName = memento.LastName;
}
/// <summary>
/// Zapisuje aktualny stan obiektu
/// </summary>
/// <returns></returns>
public Memento CreateMemento()
{
return new Memento(_firstName, _lastName, _age);
}
}
public class Memento
{
private string _firstName;
private string _lastName;
private int _age;
public string FirstName
{
get
{
return _firstName;
}
set
{
_firstName = value;
}
}
public string LastName
{
get
{
return _lastName;
}
set
{
_lastName = value;
}
}
public int Age
{
get
{
return _age;
}
set
{
_age = value;
}
}
public Memento(string firstName, string lastName, int age)
{
_firstName = firstName;
_lastName = lastName;
_age = age;
}
}
public class Caretaker
{
private Memento _memento;
public Memento Memento
{
get
{
return _memento;
}
set
{
_memento = value;
}
}
}






