pátek 28. srpna 2015

MS Outlook Appointment (Událost)

Při ukládání Událostí v outlooku existuje malá zvláštnost u celodenních událostí.

Outlook zobrazuje v kartě jednodení celodenní událost jako od: 28.8.2015 0:00 do: 28.8.2015 0:00 ale datově si to ukládá jako od: 28.8.2015 0:00 do: 29.8.2015 0:00


var endDate = existingOutlookItem.End;
if (existingOutlookItem.AllDayEvent) 
{
   endDate = endDate.AddDays(-1);
}

Vlastnosti:

AllDayEvent
Subject
Body
Sensitivity
Location
Importance
BusyStatus
Start
End
Categories

úterý 25. srpna 2015

Návrh API a testování

Při návrhu API je potřeba stanovit kromě způsobu komunikace i časy do kterých má rozhraní reagovat. Při vývoje ji pak dobrý nápad zahrnout do testovacích scénářů i testy, které prověří rychlost API. Co je Vám platné když stihnete termín, vše v přádku nasadíte, ale první klient který použije program v praxi na svích 10.000 záznamů se výsledku dočká až druhý den?

Napište test který pomocí API založí záznam a zase ho načte. Co se stane když ho obalíte FORem a spustíte ho 10.000x ? Pomocí StopWatch si to můžete stopnout a pokud se čas přehoupne přes určitou mez tak test nechejte spadnout.

Fajným zabijákem výkonu je reflexe. Mega fajným zabijákem výkonu je reflexe v cyklu.

Určitě dobrý nápad je vyvýjet API a klientsou knihovnu v oddělených projektech od celého systému. Tím se Vám zjednoduší údržba a vývoj.
API na servrové straně a klientskou část můžete společně verzovat a společně nasazovat.
Navíc je můžete společně i testovat bez nutnosti nasazovat celý systém např UI vrstvu. Máte přece UI vrstvu zvlášť? Nebo ne?

Testování

můžete napsat test který načte z api záznam a zkontroluje jestli všechny atributy obsahují očekávané hodnoty. Co se Však ale stane pokud nasadíte novou verzi a databáze je prázdná? Test spadne.
Lepší variantou proto je vytvořit testovací netodu která založí pokaždé nový záznam a ten na serveru vyhledá a zase si ho stáhne a porovná odeslané a přijaté hodnoty mezi sebou. Otestujete jak vytvoření záznamu, tak jeho stažení a porovnáním hodnot mezi sebo zkontrolujete jestli to co odesíláte se vám vrátí.
Klasický případ je že odešlete DateTime včetně času, server ale časovou složku zahazuje a ukládá pouze datum. Nebo datum vrací v jiném formátu.

Každou entitu se kterou je možné prostřednictvím API pracovat by měli pokrýt minimálně 4 testy (CRUD). Víše zmíněný test pokrývá dvě ze čtyřech.

středa 19. srpna 2015

Active Window Title Watch

class Program
    {
        static void Main(string[] args)
        {
            while(true)
            {
                Console.WriteLine(GetActiveWindowTitle());
                Thread.Sleep(1000);
            }
        }

        [DllImport("user32.dll")]
        static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

        private static string GetActiveWindowTitle()
        {
            const int nChars = 256;
            StringBuilder Buff = new StringBuilder(nChars);
            IntPtr handle = GetForegroundWindow();

            if (GetWindowText(handle, Buff, nChars) > 0)
            {
                return Buff.ToString();
            }
            return null;
        }
    }

Zdroj:
http://stackoverflow.com/questions/115868/how-do-i-get-the-title-of-the-current-active-window-using-c
http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

čtvrtek 13. srpna 2015

WinForm Localization (Globalization)


Ve vlastnostech formuláře
ve skupině Design nastavit vlastnost Localizable na true
Přepnout vlastnost Language z default na češtinu.
Upravit text některého z prvků které chcete lokalizovat. (tím se vytvoří další Resource File *.cs-CZ.resx)




Zkopírujte z výchozího resource souboru klíče i s hodnotou a přeneste je do Google Translatoru. Nechte si je přeložit do zvoleného jazyka a zase je zkopírujte. Tentokát ale do nového resource souboru. (pokud tam něco už je tak to přepište, nebo předtím smažte) Nesprávně přeložené hodnoty opravte a soubor uložte.



Pokud potřebujete přepnout Jazyk je nutné nastavit CurrentUICulture hned před inicializací formuláře. CurrentCulture kvuli lokalizaci stringů není potřeba měnit. Má ale vliv na chování některých metod jako např. ToLongDateString()



label1.Text = DateTime.Now.ToLongDateString();

public Form1()
        {
            
            //Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("Fr");
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("Fr");
            InitializeComponent();
        }

Pokud změníte CurrentUICulture až po inicializaci formuláře musíte provést lokalizaci ručně.
        private void button1_Click(object sender, EventArgs e)
        {
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("Fr");

            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
            resources.ApplyResources(this.button1, "button1");
        }

Seznam kódů
https://msdn.microsoft.com/en-us/library/ee825488(v=cs.20).aspx

Video:
Globalization of a WinForms App in 2 minutes
https://www.youtube.com/watch?v=SNIyP1QQdVs

Články:
http://www.zive.cz/clanky/poznavame-c-a-microsoft-net---74-dil--lokalizace/sc-3-a-130695/default.aspx