Express App Framework - wstęp

Ostatnio w ramach grupy .NET, miałem okazję na prezentacji, opowiedzieć Wam o XAF-ie. Po prezentacji wpadłem na pomysł żeby założyć bloga, i opisać ten Framework. Dlatego też, nie będę umieszczał materiałów które prezentowałem, a w zamian w ramach autopromocji zapraszam Was na http://dawidtulski.net :) Tam w cyklu wpisów, znajdziecie na pewno to co już pokazywałem oraz wiele innych (mam nadzieje ciekawych) rzeczy dotyczących XAF-a.

Tagi: ,

Ustalenia po spotkaniach organizacyjnych

Hej :)

W ubiegłym tygodniu odbyły się dwa, organizacyjne, spotkania grupy. Postanowiliśmy, że tak, jak w latach poprzednich, będą dwa typy spotkań: Warsztaty oraz Prezentacje. Na warsztatach, w tym semestrze będziemy uczyli się C# oraz pisali małe projekty. Spotkania zawsze będą odbywały się we wtorki (prezentacje) o godzinie 17.30 oraz w czwartki (warsztaty) o godzinie 19.

Zapraszam również na jutrzejsze spotkanie (wtorek 26.10), na którym Mateusz Jaskółowski opowie o tworzeniu aplikacji w WPF z użyciem wzorca MVVM. Opowie również o narzędziu do tworzenia wyglądu naszej aplikacji WPF. Zapraszamy!

Nie zapomnijcie zarejestrować się na: https://codeguru.pl/group-82/LectureDetails/1,4686.aspx

 

Tagi: , , ,

6-ste spotkanie OLMUG

W poniedziałek 18 stycznie 2010 odbędzie się szóste spotkanie grupy OLMUG (Olsztyn Microsoft User Group). Spotkanie będzie miała miejsce na Wydziale Matematyki i Informatyki UWM w Olsztynie przy ulicy Żołnierskiej 14 w sali 49. Start spotkania zaplanowany jest na godzinę 18:00.

O czym będzie można posłuchać na spotkaniu? Tradycyjnie odbędą się dwie prezentacje:

  • „Kilka słów o wzorcach projektowych” - lokalnego przedstawiciela grupy,
  • zaproszonego gościa spoza Olsztyna na temat TFS (Team Foundation Server).

Wszystkie informacje znajdują się na stronie spotkania. Wymagana jest rejestracja.

Tagi: , ,

Windows Presentation Foundation

W środę na spotkaniu naszej grupy zaprezentowałem czym jest WPF, do czego może się przydać oraz pokazałem przykłady kodu.

Windows Presentation Foundation jest jednym z elementów wprowadzonych w .NET 3.0. Przede wszystkim umożliwia rozdzielenie kodu aplikacji od projektu interfejsu użytkownika. Dzięki narzędziu Microsoft Expression Blend Designer może projektować interfejs aplikacji w sposób dla niego wygodny (graficzne przeciąganie elementów, kolorowanie, ustawianie stanów animacji na timeline, itp).

W WPF interfejs jest definiowany w języku XAML. W tym języku możemy zadeklarować wygląd, animacje, sposób reagowania na zdarzenia. Dzięki temu aplikacja nie zawiera kodu odpowiedzialnego za np. animację interfejsu. Tym zajmuje się sam framework, a aplikacja zawiera tylko kod związany z logiką biznesową.

Kolejną zaletą WPF jest data binding. Możemy “zbindować” dowolną kontrolkę z jakimś obiektem, bazą danych, plikiem XML albo z inną kontrolką. W ten sposób każda zmiana w jednej z “zbindowanych” właściwości automatycznie będzie kopiowana do drugiej. Nie musimy sprawdzać czy coś się zmieniło  i samemu kopiować danych.

Jeśli chcemy w naszej aplikacji WPF mieć wstążkę (“ribbon”) znany z m.in. Microsoft Office 2007 wystarczy, że do aplikacji dołączymy bibliotekę RibbonControlsLibrary.dll.

