<?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>yesJames.com &#187; Software</title>
	<atom:link href="http://www.yesjames.com/index.php/category/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.yesjames.com</link>
	<description>ahuh... sure... what ever you say...</description>
	<lastBuildDate>Fri, 13 Nov 2009 02:59:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Vista &amp; Office 2007 Error: &#8220;has not been installed for the current user&#8221;</title>
		<link>http://www.yesjames.com/index.php/2009/05/vista-office-2007-error/</link>
		<comments>http://www.yesjames.com/index.php/2009/05/vista-office-2007-error/#comments</comments>
		<pubDate>Thu, 21 May 2009 10:42:11 +0000</pubDate>
		<dc:creator>james</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Office 2007]]></category>
		<category><![CDATA[Vista]]></category>

		<guid isPermaLink="false">http://www.yesjames.com/?p=153</guid>
		<description><![CDATA[If you&#8217;re running Microsoft Windows Vista, with Office 2007, you&#8217;ll more than likely come across this problem during one of your early automatic Office Updates or Service packs. The error comes as you try to launch your office application for the first time after an office update. It reads something along the lines of &#8220;&#60;application&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re running Microsoft Windows Vista, with Office 2007, you&#8217;ll more than likely come across this problem during one of your early automatic Office Updates or Service packs. The error comes as you try to launch your office application for the first time after an office update. It reads something along the lines of <em>&#8220;&lt;application&gt; has not been installed for the current user&#8221;</em>.</p>
<p>At the core of this issue is a simple malconfiguration of the MSI installer that performs the update and configures the registry. It seems that as the installer creates or modifies executeable files and/or registry keys, it does so as the administrator user. This in turn cases all of the permissions on those files/keys to reset to those of the administrator user, causing the error you see.</p>
<p>Specifically, Update KB951944for Office 2007 seems to be the update causing the issue (according to user who have tested each and every patch for the bug). Skipping this one <em>should</em> avoid the problem all together.</p>
<p>There are several possible resolutions to this problem depending on your specific situation, some simple to solve, some more difficult.</p>
<p>The most obvious, and easiest fo resolve, is permissions on the executable files themselves. Firstly you have to open the Office application folder (normally &#8220;C:Program files (x86) Microsoft OfficeOffice 12&#8243; or similar). You&#8217;ll need to locate each individual application executable (e.g. &#8220;<em>Word</em>&#8221; is &#8220;<em>winword.exe</em>&#8220;.) Right click on the executeable and select the &#8220;<strong>Properties</strong>&#8221; menu. In the properties window that opens, select the &#8220;<strong>Security</strong>&#8221; tab and click &#8220;<strong>Edit</strong>&#8220;. Give &#8220;<strong>Users</strong>&#8221; full control. You&#8217;ll may (in rare cases) need to re-create your shortcuts from these files.</p>
<p>Amongst the registry keys that are affected are the following:</p>
<ul>
<li>HKLMSoftwareMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Components379E92CC2CB71D119A12000A9CE1A22A</li>
<li>HKLMSoftwareMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18ComponentsDA42BC89BF25F5BD0AF18C3B9B1A1EE8</li>
<li>HKLMSoftwareMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18ComponentsDA42BC89BF25F5BD0BF18C3B9B1A1EE8</li>
<li>HKLMSoftwareMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18ComponentsDA42BC89BF25F5BD0CF18C3B9B1A1EE8</li>
<li>HKLMSoftwareMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Components82DE7549CF3F8CCB0DF18C3B9B1A1EE8</li>
<li>HKLMSoftwareMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Components6F949E36CB3004C50AF18C3B9B1A1EE8</li>
<li>HKLMSoftwareMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Components6F949E36CB3004C50CF18C3B9B1A1EE8</li>
<li>HKLMSoftwareMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Components7AA6F3DBF3CE139469FE63D56E7AF446</li>
</ul>
<p>Any (including any that may not be listed above yet simmilarly afflicted) registry affected in this manner keys need to have thier permissions reset to the same permissions as thier parent key. i.e permissions should be inherited.<br />
If you&#8217;re not comfortable doing this by hand, there&#8217;s an open-source utility called <strong>SetACL</strong> (<a title="SetACL at SourceForge" href="http://setacl.sourceforge.net/" target="_blank">http://setacl.sourceforge.net/</a>) that can help.</p>
<p><em><span style="text-decoration: underline;"><strong>WARNING</strong></span>: There are many keys under the &#8220;components&#8221; key that have nothing to do with Office! do not go and arbitrarily go and reset every single sub-key under &#8220;components&#8221; to inherited permissions, as this will effectively remove all UAC protection from all installed components (not just office) so don&#8217;t do that! You&#8217;ll have to inspect individual registry keys.</em></p>
<p>If you&#8217;re in fact going to use SetACL, you can execure the appropriate command-line function like this:</p>
<p><code>setacl -ot reg -on "HKLMSoftwareMicrosoftWindowsCurrentVersionIn  stallerUserDataS-1-5-18Components{GUID}" -actn setprot -op "dacl:np;sacl:nc" -rec yes</code></p>
<p>Where {GUID} is the ID of the component that requires resetting. It may be easier to copy this command into a batch file if you need to execute it numerous times. Typing this over and over 30 times can be painful.</p>
<p>Well, hopefully one of these solutions has solved the problem fo you. If not, I&#8217;ve heard of a later update causing almost the same issue, so you may very well be experiencing a similar problem! Let me know if you do&#8230; especially if you figure out another way to solve it.</p>
<p>Thanks to everyone at VistaHeads for following up the problem.</p>
<p>For more information, and to join in discussions on Microsoft products, see the following Microsoft specific Newsgroups:<br />
microsoft.public.office.misc and microsoft.public.word.newusers</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yesjames.com/index.php/2009/05/vista-office-2007-error/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Delphi: Declaring and initialising constant arrays</title>
		<link>http://www.yesjames.com/index.php/2009/02/delphi-declaring-and-initialising-constant-arrays/</link>
		<comments>http://www.yesjames.com/index.php/2009/02/delphi-declaring-and-initialising-constant-arrays/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 03:54:58 +0000</pubDate>
		<dc:creator>james</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.yesjames.com/?p=141</guid>
		<description><![CDATA[In Delphi, arrays are, put simply, a list of values contained within a common variable, that are accessible by their index within that list.
But what if you don&#8217;t want your list of values to be able to be altered at run-time? You need them to be contained in a constant rather than a variable.
Example: to [...]]]></description>
			<content:encoded><![CDATA[<p><script src="http://www.yesjames.com/wp-content/themes/yesjames_blue/sh/shBrushDelphi.js" type="text/javascript"></script>In Delphi, arrays are, put simply, a list of values contained within a common variable, that are accessible by their index within that list.</p>
<p>But what if you don&#8217;t want your list of values to be able to be altered at run-time? You need them to be contained in a constant rather than a variable.</p>
<p><strong>Example:</strong> to declare an array of abbreviated week names:</p>
<pre name="code" class="delphi">
const
  Days: Array[0..6] of String = (
      'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'
  );
</pre>
<p>You could then access each name by the index of the day of the week within the <strong>Days</strong> constant.</p>
<pre name="code" class="delphi">
i := DayOfWeek(Date); //returns an integer 0-6
ShowMessage('Today is  ' + Days[i]);
</pre>
<p>Another common use for constant arrays is to describe the values in an ENUM type:</p>
<pre name="code" class="delphi">
type
  TStatusCodes = [
    scUnknown, scActive, scPending,
    scDisabled, scSuspended
  ];
const
  StatusString = Array[TStatusCodes] of String = (
    'Unknown', 'Active', 'Pending',
    'Disabled', 'Suspended'
  );
</pre>
<p>Then, the description string for each status code becomes available via the ordinal value of the status code itself:</p>
<pre name="code" class="delphi">
ShowMessage('Your account is '+ StatusString[scActive]);
</pre>
<p>Would show a message box with the text &#8220;<em>Your account is Active</em>&#8220;. Of course in the real world, the status code enumeration value would come from a user object or some such similar method (like &#8220;<em>function getAccountStatus(): TStatusCode;</em>&#8221; perhaps).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yesjames.com/index.php/2009/02/delphi-declaring-and-initialising-constant-arrays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to find Windows uptime</title>
		<link>http://www.yesjames.com/index.php/2009/01/how-to-find-windows-uptime/</link>
		<comments>http://www.yesjames.com/index.php/2009/01/how-to-find-windows-uptime/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 22:19:51 +0000</pubDate>
		<dc:creator>james</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.yesjames.com/?p=130</guid>
		<description><![CDATA[Ok, so you want to know how long it&#8217;s been since your windows workstation or server was last (re)booted. There are two options. The first is built right into windows, the second is an external command-line program provided by Microsoft to help with the problem.
Option 1:

Go to &#8220;Start&#8221; -&#62; &#8220;Run&#8220;.
Write &#8220;cmd&#8221; and press on &#8220;Enter&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, so you want to know how long it&#8217;s been since your windows workstation or server was last (re)booted. There are two options. The first is built right into windows, the second is an external command-line program provided by Microsoft to help with the problem.</p>
<p><span style="text-decoration: underline;">Option 1:</span></p>
<ol>
<li>Go to &#8220;<em>Start</em>&#8221; -&gt; &#8220;<em>Run</em>&#8220;.</li>
<li>Write &#8220;<strong>cmd</strong>&#8221; and press on &#8220;<em>Enter</em>&#8221; key.</li>
<li>Write the command &#8220;<strong>net statistics server</strong>&#8221; and press on &#8220;<em>Enter</em>&#8221; key.</li>
<li>The line that start with &#8220;<em>Statistics since …</em>&#8221; provides the time that the server was up from.</li>
</ol>
<p>*   The command &#8220;<strong>net stats srv</strong>&#8221; can be use instead.</p>
<p><span style="text-decoration: underline;">Option 2:</span></p>
<p>The <strong>Uptime.exe</strong> tool allows you to estimate Server Availability with Windows NT 4.0 SP4 or Higher.</p>
<p><strong>Uptime.exe</strong> is a standalone program. To install the tool, simply copy the file into your <em>Windows</em> directory. You may then run the tool at a command prompt.</p>
<p>For extended help on this tool, type the following at a command prompt:</p>
<pre class="indent"><span class="userInput">uptime /help
</span></pre>
<p>This tool is most accurate when run with administrator privileges, however, even without administrator privileges, the tool attempts to make a best estimate based on available information. In all cases, the results should be considered estimates.</p>
<p>The <strong>uptime.exe</strong> program can be downloaded from Microsoft here:<br />
<a href="http://download.microsoft.com/download/winntsrv40/install/uptime_1.01/nt4/en-us/uptime.exe">http://download.microsoft.com/download/winntsrv40/install/uptime_1.01/nt4/en-us/uptime.exe</a></p>
<p><span style="text-decoration: underline;">See also:</span></p>
<p><a href="http://support.microsoft.com/kb/555737" target="_blank">http://support.microsoft.com/kb/555737</a><br />
<a href="http://support.microsoft.com/kb/232243" target="_blank">http://support.microsoft.com/kb/232243</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yesjames.com/index.php/2009/01/how-to-find-windows-uptime/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vista/Macrovision screwup</title>
		<link>http://www.yesjames.com/index.php/2008/12/vistamacrovision-screwup/</link>
		<comments>http://www.yesjames.com/index.php/2008/12/vistamacrovision-screwup/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 10:34:12 +0000</pubDate>
		<dc:creator>james</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Macrovision]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[Vuze]]></category>

		<guid isPermaLink="false">http://www.yesjames.com/?p=117</guid>
		<description><![CDATA[If you&#8217;ve been running Vista for any period, you may well have come across the following error if you&#8217;ve installed a software DVD player, or upgraded an existing one, or perhaps have Azureus Vuze or some other Java application with media player capabilities installed:
java.io.FileNotFoundException: C:\Documents and Settings\ReleaseEngineer.MACROVISION\Application Data\Azureus\azureus.config.saving (The system cannot find the path specified)
or
error:failed [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve been running Vista for any period, you may well have come across the following error if you&#8217;ve installed a software DVD player, or upgraded an existing one, or perhaps have Azureus Vuze or some other Java application with media player capabilities installed:</p>
<p><code>java.io.FileNotFoundException: C:\Documents and Settings\ReleaseEngineer.MACROVISION\Application Data\Azureus\azureus.config.saving (The system cannot find the path specified)</code></p>
<p>or<br />
<code>error:failed to create directory C:\Documents and Settings\ReleaseEngineer.MACROVISION\Application Data\Azureus\azureus.config.saving (The system cannot find the path specified)</code></p>
<p>Well, it seems that some genius programmer, instead of using the WIN32 function to determine the users application data path, has instead hard coded one assuming that the user will be running Windows XP under which creating the above directories might be allowed as all users are super users by default (under normal home-use circumstances).</p>
<p>Well, there is a solution &#8211; however it involves editing the Windows Registry.<br />
<em><span style="text-decoration: underline;"><strong>NOTE:</strong></span> If you&#8217;re unsure about what this means or are uncomfortable with editing the Windows Registry directly, ask for help from someone who has, or do a lot of research before you begin. If you break or corrupt your registry, windows may very easily become unusable.</em></p>
<p>Open your registry editor by running <strong>RegEdit</strong> from the windows &#8220;<em>RUN</em>&#8221; command:</p>
<p><code>Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folder</code></p>
<p>and make sure that <em>AppData</em> is set to &#8220;<strong>C:\Users\<em>&lt;user&gt;</em>\AppData\Roaming</strong>&#8220;. (replacing &lt;user&gt; with your local user account name &#8211; check the path yourself if unsure).</p>
<p><code>Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folder</code></p>
<p><em>AppData</em> should be &#8220;<strong>%USERPROFILE%\AppData\Roaming</strong>&#8221;</p>
<p><code>Computer\HKEY_CURRENT_USER\Volatile Environment</code></p>
<p><em>AppData</em> should be &#8220;<strong>C:\Users\&lt;user&gt;\AppData\Roaming</strong>&#8221; (again, replacing &lt;user&gt; with your local user account name &#8211; check the path yourself if unsure).</p>
<p>This should solve most of your issues.</p>
<p>I&#8217;ve been told that DELETING any registry keys containing the value: &#8220;<strong>C:\Documents and Settings\ReleaseEngineer.MACROVISION</strong>&#8221; will also work as the keys will be re-created automatically using default values (the correct default values) the next time a program saves its settings. However, this seems a drastic and possibly unsafe step, so leave it as a last resort if you&#8217;re still having problems.</p>
<p>Hope this help you all.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yesjames.com/index.php/2008/12/vistamacrovision-screwup/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>howto: Format numbers in JavaScript</title>
		<link>http://www.yesjames.com/index.php/2008/11/howto-format-numbers-in-javascript/</link>
		<comments>http://www.yesjames.com/index.php/2008/11/howto-format-numbers-in-javascript/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 23:17:32 +0000</pubDate>
		<dc:creator>james</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[web programming]]></category>

		<guid isPermaLink="false">http://www.yesjames.com/?p=41</guid>
		<description><![CDATA[Formatting Numbers
Numeric formatting in JavaScript can be very tedious. From handling non-numeric characters, to multiple-currency symbols, to alternate negative display methods. The functions below should be valuable in assisting to format numbers and currencies of all types.

To do complete formatting of a number, the following function formatNumber(), takes several parameters specifying the properties of the [...]]]></description>
			<content:encoded><![CDATA[<h3>Formatting Numbers</h3>
<p>Numeric formatting in JavaScript can be very tedious. From handling non-numeric characters, to multiple-currency symbols, to alternate negative display methods. The functions below should be valuable in assisting to format numbers and currencies of all types.</p>
<p><span id="more-41"></span></p>
<p>To do complete formatting of a number, the following function <b>formatNumber()</b>, takes several parameters specifying the properties of the output.</p>
<pre name="code" class="javascript">
/* formatNumber: PARAMETERS...
num: the decimal number to convert (must be numeric)
dec: number of resulting decimal places to keep
thou: the character to use for thousands separator
pnt: the character to use for decimal point
curr1: Preceding Currency Symbol
curr2: Trailing Currency symbol
n1: Preceding Negative character
n2: Trailing Negative character
*/
function formatNumber(num, dec, thou, pnt, curr1, curr2, n1, n2) {
	var x = Math.round(num * Math.pow(10,dec));
	if (x >= 0) n1 = n2 = '';
	var y = (''+ Math.abs(x)).split('');
	var z = y.length - dec;
	if (z<0) z--;
	for (var i = z; i < 0; i++) y.unshift('0');
	if (z<0) z = 1;
	y.splice(z, 0, pnt);
	if (y[0] == pnt) y.unshift('0');
	while (z > 3) { z-=3; y.splice(z,0,thou); }
	var r = curr1 + n1 + y.join('') + n2 + curr2;
	return r;
}
</pre>
<p>To use this function, simply call the function with the parameters you require.<br />
e.g. To display a currency (western such as USD or AUD):</p>
<pre name="code" class="javascript">
var cur = formatNumber(1257.45, 2, ',', '.', '$', '', '-', '');
alert(cur);
</pre>
<p>will output: <b>$1,257.45</b></p>
<p>Alternatively, you may decide to use a helper function that defaults most of these values for you. For example:</p>
<pre name="code" class="javascript">
function formatCurrency(num) {
  return formatNumber(num, 2, ',', '.', '$', '', '-', '');
}
</pre>
<p>The thousandsFormat() function takes any decimal number, negative or positive, and formats it by adding commas every three digits. This makes the number more readable for your site visitors:</p>
<pre name="code" class="javascript">
// This function formats numbers by adding commas
function thousandsFormat(nStr) {
  nStr += '';
  x = nStr.split('.');
  x1 = x[0];
  x2 = x.length &gt; 1 ? '.' + x[1] : '';
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1))
    x1 = x1.replace(rgx, '$1' + ',' + '$2');
  return x1 + x2;
}
</pre>
<h2>Strip Non-Numeric Characters From a String</h2>
<p>The stripNonNumeric() function strips any non-numeric characters from a string leaving you with a valid decimal number. This function considers the minus sign (hyphen) and the period to be numeric and will not strip them unless the minus sign is not at the beginning of the number or there is more than one period:</p>
<pre name="code" class="javascript">
// This function removes non-numeric characters
function stripNonNumeric(str) {
  str += '';
  var rgx = /^\d|\.|-$/;
  var out = '';
  for (var i = 0; i < str.length; i++) {
    if (rgx.test(str.charAt(i))) {
      if (!((str.charAt(i)=='.' &#038;&#038; out.indexOf('.')!=-1)
        || (str.charAt(i)=='-' &#038;&#038;  out.length!=0))) {
        out += str.charAt(i);
      }
    }
  }
  return out;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.yesjames.com/index.php/2008/11/howto-format-numbers-in-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delphi: Minimising child forms in an SDI application</title>
		<link>http://www.yesjames.com/index.php/2008/11/delphi-minimising-child-forms-in-an-sdi-application/</link>
		<comments>http://www.yesjames.com/index.php/2008/11/delphi-minimising-child-forms-in-an-sdi-application/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 22:37:10 +0000</pubDate>
		<dc:creator>james</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[SDI]]></category>
		<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://www.yesjames.com/?p=45</guid>
		<description><![CDATA[In an SDI application (Single Document Interface), the main form acs as the &#8220;container&#8221; for the entire application. This means that child forms, are exactly that &#8211; children of the application. The long and short of which, means that when you minimise the main form of the application, all forms are hidden. In addition to [...]]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript" language="javascript" src="http://www.yesjames.com/wp-content/themes/yesjames_blue/sh/shBrushDelphi.js"></script>In an SDI application (Single Document Interface), the main form acs as the &#8220;container&#8221; for the entire application. This means that child forms, are exactly that &#8211; children of the application. The long and short of which, means that when you minimise the main form of the application, all forms are hidden. In addition to which, when you minimise a child form of the application, it doesn&#8217;t minimise to the task bar, instead it minimises to the application desktop. This also has the side effect that only the main application form itself has a task bar button.</p>
<p>So, How do I change this behaviour?</p>
<p><span id="more-45"></span></p>
<p>For one reason or another, you may decide that you want to let each child form in an application you create have it&#8217;s own Task Bar button, and as a result, complete control over it&#8217;s visibility when the application&#8217;s main form is minimized/restored. Ordinarily, the first form created in your application is the <i>Main Form</i>. It is the parent of all other forms that will be created in your application, and as such, when the main form closes, the application terminates. In addition, when the main form is minimised, all child forms are also minimized as the application is hidden. Only the main form in this case has a button on the task bar.</p>
<h3>So, you don&#8217;t really want your child forms to be hidden when you minimise the main form of the application&#8230;</h3>
<p>Well, you need to do two things. Both can be done inside the <b>CreateParams()</b> method of your form. SO you&#8217;ll need to override this procedure.<br/><br />
Firstly, you&#8217;ll need to change the style parameters of the form when it is created. More specifically, you need to override the  and manually set the <b>ExStyle</b> parameter. Secondly, you&#8217;ll need to change the parent of the form form the applications main form to something else &#8211; usually the Windows Desktop.</p>
<p>Firstly, you need to add the style <b><i>WS_EX_APPWINDOW</i></b> to the style of the window being created. You can do this by <b><i>or</i></b>ing this constant with the <i>ExStyle</i> paramter as such:</p>
<pre name="code" class="delphi">
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
</pre>
<p>So, the code would look like this:</p>
<pre name="code" class="delphi">
interface

type
TChildForm = class(TForm)
  ...
  protected
  procedure CreateParams(var Params: TCreateParams); override;
    ...

implementation

  procedure TChildForm.CreateParams(var Params: TCreateParams);
  begin
    inherited;
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
    Params.WndParent := GetDesktopWindow;
  end;
</pre>
<p>References:</p>
<p>http://delphi.about.com/od/formsdialogs/a/child_forms.htm</p>
<p>http://delphi.about.com/od/formsdialogs/l/aa073101a.htm</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yesjames.com/index.php/2008/11/delphi-minimising-child-forms-in-an-sdi-application/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hidden dialog box in Outlook 2007 problem</title>
		<link>http://www.yesjames.com/index.php/2008/09/hidden-dialog-box-in-outlook-2007-problem/</link>
		<comments>http://www.yesjames.com/index.php/2008/09/hidden-dialog-box-in-outlook-2007-problem/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 07:53:58 +0000</pubDate>
		<dc:creator>james</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[KB946983]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Office 2007]]></category>
		<category><![CDATA[Outlook 2007]]></category>
		<category><![CDATA[Word 2007]]></category>

		<guid isPermaLink="false">http://www.yesjames.com/?p=49</guid>
		<description><![CDATA[Microsoft post updates to all of thier applications on a regular basis. Almost all of them relate to security patches of some sort, some update functionality.
One of the more recent updates to Microsoft Office 2007 caused quite some trouble to some users, specifically when running Outlook (or Word etc.) for the first time as a [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft post updates to all of thier applications on a regular basis. Almost all of them relate to security patches of some sort, some update functionality.</p>
<p>One of the more recent updates to Microsoft Office 2007 caused quite some trouble to some users, specifically when running Outlook (or Word etc.) for the first time as a new user on a given machine.</p>
<p>The problem manifests itself by not allowing the user to perform any operations inside the program, or exit the application. In Outlook, this means you can&#8217;t open an email, or pretty much anything else. The program won&#8217;t even exit. There&#8217;s one hint however &#8211; if you try and tun a second copy of the program, you get the error message: &#8220;<span class="MsgBodyText"><strong><em>A dialog box is open. Close it and try again.</em></strong>&#8220;</span></p>
<p>As it turns out, this is hafll correct. There <em>is</em> in fact a dialogue box open. But it&#8217;s not visible to the user. The dialog box is the setup window that asks the user for their name and initials. Unfortunately as fast as the window appearsm it&#8217;s hidden again from the user.</p>
<p>It turns out, t<span class="MsgBodyText">he problem is related to <em><strong>KB946983 </strong></em>(Outlook 2007 Update), so removing this patch corrects the functionality&#8230; It&#8217;s important to note though, that update does correct a security vulnerability in Outlook, and you may wish to re-apply the update after you&#8217;ve fixed the problem.</span></p>
<p>The second option to resolve this issue, is to run one of the other Office 2007 programs (e.g. Word), fill in the dialogue box, save the settings, exit both programs (You&#8217;ll probably have to end the &#8220;Outlook.exe&#8221; taks from the task manager), then re-start it all. This <em>usually</em> works, but some users have claimed this did not help, which may or may not be related to the order in which they do these things.</p>
<p>Hope this helps someone.</p>
<p>Ref: <a href="http://office-outlook.com/outlook-forum/index.php/m/282796/" target="_blank">http://office-outlook.com/outlook-forum/index.php/m/282796/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yesjames.com/index.php/2008/09/hidden-dialog-box-in-outlook-2007-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>howto: GET a URL parameter in JavaScript</title>
		<link>http://www.yesjames.com/index.php/2008/02/howto-get-a-url-parameter-in-javascript/</link>
		<comments>http://www.yesjames.com/index.php/2008/02/howto-get-a-url-parameter-in-javascript/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 09:38:01 +0000</pubDate>
		<dc:creator>james</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[get parameter]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[parameters]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[source code]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[url parameter]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://www.yesjames.com/index.php/2008/02/11/howto-get-a-url-parameter-in-javascript/</guid>
		<description><![CDATA[A useful little piece of JavaScript for retrieving a URL parameter (Query String) from your page. If a requested parameter doesn&#8217;t exist it will return an empty string rather than a NULL object. It will also handle the inclusion of anchor tags in the URL and exclude them from possible results.
e.g. http://www.yesjames.com/test.php?myparam=justatest
calling &#8220;gerURLParam(&#8216;myparam&#8217;) will return [...]]]></description>
			<content:encoded><![CDATA[<p>A useful little piece of JavaScript for retrieving a URL parameter (Query String) from your page. If a requested parameter doesn&#8217;t exist it will return an empty string rather than a NULL object. It will also handle the inclusion of anchor tags in the URL and exclude them from possible results.</p>
<blockquote><p>e.g. http://www.yesjames.com/test.php?myparam=justatest<br />
calling &#8220;gerURLParam(&#8216;myparam&#8217;) will return &#8220;justatest&#8221;</p></blockquote>
<pre name="code" class="javascript">
function getURLParam(name) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var pattern = "[\\?&amp;]"+name+"=([^&amp;#]*)";
  var regex = new RegExp(pattern);
  var aResult = regex.exec(window.location.href);
  if ( aResult == null ) {
    return "";
  } else {
    return aResult[1];
  }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.yesjames.com/index.php/2008/02/howto-get-a-url-parameter-in-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software Protection</title>
		<link>http://www.yesjames.com/index.php/2006/08/software-protection/</link>
		<comments>http://www.yesjames.com/index.php/2006/08/software-protection/#comments</comments>
		<pubDate>Tue, 15 Aug 2006 04:48:35 +0000</pubDate>
		<dc:creator>james</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.yesjames.com/index.php/2006/08/15/software-protection/</guid>
		<description><![CDATA[I've had an epiphany about software protection. I was listening to a TWIT.tv podcast the other day and one of the topics that came up was Digital Rights Management (DRM) and the laws associated with intellectual property protection and copyright. One of the issues that arose was the success of software that wasn't copy protected against those that were. Specifically 3D design and modelling packages and game design engines were mentioned.

I believe whole heartedly that there is a point where the investment in a piece of software requires some sort of serious licence management, especially for the really expensive software, the likes of Autodesk's Alias, 3ds Max and Maya, Newtek's Lightwave or SoftImage, and even high-end audio engineering packages. But how does the average Joe become proficient with these pieces of software if they're so hard to get your hands on and so expensive that only the most profitable of studios can afford to purchase them?]]></description>
			<content:encoded><![CDATA[<p><img align="right" alt="3dsMax" id="image25" title="3dsMax" src="http://www.yesjames.com/wp-content/uploads/2006/08/3d_studio_max.jpg" />I&#8217;ve had an epiphany about software protection. I was listening to a <a title="TWIT.tv" target="_blank" href="http://www.twit.tv/">TWIT.tv</a> podcast the other day and one of the topics that came up was Digital Rights Management (DRM) and the laws associated with intellectual property protection and copyright. One of the issues that arose was the success of software that wasn&#8217;t copy protected against those that were. Specifically 3D design and modelling packages and game design engines were mentioned.</p>
<p>I believe whole heartedly that there is a point where the investment in a piece of software requires some sort of serious licence management, especially for the really expensive software, the likes of Autodesk&#8217;s <a title="Alias" target="_blank" href="http://www.autodesk.com/alias">Alias</a>, <a title="3ds Max" target="_blank" href="http://www.autodesk.com/3dsmax">3ds Max</a> and <a title="Maya" target="_blank" href="http://www.autodesk.com/maya">Maya</a>, Newtek&#8217;s <a title="Lightwave 3d" target="_blank" href="http://www.newtek.com/lightwave/">Lightwave</a> or <a title="SoftImage" target="_blank" href="http://www.softimage.com/">SoftImage</a>, and even high-end audio engineering packages. But how does the average Joe become proficient with these pieces of software if they&#8217;re so hard to get your hands on and so expensive that only the most profitable of studios can afford to purchase them?</p>
<p><span id="more-23"></span>Most software is &#8220;evaluated&#8221; by the likes of teenage kids who want to play around with cool software like 3D Studio Max or Alias Studio, for creating wonderful 3D graphics and games &#8211; to test their skills and learn the tricks of the trade. These kids aren&#8217;t about to publish their own titles, and it would be pretty damn easy for anyone to figure out who did if they happened to be using an unlicensed copy of this software if they tried.</p>
<p>Professional Game studios and post-production film houses and special effects hoses normally have some sort of bulk licence agreement in place and would be highly exposed to even consider using a copy of software they didn&#8217;t have a licence for! This is where I believe it is imperative to allow to an extent, the unlicensed copies of this software to float around out there &#8211; call them trial versions, demos, what ever you like&#8230; they can be very important to the success of a product.</p>
<p>If there are thousands of people who are familiar with a articular product, a studio or production facility is much more likely to use that product just in order to have a larger talent base to chose from when hiring it&#8217;s employees. A product that requires special training and/or a large outlay before you can become familiar with it it going to be much less attractive to a potential large scale client regardless of their budget &#8211; it&#8217;s talent they&#8217;re after.</p>
<p><a title="Animal Logic" target="_blank" href="http://www.animallogic.com/">Animal Logic</a> for example, the special effects artists for Lord of the Rings, the Matrix, Hero and Face Off to name a few, use SoftImage, Maya and 3D Studio Max (primarily) and skills in these products will obviously greatly help anyone looking for work with this company in the modelling, animation or even lighting areas. How do you get industry experience unless you can get a job in the first place&#8230; easy &#8211; make sure you&#8217;re already good at it. Create yourself a portfolio of private work, and create things that interest you. The more personal the work, the better an idea a potential employer has of you capabilities and passions. But, how many kids get to play with a $6,000 software package let alone a $60,000 one, to learn the basics to see if they&#8217;re talented at creating digital content, and if it might be a career they might pursue?</p>
<p>I think it&#8217;s a fantastic tactic for these companies to allow copies of their software to get out there for people to play with. For starters, this would allow lots and lots of people to become familiar with their own custom user interface, and the ins and outs of working with their software. Not only would this make their software very popular, but it would vastly increase the qualified, or at least experienced, user-base. This means that there will be many more users for employers to choose from when finding reasons to go with one piece of software over another.</p>
<p>The companies that seem to be most successful at protecting their software against piracy are no longer in business! Why? That should be obvious by now. How can anyone afford to pay so much money on a piece of software that they have no idea how to use! Let people learn by playing.</p>
<p>No one in thier right mind would attempt too actually produce and release a piece of content created in such a visually obvious medium, without first putting the appropriate licenses in place.  We&#8217;re talking about medium to large movie houses, post production studios, and special effects houses here&#8230; they have no reason not to licence up properly. It&#8217;s the users themselves who may not have even become users of a given piece of software without first having experienced a trial or unlicensed version for a period of time, and in the case of true 3D artists, potentially quite a long period of time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yesjames.com/index.php/2006/08/software-protection/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
