\

Školení Návrhové vzory, OOP a UML


 Thursday, 24 April 2008
Vlastní reakce na podrženi stylu uživatelem (zobrazení kontextového menu)

Další z triků pro Compact .Net Framework, na který se lidé často ptají. Chcete sami zareagovat na podržení stylu místo výchozího zobrazení kontextového menu, což zajišťuje výchozí obsluha události přímo v CNF? Přes P/Invoke je to možné.

private const uint GN_CONTEXTMENU = 1000; 
private const uint SHRG_RETURNCMD = 0x00000001; 


[StructLayout(LayoutKind.Sequential)] 
public class SHINFO 
{ 
       public uint cbSize = 0; 
       public IntPtr hwndClient = IntPtr.Zero; 
       public int x = 0; 
       public int y = 0; 
       public uint dwFlags = 0; 
} 
[DllImport("aygshell", SetLastError = true)] 
private static extern uint SHRecognizeGesture(SHINFO shrg); 


//Obsluha udalosti MouseDown formulare/ovladaciho prvku
private void mouseDown(object sender, MouseEventArgs e) 
{ 

   SHINFO shinfo = new SHINFO(); 
   shinfo.cbSize = (uint)(Marshal.SizeOf(shinfo)); 
   shinfo.hwndClient = this.Handle; //handle formulare/ovladaciho prvku
   shinfo.x = e.X; 
   shinfo.y = e.Y; 
   shinfo.dwFlags = SHRG_RETURNCMD; 
   if (SHRecognizeGesture(shinfo) == GN_CONTEXTMENU) 
   {
     //nase reakce 
  } 
}

V nativním kódu můžeme vlastním zpracováním gesta GN_CONTEXTMENU odstranit nepříjemnou a snad od počátku přítomnou chybu v MFC, která způsobí, že se animace ("tečky opisující kruh") zobrazí 2x. Ukázka z Today pluginu (čisté API, ne MFC).

 

 

SHRGINFO shrg;
HMENU hMenu;

shrg.cbSize = sizeof(shrg);
shrg.hwndClient = m_hWnd;
shrg.ptDown.x = point.x;
shrg.ptDown.y = point.y;
shrg.dwFlags = SHRG_RETURNCMD ;

POINT screenPoint = point;
ClientToScreen(m_hWnd, &screenPoint);


if (!tabControl.HasFocus())
{
:PostMessage(GetParent(), TODAYM_TOOKSELECTION, (WPARAM)m_hWnd, 0);

}

if (SHRecognizeGesture(&shrg) == GN_CONTEXTMENU) 
{
//Nas kod
}


Thursday, 24 April 2008 12:11:30 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  Compact .Net Framework | Mobilitky


 Friday, 18 April 2008
Existuje konverze na typ int? A jsme schopni detekovat existenci konverze za běhu aplikace?

Na builderu padl dotaz, jak za běhu aplikace zjistit, zda lze nějaký typ konvertovat na int a přitom zohlednit i uživatelské konverze. Sice nevím, k čemu by se dala informace využít:), když už si  kompilátor "jen to své" u konverzí řekl - užitečnost informace je srovnatelná s užitečnosti permanentky do harému obdržené post mortem. (Kvazi)problém se dá částečně vyřešit s využitím podivných hacků. Přesto dávám kód sem s vírou, že někdo vymyslí něco lepšího, nebo mi alespoň sdělí, k čemu by se taková informace dala využít. A per analogiam se tak vyřeší i trýznivá aporie (ne)obdržené permanentky. :)

static class TypeExtensions
    {
         public static bool HasToIntConversion(Type type)
         {
        
                 Type intType = typeof(int);
                 Type currentType = type;
                    
                 Type[] floatTypes = {typeof(float), typeof(double), typeof(decimal)};
                 if (currentType.IsPrimitive||
                     currentType.IsEnum ||
                     Array.IndexOf(floatTypes, currentType) >= 0)
                   
                {
                    return true;
                }

                
                else
                {

                    foreach (MethodInfo info in currentType.GetMethods())
                    {
                        Console.WriteLine(info.Name);
                        if (info.Name.Contains("op_Implicit") || info.Name.Contains("op_Explicit"))
                        {
                            if (info.ReturnType.Equals(intType))
                            {
                                return true;
                            }
                        }
                        
                    }

                }

                return false;
            }
        
             
        public static bool HasToIntConversion(this object obj)
        {
            return HasToIntConversion(obj.GetType());           

        }
    
        public static bool HasToIntConversion<T>()
        {
            return HasToIntConversion(typeof(T));
        }
            
    }

Použití je jednoduché:

 