Kolejnym krokiem jest zdefiniowanie komend. Aby komendy zawierały informacje potrzebne dla ribbona (ikony, etykiety…) muszą być typu RibbonCommand:

   1: <ResourceDictionary 
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary">
   5:  
   6:     <r:RibbonCommand x:Key="CutCommand"
   7:         LabelTitle="Cut"
   8:         ToolTipTitle="Cut"
   9:         ToolTipDescription="Cut text element to the clipboard."
  10:         SmallImageSource="images/Cut.png"
  11:         LargeImageSource="images/Cut.png" />
  12:  
  13:     <r:RibbonCommand x:Key="CopyCommand"
  14:         LabelTitle="Copy"
  15:         ToolTipTitle="Copy"
  16:         ToolTipDescription="Copy text element to the clipboard."
  17:         SmallImageSource="images/Copy.png"
  18:         LargeImageSource="images/Copy.png" />
  19:  
  20: ...
  21:     
  22: </ResourceDictionary>

Wstążka pojawi się jeśli w oknie umieścimy kontrolkę Ribbon. Wstążka składa się z zakładek (RibbonTab), na każdej zakładce znajdują się grupy (RibbonGroup) i w tych grupach są przyciski i inne elementy. Poniżej przykład definicji ribbona:

   1: <r:Ribbon DockPanel.Dock="Top" Title="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=Title}">
   2:  
   3:           <r:RibbonTab Label="Banking">
   4:  
   5:               <!-- Define the groups in this tab -->
   6:               <r:RibbonTab.Groups>
   7:  
   8:                   <!-- Clipboard commands -->
   9:                   <r:RibbonGroup GroupSizeDefinitions="{StaticResource RibbonLayout}">
  10:                       <r:RibbonGroup.Command>
  11:                           <r:RibbonCommand LabelTitle="Clipboard" SmallImageSource="images/Paste.png" />
  12:                       </r:RibbonGroup.Command>
  13:                       <r:RibbonButton Command="me:AppCommands.Cut"/>
  14:                       <r:RibbonButton Command="me:AppCommands.Copy"/>
  15:                       <r:RibbonButton Command="me:AppCommands.Paste"/>
  16:                   </r:RibbonGroup>
  17:  
  18:                   <r:RibbonGroup GroupSizeDefinitions="{StaticResource RibbonLayout}">
  19:                       <r:RibbonGroup.Command>
  20:                           <r:RibbonCommand LabelTitle="Checkbook" SmallImageSource="images/AddNew.png" />
  21:                       </r:RibbonGroup.Command>
  22:                       <r:RibbonButton Command="me:AppCommands.AddNew"/>
  23:                       <r:RibbonButton Command="me:AppCommands.Clear" />
  24:                       <r:RibbonButton Command="me:AppCommands.Delete"/>
  25:                   </r:RibbonGroup>
  26:  
  27:                   <r:RibbonGroup GroupSizeDefinitions="{StaticResource RibbonLayout}">
  28:                       <r:RibbonGroup.Command>
  29:                           <r:RibbonCommand LabelTitle="Statements" SmallImageSource="images/Reconcile.png" />
  30:                       </r:RibbonGroup.Command>
  31:                       <r:RibbonButton Command="me:AppCommands.Reconcile"/>
  32:                   </r:RibbonGroup>
  33:  
  34:                   <r:RibbonGroup GroupSizeDefinitions="{StaticResource RibbonLayout}">
  35:                       <r:RibbonGroup.Command>
  36:                           <r:RibbonCommand LabelTitle="Online" SmallImageSource="images/CreditCards.png" />
  37:                       </r:RibbonGroup.Command>
  38:  
  39:                       <r:RibbonButton Command="me:AppCommands.DownloadStatements"/>
  40:                       <r:RibbonButton Command="me:AppCommands.DownloadCreditCards"/>
  41:                       <r:RibbonButton Command="me:AppCommands.Transfer"/>
  42:                   </r:RibbonGroup>
  43:  
  44:                   <r:RibbonGroup GroupSizeDefinitions="{StaticResource RibbonLayout}">
  45:                       <r:RibbonGroup.Command>
  46:                           <r:RibbonCommand LabelTitle="Tools" SmallImageSource="images/Backup.png" />
  47:                       </r:RibbonGroup.Command>
  48:  
  49:                       <r:RibbonButton Command="me:AppCommands.Backup"/>
  50:                       <r:RibbonButton Command="me:AppCommands.Calculator"/>
  51:                   </r:RibbonGroup>
  52:  
  53:               </r:RibbonTab.Groups>
  54:           </r:RibbonTab>
  55:  
  56:           <r:RibbonTab Label="Reporting">
  57:               <r:RibbonTab.Groups>
  58:                   <r:RibbonGroup GroupSizeDefinitions="{StaticResource RibbonLayout}">
  59:                       <r:RibbonGroup.Command>
  60:                           <r:RibbonCommand LabelTitle="Reports" SmallImageSource="images/CashflowReport.png" />
  61:                       </r:RibbonGroup.Command>
  62:  
  63:                       <r:RibbonButton Command="me:AppCommands.TrendReport" />
  64:                       <r:RibbonButton Command="me:AppCommands.BudgetReport"/>
  65:                       <r:RibbonDropDownButton Command="me:AppCommands.OtherReports">
  66:                           <MenuItem Header="Cash Flow Report" />
  67:                           <MenuItem Header="Favorites Report" />
  68:                           <MenuItem Header="Spending Report" />
  69:                           <MenuItem Header="Savings Report" />
  70:                           <MenuItem Header="Credit Report" />
  71:                       </r:RibbonDropDownButton>
  72:  
  73:                   </r:RibbonGroup>
  74:               </r:RibbonTab.Groups>
  75:           </r:RibbonTab>
  76:  
  77:       </r:Ribbon>

