• ú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
    SLUPKA
    SLUPKA --- ---
    AREX: Ani opačný problém by tomu mému neměl vadit - pondělí 8:00 vleze do prvního ifu, v něm první if nic druhý zvedne den o jedna (na další den)... A pak od toho dalšího dne nalezne první dobrý den a to je středa...
    AREX
    AREX --- ---
    SLUPKA: Jo, byl tam opacny problem. Pokud je treba Pondeli 8:00 tak by to melo skocit na Streda 7:00. Konecne to dela co chci, ale jsem dneska nejakej vygumovanej, takovy v podstate jednoduchy algoritmus a povedlo se mi to az na nejakych 10. pokus odladit :/
    public static DateTime GetNextCheckDate(DateTime date)
    {
        var result = date;
        while (true)
        {
            if (CheckDays.Any(d => d == result.DayOfWeek) && result.Hour <= CheckHour) {
                break;
            }
    
            result = result.Date.AddDays(1);
        }
    
        return result.Date.AddHours(CheckHour);
    }
    SLUPKA
    SLUPKA --- ---
    AREX: To by nemělo skočit do středy. Protože to skočí do první podmínky, ale tam už to neskočí do ničeho vevnitř. Takže po prvním ifu bude stále Pondělí 6:00... A ve while bude okamžitý break, takže to vrátí stejný datum jen s upraveným časem...
    AREX
    AREX --- ---
    SLUPKA: Jo ta smycka je presne to co sem hledal. Ja to tusil, ze vymyslim zbytecny slozitosti a pritom to jde tak jednoduse :) Akorat tam jeste musim podchytit situaci "Pondeli 6:00 - vrati Pondeli 7:00". V soucasnem stavu by to skakalo rovnou do stredy. Nicmene diky moc za nasmerovani :)
    SLUPKA
    SLUPKA --- ---
    AREX: Něco takového by nefungovalo? (SetTime neexistuje, ale není těžké to přepsat, aby to dělalo to co má :))

    var curDate = DateTime.Now;

    if(CheckDays.Contains(curDate.DayOfWeek))
    {
      if(curDate.Hour == CheckHour)
      {
        DoSomething();
      }
      if(curDate.Hour >= CheckHour)
      {
        curDate = curDate.AddDays(1);
      }
    }

    while(true)
    {
      if(CheckDays.Contains(curDate.DayOfWeek))
        break;

      curDate = curDate.AddDays(1);
    }

    return curDate.SetTime(CheckHour, 0, 0);
    AREX
    AREX --- ---
    Potreboval bych mensi vypomoc. Asi na to jdu zbytecne slozite a nejak se v tom zapomotavam a vznikaj mi hrozne slozity podminky.

    Mam tyto dva parametry.

    private const int CheckHour = 7;
    private DayOfWeek[] CheckDays = new[] { DayOfWeek.Monday, DayOfWeek.Wednesday, DayOfWeek.Friday };

    Zacnu nekolika priklady
    Pondeli 7:37 - metoda neco udela a vrati Streda 7:00
    Pondeli 8:28 - metoda nic nedela a vrati Streda 7:00
    Streda 17:42 - metoda nic nedela a vrati Patek 7:00
    Patek 7:21 - metoda neco udela a vrati Pondeli 7:00
    Sobota 5:55 - metoda nic nedela vrati Pondeli 7:00

    Je to tedy v podstate takovy mensi task scheduler, akorat v podstate sity na miru. Ta metoda se muze spustit prakticky kdykoliv, proto potrebuju v prvnim kroku overit jestli vubec ma neco spoustet. Nasledne se pak spocita datum pro dalsi teoreticke spusteni.
    BAT
    BAT --- ---
    SLUPKA: Diky moc.
    Ale skoda, po precteni vidim, ze to bez dalsich obezlicek nejde, cimz padem to pro me ztraci tu eleganci a bude efektivnejsi se v tomto pripade na XAML uplne vykvajznout.
    SLUPKA
    SLUPKA --- ---
    BAT: To už tak úplně přímočaře nejde, ale řešení najdeš třeba tu: http://karlhulme.wordpress.com/2007/02/14/xpath-variabledynamic-parameters-in-wpf-binding/
    BAT
    BAT --- ---
    SLUPKA: Muzes mi to nejak podrobnejc popsat?
    To co bych chtel, je vlastne Binding uvnitr Bindingu - asi neco jako kdybych udelal:
    {Binding XPath=//Items/Item[@id='{Binding Source={x:Static local:Settings.Instance}, Path=ItemId}']}
    Takhle to samozrejme nejde, to jen pro lepsi vysvetleni co presne chci.
    SLUPKA
    SLUPKA --- ---
    BAT: Dá se bindovat na XPath cestu do toho xml, pak už ti stačí, aby si uměl XPath :)
    BAT
    BAT --- ---
    Je mozny podle hodnoty nabindovane property vybrat urcity element z XML
    a z tohoto elementu pak pouzit nejake parametry napr. k nastaveni zobrazeneho textu, obrazku, atp?

    Priklad:

    <?xml version="1.0" encoding="utf-8" ?>
    <Items xmlns="">
    <Item tag="0" icon="icon1.png" txt="Text 1">
    <Item tag="1" icon="icon2.png" txt="Text 2">
    <Item tag="2" icon="icon3.png" txt="Text 3">
    </Items>

    Vedle toho mam property cisloIkony.
    A pak toto:

    <Image Source="{Binding ...}" />
    <TextBlock Text="{Binding ...}" />

    Jak zaridit Binding, aby se z XML vybralo Item jehoz @tag odpovida aktualni hodnote cisloIkony,
    a z te vybrane polozky pouzit @icon a @txt pro nastaveni Image.Source a TextBlock.Text ?
    Googlim, MSDN procitam, ale ne a ne se dobrat reseni - da se to vubec udelat?
    BAT
    BAT --- ---
    MORMEGIL: muzu prepinat "Show output from" mezi Build, nebo Debug - oboji samozrejme vypisuje jine veci, ale nikde neni nic o spatnem bindovani.
    Mozna to vyplyva z nejakych omezeni Express edice.
    MORMEGIL
    MORMEGIL --- ---
    BAT: Tak v Output window jde přepínat, čeho Output se má zobrazit… (Blbá rada, ale co když…)
    BAT
    BAT --- ---
    SLUPKA: Clovece tuhle radu uz jsem kdesi cetl, ale v mem pripade to zkratka neplati.
    S bindovanim jsem se za tu kratkou dobu uz neco napatlal a nasekal a vyresil hromadu chyb,
    ale NIKDY jsem v output okne nemel zadnou zpravu jakkoliv se tykajici bindovani.
    Ani v Errorlistu, ani v Output window.

    (zacinam si myslet, ze je tam nekde jeste jine "Output" window o kterem nevim :)
    SLUPKA
    SLUPKA --- ---
    BAT: Jinak takové doporučení, když se ti něco nezdá kolem bindování, tak se podívej do Output window ve visual studiu. Když nesedí binding, tak se to tam napíše a občas je tam i hint co by mohlo být za problém (například, tady by ti to psalo, že property Server not found :))
    BAT
    BAT --- ---
    Diky obema za vysvetleni.
    Prepsal jsem to tak, aby instance Server byla property, a uz to funguje.
    NECROMAN
    NECROMAN --- ---
    SLUPKA: tak jsem to myslel, dik
    BAT
    BAT --- ---
    SLUPKA: Aha, asi jsem nepochopil proces fungovani bindovani.

    Jestli to chapu spravne, tak v te "ceste" definujici vazbu smi byt pouze properties?
    Tzn. Address, na kterou chci bindovat, sice je property (Server.Address je property),
    ale nepujde to kvuli tomu, ze jeji parent (Server) neni property (Settings.Instance.Server je field).

    Myslel jsem, ze je dulezity jen to, aby byl property cilovy element na ktery binduju, ale ze uz nezalezi pres co vsechno se k nemu dostavam.
    SLUPKA
    SLUPKA --- ---
    BAT: Skutečná properta znamená property, nikoliv field.

    Field vypadá např. takto:
    public int i;

    Property např. takto:
    public int I { get; set; }

    A na bindování musíš bindovat na property nikoliv na fieldy
    BAT
    BAT --- ---
    NECROMAN: o vyvolani udalosti PropertyChanged je postarano.
    V setteru hodnoty Address se ta udalost vyvolava. Cely kod jsem sem nedaval aby to nebylo zbytecne dlouhy
    (a taky proto, ze nevim jak to sem pastnout bez nutnosti to cele jeste rucne formatovat a menit ruzne znaky na htmlentity, atp.).

    Co myslis tim "skutecna Properta" ?
    Jaky je v tomto ohledu (pouziti pri bindovani) rozdil mezi class Trida { public int cislo = 10; } a mezi class Trida { public Cislo Trida2 = new Cislo(); Trida2.cislo = 10; } ?

    Zeptam se jinak:
    Je problem ve zpusobu zapisu te vazbu v XAML?
    Tzn. je spatne {x:Static local:Settings.Instance}, Path=Server.Address} ?
    On uz se neumi dostat na .Address, pac tak daleko chodit neumi, nebo se to musi napsat jinak?

    (jestli se ptam nejak hloupe, tak se omlouvam, a prosim o trpelivost.)
    NECROMAN
    NECROMAN --- ---
    BAT: ono to jde, ale kazda z tech propert musi byt skutecna Properta, takze v pripade promenne
    public ServerSettings Server = new ServerSettings();
    to nepujde
    A stejne tak pokud to ma reagovat na zmenu, tak je nutne na kazdem clanku toho volani volat PropertyChanged
    Kliknutím sem můžete změnit nastavení reklam