środa, 24 sierpnia 2011

C# i Splash Screen w aplikacji podczas ładowania Form

Taka szybka notka na temat wstawiania do aplikacji opartej na WindowsForms splash screena.
W mojej aplikacji potrzebny Splash Screen jest by pokazać użytkownikowi, że aplikacja się uruchamia, podczas gdy wczytywane są dane z bazy danych. Wiadomo - użytkownik, jeśli nie zobaczy błyskawicznej reakcji na działanie "dwukliku" na ikonkę, znów na nią kliknie, i znów i znów. Po co frustrować użytkowników? Lepiej zamontować w aplikacji splash screen.

Może to być jakaś miła dla oka grafika, czy cokolwiek innego.
Po 1. należy przygotować formatkę Splash - warto wyłączyć ikonę na pasku dla formy, obramowanie, ikony zamykania itd. - wszystkie properties, które mogą nas interesować zmieniamy jak dla każdej innej formatki.
Po 2. dla formatki Splash ustawiamy jakiś Background Image - to co będzie się pojawiało gdy będzie nam się aplikacja ładować. Warto przy tym dobrać tak rozmiar formatki, by cała grafika mieściła się w jej wnętrzu.
Po 3. W konstruktorze głównej formy aplikacji wpisujemy standardową konstrukcję tworzącą nasz splash screen, czyli
Splash splash = new Splash();
splash.Show();
splash.Update();
ostatnia linijka wymusza rysowanie okna zanim nastąpi zakończenie metody. Dzięki Show() komunikaty nadal są w ruchu (tj. aplikacja się ładuje), a Refresh() sprawia, że okienko się pojawi. Ta ostatnia linijka jest bardzo ważna dla osiągnięcia tego efektu. Sprawdźcie, jak się splash zachowa bez niej :)
Oczywiście, następne linijki w konstruktorze głównej formy to standardowo:
InitializeComponent();
// cała reszta stuffu inicjującego

Żeby splashScreen zniknął po załadowaniu się głównej formy wystarczy do kodu wywoływanego podczas zdarzenia Form.Load dla głównej formy wrzucić:
splash.Close(); // ewentualnie splash.Hide();

To tyle - ot, taki szybki sposób na ułatwienie życia użytkowników.

wtorek, 19 kwietnia 2011

Ukrywanie głównego okna programu w Visual Studio 2010

Ostatnio troszkę się męczyłem z uzyskaniem efektu aplikacji działającej w tle. Pisałem program, który miał działać w tle, a jedyną informacją o jego działaniu miała być ikonka w zasobniku systemowym (of kors z podpiętym menu).
Zamierzony efekt udało się osiągnąć dopiero po zabawie z przezroczystością.
W związku z tym, że było to główne okno, Hide() w ogóle nie dawał się uruchomić w konstruktorze czy po załadowaniu (event Load). W sieci znalazłem próbę rozwiązania (po wypowiedziach sądzę, że działającą), która jednak w przypadku mojego projektu nie działa.
Po przeprowadzeniu wielu prób, doszedłem do tego, że ustawienie właściwości Opacity dla formy na 0% (lub 0.0d) powoduję, że jest ona ukryta przed użytkownikiem. Ukryta, tzn. znika całkowicie (łącznie z utratą focusu) z przestrzeni roboczej. Oczywiście nadal w tle jest aktywna.

czwartek, 24 marca 2011

Pobieranie adresu IP i nazwy hosta w sieci

Taki krótki szybki wpis po kilku minutach nudy na zajęciach, czyli rzecz o zamianie IP -> nazwa hosta -> IP

string text = "212.77.100.101"; //jeśli chcemy uzyskać nazwę hosta
//string text = "www.wp.pl"; //jeśli chcemy pobrać IP
IPAddress tmp = null;
if (IPAddress.TryParse(text, out tmp))
{
       Console.WriteLine(Dns.GetHostEntry(tmp).HostName.ToString()); //pobierz nazwę hosta
}
else
{
       Console.WriteLine(Dns.GetHostEntry(text).AddressList[0].ToString()); //pobierz pierwszy adres nazwy hosta
}

sobota, 19 marca 2011

Zmiana zawartości rekordu podczas UPDATEa w Transact-SQL

Nie tak dawno miałem pewne problemy, jak zmienić zawartość pola rekordu w tabeli, podczas jego aktualizacji. Pola, które nie jest aktualizowane.
Chodziło o to, aby w czasie zmiany pola BITowego z wartości 0 na 1, pole typu DateTime, zmieniało swoją zawartość, na datę wykonania tej zmiany.
Pomoc otrzymałem na stackoverflow.com - swoją drogą dziwne, że nie wpadłem na tak oczywiste rozwiązanie:
create trigger tr_U_YourTable
on YourTable
for Update
as
begin
    if update(true_false)
        update yt
            set date = getdate()
            from Inserted i
                inner join Deleted d
                    on i.ID = d.ID
                inner join YourTable yt
                    on i.ID = yt.ID
            where coalesce(i.true_false,0) <> coalesce(d.true_false,0)
end