class ConvertibleToInt
    {
        private int x=5;
        
        
        public ConvertibleToInt()
        {

        }
    
        public static implicit operator int(ConvertibleToInt instance)
        {
            if (instance == null)
            {
                throw new InvalidCastException();
            }
            
            return instance.x;
        }

    }


    class ExplicitConvertibleToInt
    {
        private int x = 5;


        public ExplicitConvertibleToInt()
        {

        }

        public static explicit operator int(ExplicitConvertibleToInt instance)
        {
            if (instance == null)
            {
                throw new InvalidCastException();
            }

            return instance.x;
        }

    }

class Program
    {
        static void Main(string[] args)
        {

            ConvertibleToInt conv = new ConvertibleToInt();
            Console.WriteLine(conv.HasToIntConversion());
            
            
            Console.WriteLine(TypeExtensions.HasToIntConversion<short>());
            Console.WriteLine(TypeExtensions.HasToIntConversion<decimal>());
            Console.WriteLine(TypeExtensions.HasToIntConversion(5));


            Console.WriteLine(TypeExtensions.HasToIntConversion<ConvertibleToInt>());
            Console.WriteLine(TypeExtensions.HasToIntConversion<ExplicitConvertibleToInt>());
            
            Console.ReadLine();
            
        }
}


Friday, 18 April 2008 16:56:38 (Central Europe Standard Time, UTC+01:00)       
Comments [5]  


 Tuesday, 01 April 2008
Google Android a proč se na Androidu podílí i tak soudná firma, jakou je společnost HTC?

Protože se mě v posledních dvou měsících pár lidí na diskuzních fórech ptalo na to, co říkám platformě Android od Googlu a posléze na to, proč si myslím, že Androida podporuje HTC, dávám své poznámky sem, abych je nemusel posílat každému zvlášť. Uznávám, že první část byla by se dala shrnout  jednou holou větou: "Nemám rád Google". :) Aby ale spot nepůsobil tak jednostranně - pořád bych raději Androida než tu tretku od Applu zvanou iPhone, která se mi nejprve líbila, ale poté, co jsem ji měl jeden den na hraní  a prošel jsem všechny zdůrazňované přednosti iPhonu (hele, jak mi rotuje displej a jak mohu zvětšit část stránky v prohlížeči atd.),  a znovu jsem se podíval na cenovku, jen jsem se dlouho smál. Ověřil jsem si, že stále žiju v báječném světě, kde vás samotná rozjuchaná reklama vyzve, abyste kašlali na image, což Apple fanoušci zvládají dokonale a iPhone samozřejmě kupují většinou jen proto, že se jim samotným líbí a ne že by si chtěli honit triko před podobně nezávislými kámoši. A mimochodem  - Apple dle posledních "analýz" prý nemá skoro žádné náklady na marketing - v postorwellovském světě slovo nic znamená (ale fakt jen přibližně :) ) 1/3 zisku za rok 2006.


" Domníváte se, že se prosadí mobilní linuxová platforma Google Android, která je open source => méně závislá na oficiální implementaci výrobce?"

Ne, podle mě se neprosadí a bude to pořádný průšvih - ale takový experiment si Google dovolit může a neúspěch (prozatím) nijak neohrozí jeho hlavní "business".  Kdyby za Androidem nestál Google, (skoro) nikdo se o tuto platformu nebude zajímat - jenže dnes vše, co dělá Google, má ihned kolem sebe mediální aureolu něčeho úžasného a důležitého. Google je obr na hliněných nohou - Google se sice rozkročil do mnoha oblastí, ale kromě vyhledávání mu z žádné oblasti, o kterou se zajímá, netečou žádné zajímavé peníze - a já osobně žadný další vydatný zdroj peněz ani v budoucnu nevidím. A do těch hliněných nohou ho na každém nepřátelském území, které se snaží svým "přátelským" přístupem anektovat, s gustem a požitkářskou vervou nakopne jakákoli firma, která nechce přijít o svůj současný tržní podíl. A že by Google sesadil z trůnu Nokii nebo Microsoft? Dobrý vtip... Vždyť jeho "peněženka" nedokáže ani pořádně konkurovat PayPalu.