Jeszcze nie wygląda to tak jakbyśmy sie tego spodziewali, brakuje trzech rzeczy:

  1. Menu aplikacji.
    109-5[1] 
    Menu aplikacji tworzymy ustawiając właściwość Ribbon.ApplicationMenu. W menu możemy wstawić komendy nowe (jak w poniższym przykładzie) jak i te same które zdefiniowaliśmy wcześniej.

       1: <r:Ribbon.ApplicationMenu>
       2:                 <r:RibbonApplicationMenu>
       3:                     <r:RibbonApplicationMenu.Command>
       4:                         <r:RibbonCommand 
       5:                             Executed="OnCloseApplication"
       6:                             LabelTitle="Application Button"
       7:                             LabelDescription="Close the application."
       8:                             SmallImageSource="images/Coins.png"
       9:                             LargeImageSource="images/Coins.png"
      10:                             ToolTipTitle="Personal Finance Manager"
      11:                             ToolTipDescription="Click here to open or save a checkbook register." />
      12:                     </r:RibbonApplicationMenu.Command>
      13:                     <r:RibbonApplicationMenuItem>
      14:                         <r:RibbonApplicationMenuItem.Command>
      15:                             <r:RibbonCommand 
      16:                                 LabelTitle="_Close" 
      17:                                 LabelDescription="Close the Application"
      18:                                 Executed="OnCloseApplication" />
      19:                         </r:RibbonApplicationMenuItem.Command>
      20:                     </r:RibbonApplicationMenuItem>
      21:                 </r:RibbonApplicationMenu>
      22:             </r:Ribbon.ApplicationMenu>
  2. QuickAccessToolBar
    109-6[1] 
    QuickAccessToolBar to pasek przycisków z najczęściej używanymi komendami, definiowany przez użytkownika

       1: <r:Ribbon.QuickAccessToolBar>
       2:     <r:RibbonQuickAccessToolBar CanUserCustomize="True">
       3:         <r:RibbonButton Command="me:AppCommands.AddNew" r:RibbonQuickAccessToolBar.Placement="InCustomizeMenuAndToolBar" />
       4:         <r:RibbonButton Command="me:AppCommands.Cut" r:RibbonQuickAccessToolBar.Placement="InCustomizeMenuAndToolBar" />
       5:         <r:RibbonButton Command="me:AppCommands.Copy" r:RibbonQuickAccessToolBar.Placement="InCustomizeMenuAndToolBar" />
       6:         <r:RibbonButton Command="me:AppCommands.Paste"  r:RibbonQuickAccessToolBar.Placement="InCustomizeMenuAndToolBar" />
       7:         <r:RibbonButton Command="me:AppCommands.Help" r:RibbonQuickAccessToolBar.Placement="InToolBar" />
       8:     </r:RibbonQuickAccessToolBar>
       9: </r:Ribbon.QuickAccessToolBar>
  3. Office 2007 Theme Resources
    Aby w naszej aplikacji przycisk uruchamiający menu aplikacji był okrągły i umieszczony w lewym górnym rogu okna musimy zmienić klasę z której dziedziczy nasze okno z Window na RibbonWindow, oraz dodać do aplikacji ustawienia wyglądu z kontrolki :

       1: <Window.Resources>
       2:     <ResourceDictionary>
       3:         <ResourceDictionary.MergedDictionaries>
       4:             <ResourceDictionary 
       5:                 Source="/RibbonControlsLibrary;component/Themes/Office2007Blue.xaml"/>
       6:         </ResourceDictionary.MergedDictionaries>
       7:     </ResourceDictionary>
       8: </Window.Resources>

