<?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>LMD Innovative Blog</title>
	<atom:link href="http://blog.lmd.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lmd.de</link>
	<description>News, Tutorials</description>
	<lastBuildDate>Tue, 02 Mar 2010 18:09:40 +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>New LMD 2010 installers available (.08)</title>
		<link>http://blog.lmd.de/2010/03/new-lmd-2010-installers-available-08/</link>
		<comments>http://blog.lmd.de/2010/03/new-lmd-2010-installers-available-08/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 18:09:40 +0000</pubDate>
		<dc:creator>rmaricca</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.lmd.de/?p=157</guid>
		<description><![CDATA[New LMD 2010 installers are available. New versions of major packs are :
LMD-Tools 10.08
LMD ElPack 8.08
LMD IDE-Tools 3.08
Review changes on history page.
]]></description>
			<content:encoded><![CDATA[<p>New LMD 2010 installers are available. New versions of major packs are :</p>
<p><a href="http://www.lmd.de/products/vcl/lmdtools">LMD-Tools</a> <strong>10.08</strong><br />
<a href="http://www.lmd.de/products/vcl/lmdelpack">LMD ElPack</a> <strong>8.08</strong><br />
<a href="http://www.lmd.de/products/vcl/lmdidetools">LMD IDE-Tools</a> <strong>3.08</strong></p>
<p>Review changes on <a href="http://wiki.lmd.de/index.php/LMD_VCL_-_Resources">history page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmd.de/2010/03/new-lmd-2010-installers-available-08/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New LMD 2010 Installers available (.07)</title>
		<link>http://blog.lmd.de/2010/01/new-lmd-2010-installers-available-07/</link>
		<comments>http://blog.lmd.de/2010/01/new-lmd-2010-installers-available-07/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 17:26:04 +0000</pubDate>
		<dc:creator>rmaricca</dc:creator>
				<category><![CDATA[Announce]]></category>
		<category><![CDATA[LMD ElPack]]></category>
		<category><![CDATA[LMD IDE-Tools]]></category>
		<category><![CDATA[LMD Packs]]></category>
		<category><![CDATA[LMD VCL]]></category>
		<category><![CDATA[LMD-Tools]]></category>

		<guid isPermaLink="false">http://blog.lmd.de/?p=154</guid>
		<description><![CDATA[New LMD 2010 installers are available. New versions of major packs are :
LMD-Tools 10.07
LMD ElPack 8.07
LMD IDE-Tools 3.07
Review changes on history page.
]]></description>
			<content:encoded><![CDATA[<p>New LMD 2010 installers are available. New versions of major packs are :</p>
<p><a href="http://www.lmd.de/products/vcl/lmdtools">LMD-Tools</a> <strong>10.07</strong><br />
<a href="http://www.lmd.de/products/vcl/lmdelpack">LMD ElPack</a> <strong>8.07</strong><br />
<a href="http://www.lmd.de/products/vcl/lmdidetools">LMD IDE-Tools</a> <strong>3.07</strong></p>
<p>Review changes on <a href="http://wiki.lmd.de/index.php/LMD_VCL_-_Resources">history page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmd.de/2010/01/new-lmd-2010-installers-available-07/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Merry Christmas and Happy New Year 2010!</title>
		<link>http://blog.lmd.de/2009/12/merry-christmas-and-happy-new-year-2010/</link>
		<comments>http://blog.lmd.de/2009/12/merry-christmas-and-happy-new-year-2010/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 11:52:52 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[Non-Tech]]></category>
		<category><![CDATA[christmas]]></category>
		<category><![CDATA[congratulation]]></category>
		<category><![CDATA[new year]]></category>

		<guid isPermaLink="false">http://blog.lmd.de/2009/12/merry-christmas-and-happy-new-year-2010/</guid>
		<description><![CDATA[Best wishes from the LMD Innovative team!
All orders and support issues during holidays will be handled as usual. In the first two weeks of 2010 there might be delays in support handling, because most members of support team will be in holidays.
]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-149" title="ball_blue_1" src="http://blog.lmd.de/wp-content/uploads//ball_blue_1.png" alt="" width="96" height="96" />Best wishes from the LMD Innovative team!</p>
<p>All orders and support issues during holidays will be handled as usual. In the first two weeks of 2010 there might be delays in support handling, because most members of support team will be in holidays.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmd.de/2009/12/merry-christmas-and-happy-new-year-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New LMD 2010 Installers available (.06)</title>
		<link>http://blog.lmd.de/2009/12/new-lmd-2010-installers-available-06/</link>
		<comments>http://blog.lmd.de/2009/12/new-lmd-2010-installers-available-06/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 18:33:00 +0000</pubDate>
		<dc:creator>rmaricca</dc:creator>
				<category><![CDATA[Announce]]></category>
		<category><![CDATA[LMD ElPack]]></category>
		<category><![CDATA[LMD IDE-Tools]]></category>
		<category><![CDATA[LMD Packs]]></category>
		<category><![CDATA[LMD VCL]]></category>
		<category><![CDATA[LMD-Tools]]></category>
		<category><![CDATA[Non-Tech]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[installers]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://blog.lmd.de/?p=132</guid>
		<description><![CDATA[New LMD 2010 installers are available. New versions of major packs are :
LMD-Tools 10.06
LMD ElPack 8.06
LMD IDE-Tools 3.06
Review changes on history page.
This is mainly a release to work around a problem introduced with recent Delphi 2010 Updates in the shared runtime. The following line:
TLMDOnHeaderWrite = procedure(Sender : TObject; var Target : Text) of object;
causes now [...]]]></description>
			<content:encoded><![CDATA[<p>New LMD 2010 installers are available. New versions of major packs are :</p>
<p><a href="http://www.lmd.de/products/vcl/lmdtools">LMD-Tools</a> <strong>10.06</strong><br />
<a href="http://www.lmd.de/products/vcl/lmdelpack">LMD ElPack</a> <strong>8.06</strong><br />
<a href="http://www.lmd.de/products/vcl/lmdidetools">LMD IDE-Tools</a> <strong>3.06</strong></p>
<p>Review changes on <a href="http://wiki.lmd.de/index.php/LMD_VCL_-_Resources">history page</a>.</p>
<p>This is mainly a release to work around a problem introduced with recent Delphi 2010 Updates in the shared runtime. The following line:</p>
<pre class="brush:delphi;toolbar:false;gutter:false;">TLMDOnHeaderWrite = procedure(Sender : TObject; var Target : Text) of object;</pre>
<p>causes now a TI894 internal error.</p>
<p>This method signature is used OnHeaderWrite events in TLMDApplication class and TLMDApplicationCtrl control. For Delphi 2010 and above this line is now changed to:</p>
<pre class="brush:delphi;toolbar:false;gutter:false">TLMDOnHeaderWrite=procedure(Sender : TObject;const Target: TStringList) of object;</pre>
<p>This is a breaking change. If you used this event you need to change your code slightly (add your header lines now to Stringlist instead writing to a TEXT variable.<br />
Please also note that this problem appeared for source code user in Delphi/C++ Builder with Update 2 or higher only. If you are not affected by this problem there is no need to update to .06 release.</p>
<p>[*] Memory leak in LMDVistaDialog.pas was fixed.<br />
[+] Added OldFilter property for TLMDCustomFileDialog.FileTypes, you now be able to set old filters like this Text files (*.txt)|*.TXT<br />
[*] Added default option to enable sizing in dealogs in OSes previous than Vista<br />
[*] TLMDPngObject &#8211; fixed drawing on Vista glass</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmd.de/2009/12/new-lmd-2010-installers-available-06/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Windows 7 API support for Taskbar &#8211; Part 1</title>
		<link>http://blog.lmd.de/2009/12/new-windows-7-api-for-taskbar-part-1/</link>
		<comments>http://blog.lmd.de/2009/12/new-windows-7-api-for-taskbar-part-1/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 17:16:53 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[Snippets]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[taskbar]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://blog.lmd.de/?p=87</guid>
		<description><![CDATA[The latest OS release from Microsoft introduces to us a lot of new features that (can) make life of developers easier and improve usability of own applications. This post is about small part of new Windows API that allows to customize taskbar button of your application.

Pictures and source code are telling more than 1000 words, [...]]]></description>
			<content:encoded><![CDATA[<p>The latest OS release from Microsoft introduces to us a lot of new features that (can) make life of developers easier and improve usability of own applications. This post is about small part of new Windows API that allows to customize taskbar button of your application.<br />
<span id="more-87"></span><br />
Pictures and source code are telling more than 1000 words, hence we start immediately with practical examples:<br />
Here is picture of what we will get after compiling <a href="http://blog.lmd.de/wp-content/uploads//windows7-part1.zip">sample project</a> &#8211; we will create project that has buttons on it&#8217;s taskbar thumbnail, that allow to control progressbar and another part is reflect progressbar state on application taskbar button:</p>
<p><div id="attachment_90" class="wp-caption alignnone" style="width: 546px"><a rel="lightbox[screenshot1.png]" href="http://blog.lmd.de/wp-content/uploads/screenshot1.png" title="windows7-part1-1" rel="lightbox[87]" rel="lightbox[87]"><img class="size-full wp-image-90 cboxModal" title="windows7-part1-1" src="http://blog.lmd.de/wp-content/uploads/screenshot1.png" alt="Sample project screenshot. Windows 7" width="536" height="249" /></a><p class="wp-caption-text">Sample project screenshot. Windows 7</p></div><strong>NB #1</strong> To compile code from this post you should have updated units from Delphi 2010 or unit from LMD Tools 2010 &#8211; LMDWindows7Utils.pas</p>
<p><strong>NB #2</strong> All manipulatations with taskbar buttons must be done after button will be created, to catch this moment we should subscribe to WM_TASKBARBUTTONCREATED event, that must firstly registered by RegisterWindowMessage(&#8216;TaskbarButtonCreated&#8217;); &#8211; I reccomend you to add this registration to initialization section of unit with your form:</p>
<pre class="brush:delphi">//.....//
initialization
  WM_TASKBARBUTTONCREATED := RegisterWindowMessage('TaskbarButtonCreated');
end.</pre>
<p><strong>NB #3</strong> You must be sure that Application.MainFormOnTaskbar is True; or drop on form TLMDFormVista for delphi 6-2005 versions</p>
<p>Now, when we registered message we can handle it in WndProc method to setup taskbar button:</p>
<pre class="brush:delphi">type
  TForm8 = class(TForm)
    Timer1: TTimer;
    ImageList1: TImageList;
    ProgressBar1: TProgressBar;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    FTick: Int64;
    FButtons: array[0..2] of TThumbButton;
    FNormalIcon: Cardinal;
    FPauseIcon: Cardinal;
    FTaskBar: ITaskbarList3;
  protected
    procedure WndProc(var Message: TMessage); override;
    { Private declarations }
  public
    { Public declarations }
  end;
//...//
procedure TForm8.WndProc(var Message: TMessage);
begin
  inherited;
  // Is tasbar button created?
  if Message.Msg = WM_TASKBARBUTTONCREATED then
  begin
    // Create instance of ITaskbarList3
    CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, FTaskBar);
    // Init
    FTaskBar.HrInit;
    // This method set progress state of tasbar button.
    // Button has next states: error, paused, normal and indetermintate
    FTaskBar.SetProgressState(Handle, TBPF_NORMAL);
    FNormalIcon := LoadIcon(0, IDI_ASTERISK);
    FPauseIcon := LoadIcon(0, IDI_WARNING);
    // Set overlay icon for taskbar button - "!" - asterix
    FTaskBar.SetOverlayIcon(Handle, FNormalIcon, 'In progress');

    // Buttons setup
    // Set imagelist handle that contains glyphs for our buttons
    FTaskBar.ThumbBarSetImageList(Handle, ImageList1.Handle);
    // This identificator will be used to determinate what button pressed
    FButtons[0].iId := 40001;
    FButtons[0].dwFlags := THBF_ENABLED;
    FButtons[0].iBitmap := 0;
    StringToWideChar('Reset', FButtons[0].szTip, 260);
    FButtons[0].dwMask := THB_BITMAP or THB_FLAGS or THB_TOOLTIP;

    FButtons[1].iId := 40002;
    FButtons[1].dwFlags := THBF_DISABLED;
    FButtons[1].iBitmap := 1;
    StringToWideChar('Play', FButtons[1].szTip, 260);
    FButtons[1].dwMask := THB_BITMAP or THB_FLAGS or THB_TOOLTIP;

    FButtons[2].iId := 40003;
    FButtons[2].dwFlags := THBF_ENABLED;
    FButtons[2].iBitmap := 2;
    StringToWideChar('Pause', FButtons[2].szTip, 260);
    FButtons[2].dwMask := THB_BITMAP or THB_FLAGS or THB_TOOLTIP;
    // Add buttons to thumbnail
    FTaskBar.ThumbBarAddButtons(Handle, 3, @FButtons[0]);
    FTaskBar.SetThumbnailTooltip(Handle, 'Test');
    Timer1.Enabled := True;
  end;
end;</pre>
<p>To handle buttons click we need to catch WM_COMMAND message, WParamLo field will contains id of clicked button:</p>
<pre class="brush:delphi">procedure TForm8.WndProc(var Message: TMessage);
begin
  //...//
  if Message.Msg = WM_COMMAND then
  begin
    // Handle 'Reset' button
    if Message.WParamLo = 40001 then
    begin
      Timer1.Enabled := True;
      FTaskBar.SetProgressState(Handle, TBPF_NORMAL);
      FTick := 0;
    end;
    // Handle 'Play' button
    if Message.WParamLo = 40002 then
    begin
      // Run timer again
      Timer1.Enabled := True;
      FTaskBar.SetProgressState(Handle, TBPF_NORMAL);
      // Set overlay icon to asterix icon
      FTaskBar.SetOverlayIcon(Handle, FNormalIcon, 'In progress');
      ProgressBar1.State := pbsNormal;
      // Disable 'Play' button
      FButtons[1].dwFlags := THBF_DISABLED;
      // Enable 'Pause' button
      FButtons[2].dwFlags := THBF_ENABLED;
      // Update buttons
      FTaskBar.ThumbBarUpdateButtons(Handle, 3, @FButtons[0])
    end;
    // Handle 'Pause' button. Almost the same as for 'Play'
    if Message.WParamLo = 40003 then
    begin
      Timer1.Enabled := False;
      FTaskBar.SetProgressState(Handle, TBPF_PAUSED);
      FTaskBar.SetOverlayIcon(Handle, FPauseIcon, 'Paused');
      ProgressBar1.State := pbsPaused;
      FButtons[1].dwFlags := THBF_ENABLED;
      FButtons[2].dwFlags := THBF_DISABLED;
      FTaskBar.ThumbBarUpdateButtons(Handle, 3, @FButtons[0])
    end;
  end;
end;</pre>
<p>And finally OnTimer handler code:</p>
<pre class="brush:delphi">procedure TForm8.Timer1Timer(Sender: TObject);
begin
  FTaskBar.SetProgressValue(Handle, FTick, 200);
  ProgressBar1.Position := FTick;
  Inc(FTick);
  // It's all?
  if FTick &gt;= 200 then
  begin
    // Set indeterminate progress mode for tasbar button
    FTaskBar.SetProgressState(Handle, TBPF_INDETERMINATE);
    Timer1.Enabled := False;
  end;
end;</pre>
<p>That&#8217;s all for &#8220;Part 1&#8243; &#8211; I hope that it will be useful for someone.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmd.de/2009/12/new-windows-7-api-for-taskbar-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>December update of LMD 2010 installers</title>
		<link>http://blog.lmd.de/2009/12/119/</link>
		<comments>http://blog.lmd.de/2009/12/119/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 17:47:29 +0000</pubDate>
		<dc:creator>rmaricca</dc:creator>
				<category><![CDATA[Announce]]></category>
		<category><![CDATA[LMD ElPack]]></category>
		<category><![CDATA[LMD IDE-Tools]]></category>
		<category><![CDATA[LMD Packs]]></category>
		<category><![CDATA[LMD VCL]]></category>
		<category><![CDATA[LMD-Tools]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[installers]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://blog.lmd.de/?p=119</guid>
		<description><![CDATA[New LMD 2010 installers are available. New versions of major packs are :
LMD-Tools 10.05
LMD ElPack 8.05
LMD IDE-Tools 3.05
Besides that several standalone packs and the Freeware SE packages were updated as well.
Both public and protected download areas were updated with new installers.
Review changes on history page. LMD 2010 platform changes can be reviewed in public Wiki. [...]]]></description>
			<content:encoded><![CDATA[<p>New LMD 2010 installers are available. New versions of major packs are :</p>
<p><a href="http://www.lmd.de/products/vcl/lmdtools">LMD-Tools</a> <strong>10.05</strong><br />
<a href="http://www.lmd.de/products/vcl/lmdelpack">LMD ElPack</a> <strong>8.05</strong><br />
<a href="http://www.lmd.de/products/vcl/lmdidetools">LMD IDE-Tools</a> <strong>3.05</strong></p>
<p>Besides that several standalone packs and the Freeware SE packages were updated as well.</p>
<p>Both public and protected download areas were updated with new installers.<br />
Review changes on <a href="http://wiki.lmd.de/index.php/LMD_VCL_-_Resources">history page</a>. LMD 2010 platform changes can be reviewed in <a href="http://wiki.lmd.de/index.php/LMD_VCL_2010_-_What%27s_New%3F">public Wiki</a>. A comparison of all LMD packages packages can be reviewed in the <a href="http://www.lmd.de/products/vcl/lmdvcl/featmatrix.php">feature matrix</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmd.de/2009/12/119/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#8220;At&#8221; in font typename</title>
		<link>http://blog.lmd.de/2009/12/at-in-font-typename/</link>
		<comments>http://blog.lmd.de/2009/12/at-in-font-typename/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 22:55:12 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[LMD ElPack]]></category>
		<category><![CDATA[LMD Packs]]></category>
		<category><![CDATA[LMD VCL]]></category>
		<category><![CDATA[LMD-Tools]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://blog.lmd.de/?p=110</guid>
		<description><![CDATA[Several Windows font names start with &#8220;@&#8221; in their names, but what does that mean exactly? I think this is not of interest for me only &#8211; I just had a related support question from a customer. After googling 20 minutes I finally found the answer on MSDN (article &#8220;Vertical Writing and Printing&#8220;, which is no longer [...]]]></description>
			<content:encoded><![CDATA[<p>Several Windows font names start with &#8220;@&#8221; in their names, but what does that mean exactly? I think this is not of interest for me only &#8211; I just had a related support question from a customer. After googling 20 minutes I finally found the answer on MSDN (article &#8220;<a href="http://www.microsoft.com/globaldev/dis_v1/disv1.asp?DID=dis24d&amp;File=S24B6_h.asp">Vertical Writing and Printing</a>&#8220;, which is no longer available, though):</p>
<blockquote><p>
<em>As the following illustration shows, displaying text vertically doesn&#8217;t mean that you simply rotate an entire line of text by 90 degrees. Most characters remain upright, but others, such as those identified by arrows, change orientation.</em></p>
<p><img src="http://www.microsoft.com/globaldev/dis_v1/html/2216.gif" alt="" width="470" height="308" /></p>
<p><em>Fortunately, with Win32 you don&#8217;t need to write code to rotate characters. To display text vertically on Windows, enumerate the available fonts as usual and select a font whose typeface name begins with the at (@) character. Then create a LOGFONT structure, setting both the escapement and the orientation to 270 degrees. Calls to TextOut are the same as for horizontal text.</em></p>
<p><em>The Far East Win32 SDK contains a sample application called TATE (short for tategaki, meaning &#8220;vertical writing&#8221;) which demonstrates how to create fonts and display vertical text. Figure 7-22 shows a sample file displayed in TATE using a horizontal font. Selecting a vertical font from the Font dialog box (see Figure 7-23 below) causes the text to be displayed vertically. (See Figure 7-24 below.)</em>
</p></blockquote>
<p>As a result all LMD controls like TLMDFontComboBox, which allow to display or select a font, support now an option to hide such font names when they are of no or little use for your end customers. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmd.de/2009/12/at-in-font-typename/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>November update of LMD 2010 installers</title>
		<link>http://blog.lmd.de/2009/11/november-update-of-lmd-2010/</link>
		<comments>http://blog.lmd.de/2009/11/november-update-of-lmd-2010/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 09:52:54 +0000</pubDate>
		<dc:creator>Alexander</dc:creator>
				<category><![CDATA[Announce]]></category>
		<category><![CDATA[LMD ElPack]]></category>
		<category><![CDATA[LMD IDE-Tools]]></category>
		<category><![CDATA[LMD VCL]]></category>
		<category><![CDATA[LMD-Tools]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[installers]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://blog.lmd.de/?p=81</guid>
		<description><![CDATA[New LMD 2010 installers are available. New versions of major packs are :
LMD-Tools 10.04
LMD ElPack 8.04
LMD IDE-Tools 3.04
Besides that several standalone packs were updated as well.
Please note the updated executable demo projects:

LMD Grid Demo
Office Theme Renderer Demo
IDE-Tools 3 Demo.

Both public and protected download areas were updated with new installers.
Review changes on history page. LMD 2010 [...]]]></description>
			<content:encoded><![CDATA[<p>New LMD 2010 installers are available. New versions of major packs are :</p>
<p>LMD-Tools 10.04<br />
LMD ElPack 8.04<br />
LMD IDE-Tools 3.04</p>
<p>Besides that several standalone packs were updated as well.<br />
Please note the updated executable demo projects:</p>
<ul>
<li><a href="http://www.lmd.de/downloads/lmd2010vcl/lmd_grid.zip">LMD Grid Demo</a></li>
<li><a href="http://www.lmd.de/downloads/lmd2010vcl/lmd_theme.zip">Office Theme Renderer Demo</a></li>
<li><a href="http://www.lmd.de/downloads/lmd2010vcl/IDETools_Demo2.zip">IDE-Tools 3 Demo</a>.</li>
</ul>
<p>Both public and protected download areas were updated with new installers.<br />
Review changes on <a href="http://wiki.lmd.de/index.php/LMD_VCL_-_Resources">history page</a>. LMD 2010 platform changes can be reviewed in <a href="http://wiki.lmd.de/index.php/LMD_VCL_2010_-_What%27s_New%3F">public Wiki</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmd.de/2009/11/november-update-of-lmd-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The OnUserRule and OnTextChangedAt events of the TLMDMaskEdit control</title>
		<link>http://blog.lmd.de/2009/11/the-onuserrule-and-ontextchangedat-events-of-the-tlmdmaskedit-control/</link>
		<comments>http://blog.lmd.de/2009/11/the-onuserrule-and-ontextchangedat-events-of-the-tlmdmaskedit-control/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 21:10:37 +0000</pubDate>
		<dc:creator>vbocharov</dc:creator>
				<category><![CDATA[LMD-Tools]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[edit controls]]></category>
		<category><![CDATA[lmdtools]]></category>

		<guid isPermaLink="false">http://blog.lmd.de/?p=70</guid>
		<description><![CDATA[Once again, many thanks to Roddy Pratt for the subject of this post.
The OnUserRule event serves to check if entered symbol is correct for a given place when MaskType = meMask and there is an &#8220;r&#8221; letter in the mask. For example, if Mask = &#8216;rr&#8217;, following OnUserRule handler allows to enter &#8220;aa&#8221;, &#8220;ab&#8221;, &#8220;ba&#8221;, [...]]]></description>
			<content:encoded><![CDATA[<p>Once again, many thanks to Roddy Pratt for the subject of this post.<br />
The <strong>OnUserRule</strong> event serves to check if entered symbol is correct for a given place when MaskType = <em>meMask</em> and there is an &#8220;r&#8221; letter in the mask. For example, if Mask = &#8216;rr&#8217;, following <strong>OnUserRule</strong> handler allows to enter &#8220;aa&#8221;, &#8220;ab&#8221;, &#8220;ba&#8221;, &#8220;bb&#8221; strings only:</p>
<pre class="brush:delphi;gutter:false">procedure TForm1.LMDMaskEdit1UserRule(Sender: TObject; var Ok: Boolean;
   c: WideChar; at: Integer);
begin
  ok := ( c = 'a' ) or ( c = 'b' );
end;</pre>
<p>While implementing some kind of tricky user rule, it is very easy to yield to temptation of changing text with <strong>OnUserRule</strong> event.<br />
This is what should never be done unless you have some free hours to debug unexpected behavior of your construction.</p>
<p><span id="more-70"></span></p>
<p>So, the message of this post is: do not use the <strong>OnUserRule</strong> event  for changing the Text while it is being checked.<br />
You should use the <strong>OnTextChangedAt</strong> for this purposes.</p>
<p>Here is an example of how to modify text while user is entering characters: LMDMaskEdit control with a custom rule ( Mask = &#8216;rr&#8217; ) that allows entry of  2-digit numbers between 00 and 23 (including bounds). If a number is greater than 23 is entered, then the units digit is automatically set to 3.</p>
<pre class="brush:delphi;gutter:false">procedure TForm1.LMDMaskEdit1UserRule(Sender: TObject; var Ok: Boolean;
   c: WideChar; at: Integer);
begin
  case at of
    1: ok := ( Pos(AnsiChar(c), '012' ) &gt; 0);
    2: ok := ( (Pos(AnsiChar(LMDMaskEdit1.Text[1]), '012' )
         &gt; 0) ) and
        ( (Pos(AnsiChar(c), '0123456789' ) &gt; 0) ) ;
  end;
end;

procedure TForm1.LMDMaskEdit1TextChangedAt(sender: TObject; At: Integer);
begin
  if (at = 2) and (Pos(LMDMaskEdit1.BlankChar,
    LMDMaskEdit1.Text) = 0) then
    if strtoint(LMDMaskEdit1.Text) &gt; 23 then
      LMDMaskEdit1.Text := '23';
end;</pre>
<p>Note that LMDMaskEdit1.TextChangedAt can be simplified in this example if<br />
BlankChar = &#8216;0&#8242;:</p>
<pre class="brush:delphi;gutter:false">procedure TForm1.LMDMaskEdit1TextChangedAt(sender: TObject; At: Integer);
begin
  if (at = 2)  then
    if strtoint(LMDMaskEdit1.Text) &gt; 23 then
      LMDMaskEdit1.Text := '23';
end;</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmd.de/2009/11/the-onuserrule-and-ontextchangedat-events-of-the-tlmdmaskedit-control/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New validation scheme for TLMDSpinEdit/TLMDExtSpinEdit</title>
		<link>http://blog.lmd.de/2009/10/some-news-on-validating-input-in-tlmdspinedittlmdextspinedit/</link>
		<comments>http://blog.lmd.de/2009/10/some-news-on-validating-input-in-tlmdspinedittlmdextspinedit/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 21:41:48 +0000</pubDate>
		<dc:creator>vbocharov</dc:creator>
				<category><![CDATA[LMD VCL]]></category>
		<category><![CDATA[LMD-Tools]]></category>
		<category><![CDATA[edit controls]]></category>
		<category><![CDATA[lmdtools]]></category>

		<guid isPermaLink="false">http://blog.lmd.de/?p=50</guid>
		<description><![CDATA[Besides using the spin buttons and the arrow/ PgUp/PgDown keys, TLMDSpinEdit allows to enter values directly into the text field. By now this control handled a hard-coded validation on each entered character, because pressing digit keys caused changed values in the SetDouble method.
This behavior was OK when min value of control is zero or negative. [...]]]></description>
			<content:encoded><![CDATA[<p>Besides using the spin buttons and the arrow/ PgUp/PgDown keys, <strong>TLMDSpinEdit</strong> allows to enter values directly into the text field. By now this control handled a hard-coded validation on each entered character, because pressing digit keys caused changed values in the SetDouble method.</p>
<p>This behavior was OK when min value of control is zero or negative. But for min values greater than zero some interesting thing occurred which looked like a bug. Example: Setting MinValue = 5 it was impossible to enter values starting with 1, 2, 3, 4 digits directly (as described by Roddy Pratt&#8217;s post in LMD-Tools newsgroup from 8/10/2009).<br />
There was always a workaround: After entering e.g. &#8216;55&#8242; place cursor before first digit, and then press 1. Result is &#8216;15&#8242;. Alternatively, one could use PgUp key to change the value from 5 to 15, and then use arrow keys. We have to admit that this may not be comprehensible for the end user.</p>
<p>The problem is immanent to the per-symbol validation which is implemented by TLMDSpinEdit controls. How should we (as programmer) know that the end user is going to add a second character after entering &#8216;1&#8242;?<br />
We implemented an alternative mechanism to check end user entries: The property <strong>CheckOnExitOnly</strong> was introduced, which allows you to decide how and when validation checks should be performed. If set to false, per-symbol validation is enabled control behaves like before. If enabled, control checks value range only when control is loosing focus.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmd.de/2009/10/some-news-on-validating-input-in-tlmdspinedittlmdextspinedit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
