<?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>bc-programming &#187; Windows</title>
	<atom:link href="http://bc-programming.com/blogs/category/general-computing/windows/feed/" rel="self" type="application/rss+xml" />
	<link>http://bc-programming.com/blogs</link>
	<description>Programming, Possums, Ponies, and why you shouldn&#039;t mix any two.</description>
	<lastBuildDate>Wed, 16 May 2012 23:06:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Snippets.</title>
		<link>http://bc-programming.com/blogs/2012/05/snippets/</link>
		<comments>http://bc-programming.com/blogs/2012/05/snippets/#comments</comments>
		<pubDate>Thu, 03 May 2012 22:58:10 +0000</pubDate>
		<dc:creator>BC_Programming</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Choose]]></category>
		<category><![CDATA[ClampValue]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[IComparable]]></category>
		<category><![CDATA[Select]]></category>
		<category><![CDATA[static]]></category>

		<guid isPermaLink="false">http://bc-programming.com/blogs/?p=975</guid>
		<description><![CDATA[Naturally, as we write programs we create a small set of useful functions. BASeBlock has been no exception. I&#8217;ve created quite a few functions that offer generic functionality that could be used elsewhere. Here, I share some of them. Value Clamping Clamping values is a very common activity. It started to get on my nerves, [...]]]></description>
			<content:encoded><![CDATA[<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2012/05/snippets/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><p>Naturally, as we write programs we create a small set of useful functions. BASeBlock has been no exception. I&#8217;ve created quite a few functions that offer generic functionality that could be used elsewhere. Here, I share some of them.</p>
<h3> Value Clamping </h3>
<p>Clamping values is a very common activity. It started to get on my nerves, repeating code to make sure a given value was within a range. As a result I conceived of a generic function that could be used for any IComparable.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;public <span class="kw4">static</span> T ClampValue&lt;T&gt; <span class="br0">&#40;</span>T Value, T min, T max<span class="br0">&#41;</span> &nbsp;where T:IComparable</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//cast to IComparable</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; IComparable cvalue = <span class="br0">&#40;</span>IComparable<span class="br0">&#41;</span>Value;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; IComparable cmin = <span class="br0">&#40;</span>IComparable<span class="br0">&#41;</span>min;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; IComparable cmax = <span class="br0">&#40;</span>IComparable<span class="br0">&#41;</span>max;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//return (T)(cvalue.CompareTo(cmin)&lt; 0 ?cmin:cvalue.CompareTo(cmax)&gt;0?max:Value);</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>cvalue.<span class="me1">CompareTo</span><span class="br0">&#40;</span>cmin<span class="br0">&#41;</span> &lt; <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> min;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>cvalue.<span class="me1">CompareTo</span><span class="br0">&#40;</span>cmax<span class="br0">&#41;</span> &gt; <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> max;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Value;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>The basic idea is fairly simple. First, in order to clamp the value, we will need to be able to compare them, so we constrain the function to accepting only type T&#8217;s that implement that interface. The first step is casting each value to an IComparable; then we use those variables to compare and return the appropriate value. if the value is larger than max, max is returned; if it is smaller than min, min is returned. otherwise, value is returned unchanged. This function is most useful for numbers, but it can also have interesting implications and usage cases for other classes that are comparable, even strings.</p>
<h3>  choosing N items from a Enumerable list of S </h3>
</p>
<p>This also came up quite a lot- some parts of the game needed to randomly choose some set of values from a larger set of values. Naturally this gave birth to another generic routine for the purpose:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public <span class="kw4">static</span> T <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;Choose&lt;T&gt;<span class="br0">&#40;</span>IEnumerable&lt;T&gt; ChooseArray, <span class="kw4">int</span> numselect<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Random rgen = new Random<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; T <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;returnarray = new T <span class="br0">&#91;</span>numselect<span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SortedList&lt;double , T&gt; sorttest = new SortedList&lt;double, T&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; foreach <span class="br0">&#40;</span>T loopvalue in ChooseArray<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sorttest.<span class="me1">Add</span><span class="br0">&#40;</span>rgen.<span class="me1">NextDouble</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, loopvalue<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; var usearray = sorttest.<span class="me1">ToArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>; i &lt; numselect; i++<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; returnarray <span class="br0">&#91;</span>i<span class="br0">&#93;</span> &nbsp;= usearray <span class="br0">&#91;</span>i<span class="br0">&#93;</span> .<span class="me1">Value</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> returnarray;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>The idea is simple- make a SortedList that sorts the given listing using a random value as a key, then take the top numselect items off the top. This code will not work properly if numselect is larger than the size of the enumeration, but using count to clamp the size of the array would enumerate twice.</p>
<p>It&#8217;s probably possible to make this faster- possibly much faster- since we only need numselect elements. The core idea here is to shuffle the input array and choose two elements. One flawed approach for shuffling an array is to choose a random index and swap it with another random index, but this has myriad problems since it doesn&#8217;t really guarantee that everything is shuffled, and the result could very well have runs of the original card order.</p>
<p>Now, what if we had three objects we wanted to randomly choose from, and we wanted one of them to be chosen more frequently? One way of doing this is to use the above choose function and add duplicate entries. However, this could be tricky if you had odd requirements. This is where the Select&lt;T&gt; function would come in. this function is designed to accept an array and a corresponding array of probability weightings; if all the weightings are equal, than the result should be similar to what we get from Choose. Select accomplishes this  by keeping it simple. each array element is essentially assigned a given range within the total, and a random number is generated from the complete total of all weightings. For example, if we had the following elements:</p>
<table>
<th> # </th>
<th> Name </th>
<th> Weight </th>
<tr>
<td> 1 </td>
<td> Billy </td>
<td> 15 </td>
</tr>
<tr>
<td> 2 </td>
<td> Thomas </td>
<td> 35 </td>
</tr>
<tr>
<td> 3 </td>
<td> Jack </td>
<td> 70 </td>
</tr>
<tr>
<td> 4 </td>
<td> Selmac </td>
<td> 40 </td>
</tr>
<tr>
<td> 5 </td>
<td> Patrick </td>
<td> 80 </td>
</tr>
</table>
<p>We can see that if we generate a value between 0 and  240, than if it is between 0 and 15, we choose Billy, if it is between 15 and 50, we choose Thomas, etc.</p>
<p>Here is the code for the Select Function:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> T Select&lt;T&gt;<span class="br0">&#40;</span>T <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;items, <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;Probabilities<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> Select<span class="br0">&#40;</span>items,Probabilities,new Random<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> T Select&lt;T&gt;<span class="br0">&#40;</span>T <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;items, <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;Probabilities,Random rgen<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//first, sum all the probabilities.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//we do this manually because we will also build a corresponding list of the sums up to that element.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> getsum = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;sumulations = new <span class="kw4">float</span> <span class="br0">&#91;</span>Probabilities.<span class="me1">Length</span> + <span class="nu0">1</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>; i &lt; Probabilities.<span class="me1">Length</span>; i++<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sumulations <span class="br0">&#91;</span>i<span class="br0">&#93;</span> &nbsp;= getsum;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getsum += Probabilities <span class="br0">&#91;</span>i<span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sumulations <span class="br0">&#91;</span>sumulations.<span class="me1">Length</span><span class="nu0">-1</span><span class="br0">&#93;</span> &nbsp;= getsum; <span class="co1">//add this last value in&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//get a percentage using nextDouble. we use doubles, just in case the probabilities array uses rather large numbers to attempt to prevent</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//abberations as a result of floating point errors.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">double</span> usepercentage = rgen.<span class="me1">NextDouble</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//convert this percentage into a value we can use, that corresponds to the sum of float values:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> searchtotal = <span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span><span class="br0">&#40;</span>usepercentage * getsum<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//now find the corresponding index and return the corresponding value in the items array.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>; i &lt; Probabilities.<span class="me1">Length</span>; i++<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>searchtotal &gt; sumulations <span class="br0">&#91;</span>i<span class="br0">&#93;</span> &nbsp;&amp;&amp; searchtotal &lt; sumulations <span class="br0">&#91;</span>i + <span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> items <span class="br0">&#91;</span>i<span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">default</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>A short test Main() routine that can be used to&#8230; test it:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">static</span> <span class="kw4">void</span> Main<span class="br0">&#40;</span><span class="kw4">string</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;args<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> totalcount = <span class="nu0">50000</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">String</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;names = new <span class="kw4">string</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#123;</span> <span class="st0">&quot;Bill&quot;</span>, <span class="st0">&quot;Tom&quot;</span>, <span class="st0">&quot;Dick&quot;</span> <span class="br0">&#125;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;probability = new <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#123;</span> <span class="nu0">50</span>, <span class="nu0">20</span>, <span class="nu0">30</span> <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dictionary &lt;string , int&gt; &nbsp;countrunner = new Dictionary &lt;/string&gt; &nbsp;&lt;string , int&gt; <span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;running simulations&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>; i &gt; totalcount; i++<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">String</span> Selected = Select<span class="br0">&#40;</span>names, probability<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!countrunner.<span class="me1">ContainsKey</span><span class="br0">&#40;</span>Selected<span class="br0">&#41;</span><span class="br0">&#41;</span> countrunner.<span class="me1">Add</span><span class="br0">&#40;</span>Selected, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; countrunner <span class="br0">&#91;</span>Selected<span class="br0">&#93;</span> ++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;Completed. Results:&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span>var iterate in countrunner<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span class="me1">WriteLine</span><span class="br0">&#40;</span>iterate.<span class="me1">Key</span> + <span class="st0">&quot;<span class="es0">\t</span><span class="es0">\t</span><span class="es0">\t</span>&quot;</span> + iterate.<span class="me1">Value</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + <span class="st0">&quot; &quot;</span> + <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span>iterate.<span class="me1">Value</span><span class="br0">&#41;</span>/<span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span>totalcount<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span class="me1">ReadKey</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;&lt;/string&gt; &nbsp;</div>
</li>
</ol>
</div>
<p>The test is created in such a way that the values can be thought of directly as percentages. The resulting output shows that after a run the occurences of each lie around the percentages as given; Bill appears 50 percent of the time on average, Tom 20 percent, Dick 30 percent, etc. Obviously there is no requirement that the values add up to 100, but the values end up as percentages anyway. (choosing the values 100,40, and 60 for the probability array results in similar results).</p>
<p>This particular method has a bit of a &#8220;problem&#8221;; what if we run it repeatedly on the same array? Then we are constantly recreating the sumulations array and calculating the totals. How can we cache it? Easy- we use a Dictionary and keep weak references to the given array.</p>
<p>But all is not that simple! This is a generic method and the type T could easily change between calls- so what do we do? Well, it is possible to create a static object that contains a Dictionary indexed by a Type that has a value that is a KeyValuePair&lt;weakreference ,List&lt;T&gt;&gt;, and then inspect the Dictionary for the appropriate values, make sure the cache doesn&#8217;t get to big, dispose ofthe WeakReferences that point to arrays that have since been destroyed, blah blah, tricky business. We don&#8217;t want that, because for one thing it will be a pain to write- and for another, it will probably be slower overall to begin with. Instead, how about absolving the method itself from the responsibility, and having a ref parameter that can accept a calculated sum array. </p>
<p>For me, the above testing Main() routine took 200ms to execute, on average (I placed calls to System.Diagnostics.Stopwatch members before and after the loop). There was no appreciable difference in speed. Thnakfully, however, the extra logic did not slow it down, either.</p>
<p>The speed improvement can be seen when we have a lot more members. With 5000 members in the probability and Values arrays, and executing a Select on them 50,000 times, the average time was around 5-6 seconds. When the Main function instead gave a float []  ref as the third parameter, the average time dropped to one second. The code for the revised version of the procedure. This also adds some overloads:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> T Select&lt;T&gt;<span class="br0">&#40;</span>T <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;items, <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;Probabilities<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Select<span class="br0">&#40;</span>items, Probabilities, new Random<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> T Select&lt;T&gt;<span class="br0">&#40;</span>T <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;items, <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;Probabilities, Random rgen<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;sumulator = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Select<span class="br0">&#40;</span>items, Probabilities, rgen, ref sumulator<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> T Select&lt;T&gt;<span class="br0">&#40;</span>T <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;items, <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;Probabilities, ref <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;sumulations<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Select<span class="br0">&#40;</span>items, Probabilities, new Random<span class="br0">&#40;</span><span class="br0">&#41;</span>, ref sumulations<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> T Select&lt;T&gt;<span class="br0">&#40;</span>T <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;items, <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;Probabilities,Random rgen, ref <span class="kw4">float</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;sumulations<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//first, sum all the probabilities; unless a cached value is being given to us.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//we do this manually because we will also build a corresponding list of the sums up to that element.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> getsum = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>sumulations ==<span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sumulations = new <span class="kw4">float</span> <span class="br0">&#91;</span>Probabilities.<span class="me1">Length</span> + <span class="nu0">1</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>; i &lt; Probabilities.<span class="me1">Length</span>; i++<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sumulations <span class="br0">&#91;</span>i<span class="br0">&#93;</span> &nbsp;= getsum;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getsum += Probabilities <span class="br0">&#91;</span>i<span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sumulations <span class="br0">&#91;</span>sumulations.<span class="me1">Length</span><span class="nu0">-1</span><span class="br0">&#93;</span> &nbsp;= getsum; <span class="co1">//add this last value in&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getsum = sumulations <span class="br0">&#91;</span>sumulations.<span class="me1">Length</span><span class="nu0">-1</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//get a percentage using nextDouble. we use doubles, just in case the probabilities array uses rather large numbers to attempt to prevent</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//abberations as a result of floating point errors.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">double</span> usepercentage = rgen.<span class="me1">NextDouble</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//convert this percentage into a value we can use, that corresponds to the sum of float values:</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> searchtotal = <span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span><span class="br0">&#40;</span>usepercentage * getsum<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//now find the corresponding index and return the corresponding value in the items array.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>; i &lt; Probabilities.<span class="me1">Length</span>; i++<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>searchtotal &gt; sumulations <span class="br0">&#91;</span>i<span class="br0">&#93;</span> &nbsp;&amp;&amp; searchtotal &lt; sumulations <span class="br0">&#91;</span>i + <span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> items <span class="br0">&#91;</span>i<span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">default</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>A lot of the above could even be implemented as Extension methods to the appropriate classes, making it seamless.</p>
<p>Since I am working on a game, dealing with vectors and speeds and whatnot is common. One frequent requirement is for items to move at a random angle at a random speed within a given range. The obvious base case here is creating a Vector given a angle and a magnitude:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;public <span class="kw4">static</span> PointF GetVelocity<span class="br0">&#40;</span><span class="kw4">double</span> speed, <span class="kw4">double</span> angle<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> new PointF<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span><span class="br0">&#40;</span>Math.<span class="me1">Cos</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span> * speed<span class="br0">&#41;</span>, <span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span><span class="br0">&#40;</span>Math.<span class="me1">Sin</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span> * speed<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p> This uses standard trigonometry to calculate what would be the X and Y axes of a fictitious triangle with the given direction as it&#8217;s hypoteneuse. Extending from this, we simply create a few extra routines that perform the randomizations:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public <span class="kw4">static</span> PointF GetRandomVelocity<span class="br0">&#40;</span><span class="kw4">double</span> minspeed, <span class="kw4">double</span> maxspeed, <span class="kw4">double</span> angle<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> GetRandomVelocity<span class="br0">&#40;</span>minspeed,maxspeed,angle,new Random<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public <span class="kw4">static</span> PointF GetRandomVelocity<span class="br0">&#40;</span><span class="kw4">double</span> minspeed, <span class="kw4">double</span> maxspeed, <span class="kw4">double</span> angle, Random rgen<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> GetVelocity<span class="br0">&#40;</span>minspeed + <span class="br0">&#40;</span>rgen.<span class="me1">NextDouble</span><span class="br0">&#40;</span><span class="br0">&#41;</span> * <span class="br0">&#40;</span>maxspeed-minspeed<span class="br0">&#41;</span><span class="br0">&#41;</span>,angle<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public <span class="kw4">static</span> PointF GetRandomVelocity<span class="br0">&#40;</span><span class="kw4">double</span> minspeed, <span class="kw4">double</span> maxspeed, Random rgen<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> GetRandomVelocity<span class="br0">&#40;</span>minspeed,maxspeed, Math.<span class="me1">PI*</span><span class="nu0">2</span>*rgen.<span class="me1">NextDouble</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,rgen<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p> easy as 3.1415926! </p>
<p>Another interesting endeavour is simplifying the otherwise messy world of Object serialization, such as easily converting a Serializable Object to and from a Stream:</p>
<p> [code] </p>
<p>  public static void ObjectToStream&lt;T&gt;(T saveme, Stream outstream) where T : ISerializable</p>
<p>    {</p>
<p>        BinaryFormatter bf = getFormatter();</p>
<p>        using(GZipStream gz = new GZipStream(outstream,CompressionMode.Compress))</p>
<p>        {</p>
<p>            bf.Serialize(gz, saveme);</p>
<p>        }</p>
<p>    }</p>
<p>    public static T StreamToObject&lt;t&gt;(Stream instream) where T : ISerializable</p>
<p>    {</p>
<p>        BinaryFormatter bf = getFormatter();</p>
<p>        using(GZipStream gz = new GZipStream(instream,CompressionMode.Decompress))</p>
<p>        {</p>
<p>            return (T)bf.Deserialize(gz);</p>
<p>        }</p>
<p>    }</p>
<p> [/code] </p>
<p>This also plonks in a bit of compression through the use of a GZipStream.</p>
<p>Anyway, that&#8217;s a quick sampling of a few snippets of possible usefulness <img src='http://bc-programming.com/blogs/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2012/05/snippets/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bc-programming.com/blogs/2012/05/snippets/&via=BC_Programming&text=Snippets.&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div> <p><a href="http://bc-programming.com/blogs/?flattrss_redirect&amp;id=975&amp;md5=18c3d5fcfcf9cff1f4e1afe63ebea456" title="Flattr" target="_blank"><img src="http://bc-programming.com/blogs/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://bc-programming.com/blogs/2012/05/snippets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=bc_programming&amp;popout=1&amp;url=http%3A%2F%2Fbc-programming.com%2Fblogs%2F2012%2F05%2Fsnippets%2F&amp;language=en_GB&amp;category=software&amp;title=Snippets.&amp;description=Naturally%2C+as+we+write+programs+we+create+a+small+set+of+useful+functions.+BASeBlock+has+been+no+exception.+I%26%238217%3Bve+created+quite+a+few+functions+that+offer+generic+functionality+that+could...&amp;tags=.NET%2CC%23%2CChoose%2CClampValue%2CGenerics%2CIComparable%2CProgramming%2CSelect%2Cstatic%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Why I use INI Files, and a FormPositionSaver class</title>
		<link>http://bc-programming.com/blogs/2012/01/why-i-use-ini-files-and-a-formpositionsaver-class/</link>
		<comments>http://bc-programming.com/blogs/2012/01/why-i-use-ini-files-and-a-formpositionsaver-class/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 23:11:01 +0000</pubDate>
		<dc:creator>BC_Programming</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[GetWindowPlacement]]></category>
		<category><![CDATA[INIFile]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[SetWindowPlacement]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://bc-programming.com/blogs/?p=921</guid>
		<description><![CDATA[In some of my recent posts, I&#8217;ve covered the topic of accessing and parsing an INI file for configuration data in a C# Application. Some may wonder why. After all; the &#8220;norm&#8221; for C# and .NET applications is to use XML files for configuration information, isn&#8217;t it? Well, yes. But to be honest, XML files [...]]]></description>
			<content:encoded><![CDATA[<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2012/01/why-i-use-ini-files-and-a-formpositionsaver-class/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><p>
In some of my recent posts, I&#8217;ve covered the topic of accessing and parsing an INI file for configuration data in a C# Application.
 </p>
<p>
Some may wonder why. After all; the &#8220;norm&#8221; for C# and .NET applications is to use XML files for configuration information, isn&#8217;t it? Well, yes. But to be honest, XML files are a fucking pain in the ass. They aren&#8217;t human readable to your average person the same way an INI file is, and getting/setting values is tedious. Primarily, the reason I use INI files is that they are:</p>
<ol>
<li> Human Readable: Anybody can understand the basic structure of the sections and Name=Value syntax. </li>
<li> Accessible: You don&#8217;t need a special editor </li>
<li> Portable: since the entire thing is interpreted using Managed code, it will act the same on any platform (Mono or the MS CLR).
 </li>
</ol>
<p>
Mostly, I feel that XML, and in many ways other configuration options, are more or less driven by fad. Another option for configuration settings on Windows is the Registry, which is in fact often the recommended method; but this is anything but accessible to the user. Would you rather guide a user to edit a INI file or to fiddle with registry settings?
 </p>
<p>
With that said, INI Files do have their own issues. For example, their data is typically typeless; or, more precisely, the Values are all strings. Whereas using a .NET XML Serializer, for example, you could easily(relatively speaking) serialize and deserialize a special configuration class to and from an XML file and preserve it&#8217;s format, with my INI file class there will typically be some work to parse the values.
 </p>
<p>
It was with the idea of turning my string-only INIFile configuration settings into something that can be used for nearly any type that I created the INItemValueExtensions class, which is nothing more than a static class that provides some extension methods for the INIDataItem class. I covered this in my previous post.
 </p>
<p>
The prototypes for the two static functions are:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public <span class="kw4">static</span> T GetValue&lt;T&gt;<span class="br0">&#40;</span>this INIDataItem dataitem, T DefaultValue<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//and</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public <span class="kw4">static</span> <span class="kw4">void</span> SetValue&lt;T&gt;<span class="br0">&#40;</span>this INIDataItem dataitem, T newvalue<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>How would one use these extension methods? Well, here&#8217;s an Example:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public <span class="kw4">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><span class="kw4">String</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;args<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; INIFile loadini = new INIFile<span class="br0">&#40;</span><span class="st0">&quot;D:<span class="es0">\\</span>testini.ini&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; loadini <span class="br0">&#91;</span><span class="st0">&quot;Dates&quot;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#91;</span><span class="st0">&quot;TestDate&quot;</span><span class="br0">&#93;</span> .<span class="me1">SetValue</span><span class="br0">&#40;</span>DateTime.<span class="me1">Now</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; DateTime readvalue = loadini <span class="br0">&#91;</span><span class="st0">&quot;Dates&quot;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#91;</span><span class="st0">&quot;TestDate&quot;</span><span class="br0">&#93;</span> .<span class="me1">GetValue</span> &lt;datetime&gt; <span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;&lt;/datetime&gt; &nbsp;</div>
</li>
</ol>
</div>
<p>Woah, hold the phone! What&#8217;s going on here? We&#8217;re loading DateTime values directly from the INI File? How does that work?
 </p>
<p>All the &#8220;magic&#8221; happens in the getValue <t>  generic extension method. The first thing the routine does is check to see if the Type Parameter has a static TryParse() method; if it implements ISerializable and  <doesn 't>  have a TryParse method, than the routine will read the string from the INI file, decode it via Base64, and throw it in a MemoryStream, and then try to deserialize the Object Graph for a Type T using that stream.<br />
 </doesn>  </t>  </p>
<p>
If it does implement a TryParse() routine, (like, for example, DateTime) it doesn&#8217;t try quite as hard. It takes the string from the INI file and hands it to the Type&#8217;s TryParse() routine, and then returns what that gives back. Naturally, the inverse function (setValue) does something somewhat opposite; it checks the Base64 logic, and if so it sets the value of the item to the Base64 encoded value of the serialized object. Otherwise, it just uses toString().
 </p>
<p>
This typically works, particularly with DateTime, because usually ToString() is the inverse of TryParse(). In the case of DateTime, this has a few edge cases with regards to locale, but usually it works quite well. And more importantly, the introduction of allowing any object that implements ISerializable to simply be thrown as an INI value via a Base64 encoded string is useful too, although with large objects it&#8217;s probably not a good idea for obvious reasons.
 </p>
<p><h2> But&#8230; I still want to access other settings! </h2>
</p>
<p>
Of Course, an INIFile is only one of any number of ways to store/retrieve configuration settings. And while they don&#8217;t typically lend themselves to the same syntax provided by the INIFile class, it would be useful to have some sort of common denominator that can handle it all. That was the original intent of the relatively unassuming ISettingsStorage interface:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;public interface ISettingsStorage</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> Save<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> Load<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> AddValue<span class="br0">&#40;</span><span class="kw4">String</span> Category, <span class="kw4">String</span> ValueName, <span class="kw4">String</span> Value<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">String</span> GetValue<span class="br0">&#40;</span><span class="kw4">String</span> Category, <span class="kw4">String</span> ValueName<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>This uses a concept known as a &#8220;category&#8221; which is pretty much the same idea as an INI File section. What makes it different is that, for implementors that use other storage mechanisms, it could have additional meaning; for example, a fictitious XML implementation of ISettingsStorage could use the &#8220;Category&#8221; string as an XPath to an element; and the Value could be stored/retrieved as a Attribute. a Registry implementation might use it as a Registry path, and so on.
 </p>
<p>
The problem is, even though the INIFile class implements this interface, it&#8217;s too basic, and doesn&#8217;t provide nearly the  syntactic cleanliness that just using the INIFile does. Stemming from that, and because I wanted to try to get a way to store settings directly in a DB, I introduced two events to the INIFile class; one that fires when a Value is retrieved, and one when a value is saved. This way, the event could be hooked and the value saved elsewhere, If desired. Now, to be fair, this is mostly a shortcoming of my interface definition; as you can see above, there is no way to, for example, inspect category or Value names. I toyed with the idea of adding a &#8220;psuedo&#8221; category/value combination that would return a delimited string of category names, but that felt extremely silly. The creation of a generic interface- or abstract class- that provides all the conveniences I currently enjoy using my INIFile class but allowing me to also use XML, Registry, or nearly any other persistent storage for settings will be a long term goal. For now, I&#8217;m content with accessing INI files and having a unclean event to hack in my own behaviour.
 </p>
<p>
My first test of the above feature- whereby it allows values to be TryParse&#8217;d and ToString&#8217;d back and forth from a given type on the fly- was the creation of a FormPositionSaver class.
 </p>
<p>
The proper way to save and restore a window&#8217;s position on Windows is using the GetWindowPlacement() and SetWindowPlacement() API Functions.  These use a structure, named, quite aptly, &#8220;WINDOWPLACEMENT&#8221; to retrieve and set the window position and various attributes. Therefore, our first task is to create the proper P/Invoke&#8217;s for these functions:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#91;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;user32.dll&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">static</span> <span class="kw2">extern</span> <span class="kw4">int</span> OffsetRect<span class="br0">&#40;</span>ref RECT lpRect, <span class="kw4">int</span> x, <span class="kw4">int</span> y<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;<span class="br0">&#91;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;user32.dll&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">static</span> <span class="kw2">extern</span> <span class="kw4">int</span> GetWindowPlacement<span class="br0">&#40;</span>IntPtr hwnd, ref WINDOWPLACEMENT lpwndpl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#91;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;user32.dll&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">static</span> <span class="kw2">extern</span> <span class="kw4">int</span> SetWindowPlacement<span class="br0">&#40;</span>IntPtr hwnd, ref WINDOWPLACEMENT lpwndpl<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>I also include OffsetRect(), but I&#8217;ll get to that in a bit. Now the &#8220;big one&#8221; is the definition of the WINDOWPLACEMENT structure and it&#8217;s various aggregate structures. Why? well, in the interest of leveraging the INIFile&#8217;s static extensions, Why not define a static TryParse() and a toString() method on the structure that can set and retrieve the member values:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>StructLayout<span class="br0">&#40;</span>LayoutKind.<span class="me1">Sequential</span><span class="br0">&#41;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">struct</span> POINTAPI</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal <span class="kw4">int</span> x;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal <span class="kw4">int</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public POINTAPI<span class="br0">&#40;</span><span class="kw4">int</span> px, <span class="kw4">int</span> py<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = px;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y = py;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw4">void</span> TryParse<span class="br0">&#40;</span><span class="kw4">String</span> parseit, out POINTAPI result<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//format: (X,Y)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//strip out parens.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">String</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;parsed = parseit.<span class="me1">Replace</span><span class="br0">&#40;</span><span class="st0">&quot;(&quot;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>.<span class="me1">Replace</span><span class="br0">&#40;</span><span class="st0">&quot;)&quot;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>.<span class="me1">Split</span><span class="br0">&#40;</span>new <span class="kw4">char</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#123;</span><span class="st0">&#8216;,&#8217;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> kx = <span class="kw4">int</span>.<span class="me1">Parse</span><span class="br0">&#40;</span>parsed <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> ky = <span class="kw4">int</span>.<span class="me1">Parse</span><span class="br0">&#40;</span>parsed <span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result = new POINTAPI<span class="br0">&#40;</span>kx, ky<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">string</span> ToString<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;(&quot;</span> + x + <span class="st0">&quot;,&quot;</span> + y + <span class="st0">&quot;)&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>StructLayout<span class="br0">&#40;</span>LayoutKind.<span class="me1">Sequential</span><span class="br0">&#41;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">struct</span> RECT</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal <span class="kw4">int</span> Left;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal <span class="kw4">int</span> Top;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal <span class="kw4">int</span> Right;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal <span class="kw4">int</span> Bottom;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">string</span> ToString<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;{&quot;</span> + new POINTAPI<span class="br0">&#40;</span>Left, Top<span class="br0">&#41;</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + <span class="st0">&quot;-&quot;</span> + new POINTAPI<span class="br0">&#40;</span>Right, Bottom<span class="br0">&#41;</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + <span class="st0">&quot;}&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public RECT<span class="br0">&#40;</span><span class="kw4">int</span> pLeft, <span class="kw4">int</span> pTop, <span class="kw4">int</span> pRight, <span class="kw4">int</span> pBottom<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Left = pLeft;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Top = pTop;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Right = pRight;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Bottom = pBottom;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw4">void</span> TryParse<span class="br0">&#40;</span><span class="kw4">String</span> parsestr, out RECT result<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//strip out braces&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parsestr = parsestr.<span class="me1">Replace</span><span class="br0">&#40;</span><span class="st0">&quot;{&quot;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>.<span class="me1">Replace</span><span class="br0">&#40;</span><span class="st0">&quot;}&quot;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//split at &quot;)-(&quot;&#8230;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">String</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;Pointstrings = parsestr.<span class="me1">Split</span><span class="br0">&#40;</span>new <span class="kw4">string</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#123;</span><span class="st0">&quot;)-(&quot;</span><span class="br0">&#125;</span>, StringSplitOptions.<span class="me1">RemoveEmptyEntries</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; POINTAPI firstpoint, secondpoint;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//parse the resulting values. re-add the parens that were removed by the split.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; POINTAPI.<span class="me1">TryParse</span><span class="br0">&#40;</span>Pointstrings <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> &nbsp;+ <span class="st0">&quot;)&quot;</span>, out firstpoint<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; POINTAPI.<span class="me1">TryParse</span><span class="br0">&#40;</span><span class="st0">&quot;(&quot;</span> + Pointstrings <span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> , out secondpoint<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result = new RECT<span class="br0">&#40;</span>firstpoint.<span class="me1">y</span>, firstpoint.<span class="me1">y</span>, secondpoint.<span class="me1">x</span>, secondpoint.<span class="me1">y</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#91;</span>StructLayout<span class="br0">&#40;</span>LayoutKind.<span class="me1">Sequential</span><span class="br0">&#41;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">struct</span> WINDOWPLACEMENT</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal <span class="kw4">int</span> Length;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal <span class="kw4">int</span> flags;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal <span class="kw4">int</span> showCmd;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal POINTAPI ptMinPosition;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal POINTAPI ptMaxPosition;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; internal RECT rcNormalPosition;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">string</span> ToString<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw4">String</span>.<span class="me1">Join</span><span class="br0">&#40;</span><span class="st0">&quot;,&quot;</span>, new <span class="kw4">string</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; flags.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, showCmd.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ptMinPosition.<span class="me1">x</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, ptMinPosition.<span class="me1">y</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ptMaxPosition.<span class="me1">x</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, ptMaxPosition.<span class="me1">y</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rcNormalPosition.<span class="me1">Left</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, rcNormalPosition.<span class="me1">Top</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rcNormalPosition.<span class="me1">Right</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, rcNormalPosition.<span class="me1">Bottom</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//parsed a string into a WINDOWPLACEMENT structure.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> bool TryParse<span class="br0">&#40;</span><span class="kw4">String</span> parseme, out WINDOWPLACEMENT result<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">String</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;splitvalues = parseme.<span class="me1">Split</span><span class="br0">&#40;</span><span class="st0">&#8216;,&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;parsedvalues = new <span class="kw4">int</span> <span class="br0">&#91;</span>splitvalues.<span class="me1">Length</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>; i &lt; parsedvalues.<span class="me1">Length</span>; i++<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span>.<span class="me1">TryParse</span><span class="br0">&#40;</span>splitvalues <span class="br0">&#91;</span>i<span class="br0">&#93;</span> , out parsedvalues <span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result = new WINDOWPLACEMENT</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;flags = parsedvalues <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> ,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;showCmd = parsedvalues <span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> ,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ptMinPosition = new POINTAPI<span class="br0">&#40;</span>parsedvalues <span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span> , parsedvalues <span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> <span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ptMaxPosition = new POINTAPI<span class="br0">&#40;</span>parsedvalues <span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span> , parsedvalues <span class="br0">&#91;</span><span class="nu0">5</span><span class="br0">&#93;</span> <span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rcNormalPosition =</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new RECT<span class="br0">&#40;</span>parsedvalues <span class="br0">&#91;</span><span class="nu0">6</span><span class="br0">&#93;</span> , parsedvalues <span class="br0">&#91;</span><span class="nu0">7</span><span class="br0">&#93;</span> , parsedvalues <span class="br0">&#91;</span><span class="nu0">8</span><span class="br0">&#93;</span> , parsedvalues <span class="br0">&#91;</span><span class="nu0">9</span><span class="br0">&#93;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result = new WINDOWPLACEMENT<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>WHEW! that&#8217;s quite a bit of code for a structure definition, but we&#8217;ll make up for it with the brevity of the actual FormPositionSaver class itself. First, my design goal with this class was to make it basically do all the heavy lifting; it hooks both the Load and Unload event, and saves to and from a given INIFile Object in those events. Since the application I was working on at the time didn&#8217;t actually get a Valid INI object until during it&#8217;s main form&#8217;s Load event, and since there is no way to say &#8220;Invoke this event first no matter what&#8221; I also added a way for it to be told that hooking the load event would be pointless since it already occured, at which point it will not hook the event and instead set the form position immediately. Values are stored</p>
</pre>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public class FormPositionSaver</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; private Form FormObject = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private INIFile Configuration = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">static</span> readonly <span class="kw4">String</span> usesectionName = <span class="st0">&quot;WindowPositions&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &nbsp;&lt;summary&gt; </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// Create the FormPositionSaver</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &nbsp;&lt;/summary&gt; </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &nbsp;&lt;param name=&quot;FormObj&quot;&gt; Form to deal with &lt;/param&gt; </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &nbsp;&lt;param name=&quot;configfile&quot;&gt; INIFile to load and save &lt;/param&gt; </span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &nbsp;&lt;param name=&quot;alreadyloaded&quot;&gt; whether the Load event has fired. If true, will try to set the form position immediately. otherwise, it hooks the Load event and waits. &lt;/param&gt; </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public FormPositionSaver<span class="br0">&#40;</span>Form FormObj, INIFile configfile, bool alreadyloaded<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Configuration = configfile;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FormObject = FormObj;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FormObject.<span class="me1">FormClosed</span> += new FormClosedEventHandler<span class="br0">&#40;</span>FormObject_FormClosed<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!alreadyloaded<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FormObject.<span class="me1">Load</span> += new EventHandler<span class="br0">&#40;</span>FormObject_Load<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FormObject_Load<span class="br0">&#40;</span>FormObject, new EventArgs<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//save the placement...</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">void</span> FormObject_FormClosed<span class="br0">&#40;</span>object sender, FormClosedEventArgs e<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//save placement.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//all the &quot;tough work&quot; is handled above, and by the INIDataItem Extension methods. Here we</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//can simply use SetValue &lt;&gt; &nbsp;and set the value. Nice and clean.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WINDOWPLACEMENT grabplacement = new WINDOWPLACEMENT<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GetWindowPlacement<span class="br0">&#40;</span>FormObject.<span class="me1">Handle</span>, ref grabplacement<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Configuration <span class="br0">&#91;</span>usesectionName<span class="br0">&#93;</span> &nbsp;<span class="br0">&#91;</span>FormObject.<span class="me1">Name</span><span class="br0">&#93;</span> .<span class="me1">SetValue</span><span class="br0">&#40;</span>grabplacement<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Load event: load the form placement, if present, from the INI file we were given in our constructor.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">void</span> FormObject_Load<span class="br0">&#40;</span>object sender, EventArgs e<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WINDOWPLACEMENT currplacement = new WINDOWPLACEMENT<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GetWindowPlacement<span class="br0">&#40;</span>FormObject.<span class="me1">Handle</span>, ref currplacement<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//default is wherever it is now if there is a parse problem.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WINDOWPLACEMENT getplacement =</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Configuration <span class="br0">&#91;</span>usesectionName<span class="br0">&#93;</span> &nbsp;<span class="br0">&#91;</span>FormObject.<span class="me1">Name</span><span class="br0">&#93;</span> .<span class="me1">GetValue</span><span class="br0">&#40;</span>currplacement<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//check for previous instances, and offset if there are.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">String</span> thisproc = Process.<span class="me1">GetCurrentProcess</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">ProcessName</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Process <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;existing = Process.<span class="me1">GetProcessesByName</span><span class="br0">&#40;</span>thisproc<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>existing.<span class="me1">Length</span> &gt; <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//more than one, so offset...</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OffsetRect<span class="br0">&#40;</span>ref getplacement.<span class="me1">rcNormalPosition</span>, <span class="nu0">16</span>*existing.<span class="me1">Length</span>, <span class="nu0">16</span>*existing.<span class="me1">Length</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SetWindowPlacement<span class="br0">&#40;</span>FormObject.<span class="me1">Handle</span>, ref getplacement<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//load placement...</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>
Alright, so maybe I lied a bit. It's not super short. Although a lot of it is comments. Some might note that I only sporadically add doc comments, even though I ought to be adding them everywhere. Well, sue me. I just add them when I feel like it. When I'm concentrating on function, I'm not one to give creedence to form.
 </p>
<p>
This is where I explain OffsetRect(). Basically, if your application is run twice, and you load the form position twice, the second form will open over the first one, and the screen will look pretty much the same. So we detect previous instances and offset by an amount to make it's position different from any previous instances as necessary. That's pretty much the only purpose of OffsetRect.</p>
<p>
I have packaged the current versions of cINIFile.cs and the new FormPositionSaver.cs in a zip file, it can be downloaded from  <a href="http://bc-programming.com/downloads/files/positionsaver.zip"> here </a> .
 </p>
<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2012/01/why-i-use-ini-files-and-a-formpositionsaver-class/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bc-programming.com/blogs/2012/01/why-i-use-ini-files-and-a-formpositionsaver-class/&via=BC_Programming&text=Why I use INI Files, and a FormPositionSaver class&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div> <p><a href="http://bc-programming.com/blogs/?flattrss_redirect&amp;id=921&amp;md5=4f521bcf8d287e1266b23ce869b7b71d" title="Flattr" target="_blank"><img src="http://bc-programming.com/blogs/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://bc-programming.com/blogs/2012/01/why-i-use-ini-files-and-a-formpositionsaver-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=bc_programming&amp;popout=1&amp;url=http%3A%2F%2Fbc-programming.com%2Fblogs%2F2012%2F01%2Fwhy-i-use-ini-files-and-a-formpositionsaver-class%2F&amp;language=en_GB&amp;category=software&amp;title=Why+I+use+INI+Files%2C+and+a+FormPositionSaver+class&amp;description=In+some+of+my+recent+posts%2C+I%26%238217%3Bve+covered+the+topic+of+accessing+and+parsing+an+INI+file+for+configuration+data+in+a+C%23+Application.+Some+may+wonder+why.+After+all%3B...&amp;tags=.NET%2CC%23%2CGenerics%2CGetWindowPlacement%2CINIFile%2CSettings%2CSetWindowPlacement%2CTemplates%2Cblog" type="text/html" />
	</item>
		<item>
		<title>the illusion of Market Share and software</title>
		<link>http://bc-programming.com/blogs/2012/01/the-illusion-of-market-share-and-software/</link>
		<comments>http://bc-programming.com/blogs/2012/01/the-illusion-of-market-share-and-software/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 06:13:50 +0000</pubDate>
		<dc:creator>BC_Programming</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://bc-programming.com/blogs/?p=919</guid>
		<description><![CDATA[When speaking of browsers, Operating Systems, or various other pieces of technology, people will often speak of &#8220;market share&#8221;. I&#8217;ve always found it somewhat puzzling; the term Market share implies that the various selections are mutually exclusive. The thing is though, that simply isn&#8217;t the case Take Linux &#8220;market share&#8221; for example. I use windows, [...]]]></description>
			<content:encoded><![CDATA[<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2012/01/the-illusion-of-market-share-and-software/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><p>When speaking of browsers, Operating Systems, or various other pieces of technology, people will often speak of &#8220;market share&#8221;. I&#8217;ve always found it somewhat puzzling; the term Market share implies that the various selections are mutually exclusive. The thing is though, that simply isn&#8217;t the case</p>
<p>Take Linux &#8220;market share&#8221; for example. I use windows, as my primary OS, but I also use Linux on my laptop. Where do I fall? Who&#8217;s Market share do I increment? I use firefox usually as my browser, but I have Chrome, Opera, and IE installed. Does having them installed count towards market share? And if not, how often do I have to use them before they &#8220;count&#8221;, and who decides that?<br />
Basically, once people start bleating about market share, they&#8217;d lost grip with the facts. There is no &#8220;market share&#8221; anymore; it&#8217;s all about Mind Share.</p>
<p>&nbsp;</p>
<p>Anyway that&#8217;s a quick post from me. In other news I&#8217;ve got some additions to my INIFile.cs class (including a fix) that should make a juicy entry,too. </p>
<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2012/01/the-illusion-of-market-share-and-software/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bc-programming.com/blogs/2012/01/the-illusion-of-market-share-and-software/&via=BC_Programming&text=the illusion of Market Share and software&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div> <p><a href="http://bc-programming.com/blogs/?flattrss_redirect&amp;id=919&amp;md5=d646764eaf56bc27e254feecb7d2e406" title="Flattr" target="_blank"><img src="http://bc-programming.com/blogs/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://bc-programming.com/blogs/2012/01/the-illusion-of-market-share-and-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=bc_programming&amp;popout=1&amp;url=http%3A%2F%2Fbc-programming.com%2Fblogs%2F2012%2F01%2Fthe-illusion-of-market-share-and-software%2F&amp;language=en_GB&amp;category=software&amp;title=the+illusion+of+Market+Share+and+software&amp;description=When+speaking+of+browsers%2C+Operating+Systems%2C+or+various+other+pieces+of+technology%2C+people+will+often+speak+of+%26%238220%3Bmarket+share%26%238221%3B.+I%26%238217%3Bve+always+found+it+somewhat+puzzling%3B+the+term+Market+share+implies...&amp;tags=blog" type="text/html" />
	</item>
		<item>
		<title>A dynamic New Year&#8217;s Post</title>
		<link>http://bc-programming.com/blogs/2012/01/a-dynamic-new-years-post/</link>
		<comments>http://bc-programming.com/blogs/2012/01/a-dynamic-new-years-post/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 01:20:45 +0000</pubDate>
		<dc:creator>BC_Programming</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://bc-programming.com/blogs/?p=893</guid>
		<description><![CDATA[HAHA! How&#8217;s that for a clever title? Oh&#8230; well&#8230; ahem&#8230; nevermind. As a avid user of my own INIFile class, which I first write about- at least it&#8217;s C# implementation- in my parsing INI files posting , I am always looking for ways to improve it&#8217;s usage make it more &#8220;accessible&#8221;. Recently, I have been [...]]]></description>
			<content:encoded><![CDATA[<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2012/01/a-dynamic-new-years-post/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><p>HAHA! How&#8217;s that for a clever title?</p>
<p>Oh&#8230; well&#8230; ahem&#8230; nevermind.</p>
<p>As a avid user of my own INIFile class, which I first write about- at least it&#8217;s C# implementation- in my  <a href="http://bc-programming.com/blogs/2010/07/parsing-ini-files/"> parsing INI files posting </a> , I am always looking for ways to improve it&#8217;s usage make it more &#8220;accessible&#8221;.</p>
<p>Recently, I have been tasked (by way of my new title of &#8220;freelance consultant&#8221;) with creating several LOB (Line of Business) Type applications. Applications, naturally, have a tendency to lend their implementations to the creation and reading of settings. Being something of a fan of the simplicity of INI Files, I chose to use my INIFile class in the application. It works well, however, I have noticed that I have a lot of duplicate code. More specifically, I typically have to implement a &#8220;wrapper&#8221; class, which manages configuration information and reads/writes values to and from the INIFile as its own properties are accessed. For example:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> public bool PopulateUserOrderDropdown</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;get <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; bool tparse;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>bool.<span class="me1">TryParse</span><span class="br0">&#40;</span>OurINI <span class="br0">&#91;</span><span class="st0">&quot;Admin.Settings&quot;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#91;</span><span class="st0">&quot;PopulateUserOrderDropDown&quot;</span>,<span class="st0">&quot;false&quot;</span><span class="br0">&#93;</span> .<span class="me1">Value</span>,out tparse<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> tparse;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;set <span class="br0">&#123;</span> OurINI <span class="br0">&#91;</span><span class="st0">&quot;Admin.Settings&quot;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#91;</span><span class="st0">&quot;PopulateUserOrderDropDown&quot;</span><span class="br0">&#93;</span> .<span class="me1">Value</span>;<span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span> </div>
</li>
</ol>
</div>
<p>Nothing too dreadful, but imagine having nearly the exact same thing repeated a number of times! The code is repeated and as Larry Wall says, one of the traits of a good programmer is sloth. I don&#8217;t like having to write this same code over and over again! The INIFile is supposed to make it easy!</p>
<p>The trouble here stems from the fact that the INIFile values are only strings; and typically, many settings are represented in the application itself as integers and booleans, dates, and so forth. My first attempt to mitigate the clutter was a static method, which I called xParse:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> public <span class="kw4">static</span> class boolEx</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public <span class="kw4">static</span> bool xParse<span class="br0">&#40;</span><span class="kw4">String</span> Value, bool <span class="kw1">Default</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; bool parseresult;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>bool.<span class="me1">TryParse</span><span class="br0">&#40;</span>Value,out parseresult<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> parseresult;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">Default</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> </div>
</li>
</ol>
</div>
<p>relatively straightforward- basically it&#8217;s a shell of what I had repeated over and over again. This mitigated the issue somewhat, so my properties in the wrapper looked like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> public bool PopulateUserOrderDropdown</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;get <span class="br0">&#123;</span> <span class="kw1">return</span> boolEx.<span class="me1">xParse</span><span class="br0">&#40;</span>OurINI <span class="br0">&#91;</span><span class="st0">&quot;Admin.Settings&quot;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#91;</span><span class="st0">&quot;PopulateUserOrderDropDown&quot;</span>, <span class="st0">&quot;false&quot;</span><span class="br0">&#93;</span> .<span class="me1">Value</span><span class="br0">&#41;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;set <span class="br0">&#123;</span> OurINI <span class="br0">&#91;</span><span class="st0">&quot;Admin.Settings&quot;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#91;</span><span class="st0">&quot;PopulateUserOrderDropDown&quot;</span><span class="br0">&#93;</span> .<span class="me1">Value</span>;<span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span> </div>
</li>
</ol>
</div>
<p>much more managable, but still, could we not make this more concise? My first thought, was that perhaps I could eliminate the necessity of having the wrapper at all; I recalled two interfaces from my old COM programming days, specifically, IDispatch and IDispatchEx. Surely, I could do something similar?</p>
<p>Unfortunately, the interfaces are for COM, and C# doesn&#8217;t have dynamics until Version 4.</p>
<p>So, I fired up Visual Studio 2010 express to see if I couldn&#8217;t add the dynamic language constructs to the INIFile class; additionally, since I still need to work with .NET 3.5, I&#8217;ll add the new code as a conditional compilation.</p>
<p>The first step was deciding exactly what I wanted to happen. Imagine code like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> INIFile useINI = new INIFile<span class="br0">&#40;</span><span class="st0">&quot;settings.ini&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">String</span> ConnectionString = <span class="br0">&#40;</span><span class="kw4">String</span><span class="br0">&#41;</span>useINI.<span class="me1">General</span>.<span class="me1">ConnectionString</span>; </div>
</li>
</ol>
</div>
<p>The holy grail of the INIFile simplicity! Naturally, the .NET framework does provide the facility with which to add this functionality, as part of the System.Dynamic namespace.</p>
<p>The first step was deciding on the method by which to conditional compile. Since projects copy the source of a file to your project folder when you add them, it seemed reasonable to simply add it as a #define right inside the INIFile class itself.</p>
<pre> #define CS4 </pre>
<p>And now, I just need to enclose all my new happy stuff in a conditional directive, and I&#8217;ll get the best of both worlds- C# 4.0 consumers who keep the #define will be able to use the suave new feature, and older consumers will still be able to work without ripping apart the classes. The code to add this was surprisingly simple; as it stands now the longest method (An implementation of TryDeleteMember, which is never called from C#/VB.NET consumers, so is excessive for my usage). First, obviously we enclose the import statement in the conditional compile; the class headers are conditionally compiled as well, only deriving from DynamicObject with CS4 set.</p>
<p>The core of the new functionality is in the overrides to the Dynamic Object&#8217;s TryGetMember.</p>
<p>For the INISection:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> public override bool TryGetMember<span class="br0">&#40;</span>GetMemberBinder binder,out object result<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; result = this <span class="br0">&#91;</span>binder.<span class="me1">Name</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span> </div>
</li>
</ol>
</div>
<p>And for the INIFile&#8230;</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> public override bool TryGetMember<span class="br0">&#40;</span>GetMemberBinder binder,out object result<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; result = this <span class="br0">&#91;</span>binder.<span class="me1">Name</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span> </div>
</li>
</ol>
</div>
<p>Exactly the same, in fact. This works because of the indexer I added; the indexer will add the item if it doesn&#8217;t exist and return the new value, so even if the member name doesn&#8217;t exist, the INIFile will simply have that section added.</p>
<p>That&#8217;s for the retrieval of erements; to allow the assignment to them in the same fashion, we need to override TrySetMember(). In my case, this was a bit more involved, for flexibility purposes.</p>
<p>For example, code like INIFile.MainSection=&#8221;hello&#8221; should work, and change the name of the section. And why allow things like assignments from a Dictionary&lt;String, String&gt;, or maybe even a list (assigning a numbered id to set values)? And of course allow setting the Value directly, which will likely use the indexer much as I did for the TryGet&#8230; Implementations.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; public override bool TrySetMember<span class="br0">&#40;</span>SetMemberBinder binder, object value<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//if it is a dataitem, set it directly.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>value is INIDataItem<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this <span class="br0">&#91;</span>binder.<span class="me1">Name</span><span class="br0">&#93;</span> &nbsp;= <span class="br0">&#40;</span>INIDataItem<span class="br0">&#41;</span>value;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>value is Tuple&lt;, Object&gt;<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tuple&lt;, Object&gt; theTuple = <span class="br0">&#40;</span>Tuple&lt;, Object&gt;<span class="br0">&#41;</span>value;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; INIDataItem getitem = this <span class="br0">&#91;</span>binder.<span class="me1">Name</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getitem.<span class="me1">Name</span> = theTuple.<span class="me1">Item1</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getitem.<span class="me1">Value</span> = theTuple.<span class="me1">Item2</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>value is Tuple&lt;, String&gt;<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tuple&lt;, Object&gt; theTuple = <span class="br0">&#40;</span>Tuple&lt;, Object&gt;<span class="br0">&#41;</span>value;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; INIDataItem getitem = this <span class="br0">&#91;</span>binder.<span class="me1">Name</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getitem.<span class="me1">Name</span> = theTuple.<span class="me1">Item1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getitem.<span class="me1">Value</span> = theTuple.<span class="me1">Item2</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>value is KeyValuePair&lt;, Object&gt;<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Allow a KeyValuePair&lt;,Object&gt; to be passed to set Name and Value.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; KeyValuePair&lt;, Object&gt; castedval = <span class="br0">&#40;</span>KeyValuePair&lt;, Object&gt;<span class="br0">&#41;</span>value;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; INIDataItem getitem = this <span class="br0">&#91;</span>binder.<span class="me1">Name</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getitem.<span class="me1">Name</span> = castedval.<span class="me1">Key</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getitem.<span class="me1">Value</span> = castedval.<span class="me1">Value</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>value is KeyValuePair&lt;, String&gt;<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Allow a KeyValuePair&lt;,String&gt; to be passed to set Name and Value.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; KeyValuePair&lt;, String&gt; castedval = <span class="br0">&#40;</span>KeyValuePair&lt;, String&gt;<span class="br0">&#41;</span>value;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; INIDataItem getitem = this <span class="br0">&#91;</span>binder.<span class="me1">Name</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getitem.<span class="me1">Name</span> = castedval.<span class="me1">Key</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getitem.<span class="me1">Value</span> = castedval.<span class="me1">Value</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this <span class="br0">&#91;</span>binder.<span class="me1">Name</span><span class="br0">&#93;</span> .<span class="me1">Value</span> = value.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> </div>
</li>
</ol>
</div>
<p>setting the Value should be equally flexible; since we can, why not?<br />
for example, why not make the following &#8220;legal&#8221;?</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> INIFile.<span class="me1">Section</span>.<span class="me1">Value</span>=<span class="st0">&quot;newvalue&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">INIFile.<span class="me1">Section</span>.<span class="me1">Value</span>=DateTime.<span class="me1">Now</span>;</div>
</li>
<li class="li1">
<div class="de1">INIFile.<span class="me1">Section</span>.<span class="me1">Value</span>=Tuple.<span class="me1">Create</span><span class="br0">&#40;</span><span class="st0">&quot;NewName&quot;</span>,<span class="st0">&quot;Chicken&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">INIFile.<span class="me1">Section</span>.<span class="me1">Value</span>=Tuple.<span class="me1">Create</span><span class="br0">&#40;</span><span class="st0">&quot;NewName&quot;</span>,DateTime.<span class="me1">Now</span><span class="br0">&#41;</span>; </div>
</li>
</ol>
</div>
<p>The first example sets the Value to a string, the second sets it to a DateTime that is silently casted to a String (using toString(), and the last two use the new C# 4.0 tuples, to set both the name of the value and the value simultaneously.</p>
<p>A more elegant solution would be to add this code to the Indexer, and merely call the indexer with the name and the value and return true if no exception occurs and false otherwise. However, I&#8217;m reluctant to go that route since some of the types are C# 4 types (Tuples).</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; public override bool TrySetMember<span class="br0">&#40;</span>SetMemberBinder binder, object value<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>value is <span class="kw4">String</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this <span class="br0">&#91;</span>binder.<span class="me1">Name</span><span class="br0">&#93;</span> .<span class="me1">Name</span> = <span class="br0">&#40;</span><span class="kw4">String</span><span class="br0">&#41;</span>value;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>value is List&lt;INIItem&gt;<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; INISection getsection = this <span class="br0">&#91;</span>binder.<span class="me1">Name</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getsection.<span class="me1">INIItems</span> = <span class="br0">&#40;</span>List&lt;INIItem&gt;<span class="br0">&#41;</span>value;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> </div>
</li>
</ol>
</div>
<p>So Now, I&#8217;ve got an INI File implementation that supports Dynamic invocation. Well, that&#8217;s great&#8230; except that the application I first found it clumsy in is using .NET 3.5, so I can&#8217;t use the dynamic features. Back at square one.</p>
<p>In C# 2008/3, we might not be able to leverage the power of dynamics, but we do have generics and Extension methods at our disposal. a feasible alternative could be to add a extension method to the INIDataItem class that has a generic type parameter that it will attempt to convert it&#8217;s string Value into. First, using ChangeType, second, it can try to invoke a static TryParse on the given Type to parse the &#8220;value&#8221; string. And if none of that works, it can return a passed in default. This is still more verbose than the dynamic solution, but it has two distinct advantages- first, it&#8217;s type-safe, so you get all the intellisense goodness, and second, it&#8217;s still shorter than the alternative.</p>
<p>Here is the code, which can be found in the cINIFile.cs file attached to this posting as well.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; public <span class="kw4">static</span> class INItemValueExtensions</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//extensions for INIDataItem</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//normally, INIDataItem is a Name/Value Pair; More Specifically, because of the way INI files are, they are</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//naturally typeless. However, most configuration options are mapped to a different type by the application.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//and I&#8217;ve found it to be a gigantic pain to have to write the same TryParse() handling code over and over.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//so I added these handy extensions to the INIDataItem class, which provide some functions for setting.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//I keep them out of the main code simply because that way it doesn&#8217;t clutter it up. It&#8217;s already cluttered enough as-is.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// Attempts to use Convert.ChangeType() to change the Value of this INIDataItem to the specified type parameter.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// If this fails, it will attempt to call a static &quot;TryParse(String, out T)&quot; method on the generic type parameter.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// If THAT fails, it will return the passed in DefaultValue parameter.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;/summary&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;typeparam name=&quot;T&quot;&gt;Parameter Type to retrieve and act on in Static context.&lt;/typeparam&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;dataitem&quot;&gt;INIDataItem instance whose value is to be parsed to the given type.&lt;/param&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;DefaultValue&quot;&gt;Default value to return&lt;/param&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;returns&gt;Result of the parse/Conversion, or the passed in DefaultValue&lt;/returns&gt;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> T GetValue&lt;T&gt;<span class="br0">&#40;</span>this INIDataItem dataitem, T DefaultValue<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Generic method, attempts to call a static &quot;TryParse&quot; argument on the given class type, passing in the dataitem&#8217;s value.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>T<span class="br0">&#41;</span>Convert.<span class="me1">ChangeType</span><span class="br0">&#40;</span>dataitem.<span class="me1">Value</span>, typeof<span class="br0">&#40;</span>T<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch <span class="br0">&#40;</span>InvalidCastException ece<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//attempt to call TryParse. on the static class type.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//TryParse(String, out T)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Type usetype = typeof<span class="br0">&#40;</span>T<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T result = <span class="kw1">default</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Object <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;passparams = new object <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#123;</span> dataitem.<span class="me1">Value</span>, result <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool tpresult = <span class="br0">&#40;</span>bool<span class="br0">&#41;</span>usetype.<span class="me1">InvokeMember</span><span class="br0">&#40;</span><span class="st0">&quot;TryParse&quot;</span>, BindingFlags.<span class="kw4">Static</span>, <span class="kw2">null</span>, <span class="kw2">null</span>, passparams<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>tpresult<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//tryparse succeeded!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>T<span class="br0">&#41;</span>passparams <span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> ; <span class="co1">//second index was out parameter&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch <span class="br0">&#40;</span>Exception xx<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//curses&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> DefaultValue;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> DefaultValue;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// Logical inverse of the getValue routine&#8230; a bit faster to implement&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;/summary&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;typeparam name=&quot;T&quot;&gt;&lt;/typeparam&gt;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;dataitem&quot;&gt;&lt;/param&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;newvalue&quot;&gt;&lt;/param&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw4">void</span> setValue&lt;T&gt;<span class="br0">&#40;</span>this INIDataItem dataitem, T newvalue<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dataitem.<span class="me1">Value</span> = newvalue.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">static</span> <span class="kw4">void</span> GetTypeDefault&lt;T&gt;<span class="br0">&#40;</span>out T result<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Type tt = typeof<span class="br0">&#40;</span>T<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//basic idea: call default, empty constructor using reflection.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ConstructorInfo defaultconstructor = tt.<span class="me1">GetConstructor</span><span class="br0">&#40;</span>new Type <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#123;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result = <span class="br0">&#40;</span>T<span class="br0">&#41;</span>defaultconstructor.<span class="me1">Invoke</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>And there you have it, a bunch of awesome additions. INI files are often thought of as deprecated, but that&#8217;s only the INIFile functions. This class was designed because working with the registry makes it difficult to test properly, and because JSON,YAML, and many other formats are excessively complicated. when you just need a few basic settings, all you need is the clean, simple format of a INI file. And now, with these additions, code for reading from  those INI files is clean and simple as well!</p>
<p> <a href="http://bc-programming.com/downloads/code/cINIFile.cs"> The Source- cINIFile.cs </a> </p>
<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2012/01/a-dynamic-new-years-post/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bc-programming.com/blogs/2012/01/a-dynamic-new-years-post/&via=BC_Programming&text=A dynamic New Year's Post&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div> <p><a href="http://bc-programming.com/blogs/?flattrss_redirect&amp;id=893&amp;md5=6f7b1578e4bf6396caa8a9a9cbcd14b9" title="Flattr" target="_blank"><img src="http://bc-programming.com/blogs/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://bc-programming.com/blogs/2012/01/a-dynamic-new-years-post/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=bc_programming&amp;popout=1&amp;url=http%3A%2F%2Fbc-programming.com%2Fblogs%2F2012%2F01%2Fa-dynamic-new-years-post%2F&amp;language=en_GB&amp;category=software&amp;title=A+dynamic+New+Year%26%238217%3Bs+Post&amp;description=HAHA%21+How%26%238217%3Bs+that+for+a+clever+title%3F+Oh%26%238230%3B+well%26%238230%3B+ahem%26%238230%3B+nevermind.+As+a+avid+user+of+my+own+INIFile+class%2C+which+I+first+write+about-+at+least+it%26%238217%3Bs+C%23+implementation-...&amp;tags=blog" type="text/html" />
	</item>
		<item>
		<title>An Extension to the GenericListViewSorter class</title>
		<link>http://bc-programming.com/blogs/2011/12/an-extension-to-the-genericlistviewsorter-class/</link>
		<comments>http://bc-programming.com/blogs/2011/12/an-extension-to-the-genericlistviewsorter-class/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 22:05:28 +0000</pubDate>
		<dc:creator>BC_Programming</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Context Menu]]></category>
		<category><![CDATA[ContextMenuStrip]]></category>
		<category><![CDATA[Delegates]]></category>
		<category><![CDATA[Hooks]]></category>
		<category><![CDATA[Listview]]></category>
		<category><![CDATA[ListView Sorting]]></category>
		<category><![CDATA[MenuStrips]]></category>

		<guid isPermaLink="false">http://bc-programming.com/blogs/?p=886</guid>
		<description><![CDATA[As I posted previously here , Sorting a Listview can be something of a pain in the butt. In that article, I covered some basics on providing a class that would essentially give you sorting capabilities for free, without all the messy code that would normally be required. A lot of the code required for [...]]]></description>
			<content:encoded><![CDATA[<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2011/12/an-extension-to-the-genericlistviewsorter-class/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><p>As I posted previously  <a href="http://bc-programming.com/blogs/2011/12/the-windows-listview-sorting/"> here </a> , Sorting a Listview can be something of a pain in the butt.</p>
<p>
In that article, I covered some basics on providing a class that would essentially give you sorting capabilities for free, without all the messy code that would normally be required. A lot of the code required for sorting is mostly boilerplate with a few modifications for sorting various types. As a result, the generic implementation works rather well.
 </p>
<p>
However, as with any class, adding features never hurts. In this case, I got to thinking- why not have right-clicking the ColumnHeaders show a menu for sorting against that Column? Seems simple enough. I quickly learned that apparent simplicity often is misattributed.
 </p>
<p>
I faced several issues. The first thought was that I could hook a Mouse event for Right-Clicking a column header. Unfortunately, I soon discovered two facts about the .NET ListView control. First, was that there was no event for right-clicking a header control. Second, no even was fired at all by the ListView control when you right-clicked a header.
 </p>
<p>This left me stymied. How the heck do I implement this feature? I discovered something of a &#8220;hack&#8221; however, in that when the ListView&#8217;s ContextMenuStrip property is set, that ContextMenu Strip will be shown regardless of the location the ListView is clicked. This at least gave me something to work with. Since a ContextMenuStrip&#8217;s &#8220;Opening&#8221; event can be easily hooked, we can use that as an entry point and perform needed calculations to determine if we are indeed on a columnheader.</p>
<p>
Which brings me to the next problem, which is determining when a columnheader was in fact the item that was clicked. This requires determining the rectangle the Header control occupies, first. The Header Control is a child control of the ListView; as such, a platform Invoke using the EnumChildWindows() API was required, something like this:</p>
<pre language="C#">
private Rectangle _HeaderRect;
private delegate bool EnumWindowsCallBack(IntPtr hwnd,IntPtr lparam);
 [DllImport("user32.dll")]
private static extern int EnumChildWindows(IntPtr hwndParent,EnumWindowCallBack callbackFunction,IntPtr lParam);
 [DllImport("user32.dll"]
private static extern bool GetWindowRect(IntPtr hWnd,out RECT lpRect);

 [StructLayout(LayoutKind.Sequential)]
private struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;

}

private bool EnumWindowCallback(IntPtr hwnd, IntPtr lParam)
{
    RECT rct;
    if(!GetWindowRect(hwnd,out rct))
    {
    //first child of the listview should be the header control
    _HeaderRect=Rectangle.Empty; //likely the listview is not in Details mode, so there is no header control.
    }
    else
    {
        _HeaderRect = new Rectangle(rct.Left,rct.Top,rct.Right-rct.Left,rct.Bottom-rct.Top);
    }
    return false; //cancel enumeration.
}
private static ColumnHeader []  GetOrderedHeaders(ListView lvw)
{
    ColumnHeader []  returnarray = new ColumnHeader [lvw.Columns.Count] ;
    foreach(ColumnHeader loopheader in lvw.Columns)
    {
        returnarray [loopheader.DisplayIndex]  = loopheader;

    }
    return returnarray;
}
 </pre>
<p>Quite a bit of boilerplate to add in. Basically, the idea is that we will hook the contextMenu Opening event of the Listview, (and we add a context menu to hook if the listview in fact doesn&#8217;t have one) in our constructor;  and then when we receive the event we need to determine if the click occured within the area of the header control of the listview, if so, we cancel the event (which stops the default context menu from appearing) and show our own menu for the columnheader, which we can acquire using a bit of math and the static &#8220;GetOrderedHeaders&#8221; function, which retrieves the array of columnheaders of a ListView in order of appearance Left to Right (since the user could rearrange the Columns).</p>
<p>So First, we need to add code to the GenericListViewSorter&#8217;s Constructor. We also have a few private variables that are added; in this case, we need a ContextMenuStrip variable called &#8220;_ghostStrip&#8221; which we will use if we need to create a context menu for the control, since we don&#8217;t want that to appear in the default case. Of course we create our own ContextMenuStrip which we will show in the event instead of the default when appropriate.  so we add this beneath the existing code in the constructor:</p>
<pre language="C#">
    if(handleListView.ContextMenuStrip==null)
    {
        handleListView.ContextMenuStrip = new ContextMenuStrip();
        handleListView.ContextMenuStrip.Items.Add("GHOST"); //add a ghost item so we get the Opening Event
        _ghoststrip = handleListView.ContextMenuStrip;
}

//create OUR context menu
_headerContextMenuStrip = new ContextMenuStrip();
//add a ghost item to make sure Opening will fire.
_HeaderContextMenuStrip.Items.Add("ghost");
handleListView.ContextMenuStrip.Opening += ContextMenuStrip_Opening;
handleListView.ContextMenuStripChanged += handleListView_ContextMenuStripChanged;
</pre>
<p>Of course we need to add the two referenced event handlers, too. The ContextMenuStripChanged being a rather simple implementation designed to keep changes in the contextmenu of the listview from causing us to balls up and stop showing ours (since we are now hooking a orphaned context menu not being shown by the listview).</p>
<pre language="C#">
void handleListView_ContextMenuStripChanged(object sender,EventArgs e)
{
    OurListView.ContextMenuStrip.Opening+=ContextMenuStrip_Opening;
}
 </pre>
<p>Now the meat of the code is in the ContextMenuStrip_Opening() routine. This will need to determine wether its applicable to show the Column menu, or the already present menu (which it doesn&#8217;t show either if it happens to be the _ghoststrip). This is accomplished by use of the GetCursorPos() API routine paired with the already present GetWindowRect() implementation, which we update by calling EnumWindows.</p>
<pre language="C#">
void ContextMenuStrip_Opening(object sender,System.ComponentModel.CancelEventArgs e)
{
    //first, get screen coordinates of Cursor.
    POINTAPI gapi;
    GetCursorPos(out gapi);

    Point gotposition = new Point(gapi.X,gapi.Y);

    //acquire the HeaderRect of the control...
    EnumChildWindows(OurListView.Handle,new EnumWindowCallBack(EnumWindowCallback),IntPtr.Zero);
    //if the mouse position is within the retrieved rectangle, cancel the display of the normal menu and create and show ours.
    if(_HeaderRect.Contains(gotposition))
    {
        e.Cancel=true;
        int xoffset = gotposition.X - _HeaderRect.Left;
        ColumnHeader clickedheader = HeaderAtOffset(OurListView,xoffset);

        if(clickedheader != null)
        {
        //create the context menu as needed.
        _HeaderContextMenuStrip = new ContextMenuStrip();
        _HeaderContextMenuStrip.Tag = clickedheader;
        //two items, one for ascending order, one for descending order.
        ToolStripMenuItem AscendingHeaderItem = new ToolStripMenuItem(String.Format("Sort Column \"{0}\" Ascending",clickedheader.Text));
        ToolStripMenuItem DescendingHeaderItem = new ToolStripMenuItem(String.Format("Sort Column \"{1}\" Descending",clickedheader.Text));

        //if the current sort column is the header, check it off and disable it.

        if(CurrentSortColumn == clickedheader)
        {
            if(OurListView.Sorting ==SortOrder.Ascending)
            {
                AscendingHeaderItem.Checked=true;
                AscendingHeaderItem.Enabled=false;
            }
            else if (OurListView.Sorting==SortOrder.Descending)
            {
              DescendingHeaderItem.Checked=true;
              DescendingHeaderItem.Enabled=false;
            }   

        }
        AscendingHeaderItem.Tag = ClickedHeader;
        DescendingHeaderItem.Tag = ClickedHeader;
        //set event handlers for the two items.
        AscendingHeaderItem.Click+= AscendingHeaderItem_Click;
        DescendingHeaderItem.Click+= DescendingHeaderItem_Click;
        //add them to the context menu strip.
        _HeaderContextMenuStrip.Items.Add(AscendingHeaderItem);
        _HeaderContextMenuStrip.Items.Add(DescendingHeaderItem);
        //display the menu.
        _HeaderContextMenuStrip.Show(gotposition);
        }
   }
   else
   {
       //show the default menu, but only if it isn't the ghoststrip.
       if(OurListView.ContextMenuStrip == _ghoststrip)
           e.Cancel=true;

   }   

}
</pre>
<p>
The events for the two buttons basically sort based on the columnheader in their tag, nothing particularly special there. the actual details can be seen in the  <a href="http://bc-programming.com/downloads/GenericListViewSorter.cs">  source file </a>  itself, really.
 </p>
<p>
It actually works quite well, I&#8217;m using it in a production application, and it&#8217;s working quite well.
 </p>
<p>
Some obvious enhancements, of course, include making it possible to customize the shown menu, to present other options; perhaps a delegate or event that can be hooked that is given the Strip and the clicked column, and any number of other parameters? This would essentially give the equivalent of a ColumnHeaderRightClicked type event, too. </p>
<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2011/12/an-extension-to-the-genericlistviewsorter-class/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bc-programming.com/blogs/2011/12/an-extension-to-the-genericlistviewsorter-class/&via=BC_Programming&text=An Extension to the GenericListViewSorter class&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div> <p><a href="http://bc-programming.com/blogs/?flattrss_redirect&amp;id=886&amp;md5=f610c1fadfa8325db797201378775dae" title="Flattr" target="_blank"><img src="http://bc-programming.com/blogs/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://bc-programming.com/blogs/2011/12/an-extension-to-the-genericlistviewsorter-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=bc_programming&amp;popout=1&amp;url=http%3A%2F%2Fbc-programming.com%2Fblogs%2F2011%2F12%2Fan-extension-to-the-genericlistviewsorter-class%2F&amp;language=en_GB&amp;category=software&amp;title=An+Extension+to+the+GenericListViewSorter+class&amp;description=As+I+posted+previously+here+%2C+Sorting+a+Listview+can+be+something+of+a+pain+in+the+butt.+In+that+article%2C+I+covered+some+basics+on+providing+a+class+that...&amp;tags=C%23%2CContext+Menu%2CContextMenuStrip%2CDelegates%2CHooks%2CListview%2CListView+Sorting%2CMenuStrips%2CProgramming%2Cblog" type="text/html" />
	</item>
		<item>
		<title>The Windows ListView: Sorting</title>
		<link>http://bc-programming.com/blogs/2011/12/the-windows-listview-sorting/</link>
		<comments>http://bc-programming.com/blogs/2011/12/the-windows-listview-sorting/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 04:24:59 +0000</pubDate>
		<dc:creator>BC_Programming</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Listview]]></category>
		<category><![CDATA[Twilight Sparkle]]></category>
		<category><![CDATA[Windows 95]]></category>
		<category><![CDATA[Windows Explorer]]></category>

		<guid isPermaLink="false">http://bc-programming.com/blogs/?p=876</guid>
		<description><![CDATA[Anybody who has used windows is probably familiar with the ListView control. It is used in Windows Explorer; it is even used for the desktop. Heck, the ListView control even has implementations on Linux and Mac, and in the latter case it was there first. The ListView itself can display in several modes. Normally, it [...]]]></description>
			<content:encoded><![CDATA[<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2011/12/the-windows-listview-sorting/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><p>Anybody who has used windows is probably familiar with the ListView control. It is used in Windows Explorer; it is even used for the desktop. Heck, the ListView control even has implementations on Linux and Mac, and in the latter case it was there first.</p>
<p>The ListView itself can display in several modes. Normally, it shows things as Icons. But it can also be set to show Small Icons, a List, in some Operating Systems, there is a &#8216;Tile&#8217; option, or even options like Large,Medium, and other sizes of Icons. My Personal favourite is the details mode.</p>
<div id="attachment_877" class="wp-caption alignleft" style="width: 310px">  <a href="http://bc-programming.com/blogs/wp-content/uploads/2011/12/Win95details.png">  <img class="size-medium wp-image-877" title="Windows 95 Explorer in Details mode" src="http://bc-programming.com/blogs/wp-content/uploads/2011/12/Win95details-300x146.png" alt="" width="300" height="146" />  </a>  <p class="wp-caption-text">HA! Bet you didn&#39;t expect me to use an image from Windows 95! Expect the unexpected, chaps.</p></div>
<p>Because I mostly see and use Listviews in Details mode, I also force people who use my software to deal with Details mode. Mostly because the reason I am displaying a ListView is to show some data in a somewhat tabular format and not just give them a few icons to drag around with minimal actual information, but I digress. Anyway, I think a good question at this point might be to look at what different parts this particular ListView has. First, the gray &#8220;buttons&#8221; at the top, which serve to title each column, are referred to affectionately as ColumnHeaders. Under each ColumnHeader there is data for a given &#8220;subitem&#8221; of each item. For example, the &#8220;Size&#8221; entry here is a Subitem for each drive. An interesting feature of columnheaders that is nearly universal is that you can click on one, and it will sort by that column.</p>
<p>Another interesting thing, is that in many programming environments, the ListView control doesn&#8217;t actually provide this feature for you, and you have to code it yourself. It is rather frustrating. In particular, Visual Basic 6 allows you to sort, but you can&#8217;t really customize what you sort by; it always treats it as text. In one of my VB6 applications, BCSearch (which is available for download from my  <a href="http://bc-programming.com/?page=downloads"> Downloads </a> page) I managed to use a Custom control, available from VBAccelerator.com, which exposes additional functionality of the ListView Control on top of that provided in either of the MS provided libraries for use within Visual Basic. One of these features is that it has better support for sorting. I still had to add my own &#8220;arrow&#8221; to show the sort direction, though.</p>
<div id="attachment_878" class="wp-caption alignright" style="width: 160px">  <a href="http://bc-programming.com/blogs/wp-content/uploads/2011/12/BCSearch_sorted.png">  <img class="size-thumbnail wp-image-878" title="BCSearch Sorted" src="http://bc-programming.com/blogs/wp-content/uploads/2011/12/BCSearch_sorted-150x150.png" alt="" width="150" height="150" />  </a>  <p class="wp-caption-text">BCSearch showing results sorted by Size</p></div>
<p>The VBAccelerator control exposes a number of events and properties for controlling sorting, which I use to properly sort the various subitems, so that various entries like date or size aren&#8217;t sorted as text.</p>
<p>Curiously, the .NET Windows Forms ListView control, while having more functionality, still leaves a lot of effort to the programmer for what ideally ought to be a free feature supported by the OS. In fact it IS a free feature supported by the OS. Thankfully, the .NET control does in fact provide a feature for customizing sort functionality, And all you need is a class to implement IComparer. the IComparer will be used to compare the listitems as the Listview sorts. But if you have, say, Date and Time fields and size fields or other fields that can&#8217;t just be sorted as text, you are going to need to implement your own special comparer for each. This amounts to quite a bit of glue code; on top of that, you will need to handle the ColumnClick events on the ColumnHeader, change the sort mode, and sort it, and so forth. </p>
<p>To combat this bloating code, I wrote a relatively small class designed to encapsulate sorting. The idea being that you create a instance of this class for each listview, pass in the ListView to it&#8217;s constructor, and the class handles all the details. It worked quite well. There was a minor issue that amounted to a gigantic pain in the ass but at the same time made the result a lot better.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">using System;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Collections</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Collections</span>.<span class="me1">Generic</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Diagnostics</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">using System.<span class="me1">Drawing</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Linq</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Runtime</span>.<span class="me1">InteropServices</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Text</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Windows</span>.<span class="me1">Forms</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">namespace JobClockAdmin</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public <span class="kw4">static</span> class ListViewExtensions</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>System.<span class="me1">Runtime</span>.<span class="me1">InteropServices</span>.<span class="me1">StructLayout</span><span class="br0">&#40;</span>LayoutKind.<span class="me1">Sequential</span><span class="br0">&#41;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">struct</span> HDITEM</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">int</span> mask;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">int</span> cxy;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>System.<span class="me1">Runtime</span>.<span class="me1">InteropServices</span>.<span class="me1">MarshalAs</span><span class="br0">&#40;</span>UnmanagedType.<span class="me1">LPTStr</span><span class="br0">&#41;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">string</span> pszText;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public IntPtr hbm;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">int</span> cchTextMax;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">int</span> fmt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public IntPtr lParam;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// _WIN32_IE &gt;= 0&#215;0300 </span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">int</span> iImage;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">int</span> iOrder;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// _WIN32_IE &gt;= 0&#215;0500</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public uint type;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public IntPtr pvFilter;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// _WIN32_WINNT &gt;= 0&#215;0600</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public uint state;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>Flags<span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw2">enum</span> Mask</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Format = 0&#215;4, &nbsp;<span class="co1">// HDI_FORMAT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>Flags<span class="br0">&#93;</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw2">enum</span> Format</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SortDown = 0&#215;200, &nbsp; <span class="co1">// HDF_SORTDOWN</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SortUp = 0&#215;400, &nbsp; &nbsp; <span class="co1">// HDF_SORTUP</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">const</span> <span class="kw4">int</span> HDM_FIRST = 0&#215;1200;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">const</span> <span class="kw4">int</span> LVM_FIRST = 0&#215;1000;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">const</span> <span class="kw4">int</span> HDM_GETITEMCOUNT = <span class="br0">&#40;</span>HDM_FIRST + <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">const</span> <span class="kw4">int</span> HDM_SETITEM = <span class="br0">&#40;</span>HDM_FIRST + <span class="nu0">4</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">const</span> <span class="kw4">int</span> LVM_GETHEADER = <span class="br0">&#40;</span>LVM_FIRST + <span class="nu0">31</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">const</span> <span class="kw4">int</span> HDM_GETITEM = <span class="br0">&#40;</span>HDM_FIRST + <span class="nu0">3</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;user32.dll&quot;</span>, EntryPoint = <span class="st0">&quot;SendMessageA&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">static</span> <span class="kw2">extern</span> IntPtr SendMessage<span class="br0">&#40;</span>IntPtr hwnd, <span class="kw4">int</span> wMsg, IntPtr wParam, IntPtr lParam<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>System.<span class="me1">Runtime</span>.<span class="me1">InteropServices</span>.<span class="me1">DllImport</span><span class="br0">&#40;</span><span class="st0">&quot;user32.dll&quot;</span>, EntryPoint = <span class="st0">&quot;SendMessage&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw2">extern</span> IntPtr SendMessageHDITEM<span class="br0">&#40;</span>IntPtr hWnd, uint Msg, IntPtr wParam, ref HDITEM hdItem<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw4">void</span> SetSortIcon<span class="br0">&#40;</span>this System.<span class="me1">Windows</span>.<span class="me1">Forms</span>.<span class="me1">ListView</span> ListViewControl, <span class="kw4">int</span> ColumnIndex, System.<span class="me1">Windows</span>.<span class="me1">Forms</span>.<span class="me1">SortOrder</span> Order<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IntPtr ColumnHeader = SendMessage<span class="br0">&#40;</span>ListViewControl.<span class="me1">Handle</span>, LVM_GETHEADER, IntPtr.<span class="me1">Zero</span>, IntPtr.<span class="me1">Zero</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> ColumnNumber = <span class="nu0">0</span>; ColumnNumber &lt; = ListViewControl.<span class="me1">Columns</span>.<span class="me1">Count</span> &#8211; <span class="nu0">1</span>; ColumnNumber++<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IntPtr ColumnPtr = new IntPtr<span class="br0">&#40;</span>ColumnNumber<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HDITEM item = new HDITEM<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">mask</span> = <span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>HDITEM.<span class="me1">Mask</span>.<span class="me1">Format</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SendMessageHDITEM<span class="br0">&#40;</span>ColumnHeader, HDM_GETITEM, ColumnPtr, ref item<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<span class="br0">&#40;</span>Order == System.<span class="me1">Windows</span>.<span class="me1">Forms</span>.<span class="me1">SortOrder</span>.<span class="me1">None</span><span class="br0">&#41;</span> &amp;&amp; ColumnNumber == ColumnIndex<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>Order<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> System.<span class="me1">Windows</span>.<span class="me1">Forms</span>.<span class="me1">SortOrder</span>.<span class="me1">Ascending</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">fmt</span> &amp;= ~<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>HDITEM.<span class="me1">Format</span>.<span class="me1">SortDown</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">fmt</span> |= <span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>HDITEM.<span class="me1">Format</span>.<span class="me1">SortUp</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> System.<span class="me1">Windows</span>.<span class="me1">Forms</span>.<span class="me1">SortOrder</span>.<span class="me1">Descending</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">fmt</span> &amp;= ~<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>HDITEM.<span class="me1">Format</span>.<span class="me1">SortUp</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">fmt</span> |= <span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>HDITEM.<span class="me1">Format</span>.<span class="me1">SortDown</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">fmt</span> &amp;= ~<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>HDITEM.<span class="me1">Format</span>.<span class="me1">SortDown</span> &amp; ~<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>HDITEM.<span class="me1">Format</span>.<span class="me1">SortUp</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SendMessageHDITEM<span class="br0">&#40;</span>ColumnHeader, HDM_SETITEM, ColumnPtr, ref item<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; class GenericListViewSorter : IComparer</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private System.<span class="me1">Windows</span>.<span class="me1">Forms</span>.<span class="me1">ListView</span> OurListView;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//GetCompareValue: given a columnname and a ListViewItem, should return any more specific type.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//For example, if Column represents a date value, it would return a DateTime. </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public delegate Object GetCompareValue<span class="br0">&#40;</span>GenericListViewSorter Sorter, <span class="kw4">String</span> ColumnName, ListViewItem Item<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private GetCompareValue CompareValueFunc;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private ColumnHeader CurrentSortColumn = <span class="kw2">null</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private SortOrder <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;SortOrders = new SortOrder <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#123;</span> SortOrder.<span class="me1">None</span>,SortOrder.<span class="me1">Ascending</span>, SortOrder.<span class="me1">Descending</span> <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">String</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;SortOrderImageKey = new <span class="kw4">string</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;<span class="br0">&#123;</span><span class="st0">&quot;CLEAR&quot;</span>,<span class="st0">&quot;ASCENDING&quot;</span>,<span class="st0">&quot;DESCENDING&quot;</span> <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">int</span> CurrSortIndex = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; private Object GetCompareValue_Default<span class="br0">&#40;</span>GenericListViewSorter Sorter, <span class="kw4">String</span> ColumnName, ListViewItem Item<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//default just returns the String, for now. Later, add special conditions that detect when something is a valid date. Or something&#8230;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> indexuse = Sorter.<span class="me1">OurListView</span>.<span class="me1">Columns</span> <span class="br0">&#91;</span>ColumnName<span class="br0">&#93;</span> .<span class="me1">Index</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Item.<span class="me1">SubItems</span> <span class="br0">&#91;</span>indexuse<span class="br0">&#93;</span> .<span class="me1">Text</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public GenericListViewSorter<span class="br0">&#40;</span>ListView handleListView,GetCompareValue GetCompareRoutine<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OurListView = handleListView;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>GetCompareRoutine != <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CompareValueFunc = GetCompareRoutine;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CompareValueFunc = GetCompareValue_Default;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handleListView.<span class="me1">ColumnClick</span> += new ColumnClickEventHandler<span class="br0">&#40;</span>handleListView_ColumnClick<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> handleListView_ColumnClick<span class="br0">&#40;</span>object sender, ColumnClickEventArgs e<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//throw new NotImplementedException();</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//First thing is first: is this the same column that was clicked before?</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ColumnHeader clickedcolumn = OurListView.<span class="me1">Columns</span> <span class="br0">&#91;</span>e.<span class="me1">Column</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>CurrentSortColumn == <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CurrentSortColumn = clickedcolumn;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>CurrentSortColumn != clickedcolumn<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//if not, set the current sort Index to 0&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// CurrentSortColumn.ImageKey = &quot;CLEAR&quot;; //don&#8217;t want it to keep the image&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CurrentSortColumn = clickedcolumn;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//if it is the same, increment it and take the modulus&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CurrSortIndex = <span class="br0">&#40;</span>CurrSortIndex + <span class="nu0">1</span><span class="br0">&#41;</span> % <span class="br0">&#40;</span>SortOrders.<span class="me1">Length</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Debug.<span class="me1">Print</span><span class="br0">&#40;</span><span class="st0">&quot;CurrSortIndex:&quot;</span> + CurrSortIndex<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//CurrentSortColumn.ImageKey = SortOrderImageKey [CurrSortIndex] ;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OurListView.<span class="me1">Sorting</span> = SortOrders <span class="br0">&#91;</span>CurrSortIndex<span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OurListView.<span class="me1">SetSortIcon</span><span class="br0">&#40;</span>CurrentSortColumn.<span class="me1">Index</span>, OurListView.<span class="me1">Sorting</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>CurrSortIndex == <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OurListView.<span class="me1">ListViewItemSorter</span> = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OurListView.<span class="me1">ListViewItemSorter</span> = this;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OurListView.<span class="me1">Sort</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#region IComparer Members</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">int</span> Compare<span class="br0">&#40;</span>object x, object y<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListViewItem a = <span class="br0">&#40;</span>ListViewItem<span class="br0">&#41;</span>x;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListViewItem b = <span class="br0">&#40;</span>ListViewItem<span class="br0">&#41;</span>y;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">String</span> columnnameuse = CurrentSortColumn.<span class="me1">Name</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Object checkA = CompareValueFunc<span class="br0">&#40;</span>this, columnnameuse, a<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Object checkB = CompareValueFunc<span class="br0">&#40;</span>this, columnnameuse, b<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>checkA is IComparable<span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span>checkB is IComparable<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>OurListView.<span class="me1">Sorting</span>==SortOrder.<span class="me1">Ascending</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>IComparable<span class="br0">&#41;</span>checkA<span class="br0">&#41;</span>.<span class="me1">CompareTo</span><span class="br0">&#40;</span>checkB<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>IComparable<span class="br0">&#41;</span>checkB<span class="br0">&#41;</span>.<span class="me1">CompareTo</span><span class="br0">&#40;</span>checkA<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#endregion</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>As you can see, it it relatively small (overall). the API code at the top might be a bit confusing, but it is a result of what can only be described as an oversight on Microsoft&#8217;s part; see, originally, I was changing the sort arrow header by simply changing the columnheader image. This worked, sorta of, but there was no way to remove the image and it had this weird effect where it would basically move the text and make it aligned sorta weird. Turns out that the way the ListView would &#8220;normally&#8221; show sort order icons was a built in feature of the Listview since Common Controls 6 (XP). After some SDK digging I was able to use the Platform Invoke feature of C# to call all the appropriate API functions and &#8220;force&#8221; the Listview to show the sort order in the header appropriately.</p>
<p>The class also exposes a custom delegate which can be implemented and passed in to the constructor, which will allow for &#8220;custom&#8221; sorts. This is useful if columns contain data like dates, or numbers that you don&#8217;t want to be sorted using the normal &#8220;text&#8221; comparison. </p>
<p>All in all, It&#8217;s a class I&#8217;ve added to my &#8220;toolbox&#8221;, alongside my INIFile class for accessing INI Files. did I write about that one? I forget. </pre>
<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2011/12/the-windows-listview-sorting/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bc-programming.com/blogs/2011/12/the-windows-listview-sorting/&via=BC_Programming&text=The Windows ListView: Sorting&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div> <p><a href="http://bc-programming.com/blogs/?flattrss_redirect&amp;id=876&amp;md5=de303ff01ef21362d75cbc995710e3ff" title="Flattr" target="_blank"><img src="http://bc-programming.com/blogs/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://bc-programming.com/blogs/2011/12/the-windows-listview-sorting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=bc_programming&amp;popout=1&amp;url=http%3A%2F%2Fbc-programming.com%2Fblogs%2F2011%2F12%2Fthe-windows-listview-sorting%2F&amp;language=en_GB&amp;category=software&amp;title=The+Windows+ListView%3A+Sorting&amp;description=Anybody+who+has+used+windows+is+probably+familiar+with+the+ListView+control.+It+is+used+in+Windows+Explorer%3B+it+is+even+used+for+the+desktop.+Heck%2C+the+ListView+control+even...&amp;tags=.NET%2CC%23%2CListview%2CTwilight+Sparkle%2CWindows+95%2CWindows+Explorer%2Cblog" type="text/html" />
	</item>
		<item>
		<title>BASeBlock, Scripts, and SerializationBinders</title>
		<link>http://bc-programming.com/blogs/2011/11/baseblock-scripts-and-serializationbinders/</link>
		<comments>http://bc-programming.com/blogs/2011/11/baseblock-scripts-and-serializationbinders/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 03:12:38 +0000</pubDate>
		<dc:creator>BC_Programming</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[BinaryFormatter]]></category>
		<category><![CDATA[Serialization]]></category>
		<category><![CDATA[SerializationBinder]]></category>
		<category><![CDATA[Types]]></category>

		<guid isPermaLink="false">http://bc-programming.com/blogs/?p=853</guid>
		<description><![CDATA[So, as mentioned in the previous post, I added a &#8220;sort&#8221; of scriptability to BASeBlock. I made some tweaks, and refactored the code so it was a bit more abstracted; the original implementation was directly in the MultiTypeManager, but that didn&#8217;t really have anything to do with it, so I tweaked some of the parameters [...]]]></description>
			<content:encoded><![CDATA[<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2011/11/baseblock-scripts-and-serializationbinders/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><p>So, as mentioned in the previous post, I added a &#8220;sort&#8221; of scriptability to BASeBlock.</p>
<p>I made some tweaks, and refactored the code so it was a bit more abstracted; the original implementation was directly in the MultiTypeManager, but that didn&#8217;t really have anything to do with it, so I tweaked some of the parameters to a few methods there, added a new class with the static routines required for the needed functionality, etc. I also made it so that a &#8220;BASeBlock Script Group file&#8221; (.bbsg extension) could be used to both compile a set of files into an assembly, as well as include various other assemblies as required. Future additions will probably include the ability for each assembly to define a sort of &#8220;main&#8221; method, which can be called when the assembly is initialized.</p>
<p>However, once again, Serialization was the constant thorn in my side. I was able to mess about with a custom block written in a .cs script, and it even saved properly.</p>
<p>But the game encountered an exception when I tried to open that LevelSet; I forget the specifics, something to the tune of &#8220;failed to find assembly&#8221;  type of error. What could I do?</p>
<h2>  SerializationBinder </h2>
<p>What this basically meant was I was going to have to learn even more about the Serialization structure of .NET. Specifically, SerializationBinder&#8217;s. The concept was actually quite simple. You basically just derive a type from SerializationBinder, and use that as the .Binder property on a IFormatter class, overriding one method seems to be enough for the most part:</p>
<p>&nbsp;</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> Type BindToType<span class="br0">&#40;</span><span class="kw4">string</span> assemblyName, <span class="kw4">string</span> typeName<span class="br0">&#41;</span> </div>
</li>
</ol>
</div>
<p>&nbsp;</p>
<p>Simple! it gives you an assembly Name, a Type Name, and you simply return the appropriate type. The reason the default implementation wasn&#8217;t working was certainly as a result of the assembly being loaded dynamically, since it wasn&#8217;t  [i] really [/i]  being referenced by the BASeBlock assembly, so the default implementation didn&#8217;t find the &#8220;plugin&#8221; class assembly or the appropriate type, so threw an exception.</p>
<p>The trick here is not to enumerate the referenced assemblies, but rather to use all loaded assemblies in the current AppDomain. The general consensus with regards to using CodeDOM and compiling things like this is to compile them to their own AppDomain; however, since the assemblies were being kept &#8220;alive&#8221; for the duration of the application, that wasn&#8217;t necessary, and in this case would have complicated things. Well, it would have complicated things more than they already were.</p>
<p>The &#8220;AssemblyName&#8221; parameter, however, was more akin to the FullName property of the System.Reflection.Assembly; for example, BASeBlock&#8217;s assembly would (for the current version) be passed in as &#8220;BASeBlock, Version=1.4.0.0, Culture=neutral, PublicKeyToken=null&#8221;. Since we are only interested in the actual name of the assembly, we can simply grab everything up to the first comma.</p>
<p>Armed with the Assembly&#8217;s base name, we can start enumerating all the loaded Assemblies and looking for a match:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp;public override Type BindToType<span class="br0">&#40;</span><span class="kw4">string</span> assemblyName, <span class="kw4">string</span> typeName<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> BaseAssemblyName = assemblyName.<span class="me1">Split</span><span class="br0">&#40;</span><span class="st0">&#8216;,&#8217;</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> ;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Assembly <span class="br0">&#91;</span><span class="br0">&#93;</span> &nbsp;Assemblies = AppDomain.<span class="me1">CurrentDomain</span>.<span class="me1">GetAssemblies</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span>Assembly loopassembly in Assemblies<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>loopassembly.<span class="me1">FullName</span>.<span class="me1">Split</span><span class="br0">&#40;</span><span class="st0">&#8216;,&#8217;</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> .<span class="me1">Equals</span><span class="br0">&#40;</span>BaseAssemblyName,StringComparison.<span class="me1">OrdinalIgnoreCase</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> loopassembly.<span class="me1">GetType</span><span class="br0">&#40;</span>typeName<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch <span class="br0">&#40;</span>System.<span class="me1">Exception</span> exception<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw exception;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">return</span> <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> </div>
</li>
</ol>
</div>
<p>Then, we compare the Assembly.FullName.Split(&#8216;,&#8217;) [0]  (the text before the first comma) to the modified string, BaseAssemblyName that was changed in the same manner. I decided to go string insensitive for no reason; mostly because the assembly names for the scripts are formed from the filenames and I wouldn&#8217;t want filename capitalization to prevent a script from serializing/deserializing properly. If we find a matching assembly, we return the result of a GetType() call to that assembly with the same typename passed in as a parameter to the method. The Formatter will than attempt to deserialize the data it has to that type as needed.</p>
<p>There are a few issues with this- for one thing, it doesn&#8217;t work with Generic types. At least, I assume it doesn&#8217;t; I assume I would need some special code to get the appropriate Type for a generic type given type arguments. I&#8217;ll cross that bridge when I come to it.</p>
<p>Right now, I&#8217;ve not actually tested this extensively. My main concern would be to test that it can serialize in one session, and deserialize in another. This concern is based on the fact that the two assemblies would in that case be literally distinct- in that it would have been compiled on two occasions. Assuming the Binder is enough to convince the serializer it can deserialize something, there shouldn&#8217;t be any issues. Once I decide to figure out how to add Generics support to this Binder, I&#8217;ll definitely write about it here. </p>
<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2011/11/baseblock-scripts-and-serializationbinders/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bc-programming.com/blogs/2011/11/baseblock-scripts-and-serializationbinders/&via=BC_Programming&text=BASeBlock, Scripts, and SerializationBinders&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div> <p><a href="http://bc-programming.com/blogs/?flattrss_redirect&amp;id=853&amp;md5=4bf582aad209585f3a91206e2abc1ea1" title="Flattr" target="_blank"><img src="http://bc-programming.com/blogs/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://bc-programming.com/blogs/2011/11/baseblock-scripts-and-serializationbinders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=bc_programming&amp;popout=1&amp;url=http%3A%2F%2Fbc-programming.com%2Fblogs%2F2011%2F11%2Fbaseblock-scripts-and-serializationbinders%2F&amp;language=en_GB&amp;category=software&amp;title=BASeBlock%2C+Scripts%2C+and+SerializationBinders&amp;description=So%2C+as+mentioned+in+the+previous+post%2C+I+added+a+%26%238220%3Bsort%26%238221%3B+of+scriptability+to+BASeBlock.+I+made+some+tweaks%2C+and+refactored+the+code+so+it+was+a+bit+more+abstracted%3B...&amp;tags=.NET%2CBinaryFormatter%2CC%23%2CScripting%2CSerialization%2CSerializationBinder%2CTypes%2Cblog" type="text/html" />
	</item>
		<item>
		<title>a rant about &#8220;download managers&#8221;</title>
		<link>http://bc-programming.com/blogs/2010/11/a-rant-about-download-managers/</link>
		<comments>http://bc-programming.com/blogs/2010/11/a-rant-about-download-managers/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 00:07:10 +0000</pubDate>
		<dc:creator>BC_Programming</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Humour]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://bc-programming.com/blogs/?p=262</guid>
		<description><![CDATA[So I was bored and decided to update my Flash plugin, a chore that I recollect stopping in it&#8217;s tracks previously, for reasons I couldn&#8217;t recall. Main reason was that my flash plugin has been nearly constantly crashing on certain sites. Mostly due to the ubiquitous use of flash for advertisements, which seems to be [...]]]></description>
			<content:encoded><![CDATA[<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2010/11/a-rant-about-download-managers/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><p>So I was bored and decided to update my Flash plugin, a chore that I recollect stopping in it&#8217;s tracks previously, for reasons I couldn&#8217;t recall. Main reason was that my flash plugin has been nearly constantly crashing on certain sites. Mostly due to the ubiquitous use of flash for advertisements, which seems to be one of the dominant uses of the technology.</p>
<p>So, I visit adobe.com and go to download the player. First, they try to shove a McAfee scan down my throat. You know the drill. They know we just want to get the hell away from them, so they decide to helpfully fill out the &#8220;default&#8221; options for us, which just so happen to correspond with the options one would need to choose to give them the most revenue.</p>
<p>So I finally manage to get past that brigade of crap, and then it asks to install software. fair enough- that is what I was doing.</p>
<p>Much to my chagrin, however, it isn&#8217;t installing flash, it wants to install Adobe DLM, DLM I assume stands for DownLoad manager, although it could very well stand for Dingo-Llama-Mammoth for all I care.</p>
<p>let&#8217;s analyze the sequence of events so far:</p>
<ol>
<li> I find that because of the shitty programming by Adobe their newest, most stable release of Flash, which I might point out isn&#8217;t even theirs and is just a sodomized and tortured version of what was at least a personable Macromedia Flash, it crashes nearly constantly doing routine tasks, like showing, I don&#8217;t know, pictures, as it&#8217;s designed to. </li>
<li> So, I decide to go to the vendor page (although I would prefer not to) in order to see if an upgrade is available. I believe there is. So I click to download Adobe Flash player. Before I do this I have to uncheck the &#8220;agreement&#8221; on my part to have them perform rectal scans of my computer using an AV product that probably is rather familiar with the appearance of a rectum, since that&#8217;s it&#8217;s origin. Now, remember, when I clicked the button, it said I was downloading Flash Player. And then *poof* up comes the prompt screen asking me to download this  <em> entirely unrelated </em>  &#8220;download manager&#8221; which brings me to another point. </li>
</ol>
<p>Every single fucking program I download wants to install a god damned download manager! how many bloody download managers do I need? Am I going to need a download manager manager to manage all the download managers that all manage only the specific downloads from that specific company? Is there something wrong with the concept of downloading a program, I don&#8217;t know, using the conventional browser method? You know, like any other sane person? No, Adobe has decided to decide for me. &#8220;We won&#8217;t install Flash like you wanted, but we will install a download manager that will consume resources indefinitely for this one-time installation of Flash. Then it will sit in the background and make sure your updated, because god forbid if your version get&#8217;s out of date!&#8221;</p>
<p>Which brings me to another rant, Versioning. I mean, I totally understand why you might want to have the latest version of an application- it fixes bugs, adds features, and so forth. and being notified, and even having the opportunity to update with a few clicks is very convenient. I have no beef with the concept.</p>
<p>What I disagree with is this whole &#8220;OMG if you aren&#8217;t updated to the latest version you will get haxored!&#8221; there are people who say this about every bloody program. It&#8217;s understandable for browsers, and for a number of browser-based/web-based technologies, as well as things like the .NET framework, and of course the core of windows itself. But, seriously, the main reason you update a program is to fix bugs and add features, and hope that the bugs and security concerns that a new version  <em> adds </em>  (And they always do, unless the change is extremely minor) don&#8217;t outweigh the benefit of having the known vulnerabilities and the existing bugs eliminated.</p>
<p>Additionally, this very mantra is proposed on applications that have little relevance to web technologies. I mean, Microsoft Word has been relatively unchanged since version 6, with of course downlevel changes (which I&#8217;m sure took a lot of effort, I&#8217;m not downplaying that) But the fact is the entire purpose of the program is to be a word processor. The fact that it now represents a bloody programming platform should be some indication that they might have sort of lost their focus on what the program is supposed to do. It&#8217;s supposed to make it easy to edit documents, not make it easy to program spam e-mail merge programs or even be a platform from which to launch your own applications.</p>
<p>I don&#8217;t mean to pick on Word or Microsoft by any means- this seems to be a problem with a global scale. It&#8217;s a complex with versioning. If somebody has a problem, and they don&#8217;t have the latest version, that is automatically the cause, and truly, this attitude, or more precisely, the logic behind me, continues to elude me. They don&#8217;t understand the various downlevel changes, and half the time the release notes and changelog for said program mention nothing even remotely relevant to the various issues the person might be having.</p>
<p>Going almost hand-in-hand with the &#8220;download manager&#8221; syndrome is the &#8220;background updater&#8221;. Each company seems to have it&#8217;s own. You&#8217;ve got the Adobe one, the one from, say, Google, Apple, and so forth. And every single one of them is sitting in the background making sure I&#8217;m &#8220;up to date&#8221;. The problem here is that they all have to same goal but they all have very different UIs and they all act entirely different and essentially have different paradigms. This is something where Linux has the right idea; the package manager can update any package you install through either the GUI package manager or through a apt-get command in the terminal. The thing is, the environment is different; Linux programmers have no problem submitting their updates and new packages to the essentially neutral repository folks. With Windows, the best solution, which is the integrate this all into Windows Update, is owned by MS, which many of the companies who would have their software in it are competing with, which seems a bit like a conflict of interest; who knows if MS will &#8220;accidentally&#8221; forget to update users of competing products?</p>
<p>Back to the various &#8220;update&#8221; managers, they don&#8217;t simply update the programs you already have from their company; they also inform you of &#8220;updates&#8221; to their other products. The Apple update software makes sure you know when a new version of Safari is available, even if you only have iTunes; Google&#8217;s updater makes sure that you&#8217;re fully aware of when a new version of Picasa is released. And so on.</p>
<p>In conclusion, suffice it to say that currently update and download managers are wholly unnecessary (especially with the latter) and a huge pain in the ass for everybody. </p>
<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2010/11/a-rant-about-download-managers/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bc-programming.com/blogs/2010/11/a-rant-about-download-managers/&via=BC_Programming&text=a rant about "download managers"&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div> <p><a href="http://bc-programming.com/blogs/?flattrss_redirect&amp;id=262&amp;md5=bc33ee8a059b02b6a68aa4c5b16b2e11" title="Flattr" target="_blank"><img src="http://bc-programming.com/blogs/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://bc-programming.com/blogs/2010/11/a-rant-about-download-managers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=bc_programming&amp;popout=1&amp;url=http%3A%2F%2Fbc-programming.com%2Fblogs%2F2010%2F11%2Fa-rant-about-download-managers%2F&amp;language=en_GB&amp;category=software&amp;title=a+rant+about+%26%238220%3Bdownload+managers%26%238221%3B&amp;description=So+I+was+bored+and+decided+to+update+my+Flash+plugin%2C+a+chore+that+I+recollect+stopping+in+it%26%238217%3Bs+tracks+previously%2C+for+reasons+I+couldn%26%238217%3Bt+recall.+Main+reason+was+that...&amp;tags=Adobe%2CApple%2Cinstall%2Csoftware%2Cupdate%2CUser+Interface%2CWindows%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Microsoft and why the mob-thinking is wrong.</title>
		<link>http://bc-programming.com/blogs/2010/11/microsoft-and-why-the-mob-thinking-is-wrong/</link>
		<comments>http://bc-programming.com/blogs/2010/11/microsoft-and-why-the-mob-thinking-is-wrong/#comments</comments>
		<pubDate>Sat, 27 Nov 2010 01:21:53 +0000</pubDate>
		<dc:creator>BC_Programming</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Linux zealots]]></category>
		<category><![CDATA[Macintosh Elite douchbags]]></category>
		<category><![CDATA[Slashdotters]]></category>

		<guid isPermaLink="false">http://bc-programming.com/blogs/?p=388</guid>
		<description><![CDATA[Microsoft. It&#8217;s unheard of to find a person who hasn&#8217;t at least used a Microsoft product; it&#8217;s even less likely to find somebody who hasn&#8217;t been exposed to it. As it stands now, there are essentially three &#8220;camps&#8221;: 1. People who think MS is successful not by chance or by &#8220;copying&#8221; anything, but by coming [...]]]></description>
			<content:encoded><![CDATA[<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2010/11/microsoft-and-why-the-mob-thinking-is-wrong/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><p>Microsoft.</p>
<p>It&#8217;s unheard of to find a person who hasn&#8217;t at least used a Microsoft product; it&#8217;s even less likely to find somebody who hasn&#8217;t been exposed to it. As it stands now, there are essentially three &#8220;camps&#8221;:</p>
<p>1. People who think MS is successful not by chance or by &#8220;copying&#8221; anything, but by coming up with good ideas as well as creating good implementations of other ideas;</p>
<p>2. Open Source zealots, who spend much of their time criticizing microsoft for copying Apple and then turn around and copy both MS and apple in creating their desktop environments; Additionally, the Open Source zealots who can&#8217;t write a line of code and push the &#8220;Open Source&#8221; concept because it basically means &#8220;free software&#8221;</p>
<p>3. Generation 2 Apple Users; the type who think the Mac Classic sucks and apparently don&#8217;t realize that OSX is pretty much just a desktop environment for BSD; I cannot think of a single reason to ever buy a mac today, personally. The Original Macintosh Versus the PC-DOS had clear advantages in that it posessed a GUI, wheras DOS was a Command line interface; this beckoned the higher price tag for the product. Today, OSX offers no features that cannot be found easily on either windows, or a free Linux desktop environment; the claim is that you are paying for &#8220;quality hardware&#8221; that &#8220;just works&#8221; But truly you&#8217;re simply paying a tax to become a member of an exclusive club; It&#8217;s not the machine or the functionality Mac users are after anymore, it&#8217;s the symbol of success that it essentially provides. &#8220;hey, I have lots of disposable income to spend on overpriced toys&#8221; is the message it sends.</p>
<p>The common argument is that Microsoft got to it&#8217;s dominant market position via &#8220;strong-arm&#8221; tactics, and by &#8220;copying&#8221; ideas. First, when you run a company, and an opportunity arises, you don&#8217;t think &#8220;golly gee, I sure hope this doesn&#8217;t hurt my competitors&#8221;. The word &#8220;competition&#8221; especially with regards to software has somehow lost all meaning; people like to think that there is no competition, and there certainly is less of it today. But it&#8217;s not Microsoft&#8217;s fault that nobody is coming out with products that can compete with theirs; Just as it wouldn&#8217;t have been Apple&#8217;s fault if MS had not been able to launch windows to compete with the macintosh on the PC; it&#8217;s called business. </p>
<p>&#8220;Copying&#8221; is an interesting word that people like to use to describe Microsoft&#8217;s business strategy; however, there are two flaws with this approach:</p>
<p>it implies that they &#8220;stole&#8221; something, when in fact they saw a good idea, and implemented it themselves. One could posit the question, &#8220;if they weren&#8217;t supposed to copy, merge, and combine features, what the hell are we working towards?&#8221; In fact, the bitter irony here is that this line is often uttered by Linux users, who seem to forget that their OS of choice has lagged behind both Apple and Microsoft and has &#8220;copied&#8221; features from both; in fact, one could say that the entire concept of building upon each others code is the very concept that Open Source Software pushes; so hearing Linux users say this is sort of ironic in that they are implying that their Open Source philosophy is somehow only a good one when applied to Open Source.</p>
<p>Did windows &#8220;copy&#8221; a lot of features of Apple&#8217;s Macintosh? of course they did. When you are building a car to compete with other cars, you use the same shape for wheels; you don&#8217;t redesign the wheel; additionally, when somebody says that Microsoft steals &#8220;ideas&#8221;, the term is really useless. despite the aura around intellectual property, just thinking about something doesn&#8217;t suddenly mean that somebody else creating an implementation of your idea is stealing; an idea takes an armchair and a few minutes, and absolutely no physical effort. Implementing an idea is the hurdle that any technologist, during any era of computing had to get across; an idea is useless without an implementation. If I was to think up some new type of program, but did fuck all to create any prototypes or anything to that degree, I can&#8217;t in all fairness say that somebody &#8220;copied my idea&#8221; when they come up with an implementation; there was nothing to copy. ideas are physical objects. Some may say &#8220;but the Apple was an implementation of an idea&#8221; And yes, of course it is. But consider this; Windows runs on the IBM PC; the Mac OS environment runs on the Macintosh; consider for a moment that if apple had won the litigation against Microsoft, the IBM PC&#8217;s potential for showing a graphical environment would never have been realized. One could breakdown into a number of alternate history theories about what could have happened that go in all sorts of directions, but the truth is, it&#8217;s impossible to truly say what would have happened, simply because it didn&#8217;t. And now, the concept of a GUI that uses the same metaphorical approach is essentially the common denominator; what Microsoft naysayers are implying is that this is a bad thing; they are implicitly supporting the older paradigm where every single machine was managed in some completely separate way; That doesn&#8217;t help anybody.</p>
<p>Another thing that MS is criticized for is lack of innovation. To be perfectly frank, this is absolute bull shit. First off, if this was the case I don&#8217;t see how other companies aren&#8217;t equally guilty; and the fact is that it&#8217;s not the case.</p>
<p>Take, for example, the Windows 95 start menu; no other GUI implemented anything of this sort; the taskbar was an innovation because it made it possible to manage all the various running tasks in a always visible location; this was done through observation of their customer base, who would complain that their programs would &#8220;go away&#8221; because you no longer had a visual indication of them running (another window covered them, and they are essentially gone). Take the Windows Vista Start menu; the search bar is not something I had seen established in any major competing Graphical User interface before that. It addresses the previous criticisms of the Start menu whereby the various folders and icons would often fill the screen as you install/uninstall applications. However, nobody saw it like that; instead they decided to focus on the negatives, such as the higher system requirements. Err, HELLO, each version of windows has higher system requirements then the last. This is hardly surprising, and the fact that Vista implemented a new Desktop composition system (&#8220;Stolen&#8221; from apple, despite the fact that this was sort of a natural extension to the desktop given the ubiquitous availability of 3-D hardware on even the most value-oriented computers), as well as the larger gap between the XP and Vista release pretty well explain that.</p>
<p>Another example: take the Office Ribbon. Despite it&#8217;s detractors, it has become hugely successful and people have in fact found themselves more productive with it; this is because rather then thinking about the problem for a few seconds and then dismissing the current solution as &#8220;we shouldn&#8217;t change it because I don&#8217;t like change&#8221;, they actually looked at what they had, and realized, &#8220;holy shit, we have too many menus/toolbars and crap here&#8221; And they came up with a solution. The thing is, the ribbon made users and developers alike rethink the sort of common user-interface paradigms that we have become accustomed to, such as menus, buttons, and so forth.The heirarchal Pull down menu system was an extension on the &#8220;basic&#8221; pull down menu, where each menu title only had a single set of options; there was no concept of submenus within those menus (known as heirarchal menus). However, at some point, that model stopped working; the menus hd way too many options. The natural method was of course to group those options heiarchally; here are the options for Inserting an object, here are the options for  how to format cells, and so on. The ribbon is a testament to the fact that there is no magic bullet method that works well in all situations; a program with three options can work well with just three buttons in a window; however if you have 10 options, you better use a menu, and with 50 or so options, you&#8217;ll need to arrange that heirarchally.</p>
<p>It&#8217;s important to realize that Microsoft is not pulling the industry on it&#8217;s coat-tails by mistake; the fact is that even their competitors are playing catch-up with their technologies, and before they can release a product that even attempts to compete with them, MS has already released another version. It&#8217;s not a lack of innovation on Microsoft&#8217;s part that is causing this, it&#8217;s a lack of innovation on the competitions part.</p>
<p>Much of this is different when you look away from desktop applications and operating systems and instead look to the world-wide web. Instead, we find Google has essentially cornered almost every facet of the internet; however, they carefully crafted their approach so despite them essentially doing the exact same thing to the web as Microsoft did to the OS and desktop applications markets, they are still regarded as &#8220;good guys&#8221; which is a particularly intriguing revelation.</p>
<p>This brings me to another point: Internet Explorer.</p>
<p>Web Developers &#8211; including myself- hate trying to work with Internet Explorer- it doesn&#8217;t work like the other browsers. People like to blame MS for this. But it&#8217;s actually the W3C.</p>
<p>Take for example some of the early draft specs for HTML4 and CSS and the DOM. W3C said &#8220;alright, we  <i> might </i>  make it like this, but no promises.</p>
<p>And all the browsers ran out and implemented it. Then the w3c went to ratify the specification and decided &#8220;hey, you know what? All the stuff we have in that spec that only IE has implemented so far&#8230; let&#8217;s rip those out. And they did. So now IE suddenly had &#8220;non-standard&#8221; features that were in fact originally in the spec and simply not implemented by Netscape or whatever the other browsers were at the time, because only IE bothered to implement those particular portions according to the specification. Which  brings me to another point- the specifications are about as vague as possible. If your specifications are open to any sort of interpretation, they aren&#8217;t specifications, they&#8217;re handwavey suggestions. IE was the first browser to implement the CSS Box Model according to the specification. Then W3C ripped out that entire page of the spec. Now, they pretty much said that, but what is most interesting was that almost every single thing they took out of the spec was only implemented by IE and every single thing they added to the spec that wasn&#8217;t before were non-spec stuff that was added by other browsers. Seems a bit unfair.</p>
<p>Now, it&#8217;s gotten better in recent years, but it&#8217;s also gotten worse. MS refuses to implement any feature that is non-standard or not in the spec- because they know the w3c is some sort of demon spawn that purposely messes around the spec as much as possible just to fuck with IE&#8217;s implementation. meanwhile, the w3c is all friendly with Firefox and Opera and all the other implementations. It&#8217;s like a god damned love circle.</p>
<p>And then you have that Anti-trust nonsense. I&#8217;ve never really understood that. I mean, ok&#8230; we&#8217;ve got Netscape (with err&#8230; Netscape) and Microsoft with Internet Explorer. When IE was being charged for it was all cool.</p>
<p>But then they started giving it away free with the operating system! HORRORS OF HORRORS! Obviously they are TRYING to suffocate Netscape! I mean, that might have been a secondary reason, but for fuck&#8217;s sake, why the hell was Netscape their only god damned product to begin with? I mean, how many years were they in business with a single product? And many people say &#8220;well, golly, why would they spend money to make IE and then release it for free?&#8221; I don&#8217;t know. why the hell did they spend money to redesign paint in Windows 7? The way I see it, Microsoft looked at the internet, saw- hmm, this is becoming as ubiquitous as simple text editing, word processing, basic bitmap editing and recording short sound clips, we should distribute a way to do this with the OS. And that&#8217;s what they did. But suddenly it&#8217;s a big no-no because the slow company that had a single product that did the same thing that they charged for were all &#8220;hey, no fair, we don&#8217;t know how to sell more then one product so that&#8217;s Anti-trust!&#8221; It would be like a company that sold a basic text editor claiming anti-trust when Microsoft *GASP* included a text editor with MS-DOS 5! the NERVE of the company! How dare they include basic tools that increase the usability of the Operating system! DAMN THEM!</p>
<p>I mean, Anti-trust stuff is supposed to protect the  [i] public [/i]  from a monopoly. Not slow to change companies that don&#8217;t know how to create more then one product from other companies that happen to be able to create that same relatively simple to create (browsers were hardly that complex) applet and include it with the OS. </p>
<p>And nowadays the hubbub is all &#8220;OMG! they should let you choose your browser when you install windows!&#8221;</p>
<p>What the FUCK is that? should they let you choose from a set of other free text editors you can use instead of notepad? No, because if you want another editor you download another editor. should they offer other free alternatives to Paint Or Wordpad or Sound recorder (which actually transformed into useless with the latest ver. in win Vista/7)? No. that would be stupid. But apparently they are supposed to quite literally present a choice amongst their competitors in the browser market. Why only browsers though? </p>
<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2010/11/microsoft-and-why-the-mob-thinking-is-wrong/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bc-programming.com/blogs/2010/11/microsoft-and-why-the-mob-thinking-is-wrong/&via=BC_Programming&text=Microsoft and why the mob-thinking is wrong.&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div> <p><a href="http://bc-programming.com/blogs/?flattrss_redirect&amp;id=388&amp;md5=75a96c310ba45f184fa78b4287037543" title="Flattr" target="_blank"><img src="http://bc-programming.com/blogs/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://bc-programming.com/blogs/2010/11/microsoft-and-why-the-mob-thinking-is-wrong/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=bc_programming&amp;popout=1&amp;url=http%3A%2F%2Fbc-programming.com%2Fblogs%2F2010%2F11%2Fmicrosoft-and-why-the-mob-thinking-is-wrong%2F&amp;language=en_GB&amp;category=software&amp;title=Microsoft+and+why+the+mob-thinking+is+wrong.&amp;description=Microsoft.+It%26%238217%3Bs+unheard+of+to+find+a+person+who+hasn%26%238217%3Bt+at+least+used+a+Microsoft+product%3B+it%26%238217%3Bs+even+less+likely+to+find+somebody+who+hasn%26%238217%3Bt+been+exposed+to+it.+As...&amp;tags=Linux+zealots%2CMacintosh+Elite+douchbags%2CMicrosoft%2CSlashdotters%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Porting BASeBlock To Linux, and thoughts on Mono</title>
		<link>http://bc-programming.com/blogs/2010/11/porting-baseblock-to-linux-and-thoughts-on-mono/</link>
		<comments>http://bc-programming.com/blogs/2010/11/porting-baseblock-to-linux-and-thoughts-on-mono/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 16:55:49 +0000</pubDate>
		<dc:creator>BC_Programming</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Mono]]></category>

		<guid isPermaLink="false">http://bc-programming.com/blogs/?p=375</guid>
		<description><![CDATA[No, Not the kissing disease, Infectious mononucleosis, the open-source .NET CLR interpreter and class library. .NET; I might have ranted about this before, if not on my blog, elsewhere. most of my arguments were against it, being a VB6 using ignorant buffoon. In any case, I&#8217;ve found C# to be an awesome language. One of [...]]]></description>
			<content:encoded><![CDATA[<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2010/11/porting-baseblock-to-linux-and-thoughts-on-mono/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><p>No, Not the kissing disease, Infectious mononucleosis, the open-source .NET CLR interpreter and class library.</p>
<p>.NET; I might have ranted about  this before, if not on my blog, elsewhere. most of my arguments were against it, being a VB6 using ignorant buffoon. In any case, I&#8217;ve found C# to be an awesome language. One of the obvious downsides is that for the most part programs written in C# using Windows forms cannot be run on other systems.</p>
<p>The concept of Mono is to change  that; remember, C# isn&#8217;t a Microsoft standard, it&#8217;s an ECMA specification, and Microsoft holds no copyright over it or anything like that. Mono is a relatively huge undertaking; the creation of something on the scale of a Virtual machine as well as a class library is gargantuan, and of course there is very little hope for 100% success.</p>
<p>On the whole, Mono performs it&#8217;s primary goals admirably; there is a GTK# framework that can be used to develop windowed applications&#8230; of course then the installation on a windows PC would require the install of the Mono GTK# framework, but I digress. In any case, applications can be developed and the C# code interpreter (for on the fly syntax highlighting) as well as the compiler are top-notch and seem to work well.</p>
<p>My only beefs can of course be in the class library. Of course, re-implementing the class library provided by MS on non-windows systems is not something that can be done in a single afternoon; this stuff takes time. My attempts to create a Mono-compatible project have been stifled, however, by seemingly innocuous issues. AlLlow me to explain.</p>
<p>As many reader may be aware, I have been working on a &#8220;upgrade&#8221; of sorts to my now ancient &#8220;Poing&#8221; game, which can be found on my downloads page; the original game was written in Visual Basic 6, and, in it&#8217;s earlier incantations didn&#8217;t have a single Class; it was all based on User-Defined Types (structures for those privvy to C parlance) and functions; (short explanation: it was made before I understood classes). Later, after I had learned about classes, I refactored everything into classes. This is all rather redundant; in any case, I have since created a new project in C#, in an attempt to learn about GDI+ as well as what appeared to be a different (in some ways) painting model. As one can see by the youtube videos I have posted on it, development has gone well.</p>
<p>The idea occured to me, after Tux2 (of http://www.jrtechsupport.com/) managed to create a Mono-workable, if soundless, version of my earlier C# game, BCDodger that worked in Linux. Sound was unavailable as a result of my choice of sound library, the IRRKLANG library, while truly usable in Linux, doesn&#8217;t have a wrapper that works in Linux (or something, I don&#8217;t know&#8230; it uses DSound or something, I forget). In any case, I have since added the ability for various sound engines to be used, and have added working implementations for Open-Source and Linux-available Sound systems, such as NBass (as well as a broken fmod implementation, let&#8217;s ignore that though).</p>
<p>Much obliged, I had decided to try to get it working via Mono as well; this was facilitated by my recent reformatting of my laptop to run a dual boot Windows 7 and Mint 10 system. Installing MonoDevelop and all that, etc.</p>
<p>So, I of course open the project in Monodevelop, quite ready for errors relating to porting.</p>
<p>The version I am using is MonoDevelop (and I assume also Mono) version 2.4, for those following along.</p>
<p>My first hurdle was getting my Appdata files for the program in the right location; on windows systems they are placed in the application data folder; so too they would need to be on a Linux system. Thankfully, a quick C# program run on the Linux machine cured this issue:</p>
<pre code="C#">
using System;

namespace specialfolders
{
	class MainClass
	{
		public static void Main(String []  args)
		{
			foreach(Environment.SpecialFolder sfolder in
Enum.GetValues(typeof(Environment.SpecialFolder)))
				Console.WriteLine(sfolder.ToString() + "=" +
				Environment.GetFolderPath(sfolder));

		}
	}
}
 </pre>
<p>Which gave me, on a Windows system:</p>
<pre>
Desktop=C:\Users\BC_Programming\Desktop
Programs=C:\Users\BC_Programming\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Personal=C:\Users\BC_Programming\Documents
Personal=C:\Users\BC_Programming\Documents
Favorites=C:\Users\BC_Programming\Favorites
Startup=C:\Users\BC_Programming\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Recent=C:\Users\BC_Programming\AppData\Roaming\Microsoft\Windows\Recent
SendTo=C:\Users\BC_Programming\AppData\Roaming\Microsoft\Windows\SendTo
StartMenu=C:\Users\BC_Programming\AppData\Roaming\Microsoft\Windows\Start Menu
MyMusic=C:\Users\BC_Programming\Music
DesktopDirectory=C:\Users\BC_Programming\Desktop
MyComputer=
Templates=C:\Users\BC_Programming\AppData\Roaming\Microsoft\Windows\Templates
ApplicationData=C:\Users\BC_Programming\AppData\Roaming
LocalApplicationData=C:\Users\BC_Programming\AppData\Local
InternetCache=C:\Users\BC_Programming\AppData\Local\Microsoft\Windows\Temporary Internet Files
Cookies=C:\Users\BC_Programming\AppData\Roaming\Microsoft\Windows\Cookies
History=C:\Users\BC_Programming\AppData\Local\Microsoft\Windows\History
CommonApplicationData=C:\ProgramData
System=C:\Windows\system32
ProgramFiles=C:\Program Files
MyPictures=C:\Users\BC_Programming\Pictures
CommonProgramFiles=C:\Program Files\Common Files
 </pre>
<p>Nothing particularly out of the ordinary there. So, running the program on a Linux machine:</p>
<pre>
Programs=
Personal=/home/bc_programming
Personal=/home/bc_programming
Favorites=
Startup=
Recent=
SendTo=
StartMenu=
MyMusic=/home/bc_programming/Music
DesktopDirectory=/home/bc_programming/Desktop
MyComputer=
Templates=
ApplicationData=/home/bc_programming/.config
LocalApplicationData=/home/bc_programming/.local/share
InternetCache=
Cookies=
History=
CommonApplicationData=/usr/share
System=
ProgramFiles=
MyPictures=/home/bc_programming/Pictures
CommonProgramFiles=
</pre>
<p>which gave me what I needed: the appdata folder &#8220;BASeBlocks&#8221; needed to be copied to /home/bc_programming/.config.</p>
<p>Doing so was easy enough; the file manager on Mint 10 (dolphin) is different from windows explorer but hardly paradigm-breaking.</p>
<p>That copied, I simply threw the source folder as it was on the Visual Studio 2008 projects folder into the MonoDevelop projects folder (well, not really, it was /home/bc_programming/projects/ which I suppose means that any program that uses a projects folder will use it, oh well.)</p>
<p>psyched as I was I ripped into it with MonoDevelop, ready for anything! well, nearly anything.</p>
<p>My first error occured on line 107 of &#8220;Block.cs&#8221;:</p>
<pre code="C#">
mPowerupChanceSum = Powerupchance.Sum();
 </pre>
<p>Java programmers may be thinking &#8220;ew uppercase characters&#8221; to them I say be quiet you. Anyways, the problem here was that there was no &#8220;Sum()&#8221; Extension method defined. Which I found odd. Oh well, though, I simply created my own:</p>
<pre code="C#">
#if MONO
	public static class monoextensions
	{
		public static float Sum(this float []  floats)
		{
			float accumulator=0;
			foreach(float loopfloat in floats)
				accumulator+=loopfloat;

			return accumulator;
		}
	}

#endif
 </pre>
<p>this solved the immediate issue of the &#8220;Sum()&#8221; extension method. (For more info on C# extension methods, see  <a href="http://blah.winsmarts.com/2006/05/18/demystifying-c-30--part-3-extension-methods.aspx">  here </a> )</p>
<p> My next hurdle was on line 540 of cBall.cs:</p>
<pre code="C#">
if (wholeref.Blocks.Count((q)=>q.MustDestroy()) == 0)
 </pre>
<p>The error was something to the effect of not being able to pass a delegate or method group to a lambda expression.</p>
<p>oddly enough, the fix was the change the &#8220;q&#8221; to an x&#8230; and after it successfully built I was able to comment out the &#8220;new&#8221; line (with the x rather then a q) and uncomment the original. very odd.</p>
<p>In either case, now I was confronted with what I knew to be the biggest issue; the fact that I had to now discover how to set it up so that I was able to use the same nBASS library, but so that the nBASS library was &#8220;silently&#8221; made to use the BASS.so linux library, rather then bass.dll which wouldn&#8217;t load either way.</p>
<p>The first step in this process was in finding bass.so. Hoping for the best, I pulled up good ol&#8217; synaptic package manager.</p>
<p>No luck there <img src='http://bc-programming.com/blogs/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  so, I went into the depths of the internet&#8230;.</p>
<p>the BASS for Linux (note the lack of the n prefix; it&#8217;s the core BASS library that the nBASS dll is wrapping) can be found  <a href=http://www.un4seen.com/forum/?topic=8682> here </a> </p>
<p>this topic; or, the original post, to be precise, gives the download location for the Linux source files for BASS 2.4, which can be found at  <a href=http://www.un4seen.com/stuff/bass24-linux.zip"> http://www.un4seen.com/stuff/bass24-linux.zip </a> </p>
<p>So, I downloaded the zip file, extracted it to a folder, and am about to attempt to compile it. (there is a libbass.so that I could probably try, but I think I&#8217;ll compile it myself instead).</p>
<p>Before I continue, however, I would like to mention something that has most impressed me about Mint 10; the multiple desktops. Now, this is hardly a new feature; programs can be downloaded that do this on windows, and windows itself has built in API support for multiple desktops; however, what impresses me most is that when you activate a window on another screen, it switches to it; what I mean is, for example, in this instance my FF download window was on another desktop (no idea why) and when I went to open the downloads window via Tools->Downloads, it did the fancy compiz box animation (as I have selected in preferences) and switched to it. very cool. But enough if my gushing over the unexpected presense of sanity in the UI design of a Linux desktop environment! back to my attempts to get BaseBlock working on Linux.</p>
<p>my attempts to  <i> make </i>  the bass project, however, failed:</p>
<pre>
bc_programming@Satellite ~/Projects/bass $ sudo make
make -C 3dtest
make [1] : Entering directory `/home/bc_programming/Projects/bass/3dtest'
cc -Os -I/home/bc_programming/Projects/bass -L/home/bc_programming/Projects/bass -lbass -Wl,-rpath,/home/bc_programming/Projects/bass `pkg-config gtk+-2.0 --cflags --libs` `pkg-config libglade-2.0 --cflags --libs` -export-dynamic -D'GLADE_PATH="/home/bc_programming/Projects/bass/3dtest/"' 3dtest.c -o 3dtest
Package libglade-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libglade-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libglade-2.0' found
3dtest.c:7: fatal error: glade/glade.h: No such file or directory
compilation terminated.
make [1] : ***  [3dtest]  Error 1
make [1] : Leaving directory `/home/bc_programming/Projects/bass/3dtest'
make: ***  [3dtest]  Error 2
bc_programming@Satellite ~/Projects/bass $
 </pre>
<p>Oh the humanity! now I had to learn about this package nonsense. I first suspected perhaps, as evidence by the fact that it wasn&#8217;t found, said package wasn&#8217;t installed; so I did a quick sudo apt-get install libglade-2.0 &#8230; it reported it was installed already.</p>
<p>after a bit of effort, and installing a few dev packages, I gave up. I was able to resolve the missing dependencies but then it complained about a missing .h file (which was indeed missing and clearly should have been present) so I gave up on that, and am at the time currently trying to simply use the .so file included. An additionally problem that arises here is the obvious fact that I am using a x64 Linux system, working with C# code written on a x64 windows system but targeted towards a x86 system, problem being that to my understanding Linux is not as lenient when it comes to architecture differences; but I suppose I&#8217;ll figure that out for myself if it&#8217;s the case.</p>
<p>In any case, I am now attempting to get the nBASS library to wrapp around libbass.so rather then bass.dll; from my research if the imports are the same I should have no problem creating a dllmap entry in the appropriate config file. From the documentation it would seem that discovering where that config file goes is left as an exercise for the reader.</p>
<p>Actions:</p>
<p>pasted libbass.so in the &#8220;Debug&#8221; folder (alongside the dll).</p>
<p>Copied the BASeBlock.config file from the project root to the debug folder; renamed to Bass.Net.config.</p>
<p>opened preceding file in gedit; it now looks like this:</p>
<pre code="xml">
 < ?xml version="1.0" encoding="utf-8" ?> 

 <configuration> 
<dllmap dll="bass.dll" target="libbass.so"/>

 </configuration>
 </pre>
<p>And now, I attempt to run BASeBlock&#8230; recall that it now compiles on Linux, so it&#8217;s just a matter of making it work. I could, in a worst case scenario, construct a &#8220;nullsound&#8221; driver that simply stubs out the sound playing interfaces. But that seems like a bit of a cop-out. IN any case, attempts to run it resulted in the same error; clearly either the documentation I was reading was incorrect or I was not interpreting it properly.</p>
<p> I did a few more googles and came upon  <a href="http://www.mono-project.com/GtkGLAreaSharp:With_MonoDevelop"> this </a>  page, which, despite being about something completely different addressed the same problem; that is, translating the dllimport(whatever.dll) into imports of functions from Linux .so libraries. namely, it told me where the Mono parameter file was- /etc/mono/config. I quickly opened the feller using gedit:</p>
<p>I tossed in the line:</p>
<pre>
<dllmap dll="bass.dll" target="libbass.so" os="!windows" />
 </pre>
<p>and crossed my fingers&#8230;</p>
<p>It still didn&#8217;t work. I guessed maybe mono only loaded that stuff up when it was started? So I restarted monodevelop.</p>
<p>excellent! a little progress. Now I was still getting the error, but it was complaining about libbass.so missing. At least we&#8217;re getting somewhere.</p>
<p>It still should have found the file; however, I decided that instead of just throwing it in the app directory (because god knows where Mono is truly looking for it; even putting ./libbass.so in the dllmap failed, so Mono clearly thinks something else is the &#8220;current&#8221; directory. Instead, I decided to simply cp it somewhere globally accessible;</p>
<p>It still didn&#8217;t work.</p>
<p>Anyway, I messed around with the config file and the dllmap attribute and no matter what I put it it refused to find the file; clearly I&#8217;m missing something obvious (maybe capitalization? a missing slash? who knows). In either case I decided to defer that work to later on; I&#8217;m sure there was more to be fixed afterwards.</p>
<p>So, I created the aforementioned &#8220;Null Sound&#8221; driver; it worked fine. compiled alright. Encountered a bunch of issues during startup relating to my use of the \ as a path separator, whereas Linux uses /, fixed this with a simple Replace to change all slashes to the slashes of the OS (Environment.PathSeparatorChar).</p>
<p>It still refuses to start; Some gdi plus error. I have no idea how to workaround this, since it seems to be related to the windows forms, and has nothing to do with my own code, but rather with some configuration option. I recall Tux2 working around a similar error in BCDodger but I wasn&#8217;t paying very close attention and forget what the fix was, or even if he mentioned it. Either way, at least now BASeBlock compiles on a linux system, and most of the code-related oversights have been resolved.</p>
<p>EDIT:</p>
<p>I&#8217;ve managed to solve both issues; not at once of course.</p>
<p>First, the loading issue was fixed; pretty troublesome. In my attempts to resolve the problem I created a number of projects that used the same Image.FromFile() method to load pictures, and they worked fine.</p>
<p>Clearly, the problem then was not in what was not visible; the difference between the two. I realized that the difference was pretty clear: in my test projects, I was loading the images from within the form&#8217;s Load event; in BASeBlock, they were being loaded in a static constructor. So I decided to try to load the images elsewhere; I converted the static constructor to a static function, and called that function in the form load; there were a few other changes that I needed to make, mostly in the form of initializers attempting to use values that wouldn&#8217;t have been initialized.</p>
<p>The game started and ran fine with the NullSound driver.</p>
<p>Now, to fix the Sound; I opted to try to get nBASS working.</p>
<p>the solution was actually quite simple; merely a dllmap for bass.dll to libbass.so, and placing the x64 libbass.so in usr/lib was enough, and sound worked fine.</p>
<p>Unfortunately, it&#8217;s still slow as hell but at least I think that&#8217;s Mono&#8217;s fault. </p>
<div id="fcbk_share"><div class="fcbk_like">
										<div id="fb-root"></div>
										<script src="http://connect.facebook.net/en_US/all.js#appId=224313110927811&amp;xfbml=1"></script>
										<fb:like href="http://bc-programming.com/blogs/2010/11/porting-baseblock-to-linux-and-thoughts-on-mono/" send="false" layout="button_count" width="450" show_faces="false" font=""></fb:like>
									</div></div><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bc-programming.com/blogs/2010/11/porting-baseblock-to-linux-and-thoughts-on-mono/&via=BC_Programming&text=Porting BASeBlock To Linux, and thoughts on Mono&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div> <p><a href="http://bc-programming.com/blogs/?flattrss_redirect&amp;id=375&amp;md5=e95e773cb9752d37371451465bb53ec5" title="Flattr" target="_blank"><img src="http://bc-programming.com/blogs/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://bc-programming.com/blogs/2010/11/porting-baseblock-to-linux-and-thoughts-on-mono/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=bc_programming&amp;popout=1&amp;url=http%3A%2F%2Fbc-programming.com%2Fblogs%2F2010%2F11%2Fporting-baseblock-to-linux-and-thoughts-on-mono%2F&amp;language=en_GB&amp;category=software&amp;title=Porting+BASeBlock+To+Linux%2C+and+thoughts+on+Mono&amp;description=No%2C+Not+the+kissing+disease%2C+Infectious+mononucleosis%2C+the+open-source+.NET+CLR+interpreter+and+class+library.+.NET%3B+I+might+have+ranted+about+this+before%2C+if+not+on+my+blog%2C+elsewhere.+most...&amp;tags=.NET%2CC%23%2CLinux%2CMono%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>

