• ú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
    PECA
    PECA --- ---
    PECA: Zajímavý. Když jsem si udělal úplně nový prázdný solution tak to funguje. Tedy po opravě dalších následných chyb. Problém tedy tkví v tom, že to mám udělaný jako COM server, který potřebuji, abych si mohl patřičné služby volat z Delphi7 aplikace. Kdybyste někdo věděl, kudy z toho ven, budu velmi zauzlovaný. Prozatím to vypadá, že COM server není schopen najít app.config (debil jeden).
    Záměr je takový, že začínám psát nové věci (a klienty webových služeb) v C# jako COM servery, které se ze starých Win32 aplikací snadno volají. Celé aplikace najednou prostě z Delphi do C# jen tak nepřeklopíme.

    funkční metoda z předchozího příkladu:
    static public string CiselnikPlodin()
    {
    	CiselnikPlodin.LPI_GPL01AClient cp = new CiselnikPlodin.LPI_GPL01AClient();
    	CiselnikPlodin.processRequest rq = new CiselnikPlodin.processRequest();
    	rq.Request = new Request();
    	rq.Request.AppInfo = new AppInfo();
    	rq.Request.AppInfo.AppModule = new AppInfoAppModule();
    	rq.Request.AppInfo.AppModule.id = "Pískoviště";
    	rq.Request.AppInfo.AppModule.version = "0.1";
    	rq.Request.vOKOid = "LPI_GPL01A";
    	rq.Request.TimeStamp = new TimeStamp();
    	rq.Request.TimeStamp.type = TimeStampType.@base;
    	rq.Request.TimeStamp.Value = DateTime.MinValue; // Now;
    	rq.Request.RequestHeader = new RequestHeader();
    	rq.Request.RequestHeader.RequestID = "Označení dotazu";
    	rq.Request.RequestHeader.Subject = new RequestHeaderSubject();
    	rq.Request.RequestHeader.Subject.subjectID = "**********";
    	rq.Request.RequestHeader.Subject.Value = "Farma Rudník";
    	rq.Request.RequestContent = new RequestRequestContent();
    	rq.Request.RequestContent.Item = new RequestType();
    	rq.Request.RequestContent.Item.GETDATA = false;
    	CiselnikPlodin.processResponse rp = cp.process(rq);
    	return rp.Response.ResponseContent.Item.DATZMENYCIS.ToString();
    }

    -----
    BTW, k těm GUID jako PK, já osobně bych to nedělal. Přijde mi to dost overkill. IMHO na PK je optimální int32, eventuálně int64. GUID (domnívám se) se bude déle generovat, než prostý sequencer (autoinkrement, generátor...), zabere více místa v databázi a při přenosu. Pochopitelně záleží na množství dat. U malé databáze do pár desítek tisíc řádků a o desítkách tabulek to asi nebude úplně kritické. I když, po síti je znát pomalu každý bajt navíc :-7
    PECA
    PECA --- ---
    Zdravím. Potřebuju nakopnout správným směrem. Snažím se udělat klienta webové služby. Teprve se to učím a nějak se mi nedaří najít ty správné příklady a návody. Veškeré, co jsem našel, popisují primitivní příkládky, ze kterých mi není jasné, jak zavolat poněkud obsáhlejší službu. Konkrétně se mi jedná o služby portálu farmáře: http://eagri.cz/public/web/mze/farmar/elektronicka-vymena-dat/prehled-vystavenych-sluzeb/
    Dejme tomu třeba: https://eagri.cz/ssl/nosso-app/EPO/WS/Online/vOKOsrv.aspx?SERVICEID=LPI_GPL01A
    Optimálně s asynchronním voláním.

    Já jsme si tuto službu přidal do řešení a vygeneroval se mi pro ni soubor "Reference.cs". Pak jsem tak nějak předpokládal, že mi bude stačit vyrobit objekt, naplnit parametry, zavolat proces a přečíst odpověď. Zatím synchronně. Jenže ouha, hned na prvním řádku, kde se snažím vytvořit instanci mi to zhebne na výjimku.

    Výjimka:
    System.InvalidOperationException was unhandled by user code
      Message=Nelze najít výchozí element koncového bodu, který odkazuje na kontrakt
    CiselnikPlodin.LPI_GPL01A v oddílu konfigurace klienta třídy ServiceModel. Může to být
    proto, že pro aplikaci nebyl nalezen konfigurační soubor, nebo v elementu klienta
    nebylo možné najít element koncového bodu odpovídající tomuto kontraktu.
      Source=System.ServiceModel
      StackTrace:
           v System.ServiceModel.Description.ConfigLoader.LoadChannelBehaviors(ServiceEndpoint serviceEndpoint, String configurationName)
           v System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName, Configuration configuration)
           v System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName)
           v System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address)
           v System.ServiceModel.ChannelFactory`1..ctor(String endpointConfigurationName, EndpointAddress remoteAddress)
           v System.ServiceModel.EndpointTrait`1.CreateSimplexFactory()
           v System.ServiceModel.ClientBase`1.CreateChannelFactoryRef(EndpointTrait`1 endpointTrait)
           v System.ServiceModel.ClientBase`1.InitializeChannelFactoryRef()
           v System.ServiceModel.ClientBase`1..ctor()
           v CiselnikPlodin.LPI_GPL01AClient..ctor() v C:\zdrojaky\Service References\CiselnikPlodin\Reference.cs:řádek 1554  // !!! zde je prázdný konstruktor: public LPI_GPL01AClient() { } !!!
           v program.CiselnikPlodin() v C:\zdrojaky\program.cs:řádek 177
      InnerException: 
    
    Můj zamýšlený kód - možná úplně mimo mísu:
    public string CiselnikPlodin()
    {
    	CiselnikPlodin.LPI_GPL01AClient cp = new CiselnikPlodin.LPI_GPL01AClient(); // !!! výjimka !!! řádek 177
    	CiselnikPlodin.processRequest rq = new CiselnikPlodin.processRequest();
    	rq.Request.AppInfo.AppModule.id = "Moje aplikace"; // TODO: Doplnit automatickou identifikací aplikace.
    	rq.Request.AppInfo.AppModule.version = this.Version.ToString();
    	rq.Request.vOKOid = "LPI_GPL01A";
    	rq.Request.TimeStamp.type = CiselnikPlodin.TimeStampType.@base;
    	rq.Request.TimeStamp.Value = DateTime.Now;
    	rq.Request.RequestHeader.RequestID = "Označení dotazu";
    	rq.Request.RequestHeader.Subject.subjectID = "**********";
    	rq.Request.RequestHeader.Subject.Value = "Moje farma";
    	rq.Request.RequestContent.Item.GETDATA = false;
    	CiselnikPlodin.processResponse rp = cp.process(rq);
    	return rp.Response.ResponseContent.Item.DATZMENYCIS.ToString();
    }
    
    Našel jsem, že by to mohlo být chybějícím konfigurákem, ale ten tam mám. Tak už nevím. Děkuji předem, za každou pomoc.
    VIRTUALVOID
    VIRTUALVOID --- ---
    MORMEGIL: ja som sa k tomu dopatral tu

    A Simple C# Wrapper for Ghostscript » matthew ephraim’s blog
    http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/

    :)
    MORMEGIL
    MORMEGIL --- ---
    DARKREIDER: Přímo v C# pochybuju; zaintegrovat nativní Ghostscript, na to už wrapper najdeš.
    DARKREIDER
    DARKREIDER --- ---
    Zdarec, skromna otazka: existuje nejaka kniznica (alebo nieco), co dokaze v C# interpretovat postscript? Potrebujem zobrazit *.ps subor a nad tym spravit nejaky jednoduchy WYSIWYG editor na presuvanie blokov v tom PS kode. Cakal som, ze codeproject toho bude plny, ale ani google mi nedava nic pozitivne. Dik za kazdu reakciu.
    SLUPKA
    SLUPKA --- ---
    AREX: Aha, já myslel, že jsem napsal něco špatně :)
    AREX
    AREX --- ---
    SLUPKA: Mluvim ted samozrejme jen o te smycce dole. Tam to pri "pondeli 8:00" v prvni smycce breakne a tim padem to skonci na pondeli 7:00 coz uz je ponekud spatne :)

    Tu horni cast kontroly jsem udelal jednodusi prave vyuzitim tehle funkce.

    var now = DateTime.Now;
    var nextCheck = GetNextCheckDate(now);

    if (nextCheck.Date == now.Date && now.Hour == CheckHour) {
    ...
    }

    return nextCheck;
    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 :)
    Kliknutím sem můžete změnit nastavení reklam