<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Symbol LABoratory &#187; c#</title>
	<atom:link href="http://lab.symboltech.hu/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://lab.symboltech.hu</link>
	<description>Kreativitás és Innováció a szoftveriparban</description>
	<lastBuildDate>Tue, 03 Jan 2012 14:24:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Még mindig nagyon gyenge a .NET Entity Framework 4.0 béta</title>
		<link>http://lab.symboltech.hu/2009/08/meg-mindig-nagyon-gyenge-a-net-entity-framework-4-0-beta/</link>
		<comments>http://lab.symboltech.hu/2009/08/meg-mindig-nagyon-gyenge-a-net-entity-framework-4-0-beta/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 06:45:52 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Fejlesztői hírek]]></category>
		<category><![CDATA[Nagyvilág eseményei]]></category>
		<category><![CDATA[adatbázis]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[entity]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[microsoft]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=371</guid>
		<description><![CDATA[Találós kérdéssel indítok. Tehát mire gondoltam? ]]></description>
			<content:encoded><![CDATA[<p>Találós kérdéssel indítok. Tehát mire gondoltam?</p>
<p>Mindenki nagyon várja. Marketingre sokat költ a Microsoft. A fejlesztői portálok tele vannak vele, mert remek eszköz. Nem a megjelenítést szolgálja, azaz nem GUI. Mindenki használja. Mindenki meg van vele elégedve. Mindenki szidja. Mindenki mondja, hogy nem baj, a következő releaseben megoldják. Nagyon gyorsan, akár félévente jön ki belőle új release. Adatbázissal kapcsolatos. Adatbázist érünk el vele.</p>
<p> </p>
<p>Igen, kitalálhattátok, hogy <strong>EntityFramework</strong>. Témánál vagyunk.</p>
<p>Megjelent a 4.0 béta és az alábbi bejegyzést döbbenten olvastam. Itt kell tartani egy termék 4.0-s verziójával? Ezek a nagy előrelépések a 3.0-hoz képest? A cikk<a href="http://blogs.msdn.com/adonet/archive/2009/08/05/improvements-to-the-generated-sql-in-net-4-0-beta1.aspx" target="_blank"> itt olvasható</a>.</p>
<p>Nézzük megy egy kicsit jobban, mire is gondoltam, amikor a döbbenet szót használtam. Kollégáim már tudják mire gondolok, de tudja meg más is!</p>
<ul>
<li>Egy ilyen készültségi szinten lévő projektben kell olyan optimalizációs lépéseket megtenni, minthogy nem hoz le minden oszlopot egy subselect, csak ami kell nekünk?</li>
<li>COUNT(1) nyelvi elem direkt használata, amikor az a célszerű.</li>
<li>A legnagyobb, az IN SELECT. Komolyan gondolja valaki, hogy a 4.0-ig kell várni egy kliens oldalon is jelenlévő adatstruktúra (tömb) és SQL oldalon is elérhető nyelvi konstrukció (WHERE xx IN (x,y,z&#8230;)) összekapcsolására?</li>
</ul>
<p>Igen, emiatt van tele minden fejlesztői portál olyan jellegű kérdésekkel, hogy &#8220;Hogy tudok két táblát összekapcsolni LINQ-ban, EntityFramework-kel?&#8221; Ezek szerint nem segítség, hanem csak egy hozzászoktató eszköz, ami függőséget okoz és ha függő lettél, akkor minden fejlesztéshez a megrendelővel vetetni fogsz MsSQL Server 2010-et, supporttal, majd kell még 5 profi kolléga, aki natív SQL-hez nem ért, de kiválóan függő EntityFramework-kel.</p>
<p><em>A saját, fentihez hasonlító dolgokat megvalósító keretrendszserünk első bétája ennél sokkal több dolgot valósított meg. Mert a való életre próbáltuk alkalmazni és a tervezéskor használt use-case-ek a tapasztalatból táplálkoztak.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/08/meg-mindig-nagyon-gyenge-a-net-entity-framework-4-0-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ha várni kell a Windowsban &#8211; A jó öreg homokóra</title>
		<link>http://lab.symboltech.hu/2009/07/ha-varni-kell-a-windowsban-a-jo-oreg-homokora/</link>
		<comments>http://lab.symboltech.hu/2009/07/ha-varni-kell-a-windowsban-a-jo-oreg-homokora/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 08:13:56 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Fejlesztői hírek]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[forráskód]]></category>
		<category><![CDATA[homokóra]]></category>
		<category><![CDATA[hourglass]]></category>
		<category><![CDATA[idisposable]]></category>
		<category><![CDATA[várakozás]]></category>
		<category><![CDATA[waitcursor]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=293</guid>
		<description><![CDATA[Gyakran fordul elő, hogy homokórát kell megjelenítenünk, mert valamilyen művelet hosszabb időt vehet igénybe. A felhasználó pedig várakozzon, ahelyett, hogy a beviteli mezőket próbálja szerkeszteni vagy a gombokat működésre bírni.]]></description>
			<content:encoded><![CDATA[<p>Gyakran fordul elő, hogy homokórát kell megjelenítenünk, mert valamilyen művelet hosszabb időt vehet igénybe. A felhasználó pedig várakozzon, ahelyett, hogy a beviteli mezőket próbálja szerkeszteni vagy a gombokat működésre bírni.</p>
<p>Régebbi programozási nyelvekben (Delphi, FoxPro) a hosszú műveletek automatikusan beállították a homokóra üzemmódot. Viszont nem kezelték jól a beágyazott műveleteket, azaz 10 darab SELECT végrehajtása egymás után 10 homokórás villogást eredményezett. Ez a mai világban inkább szégyenletes, mint felhasználóbarát.</p>
<p> </p>
<p>Ezt a problémát oldottuk meg az alábbi kódrészlettel:</p>
<pre>using System;
using System.Windows.Forms;</pre>
<pre>namespace SymbolTech.Common
{
    public class WaitCursor : IDisposable
    {
        private static int waitcursorlevel = 0;

        public WaitCursor()
        {
            waitcursorlevel++;
            if (waitcursorlevel &gt; 0)
                Cursor.Current = Cursors.WaitCursor;
        }

        public void Dispose()
        {
            waitcursorlevel--;
            if (waitcursorlevel == 0)
                Cursor.Current = Cursors.Default;
        }
    }
}</pre>
<p>Minden (hosszabb) műveletet beágyazunk egy <code>using(new WaitCursor()) </code>blokkba. Ezzel a következő előnyöket érjük el:</p>
<ol>
<li>A műveletek minden esetben &#8220;homokórázni&#8221; fognak.</li>
<li>A beágyazott műveletek (külső blokk már homokórában dolgozik, a belső, mondjuk 100 iteráció is bekapcsolja a homkórát) nem fogják villogtatni a kurzort.</li>
<li>Véletlenül sem felejtjük el visszakapcsolni az alapértelmezett kurzort, amennyiben a műveletek végrehajtásra kerültek.</li>
</ol>
<p> </p>
<p>Lássunk egy példát, a használatára:</p>
<pre>        private void DummyMethod()
        {
            using (new WaitCursor())
            {
                Thread.Sleep(100);
            }
        }</pre>
<pre>        private void button1_Click(object sender, EventArgs e)
        {
            using (new WaitCursor())
            {
                Thread.Sleep(500);
                for (int i = 0; i &lt; 10; i++)
                    DummyMethod();
            }
        }</pre>
<p>A példában egy beágyazott, többször (10x) végrehajtott műveletet látunk, amelyek összességében 1.5mp-re átkapcsolnak homokórára, de közben nem villog a kurzor.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/07/ha-varni-kell-a-windowsban-a-jo-oreg-homokora/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TabCsapda &#8211; hol a kurzor?</title>
		<link>http://lab.symboltech.hu/2009/07/tabcsapda-hol-a-kurzor/</link>
		<comments>http://lab.symboltech.hu/2009/07/tabcsapda-hol-a-kurzor/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 18:35:55 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Fejlesztői hírek]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[szoftverkiadás]]></category>
		<category><![CDATA[taborder]]></category>
		<category><![CDATA[tesztelés]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=291</guid>
		<description><![CDATA[Tesztelő csapatunk fura hibával állt elő, nemsokára megjelenő program release-ünk áttekintésekor. A TAB-bal való navigáció - amely a Win95 környékén jelenhetett meg és minden felhasználó hozzászokott az elmúlt 15 évben - valahol elveszti működését és megáll.]]></description>
			<content:encoded><![CDATA[<p>Tesztelő csapatunk fura hibával állt elő, nemsokára megjelenő program release-ünk áttekintésekor. A TAB-bal való navigáció &#8211; amely a Win95 környékén jelenhetett meg és minden felhasználó hozzászokott az elmúlt 15 évben &#8211; valahol elveszti működését és megáll.</p>
<p>A GridControl volt a hibás, ugyanis furcsa működéséből adódóan egy táblázatban is lehet tabbal lépkedni, vagy a sorok vagy a cellák között és amikor a végére érünk, nem tudunk merre menni. Nem is tudom, hogy miért ez az alapértelmezett működés, de kikapcsoltuk. Sok dolgunk nem volt, 2 (!!!) sort kellett a megfelelő helyen adaptálni és az összes termékünk következő kiadásában megjelenik a TabCsapda elleni megoldás.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/07/tabcsapda-hol-a-kurzor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kivételek típusai &#8211; melyiket dobjam?</title>
		<link>http://lab.symboltech.hu/2009/07/kivetelek-tipusai-melyiket-dobjam/</link>
		<comments>http://lab.symboltech.hu/2009/07/kivetelek-tipusai-melyiket-dobjam/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 09:49:55 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Fejlesztői hírek]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[forráskód]]></category>
		<category><![CDATA[kivétel]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=275</guid>
		<description><![CDATA[A kivételkezelés alatt sok fejlesztő a catch ág megvalósítását gondolja, de ugyanolyan fontos a kivételek eldobása is. Nem szabad azzal megelégedni, hogy dobunk egy ApplicationException-t, sokkal precízebb, ha a típusos esetekben (rossz paraméter, nem jó képformátum) a beépített kivételosztályokat használjuk.]]></description>
			<content:encoded><![CDATA[<p>A kivételkezelés alatt sok fejlesztő a catch ág megvalósítását gondolja, de ugyanolyan fontos a kivételek eldobása is. Nem szabad azzal megelégedni, hogy dobunk egy ApplicationException-t, sokkal precízebb, ha a típusos esetekben (rossz paraméter, nem jó képformátum) a beépített kivételosztályokat használjuk.</p>
<p>Lássuk, mik ezek:</p>
<table border="0" width="100%" bgcolor="#ffffff" bordercolor="#c0c0c0">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="319"><strong>Kivétel osztály</strong></td>
<td width="528"><strong>Kiváltás oka</strong></td>
</tr>
<tr>
<td width="319"><strong>SystemException </strong></td>
<td width="528">Futásidejű hiba, a kivételes ősosztálya</td>
</tr>
<tr>
<td width="319"><strong>AccessException </strong></td>
<td width="528">Egy típus elemeléréseinek hibája (metódus, mező, property)</td>
</tr>
<tr>
<td width="319"><strong>ArgumentException </strong></td>
<td width="528">Metódushívás esetén hibás paraméter</td>
</tr>
<tr>
<td width="319"><strong>ArgumentNullException </strong></td>
<td width="528">Metódushívás esetén null paraméter, ha azt a metódus nem tudja kezelni</td>
</tr>
<tr>
<td width="319"><strong>ArgumentOutOfRangeException </strong></td>
<td width="528">Paraméter értéke adott határokon kívül esik</td>
</tr>
<tr>
<td width="319"><strong>ArithmeticException </strong></td>
<td width="528">&#8220;Matematikai&#8221; hiba</td>
</tr>
<tr>
<td width="319"><strong>ArrayTypeMismatchException </strong></td>
<td width="528">Típusos tömbön végzett művelet egy idegen típussal</td>
</tr>
<tr>
<td width="319"><strong>BadImageFormatException </strong></td>
<td width="528">Rossz képformátum</td>
</tr>
<tr>
<td width="319"><strong>CoreException </strong></td>
<td width="528">Futásidejű kivételes ősosztálya</td>
</tr>
<tr>
<td width="319"><strong>DivideByZeroException</strong></td>
<td width="528">Nullával való osztás</td>
</tr>
<tr>
<td width="319"><strong>FormatException </strong></td>
<td width="528">Argumentum formátuma nem helyes (pl: String.Format)</td>
</tr>
<tr>
<td width="319"><strong>IndexOutOfRangeException</strong></td>
<td width="528">Tömb indexelése túlmutat a határokon</td>
</tr>
<tr>
<td width="319"><strong>InvalidCastExpression </strong></td>
<td width="528">Futásidejű Cast művelet nem hajtható végre</td>
</tr>
<tr>
<td width="319"><strong>InvalidOperationException </strong></td>
<td width="528">Nem megfelelő (idejű?) művelet hívása</td>
</tr>
<tr>
<td width="319"><strong>MissingMemberException </strong></td>
<td width="528">DLL verziószám ütközés, eltérés metódushívás közben</td>
</tr>
<tr>
<td width="319"><strong>NotFiniteNumberException </strong></td>
<td width="528">Nem valós szám (decimal, float; NaN, Infinity)</td>
</tr>
<tr>
<td width="319"><strong>NotSupportedException </strong></td>
<td width="528">Nem létező metódus hívása (reflection?)</td>
</tr>
<tr>
<td width="319"><strong>NullReferenceException </strong></td>
<td width="528">NULL értékű változó által hivatkozott objektum elérése</td>
</tr>
<tr>
<td width="319"><strong>OutOfMemoryException </strong></td>
<td width="528">Memória elfogyás</td>
</tr>
<tr>
<td width="319"><strong>StackOverflowException </strong></td>
<td width="528">Verem műveletek memória elfogyása (rekurízió)</td>
</tr>
</tbody>
</table>
<p>A fenti lista számos lehetőséget kínál a fejlesztőknek a megfelelő kivétel eldobásában. Ezek használata nagyban megkönnyíti a hibakezelést és hibakeresést, a metódus írója pedig publikálhatja, hogy mit várt és mit kapott.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/07/kivetelek-tipusai-melyiket-dobjam/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Egyedi sorosítás &#8211; IXMLSerializable megvalósítás</title>
		<link>http://lab.symboltech.hu/2009/07/egyedi-sorositas-ixmlserializable-megvalositas/</link>
		<comments>http://lab.symboltech.hu/2009/07/egyedi-sorositas-ixmlserializable-megvalositas/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 09:30:14 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Fejlesztői hírek]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[dictionary]]></category>
		<category><![CDATA[forráskód]]></category>
		<category><![CDATA[ixmlserializable]]></category>
		<category><![CDATA[projekt]]></category>
		<category><![CDATA[sorosítás]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=268</guid>
		<description><![CDATA[C#, remek nyelv. Szinte mindent lehet sorosítani, XML-be menteni. Nem is kell kézzel ezeket megírni, összerakni. De egy pár dolog kimaradt. Talán oka is van, hogy miért, de ez nem lényeg. A lényeg, hogy meg lehet valósítani.]]></description>
			<content:encoded><![CDATA[<p><strong>C#, remek nyelv.</strong> Szinte mindent lehet sorosítani, XML-be menteni. Nem is kell kézzel ezeket megírni, összerakni. De egy pár dolog kimaradt. Talán oka is van, hogy miért, de ez nem lényeg. A lényeg, hogy meg lehet valósítani.</p>
<p>A generic List&lt;&gt;-et lehet sorosítani, de előtte kell egy plusz származtatási szinten készíteni. Dictionary&lt;T,U&gt;-t nem lehet. De van megoldás. Csináljunk egy sorosítható Dictionary-t.</p>
<pre>    [XmlRoot("Dictionary")]
    public class SerializableDictionary&lt;TKey, TValue&gt; : IXmlSerializable
    {
        public XmlSchema GetSchema()
        {
            return null;
        }</pre>
<pre>        public void ReadXml(XmlReader reader)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));</pre>
<pre>            bool wasEmpty = reader.IsEmptyElement;</pre>
<pre>            reader.Read();</pre>
<pre>            if (wasEmpty)
                return;</pre>
<pre>            while (reader.NodeType != XmlNodeType.EndElement)
                try
                {
                    reader.ReadStartElement("Item");
                    reader.ReadStartElement("Key");
                    TKey key = (TKey)keySerializer.Deserialize(reader);
                    reader.ReadEndElement();</pre>
<pre>                    reader.ReadStartElement("Value");
                    TValue value = (TValue)valueSerializer.Deserialize(reader);
                    reader.ReadEndElement();</pre>
<pre>                    reader.ReadEndElement();</pre>
<pre>                    reader.MoveToContent();</pre>
<pre>                    this.Add(key, value);
                }
                catch { }
            reader.ReadEndElement();
        }</pre>
<pre>        public void WriteXml(XmlWriter writer)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));</pre>
<pre>            foreach (TKey key in this.Keys)
            {
                writer.WriteStartElement("Item");
                writer.WriteStartElement("Key");
                keySerializer.Serialize(writer, key);
                writer.WriteEndElement();</pre>
<pre>                writer.WriteStartElement("Value");
                TValue value = this[key];
                valueSerializer.Serialize(writer, value);
                writer.WriteEndElement();</pre>
<pre>                writer.WriteEndElement();
            }
        }
    }</pre>
<p>Ahogy látható, csak a saját szintünket kell megvalósítani, a TKey és TValue elemek sorosításával már a saját osztályuk foglalkozik. Extrém eset ha a TValue is egy sorosítható Dictionary (valós példát nem tudunk jelenleg mondani), ilyenkor ennek az objektumnak a sorosításakor szintén a fenti algoritmus fog lefutni.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/07/egyedi-sorositas-ixmlserializable-megvalositas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diagram engine &#8211; miért C#</title>
		<link>http://lab.symboltech.hu/2009/07/diagram-engine-miert-c/</link>
		<comments>http://lab.symboltech.hu/2009/07/diagram-engine-miert-c/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 05:50:38 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Fejlesztői hírek]]></category>
		<category><![CDATA[Hírek]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[customcontrol]]></category>
		<category><![CDATA[diagram]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[paint]]></category>
		<category><![CDATA[szoftver]]></category>
		<category><![CDATA[zorder]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=151</guid>
		<description><![CDATA[Ügyviteli rendszereknél ritka, hogy diagramot jelenítünk meg valamit, hiszen minden adat táblákban van, azok megjelenítéséhez pedig ideális valamiféle grid.]]></description>
			<content:encoded><![CDATA[<p>Ügyviteli rendszereknél ritka, hogy diagramot jelenítünk meg valamit, hiszen minden adat táblákban van, azok megjelenítéséhez pedig ideális valamiféle grid. Néha szoktak beépített grafikon segítségével felhasználókat elképráztatni, de az egyedi rajzolásos digram nem mindennapos.</p>
<p>Az üzletkötőink, ügyviteli szakembereink sem értették, hogy mit akarunk ezzel, miért nem jó szerintünk a sima kis lista. Csak a végén értették meg, hogy mit is akartunk.</p>
<p><strong>Ezt:</strong></p>
<p><img class="aligncenter size-full wp-image-252" title="voucherdiagram" src="http://lab.symboltech.hu/wp-content/uploads/2009/07/voucherdiagram.jpg" alt="voucherdiagram" width="700" height="495" /></p>
<p>Hogyan is jött létre ez a &#8211; <em>joggal innovációnak nevezhető</em> &#8211; modul, amely minden ügyviteli termékünkben megjelenik és sok pozitív felhasználói visszajelzést indukált? A bizonylatok és egyéb adatelemek közti reláció, adatkapcsolat adott, erre épül maga az alkalmazás. No de ezt hogy jelenítsük meg egy gráfban, hogy  felhasználó is kedvet kapjon és használja?</p>
<p>Csapatunk 3 napon keresztül tervezett, brainstormingolt. Számos ötlet jelent meg a fejekben és a nagy prezentációs falon, ezen ötletek kb. 50% bele is került a megvalósult rendszerbe. Az elvárások tisztázása után kezdődött a fejlesztés. Programnyelv C#, ennek GDI és GDI+ lehetőségei kiváló kiaknázásra való területet jelentettek számunkra.</p>
<p><strong>Lépések:</strong></p>
<ul>
<li>Építsünk egy saját controlt.</li>
<li>Bármilyen megjelenni kívánó objektum feleljen megy egy <code>IDiagramDrawItem </code>interfésznek, amely egy metódust definiál <code>void Draw()</code> és információt szolgáltat arról, hogy melyik rétegben jelenik meg a kirajzolandó adatelem <code>int ZOrder { get; }</code>.</li>
<li>Rajzolás megvalósítása
<ul>
<li><code>override Paint()</code></li>
<li><code>void ClearAndDrawBackground()</code></li>
<li><code>void SortByZOrder()</code></li>
<li><code>foreach(... item.Draw()...)</code></li>
</ul>
</li>
</ul>
<p>Már a tervezési fázisban is láthatóvá vált, hogy lesznek optimalizálási kérdések, problémák, amelyek a témakör izgalmasabb részét jelentik.</p>
<p><strong>Repository, hogy ne szaggasson a kép.</strong> Egyedileg rajzoló eljárások rákfenéje a sok GDI objektum, amely memóriában és időben is költséges. A memóriabeli költségeket, mivel IDisposasble, meg lehet oldani, de sokáig tart minden OnPaintben Font-os, Pen-t és Brush-t létrehozni. Erre született megoldásként, hogy a diagram ezeket publikálja, tárolja, elérhetővé teszi eg példányban, egy alkalommal való létrehozással a rajzolni képes objektumok felé. Performancia mérést végeztünk, egy átlagos diagram 740 alkalommal tud kirajzolódni egy másodperc alatt. Nem rossz, megfelel.</p>
<p><strong>GraphicsPath, hogy lekerekített sarkú legyen a doboz.</strong> A C# GDI+ lehetőséget kínál arra, hogy vonalak és görbék segítségével egy &#8220;utat&#8221; hozzunk létre, amely felhasználható rajzolásra és kitöltésre egyaránt. Megvalósítottuk. Mivel ez is költséges, minden objektum a mérete alapján (amely nem állítható megjelenítés közben) első felhasználáskor (late-init) létrehozza a GraphicsPath objektumot.</p>
<p><strong>LinearGradientBrush, hogy átmenetes legyen a dobozok háttere.</strong> A legnagyobb kihívás a színátmenetes doboz volt, amely egy pontoktól függő GradientBrush lett. Ennek szintén elég egy példányban léteznie, de a doboz pozíciójának függvényében kell felparaméterezni. A (rendszer által) mozgatható dobozok pedig ezen tulajdonságukat gyakran változtatják, de erre is született megoldás: late-init és re-init-by-move.</p>
<p><em>És ekkor még nem ért véget a gondolkodás, a dobozok esztétikus elhelyezésének algoritmusa felér egy komolyabb diplomamunka témakörével, erről egy következő cikkben.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/07/diagram-engine-miert-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Windows 7 tálca újdonságai &#8211; fejlesztői szemmel</title>
		<link>http://lab.symboltech.hu/2009/07/windows-7-talca-ujdonsagai-fejlesztoi-szemmel/</link>
		<comments>http://lab.symboltech.hu/2009/07/windows-7-talca-ujdonsagai-fejlesztoi-szemmel/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 12:43:02 +0000</pubDate>
		<dc:creator>developerteam</dc:creator>
				<category><![CDATA[Fejlesztői hírek]]></category>
		<category><![CDATA[Nagyvilág eseményei]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[folyamatjelző]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[projekt]]></category>
		<category><![CDATA[tálca]]></category>
		<category><![CDATA[windows7]]></category>
		<category><![CDATA[WindowsApiCodecPack]]></category>

		<guid isPermaLink="false">http://lab.symboltech.hu/?p=200</guid>
		<description><![CDATA[Napvilágot látott (le is tölthető, meg is vásárolható lassan) a Microsoft új operációs rendszere, amely felhasználói szemmel újdonság, fejlesztői szemmel kihívás.]]></description>
			<content:encoded><![CDATA[<p>Napvilágot látott (le is tölthető, meg is vásárolható lassan) a Microsoft új operációs rendszere, amely felhasználói szemmel újdonság, fejlesztői szemmel kihívás.</p>
<p>Az alábbi <a href="http://windows.microsoft.com/en-US/windows7/products/features" target="_blank">linken</a> pár információval szolgálnak arról, mik is ezek az újítások. Én csak a tálca újdonságait emelném ki. Ezidáig a felhasználót a jobb alsó sarokban lévő úgynevezett értesítési területen lehetett informáli dolgokról. Milyen folyamatok futnak, mennyi ideig tart még a DVD megírása, a fájl letöltése.</p>
<p>Ezt most egy kicsit megbolondították és elérhetővé tették folyamatjelzők és ikonok megjelenítését a tálcán, ahol eddig a program főablakának címe szerepelt és jobb esetben az alkalmazás ikonja (számos fejlesztő felejt el ikont adni). A lehetőségek között szerepel:</p>
<ul>
<li>Véges folyamatjelző</li>
<li>Végtelen folyamatjelző (nem kiszámítható befejezési idővel)</li>
<li>Hibajelző (piros)</li>
</ul>
<p><img class="aligncenter size-full wp-image-206" title="taskbarwithprogressandoverlays" src="http://lab.symboltech.hu/wp-content/uploads/2009/07/taskbarwithprogressandoverlays.jpg" alt="taskbarwithprogressandoverlays" width="600" height="323" /></p>
<h3>És ehhez elég lesz a .Net framework 4.0?</h3>
<p>Elég, sőt 3.5-tel is működni fog, le kell hozzá tölteni a <a href="http://code.msdn.microsoft.com/WindowsAPICodePack" target="_blank">WindowsApiCodecPack</a>-et (4MB, súgóval együtt 19MB), amely forrásfájlokat szolgáltat számunkra, hogy a Windows7 fenti szolgáltatásait elérjük. <em>DirectX is kell hozzá a leírás szerint, de ez valószinüleg akkor szükséges, ha a CodecPack DirectX-es szolgáltatásait is szeretnénk használni.</em></p>
<p>Lehetőségünk lesz elérni a <code>ITaskBarList3</code> interfész <code>SetOverlayIcon</code>, <code>SetProgressState</code> és <code>SetProgressValue</code> metódusait, amivel lehetőségünk van a felhasználóinkat informálni egy hosszabb programfolyamat állapotáról.</p>
<p>Referenciaként a Core és Shell szerelvényeket kell a projekthez hozzáadni, ezen névterekben pedig megtalálhatóak a szükséges osztályok:</p>
<ul>
<li><code>Microsoft.WindowsAPICodePack.Shell.<strong>Taskbar</strong></code></li>
<li><code><code>Microsoft.WindowsAPICodePack.Shell.Taskbar.<strong>ProgressBar</strong></code></code></li>
<li><code><code><code>Microsoft.WindowsAPICodePack.Shell.Taskbar.<strong>OverlayIcon</strong></code></code></code></li>
</ul>
<p>Ezen kívül a <code>ProgressBarExt </code>és <code>OverlayIconExt </code>osztályok segítségével a Windows XP óta, a sok ablak megjelenítésekor összecsoportosuló programablakok mindegyike külön folyamatjelzővel látható el.</p>
<p>Tesztelés folyamatban&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.symboltech.hu/2009/07/windows-7-talca-ujdonsagai-fejlesztoi-szemmel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