Heslo "don´t be evil" je nádherně líbivé, na věčně naivní dušičky stále ještě svojí setrvačností působí a každá firma je stejně jako politická strana vděčná za zapálené "užitečné idioty". A Google se zatím jako každá normální firma snaží už jen maximalizovat zisk pro své akcionáře. 
Lehké koketování Google s Open Source je různými obskurními blogy a webziny odměňováno vtíravou, neplacenou a skoro bez výhrad kladnou reklamou po celém internetu.  Komunitní tamtamy stále duní, aktivity Googlu propagují zdarma nadšení jedinci v různých diskuzních fórech a pro Google zapálené blogy, jež šíří jakoukoli novou zprávu či jen fámu z Googlu jako největší událost od zvěstování evangelia. Nezáleží na tom, jestli Google mluví o Androidu, aktualizuje Page Rank, kupuje vývojářům nové hračky nebo se Larry či Sergej na dnešek špatně vyspali, protože si zapomněli rozsvítit svoji novou lávovou lampičku, ale vše, co dělá Google, je přece důležité, skvělé a současné firmy jako Nokia a Microsoft patří na zaneřáděné smetiště dějin, protože nechápou, jak nový svět vnímá moderní a vždy in komunitní a pro věci zdarma zapálená dušička, která v Googlu našla znovu ten věčně hledaný ideál kapitalisty s duší altruisty a líbivostí milostných charitek Aglai, Eufrosyne a Thalei.  A to nemluvím o tom, že Google milují a jsou mu zcela oddáni  - a to nejen proto, že je živí -  noví a pelem moderní techniky ovátí mágové, čarodějové, zaklínači a alchymisté, ti rozkošní a právoplatní dědici magistra Kellyho, jimiž jsou různí SEO a SEM specialisti, kteří z křišťálové koule věští, co ten jejich miláček Google asi pozměnil ve svých hodnotících algoritmech a jak z klientů vydyndají další peníze na posun ze stého místa ve vyhledávání na úžasné padesáté deváté. 

Google Android bude mít těžký život - jsem zvědavý, zda se vůbec podaří donosit Andoida až k úspěšnému porodu, zda mu nepřátelské sudičky(= jiné firmy) hned v kolébce místo věštby raději rovnou pro jistotu nezakroutí krkem, nebo zda neskončí po čase v izolaci, kam slušní výrobci ani dodavatelé aplikací nechodí a bude rád, když po několikaletém marném úsilí získat významný podíl na trhu a vytvořit kolem sebe stabilní vývojářskou komunitu, bude alespoň paběrkovat a jako žebrák sbírat drobty ze stolu, na kterém už dnes holdují obžerství jiní - a právem, protože jsou mnohem schopnější než anemický a do všech stran rozkročený Google.

Některé zajímavé příspěvky k Androidu:
http://unqualified-reservations.blogspot.com/2007/11/five-problems-with-google-android.html
http://arstechnica.com/news.ars/post/20071219-google-android-plagued-by-dysfunctional-development-process.html

Kdybych rozhodoval o strategii HTC, byl bych pro uvedení Gogle Androidu také.  Proč?

1) HTC se snaží poslední rok etablovat jako samostatná značka srovnatelná s Nokií či SE a nevnímaná jen jako mlčenlivý výrobce zajímavých přístrojů prodávaných pod značkou mobilních operátorů.  Když se v tiskové zprávě Htc zmiňuje v jedné řadě s Nokií a dalšími, je to samozřejmě pěkný a hlasitý signál veřejnosti, jak má společnost HTC nyní vnímat.

2) Jak jsem psal výše, všechny zprávy, co se i jen letmo týkají Googlu, mají dnes zajištěnu úžasnou publicitu ve spřízněných médiích a po letech spekulací na téma "Google a mobilní telefon" je oznámení vlastní ambiciózní mobilní platformy tučné sousto pro média, po kterém lačně chňapnou a v mnoha variantách předkousané a většinou nadšené přijaté předhodí i svým čtenářům. Důležité iformace o HTC se s minimálními náklady objeví v klíčových médiích.

3) V HTC dokonale využili příležitosti a hrozbu exkluzivní spolupráce s Googlem, kterého dnes Microsoft určitě vnímá jako největšího konkurenta, mohou pasovat do role beranidla, aby si u Microsoftu vymohli lepší podmínky spolupráce.

4) Od počátku mají v HTC přístup k interním údajům o Androidu, o jeho (ne) úspěšnosti, a podle toho mohou snadno měnit svoji strategii na trhu s přístroji Windows Mobile. A jsem zvědav, zda pro oba světy bude HTC dodávat HW shodné přístroje, anebo neodolá pokušení (tajné a lukrativní dohodě? :-) a pro Android dodá zařízení hardwarově horší a méně zajímavá než pro Windows Mobile.

5) Kdyby měl náhodou Android úspěch, HTC je od počátku tím, kdo se podílí na slávě a úspěchu Androidu a hlavně má další příjmy pro své akcionáře. Když Android neuspěje, HTC to nijak nehrozí  - jejich klíčový business je ve zcela jiné oblasti.

6) Spekulace - dovedu si představit, že dle interních analýz HTC je navzdory současnému úspěchu nejméně perspektivním OS Symbian. Kdyby válka na trhu mobilních operačních systemů donutila Nokii přejít na Windows Mobile (viz současné spekulace), nebo migrovat k Androidu, mohlo by HTC z tápání Nokie při přechodu na novou platformu vytřískat větší podíl na trhu mobilních zařízení, protože s oběma OS by měli v HTC více zkušeností.



Tuesday, 01 April 2008 11:33:07 (Central Europe Standard Time, UTC+01:00)       
Comments [5]  Mobilitky