poniedziałek, 27 maja 2013

does not contain a definition for 'InitializeComponent'


Ostatnim razem przenosiłem widoki WPF-owe z jednego projektu do drugiego, aby uporządkować je w inny niż dotychczas sposób. Problem jaki pojawił mi się przy przenoszeniu plików xaml - [className] does not contain a definition for 'InitializeComponent' ... - trochę mnie zaskoczył. Na początku myślałem, że coś zepsułem przy referencjach itd. Rozwiązanie problemu okazało się jednak bardzo proste. Pliki xaml podczas przenoszenia utraciły swoją pierwotną właściwość Build Action - VS ustawił ją na CodeAnalysisDictionary. Wystarczyło zmienić ją na Page - i wszystko wróciło do oczekiwanego porządku.

niedziela, 26 lutego 2012

Podłączanie konta Box.com do Windows / PC, czyli 50GB dla użytkownika

Od niedawna głośno jest w Internecie o darmowej ofercie Box.com. Serwis ten oferuje dla nowych użytkowników, za darmo, 50 GB na przechowywanie plików i to zupełnie za FREE (tzn. darmo). W końcu przechowywanie plików w chmurze jest nie tylko wygodne, ale i trendy w ostatnim czasie.

Nie będę się tu jednak rozpisywał o tym, jaka to atrakcyjna oferta i w ogóle - kto chce ten skorzysta. Napiszę jednak o czymś innym - o tym, jak z tych 50 GB skorzystać na komputerze. Dlaczego o tym napiszę? Z prostego powodu - aplikację do synchronizacji plików z komputerem mogą nabyć jedynie osoby korzystające z płatnych planów rozliczeniowych. Natomiast 50 GB dostają użytkownicy "darmowi". Więc napiszę, jak będąc darmowym użytkownikiem, za darmo połączyć się z komputera do konta na Box.net.

Sposób niżej przedstawiony jest zaprezentowany na przykładzie Windows, ale zadziała tak samo w Linuxie.

A więc zaczynajmy.

Po pierwsze uruchamiamy "Mój komputer". I wyświetlamy menu kontekstowe dla kategorii Komputer (standardowo klikamy prawym przyciskiem myszy). Z menu kontekstowego wybieramy "Mapuj dysk sieciowy".

Następnie ukaże nam się okno w którym ZAZNACZAMY "Połącz z użyciem innych poświadczeń" (czy jakoś tak) i klikamy "Połącz ze stroną Web ...".

W tym momencie pojawi nam się kolejny kreator. W pierwszym kroku kreatora klikamy po prostu "Dalej"

W drugim kroku nie mamy zbyt dużego wyboru. Zaznaczamy "Wybierz dowolną lokalizację sieciową" i klikamy "Dalej"

W trzecim kroku podajemy adres, pod którym uzyskamy dostęp do naszych plików. Adres, który należy wprowadzić, to:
https://www.box.net/dav .
I klikamy "Dalej".

W czwartym kroku wprowadzamy nazwę dla zasobu (czyli jak chcemy opisać nasz folder w Moim Komputerze) i klikamy "Dalej".

Po podaniu nazwy pojawi się okienko z prośbą o podanie poświadczeń (nazwy użytkownika i hasła). Wpisujemy nazwę użytkownika w usłudze Box (najczęściej adres e-mail, pod którym rejestrowaliśmy konto), i hasło dostępu.

Po poprawnym zalogowaniu do katalogu na serwerze pojawi się nam potwierdzenie z gratulacjami:

W tym momencie klikamy na "Koniec" i naszym oczom ukazuje się zawartość naszego katalogu w usłudze Box.
Gratuluję.

To wszystko na ten temat. Od teraz możecie swobodnie przenosić pliki, także z wykorzystaniem komputera.

UWAGA na koniec:
Właśnie przetestowałem na stacjonarnym (jedyny komp, na którym jest jeszcze XP) i okazuje się, że XPek ma problemy z dostępem do DAV po SSL. Jeśli priorytetem nie jest szyfrowanie transmisji zamiast https://www.box.net/dav wpisz http://www.box.net/dav .
Natomiast da się zauważyć destabilizację systemu XP po podłączeniu do DAV. Dlatego dobrym pomysłem jest użycie zewnętrznego klienta, który obsługuje WebDAV po SSL - korzystałem kiedyś z http://www.bitkinex.com/download .

ś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 ;)