Samą bibliotekę z ribbonem możemy ściągnąć po zaakceptowaniu licencji na stronie  Office UI Licensing (link License the Office UI). Ribbona możemy używać zupełnie bezpłatnie, wystarczy, że nasza aplikacja nie będzie konkurencyjną dla Microsoft Office (i zastosujemy się do zaleceń z licencji dotyczących wyglądu samego ribbona).

Jeśli ktoś chce sie pobawić WPFem to zamieszczam kilka linków z ciekawymi przykładami:

http://windowsclient.net/downloads/folders/wpfsamples/default.aspx

http://blog.trivadis.com/blogs/manuelmeyer/archive/2008/06/12/cool-wpf-samples.aspx

http://www.actiprosoftware.com/Support/ResourceGuides/WPF/ViewCategory.aspx?ResourceGuideCategoryID=6

Tagi: , , ,

Spotkania grupy - Windows Presentation Foundation

W tym tygodniu odbędą się dwa spotkania:

Zapraszam na spotkania :)

Zwracam uwagę, że spotkania są przesuniętę o półgodziny w stosunku do tego co było wcześniej (na Waszą prośbę :) ).

Tagi: , ,

SQLite i ADO .NET

Chciałbym przedstawić wykorzystanie SQLite w połączeniu z ADO.NET przy wykorzystaniu C#.

[slideshare id=2595661&doc=sqliteiado-net-091127052918-phpapp02]

Wymaga to jednak pewnego uzupełnienia.

SQLite

SQLite jest biblioteką napisaną w języku C, która implementuje silnik relacyjnej bazy danych. Jak głosi główne hasło projektu jest ona “prosta, szybka, niezawodna”. Cała baza znajduje się w pojedynczym pliku, a w przeciwieństwie do innych systemów baz danych, nie występuje tu żaden demon nią zarządzający.

Inne cechy warte wymienienia:

  • Mały rozmiar biblioteki (ok. 0.5MB),
  • ACID
  • Nie wymaga żadnej konfiguracji,
  • Obsługa baz do 2TB.

Kody źródłowe udostępnione są jako domena publiczna (ang. public domain), przez co dostępne dla wszystkich i do dowolnych zastosować – także komercyjnych. Ze względu na brak ograniczeń wykorzystują ją m.in.: Mozilla, Google, Adobe, Apple, Symbian. Wbudowana jest także w interpretery języków PHP i Python.

Jeśli chcemy rozpocząć przygodę najłatwiej jest pobrać konsolowy program sqlite3 (np. sqlite-3_6_17.zip), a następnie dodać go do systemowej zmiennej PATH.

image Wygodniejszym rozwiązaniem może okazać się skorzystanie z któregoś z dostępnych menedżerów:

Dzięki prostemu, łatwemu do wykorzystania API powstało wiele nakładek, które pozwalają na dostęp do danych z innych języków programowania, niż standardowy C.

SQLite ADO.NET 2.0/3.5 Provider

System.Data.SQLite jest silnikiem relacyjnej bazy danych SQLite wraz z dostawcą danych (Data Provider) dla ADO.NET. Wszystko udostępniane jest jako pojedynczy. Wszystko udostępniane jest jako pojedyncze assembly. To, co wyróżnia podaną bibliotekę, to:

  • Dostępność na zasadach public domain,
  • Całkowita implementacja ADO.NET 2.0,
  • Wsparcie dla wersji Full i Compact .NET Framework,
  • Wsparcie dla C/C++,
  • Wsparcie dla Mono,
  • ADO.NET 3.5 Entity Framework,
  • Integracja z Visual Studio 2005/2008.

