poniedziałek, 11 maja 2009

Column 'x' does not allow nulls Exception

Przedstawię szybkie rozwiązanie bez wnikania w szczegóły. Błąd ten pojawia się w kodzie generowanym przez Visual Studio, więc jest mocno denerwujący.

W moim przypadku wyjątek był wywalany przez metodę EndEdit() z BindingSource. Okazało się, że nowo tworzony wiersz ma w pamięci jedną z komórek ustawioną na null, mimo że jest ona podpięta pod TextBoxa za pomocą data bindingu. Szybkim rozwiązaniem jest wyedytowanie DataSeta. W moim przypadku workersDataSet.xsd. Odpalamy plik, zaznaczamy robiącą problemy komórkę w designerze i zmieniamy na domyślną wartość, w moim przypadku: 2009-01-01 00:00:00. Teraz wszystko ładnie działa.

czwartek, 9 kwietnia 2009

HTC Touch Pro i G-Sensor w .NET CF

Jako, że mój nowy telefon chodzi na Windowsie Mobile, nie był bym sobą, gdybym nie zabrał się za programowanie pod .NET Compact Framework. HTC Touch Pro, podobnie jak iPhone, czy Samsung Omnia posiada jeden z najbardziej niepotrzebnych, komórkowych gadżetów – żyroskop. Gra w Teetera i obracanie zdjęć, to chyba niezbyt wiele, żeby dorzucać do telefonu nowe urządzenie, no ale skoro już jest, to fajnie byłoby je wykorzystać.

Jak się okazuje HTC stosuje bardzo niemiłą politykę – nie udostępnia SDK do obsługi G-Seneora. Na szczęście, biblioteka została zhackowana (reverse engineering) przez Scotta: http://scottandmichelle.net/scott/comments.html?entry=784 , dzięki czemu wystarczy skorzystać mechanizmu P/Invoke, aby wykorzystać ją w kodzie zarządzanym. Tym zajął się Koushik Dutta: http://blog.enterprisemobile.com/2008/07/using-htc-diamonds-sensor-sdk-from-managed-code/ dzięki czemu wszystko co trzeba zrobić, to dodać do projektu referencję do biblioteki GSensorSDK i już można wykorzystać żyroskop we własnym programie.

Podstawową klasą biblioteki jest klasa HTCGSensor (wszystko w przestrzeni nazw GSensorSDK), która umożliwia odczytywanie wektora wychylenia urządzenia, za pomocą metody GetGVector(). Metoda ta, zwraca strukturę GVector, z które można odczytać wartości składowe X, Y i Z. Znaczenie poszczególnych wartości jest wyjaśnione na blogu blog.enterprisemobile.com, ale najlepszą metodą załapania jest skorzystanie z prostego programu, który wyświetla wartości na ekranie i pobawienie się telefonem.

Pole w klasie okna:

        BallInContainer ballInContainer;


Kod w konstruktorze klasy okna:

            gsensor = new HTCGSensor();


Przypisanie składowych wektora do labelek, najlepiej umieścić w procedurze obsługi zdarzenia Tick, w timerze:

            GVector vector = gsensor.GetGVector();

 

            labelX.Text = vector.X.ToString("F5");

            labelY.Text = vector.Y.ToString("F5");

            labelZ.Text = vector.Z.ToString("F5");


Poza wyżej wymienionymi możliwościami, klasa HTCGSensor pozwala na wykorzystanie zdarzenia OrientationChanged, które jest odpalane, kiedy zostanie zmieniona orientacja ekranu. Na przykład użytkownik obróci telefon o 90 stopni, przechodząc z trybu portretowego do krajobrazowego.
Później można sobie napisać Teeter'owską kulkę, która obija się o ściany, co oczywiście zrobiłem, ale kodu nie wrzucam, bo jeszcze nie wiem jak się na bloggera uploaduje pliki. ;)

Miłego żonglowania telefonami!

Zaczynamy

W końcu postanowiłem założyć bloga. Nie będę jednak tutaj opisywał tutaj mojego kota ani psa, który zjadł mi rybki. Powstrzymam się też od polityki i ideologii (nawet jeśli będzie korcić). Mam zamiar trzymać się tematów poświęconych informatyce, głównie platformie .NET i pewnie też trochę grafice komputerowej. Mam nadzieję, że informacje, które będę tu umieszczał okażą się ciekawe i przydatne.

Na razie defalutowy layout, później, kiedy znajdę więcej czasu i chęci przygotuję coś swojego.