Autorem rozwiązania jest Joe Stefanelli.
Rozwiązanie wykorzystuje tabele Inserted i Deleted występujące w T-Sql.

piątek, 18 marca 2011

Zmiana UUID dysku VirtualBox

Dzisiaj, w celu przygotowania się do zajęć, musiałem postawić 6 razy maszynę wirtualną. Pierwszą próbą była zmiana już wcześniej posiadanego dysku vboxa na współdzielony (shared):
//najpierw przerobienie obrazu na "stały" rozmiar
VBoxManage clonehd in.vdi out.vdi --variant Fixed
//potem ustawienie out.vdi w tryb shareable
VBoxManage modifyhd out.vdi --type shareable

Niestety, podpięcie później tego dysku do 6 maszyn, i uruchomienie go, poskutkowało zburzeniem konsystencji danych na nim (co za tym idzie, linux wywalał się na starcie).
Potrzebna była więc bardziej toporna metoda - skopiowanie dysku. Aby zaoszczędzić miejsce, użyłem obrazu in.vdi, który miał dynamicznie ustawiany rozmiar pliku-obrazu.
Skopiowałem go 6 razy dla każdej maszyny...
VBoxManage clonehd in.vdi outn.vdi
po czym próbując podpiąć kolejną (pierwszą) kopię, zostałem poinformowany, że dysk o takim UUID już jest podpięty do innej maszyny i nie można go dodać.
Aby ta dość długa, bo około półgodzinna praca procesora i dysku nie poszła na marne, wykorzystałem więc wbudowaną komendę do nadawania obrazom dysków nowych numerów UUID:
VBoxManage internalcommands sethduuid outn.vdi

Oczywiście podziałało ;)

sobota, 5 marca 2011

Zmiana kodowania znaków w C#

Ostatnio pracując nad zleconym projektem musiałem zmieniać kodowanie string'a, i otrzymywać zapis bajtowy string'a, który następnie przekazywałem jako parametr metody.
Do zmiany kodowania użyć można Encoder'a któregoś kodowania z kolekcji System.Text. Przykład takiego użycia:
System.Text.ASCIIEncoding encoding = new ASCIIEncoding();
Kodowanie takie można następnie wykorzystać do otrzymania tablicy bajtowej, będącej reprezentacją zapisu string'a w danym kodowaniu. Dla przykładu powyżej:
byte[] napis_w_ascii = encoding.GetBytes("napiś");

Polecam zapoznać się z kolekcją klas System.Text.Encoding i metodami dostępnymi dla różnych kodowań

środa, 23 lutego 2011

Własna dystrybucja Linuxa

Może ten wpis nie wniesie zbyt wiele na tego bloga, jednak chętnie podzielę się z wami tą informacją.

Dla osób chcących stworzyć własną, spersonalizowaną dystrybucję linuxa, Novell udostępnił narzędzie Suse Studio. Za pomocą tego serwisu można bardzo łatwo wykreować własne distro oparte na jednej z lepszych (sam z niej korzystam) dystrybucji openSuse.
Wystarczy po zalogowaniu skorzystać z "kreatora", który bardzo ładnie prowadzi przez poszczególne kroki, pozostawiając jednak użytkownikowi swobodę w modyfikacji składu dystrybucji.
Jak na początek wystarczy ;)

czwartek, 27 stycznia 2011

Sprawdzanie roli użytkownika w SQL Server + C#

W tworzonym przeze mnie projekcie bazodanowym, z wykorzystaniem MS SQL Server 2005 i C#, potrzebowałem sprawdzania, do jakiej grupy użytkowników należy logujący się do bazy danych użytkownik.
Wykorzystując procedurę (serwerową) SQL Servera sp_helpuser z parametrem (nazwą użytkownika) otrzymałem kilka informacji, w tym tą, która mnie interesuje - grupa do której należy użytkownik.
Nazwa grupy do której należy użytkownik zawiera się w polu [GroupName].

Cała metoda, zapisana w C# wygląda tak:
private void sprawdz_role()
{
        SqlDataReader rdr = null;
        SqlParameter username = new SqlParameter("@name_in_db", this.user);
        SqlCommand cmd = new SqlCommand("sp_helpuser", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(username);
        rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
                this.rola = rdr["GroupName"].ToString();
        }
        MessageBox.Show("Polaczono jako " + rola);
}

czwartek, 13 stycznia 2011

Zmiana domyślnej przeglądarki w Visual Studio 2010

Niedawno przeszedłem na nową wersję środowiska VS, z 2k8 na 2010.
Programując aplikacje SilverLighta, spotkałem się ze sporym utrudnieniem, ponieważ wcale nie tak łatwo w VS 2010 ustawić domyślną przeglądarkę w jakiej będziemy debugować.
Z pomocą przychodzi społeczność użytkowników, publikując dodatek do VS, "World of VS Default Browser Switcher", dostępny za darmo do pobrania z oficjalnej strony:
http://visualstudiogallery.msdn.microsoft.com/en-us/bb424812-f742-41ef-974a-cdac607df921
Po instalacji, wystarczy tylko z menu View, włączyć Toolbar "Default Browser Switcher".

That's all, folks...