Po zainstalowaniu biblioteki tworzymy konsolowy projekt (File > New > Project… > Console Application). Następnie dodajemy referencję do System.Data.SQLite (Add Reference… > Zakładka .NET), oraz odpowiednią dyrektywę using, do naszego kodu:

   1: using System.Data.SQLite;

Poniższy kod ilustruje podstawowe operacje na bazie:

   1: // Utworzenie połączenia z bazą. Jeżeli nie istnieje - utworzona zostanie nowa.
   2: var conn = new SQLiteConnection("Data Source = test.db;");
   3: conn.Open();
   4:  
   5: // Utworzenie tabeli
   6: using(var command = conn.CreateCommand()){
   7:     command.CommandText = "CREATE TABLE tbl (id integer primary key, col1 int, col2 string)";
   8:     command.ExecuteNonQuery();
   9: }
  10:  
  11: // Wstawienie danych
  12: using(var command = conn.CreateCommand()){
  13:     command.CommandText = "INSERT INTO tbl (col1, col2) Values('1', 'eastgroup.pl')";
  14:     command.ExecuteNonQuery();
  15: }
  16:  
  17: int col1;
  18: string col2;
  19:  
  20: // Odczyt danych
  21: using(var command = conn.CreateCommand()){
  22:     command.CommandText = "SELECT * FROM tbl";
  23:  
  24:     var reader = command.ExecuteReader();
  25:     reader.Read();
  26:  
  27:     col1 = (int)reader["col1"];            // 1
  28:     col2 = (string)reader["col2"];      // eastgroup.pl
  29: }
  30:  
  31: // Zamykamy połączenie
  32: conn.Close();
  33:  
  34: Console.WriteLine("{0} to nr {1}!", col2, col1);
  35: Console.ReadKey();

Nie jest to jedyna metoda dostępu. Kolejne przykłady będą wymagały jednak bazy northwindEF.db, która znajduje się w plikach źródłowych naszego providera. Aby ją zdobyć należy przejść na stronę System.Data.SQLite na sourceforge i pobrać plik SQLite-*-source.zip (np. SQLite-1.0.65.0-source.zip). Baza znajduje się w katalogu testlinq. Warto otworzyć plik solucji i przejrzeć jej projekty – znajduje się tu sporo ciekawego kodu.

W pliku SQLite_Eastgroup.pl.zip (126,45 kb) zamieściłem dwa przykłady – jeden pokazuje jak korzystać z LINQ, drugi wyświetla dane jednej z tabel za pomocą kontrolki DataGridView. Oba projekty szukają pliku bazy danych w “D:\northwindEF.db”. Jeżeli chcemy to zmienić musimy wyedytować plik App.Config.

image

Podsumowanie

SQLite jest wspaniałym narzędziem. System.Data.SQLite ułatwia wykorzystanie bazy danych z wykorzystaniem .NET Framework. Oto kilka sytuacji, kiedy SQLite sprawdza się najlepiej:

  • Gotowy standard zapisu, format plików dla aplikacji,
  • Urządzenia i aplikacje wbudowane,
  • Strony internetowe (do ok. 100K odwiedzin dziennie),
  • Wewnętrzne lub tymczasowe bazy,
  • Analiza z wiersza poleceń,
  • Dema i testowanie,
  • Edukacja,
  • Nauka pisania rozszerzeń.

A jakie są Wasze doświadczenia z SQLite?

Tagi: ,

Wstęp do asp.net

Dzięki za przybycie na moja prezentację o asp.net Zdaje sobie sprawę, że nie jestem profesjonalistą w prowadzeniu prezentacji ale mam nadzieje, że wynieśliście coś z niej:) W każdym bądź razie uwierzcie mi, że nie łatwo stać po tej drugiej stronie. Poniżej macie króciutką prezentację a pod spodem cały projekt który robiłem na prezentacji.

Materiały:

Test.rar (60,81 kb)

Tagi: ,

Eastgroup.pl na facebooku