• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    NECROMAN
    NECROMAN --- ---
    TENCOKACISTROMY: tady jde spise o dvojite kliknuti omylem. Pokud vim, tak treba Win aplikace umi rozlisit click a doubleclick a nepusti tam zkratka dvakrat kliknuti, ale u Windows Phone kdyz se dvakrat dotknu buttonu, tak to pusti oba clicky.
    Dost aplikaci na tom treba vylitava, pokud nejaky button presmerovava na webovou stranku, tak pokud se klikne dvakrat za sebou, tak to druhe volani schodi aplikaci, protoze Show Web task haze vyjimku, pokud aplikace neni v popredi.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    NECROMAN: V tom pripade ti ale zasednuti tlacitka nepomuze. Postupnost akci totiz bude:
    - click na tlacitko
    -- zasednuti tlacitka
    -- pridani itemu
    -- odsednuti tlacitka
    - click na tlacitko (podruhe)

    Jediny jednoduchy reseni co me napada (ale asi nebude spravne), ze by to tolacitko bylo sedivy po nejaky cas. Ale UX tim podle me docela dostane ranu. Pokud ale tvi uzivatele nejsou schopny rozlisovat click/doubleclick, tak to mozna bude ve vysledku lepsi.
    NECROMAN
    NECROMAN --- ---
    TENCOKACISTROMY: bezi synchronne, ale kdyz omylem uzivatel klikne na button, tak se to zkratka zavola dvakrat se stejnym parametrem, coz muze treba zpusobit i dvojite pridani noveho itemu.
    Vim ze to mam nekde blbe, ale jen resim, jak to opravit co nejelegagneji. Konkretne jedna se o AppBar buttony ve WP7.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    NECROMAN: A to ta tvoje operace bezi asynchronne? Protoze jestli bezi v UI, tak ti zadny nastavovani lze/nelze spustit nepomuze. Proste se ti to opravdu pusti dvakrat.
    ESY
    ESY --- ---
    MICA: on click vubec neresis. Resi se defaultne jen command. kterej si tam obhospodaruje canexecute. Pokud se teda bavime o mvvm
    MICA
    MICA --- ---
    NECROMAN: Nebylo by lepší nějak ošetřit "remove item" operaci? ;) Já osobně bych místo xyzButton.Enabled používal nějakou nějakou stavovou proměnnou (buď jednoduše bool nebo si vytvořit nějaký Enum s možnými stavy).

    ESY: Když zvrhle rovnou v obsluze OnClick eventu řešíš něco co může trvat déle než dvojklik? :)))
    ESY
    ESY --- ---
    NECROMAN: tak u buttonu mas snad can execute ne ? nenapadame ted moc kdy to co pises muze nzastat. :]
    NECROMAN
    NECROMAN --- ---
    Dotaz, jaky je tak best practice v GUI aplikacich, jak predchazet situacim, kdy uzivatel omylem dvojklikne na nejaky button nebo odkaz,aby se operace neprovedla dvakrat? Dneska jsem zjistil, ze mi pada app treba na "remove item" operaci, protoze druhe spusteni uz nenajde ten originalni objekt v kolekci.

    Napada jako nejlepsi uzamknout IsEnabled u buttonu, kdyz se vykonava operace, nebo vite i o chytrejsim reseni?
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    H_U_N_T_E_R: Jen tak strilim od boku, ale pro kazdyho uzivatele/kontajner-opraveni by jsi mohl mit samostatnou aplikacni domenu. Pri prijmu requestu by jsi zjistil zda ji uz mas nebo vytvoril novou.
    H_U_N_T_E_R
    H_U_N_T_E_R --- ---
    Umíte někdo s WCF Data Services? Mám multitenant aplikaci, kde práva pro přístup k jednotlivým resources se nastavují dynamicky. Problém je, že z nějakého důvodu (pseudo-obhájení: http://blogs.msdn.com/b/marcelolr/archive/2008/06/16/so-special-initializeservice-in-ado-net-data-services.aspx ) nemám možnost vynutit si rekonfiguraci / nastavit práva dle lognutého uživatele (funkce na to se volá jednou za život appDomain). Navíc podle reflektoru tu settings cachují na základě GetType a ne na základě URL.
    Napadá někoho prosím nějaká obezlička?
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    class PolozeniKamenu - to fakt neni dobry kandidat na class :)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    Nojo, zase skola a odevzdavani prvnich praci na posledni chvili.
    ESY
    ESY --- ---
    CERMINEK:
    jo tak udelej si neakej objekt



    Treba CStone
    {
    public EColor Color {get;set;}
    public EStoneType StoneType {get;set;}
    }

    enum EColor { Black, White }
    enum EStoneType { Normal,Dame}

    pokud chces mit teda pole tak ho nedelej stringu ale tech CStone[,]

    nekde si udelej tu inicializacni tridu. Co to pole naplni.

    A pak dal ty metody

    uz budes jen itinerovat ostatni sutry s neakejma podminkama.

    Kouk jsem an to jen rychle
    CERMINEK
    CERMINEK --- ---
    ESY: To bych rád věděl i já :) mám zadání úkolu a nulovou znalost OOP :/

    Ten paskvil co mám je tady http://pastebin.com/VJpKgRxA a zadání je v prvním komentu... Tak nějak jsem načal strukturu tříd, ale tím jsem asi skončil...
    ESY
    ESY --- ---
    CERMINEK: popravde ted nevim co presne myslis a ani co chces :]
    CERMINEK
    CERMINEK --- ---
    [C#] using System; using System.Collections.Generic; using System.Linq; using Syst - Pastebin.com
    http://pastebin.com/VJpKgRxA
    Za jakoukoliv radu, jak to rozchodit budu vděčný... odevzdávám dneska v noci... ach ta proktrastinace :(
    CERMINEK
    CERMINEK --- ---
    Tak jsem to nakonec vyřešil, že to naplním natvrdo... To pole se takhle vytvoří jen na začátku... teď pro změnu řeším jak to rozepsat do objektů a tady jsem v koncích i s nápovědou...
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    MORMEGIL: retezec jsem vybral v duchu pseudokodu, pac jsem netusil jak to definuje :) nicmene s rozlozenim sutru mas recht, je videt ze uz jsem nad ranem moc pozor nedaval.

    MORMEGIL
    MORMEGIL --- ---
    SHIGORBIRDMAN: Tak puristi by hlavně takovýhle věci nereprezentovali řetězcem, žeáno. Navíc on očividně nechce střídání barev na pozadí (ty se ostatně dají zjistit přes (x+y)%2), ale počáteční pozice kamenů. ;-)

    Nějakým cyklem se to dá zařídit třeba zcela obecně takto:
    const int INITIAL_PIECE_ROWS = 3;
    const int ROWS = 8;
    const int COLUMNS = 8;
    for (int player = 0; player < 2; ++player)
    {
    	for (int row = 0; row < INITIAL_PIECE_ROWS; ++row)
    	{
    		int realRow = player == 0 ? row : ROWS - row - 1;
    		for (int col = realRow % 2; col < COLUMNS; col += 2)
    		{
    			Console.WriteLine("Kámen hráče {0} na {1};{2}", player + 1, col, realRow);
    		}
    	}
    }
    


    Anebo by to mohlo fungovat i nějak takhle ;-)
    var pieces = Enumerable.Range(0, ROWS)
    	.Where(row => row < INITIAL_PIECE_ROWS || row >= ROWS - INITIAL_PIECE_ROWS)
    	.Join(Enumerable.Range(0, COLS), _ => 0, _ => 0, (row, col) => new { Row = row, Col = col, Player = row >= INITIAL_PIECE_ROWS ? 2 : 1 } )
    	.Where(x => (x.Row + x.Col) % 2 == 0);
    
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    (puristi a optimalizatori by pochopitelne dali misto x a y < 8 porovnavani s length, aby mel compiler radost a mohl vypnout boundary check :))
    Kliknutím sem můžete změnit nastavení reklam