<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8857431988988627285</atom:id><lastBuildDate>Fri, 27 Nov 2009 18:20:52 +0000</lastBuildDate><title>Chris Bensen</title><description>I am a Senior R&amp;D Engineer at Embarcadero Technologies. This is my blog about Delphi, Photography, and stuff I find interesting.</description><link>http://chrisbensen.blogspot.com/</link><managingEditor>noreply@blogger.com (Chris Bensen)</managingEditor><generator>Blogger</generator><openSearch:totalResults>303</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ChrisBensenBlog" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-1161404991050410742</guid><pubDate>Tue, 24 Nov 2009 19:40:00 +0000</pubDate><atom:updated>2009-11-24T11:43:56.349-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CodeGear</category><title>Debugging Direct2D</title><description>When debugging Direct2D the debugger can be really slow, and I've recently discovered the culprit of the poor performance; the Intel graphics driver. The same performance problems happen in Visual Studio so it isn't a C++Builder or Delphi bug. If you are debugging Direct2D just run without debugging or get a system with an NVIDIA graphics card.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-1161404991050410742?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/D9NFP0wr-_w" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/D9NFP0wr-_w/debugging-direct2d.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/11/debugging-direct2d.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-2498647004405751258</guid><pubDate>Tue, 24 Nov 2009 16:00:00 +0000</pubDate><atom:updated>2009-11-24T08:45:28.225-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">CodeGear</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>Touch Demo</title><description>My Touch Move demo is now complete. Here is a quick list of the four parts:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://chrisbensen.blogspot.com/2009/09/touch-demo-part-i.html"&gt;Part I&lt;/a&gt;&lt;br /&gt;&lt;a href="http://chrisbensen.blogspot.com/2009/10/touch-demo-part-ii.html"&gt;Part II&lt;/a&gt; &lt;br /&gt;&lt;a href="http://chrisbensen.blogspot.com/2009/10/touch-demo-part-iii.html"&gt;Part III&lt;/a&gt; &lt;br /&gt;&lt;a href="http://chrisbensen.blogspot.com/2009/11/touch-demo-part-iv.html"&gt;Part IV&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And you can &lt;a href="http://cc.embarcadero.com/item/27469"&gt;download source code&lt;/a&gt; from CodeCentral for all four demos. The download wasn't working but has now been fixed.&lt;br /&gt;&lt;br /&gt;After the Thanksgiving Holiday I'll start something new. I was thinking of how to hack the touch keyboard, but if anyone has suggestions regarding things you'd like to know about touch drop me a line either via comments or the contact me link on the right side of this blog and I'll try and make a post out of it.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-2498647004405751258?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/5JQ1xUzZSME" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/5JQ1xUzZSME/touch-demo.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/11/touch-demo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-950410032726471983</guid><pubDate>Tue, 24 Nov 2009 01:54:00 +0000</pubDate><atom:updated>2009-11-24T09:22:24.005-08:00</atom:updated><title>Unicycling in Africa</title><description>My good friend Corbin got married this summer to the lovely Louise (yours truly photographed their wedding) and then they went for their honeymoon in Africa on unicycles! Here's an awesome video that Corbin made:&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0MQ7j4UylU8&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/0MQ7j4UylU8&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Here is another video from their tour. My daughter loves this one!&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JKbYZc-NrX4&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/JKbYZc-NrX4&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-950410032726471983?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/R6usnrBloXs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/R6usnrBloXs/unicycling-in-africa.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/11/unicycling-in-africa.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-6128938897812321654</guid><pubDate>Thu, 19 Nov 2009 21:00:00 +0000</pubDate><atom:updated>2009-11-24T08:36:45.425-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">CodeGear</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>Touch Demo Part IV</title><description>Previously I posted &lt;a href="http://chrisbensen.blogspot.com/2009/09/touch-demo-part-i.html"&gt;Part I&lt;/a&gt;, &lt;a href="http://chrisbensen.blogspot.com/2009/10/touch-demo-part-ii.html"&gt;Part II&lt;/a&gt; and &lt;a href="http://chrisbensen.blogspot.com/2009/10/touch-demo-part-iii.html"&gt;Part III&lt;/a&gt; of the Touch Demo.&lt;br /&gt;&lt;br /&gt;This is the final step of the touch demo where I will be adding the inertia processing and mouse support. Mouse support is easy but requires a minor refactoring of the touch message handler so the mouse can piggy back on it. For CodeRage I did add a touch keyboard but I will leave that as an exercise for the user.&lt;br /&gt;&lt;br /&gt;And now you can &lt;a href="http://cc.embarcadero.com/item/27469"&gt;download source code&lt;/a&gt; from CodeCentral for all four demos. Update: The download wasn't working but it has now been fixed.&lt;br /&gt;&lt;br /&gt;Inertia processing requires the Manipulations unit. Then the object that is to be manipulated, in this case TGlowSpot, should implement the _IManipulationsEvents interface which is a COM event sync. Here is how that class changed:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  TGlowSpot = class(TInterfacedObject, _IManipulationEvents)&lt;br /&gt;  private&lt;br /&gt;    FInertia: IInertiaProcessor;&lt;br /&gt;    FManipulator: IManipulationProcessor;&lt;br /&gt;    FInertiaCookie, FManipulatorCookie: LongInt;&lt;br /&gt;    FCompleted: BOOL;&lt;br /&gt;  public&lt;br /&gt;    X, Y, Radius: Integer;&lt;br /&gt;    Alpha: Extended;&lt;br /&gt;    FadeIn: Boolean;&lt;br /&gt;    Color: TColor;&lt;br /&gt;    ID: Integer;&lt;br /&gt;&lt;br /&gt;  protected&lt;br /&gt;    procedure DoTouch(const APoint: TPoint; AID: Integer; ATouchMessage: TTouchMessage);&lt;br /&gt;&lt;br /&gt;    { _IManipulationEvents }&lt;br /&gt;    function ManipulationStarted(X: Single; Y: Single): HRESULT; stdcall;&lt;br /&gt;    function ManipulationDelta(X: Single; Y: Single; translationDeltaX: Single;&lt;br /&gt;      translationDeltaY: Single; scaleDelta: Single; expansionDelta: Single;&lt;br /&gt;      rotationDelta: Single; cumulativeTranslationX: Single;&lt;br /&gt;      cumulativeTranslationY: Single; cumulativeScale: Single;&lt;br /&gt;      cumulativeExpansion: Single; cumulativeRotation: Single): HRESULT;&lt;br /&gt;      stdcall;&lt;br /&gt;    function ManipulationCompleted(X: Single; Y: Single;&lt;br /&gt;      cumulativeTranslationX: Single; cumulativeTranslationY: Single;&lt;br /&gt;      cumulativeScale: Single; cumulativeExpansion: Single;&lt;br /&gt;      cumulativeRotation: Single): HRESULT; stdcall;&lt;br /&gt;  public&lt;br /&gt;    constructor Create(AParent: TWinControl);&lt;br /&gt;&lt;br /&gt;    procedure Paint(Canvas: TDirect2DCanvas);&lt;br /&gt;    procedure Disconnect;&lt;br /&gt;    procedure ProcessInertia;&lt;br /&gt;  end;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Each TGlowSpot needs to hold on to an instance of the inertia processor and the manipulation processor and then connect up to them with the event sync. That is done in the constructor:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;constructor TGlowSpot.Create(AParent: TWinControl);&lt;br /&gt;begin&lt;br /&gt;  inherited Create;&lt;br /&gt;  Alpha := 1;&lt;br /&gt;  Radius := 80;&lt;br /&gt;  FadeIn := False;&lt;br /&gt;  Randomize;&lt;br /&gt;  Color := RGB(Random(255), Random(256), Random(256));&lt;br /&gt;  ID := -1;&lt;br /&gt;  FCompleted := True;&lt;br /&gt;  ID := -1;&lt;br /&gt;  FCompleted := True;&lt;br /&gt;&lt;br /&gt;  FInertia := CreateComObject(CLSID_IInertiaProcessor) as IInertiaProcessor;&lt;br /&gt;  FManipulator := CreateComObject(CLSID_IManipulationProcessor) as IManipulationProcessor;&lt;br /&gt;  InterfaceConnect(FInertia, _IManipulationEvents, Self, FInertiaCookie);&lt;br /&gt;  InterfaceConnect(FManipulator, _IManipulationEvents, Self, FManipulatorCookie);&lt;br /&gt;&lt;br /&gt;  FInertia.put_DesiredDeceleration(0.001);&lt;br /&gt;&lt;br /&gt;  FInertia.put_BoundaryLeft(200);&lt;br /&gt;  FInertia.put_BoundaryTop(200);&lt;br /&gt;  FInertia.put_BoundaryRight(AParent.Width - 200);&lt;br /&gt;  FInertia.put_BoundaryBottom(AParent.Height - 200);&lt;br /&gt;&lt;br /&gt;  FInertia.put_ElasticMarginLeft(200);&lt;br /&gt;  FInertia.put_ElasticMarginTop(200);&lt;br /&gt;  FInertia.put_ElasticMarginRight(200);&lt;br /&gt;  FInertia.put_ElasticMarginBottom(200);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And then of the disconnect is done like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;procedure TGlowSpot.Disconnect;&lt;br /&gt;begin&lt;br /&gt;  InterfaceDisconnect(FInertia, _IManipulationEvents, FInertiaCookie);&lt;br /&gt;  InterfaceDisconnect(FManipulator, _IManipulationEvents, FManipulatorCookie);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The inertia processing is handled with each WM_TOUCH message that is fired. It's pretty simple really, if there is a move, call the manipulation COM object's ProcessMove, and do the same with down. Up is a bit different because of the inertia but all you need to do is set the velocity and the location.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;procedure TGlowSpot.DoTouch(const APoint: TPoint; AID: Integer;&lt;br /&gt;  ATouchMessage: TTouchMessage);&lt;br /&gt;var&lt;br /&gt;  Vx, Vy: Single;&lt;br /&gt;begin&lt;br /&gt;  case ATouchMessage of&lt;br /&gt;    tmMove:&lt;br /&gt;    begin&lt;br /&gt;      X := APoint.X;&lt;br /&gt;      Y := APoint.Y;&lt;br /&gt;      FManipulator.ProcessMove(AID, APoint.X, APoint.Y);&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    tmDown:&lt;br /&gt;    begin&lt;br /&gt;      X := APoint.X;&lt;br /&gt;      Y := APoint.Y;&lt;br /&gt;      FManipulator.ProcessDown(AID, APoint.X, APoint.Y);&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    tmUp:&lt;br /&gt;    begin&lt;br /&gt;      ID := -1;&lt;br /&gt;&lt;br /&gt;      FManipulator.ProcessUp(AID, APoint.X, APoint.Y);&lt;br /&gt;&lt;br /&gt;      FManipulator.GetVelocityX(Vx);&lt;br /&gt;      FManipulator.GetVelocityY(Vy);&lt;br /&gt;&lt;br /&gt;      FInertia.put_InitialVelocityX(Vx);&lt;br /&gt;      FInertia.put_InitialVelocityY(Vy);&lt;br /&gt;&lt;br /&gt;      FInertia.put_InitialOriginX(X);&lt;br /&gt;      FInertia.put_InitialOriginY(Y);&lt;br /&gt;&lt;br /&gt;      FCompleted := False;&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TGlowSpot.ManipulationCompleted(X, Y, cumulativeTranslationX,&lt;br /&gt;  cumulativeTranslationY, cumulativeScale, cumulativeExpansion,&lt;br /&gt;  cumulativeRotation: Single): HRESULT;&lt;br /&gt;begin&lt;br /&gt;  Result := S_OK;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TGlowSpot.ManipulationDelta(X, Y, translationDeltaX, translationDeltaY,&lt;br /&gt;  scaleDelta, expansionDelta, rotationDelta, cumulativeTranslationX,&lt;br /&gt;  cumulativeTranslationY, cumulativeScale, cumulativeExpansion,&lt;br /&gt;  cumulativeRotation: Single): HRESULT;&lt;br /&gt;begin&lt;br /&gt;  Inc(Self.X, Round(translationDeltaX));&lt;br /&gt;  Inc(Self.Y, Round(translationDeltaY));&lt;br /&gt;  Result := S_OK;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TGlowSpot.ManipulationStarted(X, Y: Single): HRESULT;&lt;br /&gt;begin&lt;br /&gt;  Result := S_OK;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TGlowSpot.ProcessInertia;&lt;br /&gt;begin&lt;br /&gt;  if not FCompleted then&lt;br /&gt;    FInertia.Process(FCompleted);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The last bit of code I want to talk about is the mouse handling. I refactored the handling of the WM_TOUCH message into WMTouch and ProcessTouchMessages. ProcessTouchMessages is the common function that the mouse message can call to get the same inertia behavior.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;procedure TTouchForm.WMTouch(var Message: TMessage);&lt;br /&gt;&lt;br /&gt;  function TouchPointToPoint(const TouchPoint: TTouchInput): TPoint;&lt;br /&gt;  begin&lt;br /&gt;    Result := Point(TouchPoint.X div 100, TouchPoint.Y div 100);&lt;br /&gt;    PhysicalToLogicalPoint(Handle, Result);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  TouchInputs: array of TTouchInput;&lt;br /&gt;  TouchInput: TTouchInput;&lt;br /&gt;  Handled: Boolean;&lt;br /&gt;  Point: TPoint;&lt;br /&gt;  TouchMessage: TTouchMessage;&lt;br /&gt;begin&lt;br /&gt;  Handled := False;&lt;br /&gt;  SetLength(TouchInputs, Message.WParam);&lt;br /&gt;  GetTouchInputInfo(Message.LParam, Message.WParam, @TouchInputs[0],&lt;br /&gt;    SizeOf(TTouchInput));&lt;br /&gt;  try&lt;br /&gt;    for TouchInput in TouchInputs do&lt;br /&gt;    begin&lt;br /&gt;      Point := TouchPointToPoint(TouchInput);&lt;br /&gt;&lt;br /&gt;      if (TouchInput.dwFlags and TOUCHEVENTF_MOVE) &lt;&gt; 0 then&lt;br /&gt;        TouchMessage := tmMove&lt;br /&gt;      else if (TouchInput.dwFlags and TOUCHEVENTF_UP) &lt;&gt; 0 then&lt;br /&gt;        TouchMessage := tmUp&lt;br /&gt;      else if (TouchInput.dwFlags and TOUCHEVENTF_DOWN) &lt;&gt; 0 then&lt;br /&gt;        TouchMessage := tmDown;&lt;br /&gt;&lt;br /&gt;      ProcessTouchMessages(Point, TouchInput.dwID, TouchMessage);&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    Handled := True;&lt;br /&gt;  finally&lt;br /&gt;    if Handled then&lt;br /&gt;      CloseTouchInputHandle(Message.LParam)&lt;br /&gt;    else&lt;br /&gt;      inherited;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TTouchForm.ProcessTouchMessages(const APoint: TPoint; ID: Integer;&lt;br /&gt;  TouchMessage: TTouchMessage): TGlowSpot;&lt;br /&gt;var&lt;br /&gt;  Spot: TGlowSpot;&lt;br /&gt;begin&lt;br /&gt;  Result := nil;&lt;br /&gt;  Spot := FindSpot(ID);&lt;br /&gt;&lt;br /&gt;  if Spot = nil then&lt;br /&gt;  begin&lt;br /&gt;    Spot := FindSpot(APoint);&lt;br /&gt;&lt;br /&gt;    if Spot &lt;&gt; nil then&lt;br /&gt;      Spot.ID := ID;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  if Spot = nil then&lt;br /&gt;  begin&lt;br /&gt;    Spot := TGlowSpot.Create(Self);&lt;br /&gt;    Spot.ID := ID;&lt;br /&gt;    FSpots.Add(Spot);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  Spot.DoTouch(APoint, ID, TouchMessage);&lt;br /&gt;  Result := Spot;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And last the mouse handling functions with the check for ssTouch in the Shift parameter. If that check wasn't there each message would happen effectively twice because the touch messages also send mouse messages for backwards compatibility with applications that don't support touch.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;procedure TTouchForm.FormMouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt;  Shift: TShiftState; X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt;  if ssTouch in Shift then Exit;&lt;br /&gt;  FMouseDown := True;&lt;br /&gt;  ProcessTouchMessages(Point(X, Y), 0, tmDown);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TTouchForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,&lt;br /&gt;  Y: Integer);&lt;br /&gt;begin&lt;br /&gt;  if ssTouch in Shift then Exit;&lt;br /&gt;  if FMouseDown then&lt;br /&gt;    ProcessTouchMessages(Point(X, Y), 0, tmMove);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TTouchForm.FormMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt;  Shift: TShiftState; X, Y: Integer);&lt;br /&gt;var&lt;br /&gt;  Spot: TGlowSpot;&lt;br /&gt;begin&lt;br /&gt;  if ssTouch in Shift then Exit;&lt;br /&gt;  Spot := ProcessTouchMessages(Point(X, Y), 0, tmUp);&lt;br /&gt;  Spot.ID := -1;&lt;br /&gt;  FMouseDown := False;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I just realized that there is a bug in the program. It will run just fine but crash pretty bad if it runs too long. I guess I never demoed it very long before. So I'll leave debugging this crash as an exercise for the user.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-6128938897812321654?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/n9iaUTxPIFQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/n9iaUTxPIFQ/touch-demo-part-iv.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/11/touch-demo-part-iv.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-6850753732402089229</guid><pubDate>Tue, 27 Oct 2009 20:00:00 +0000</pubDate><atom:updated>2009-10-27T15:12:26.679-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>Dell Latitude XT2 XFR Rugged Tablet</title><description>&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ZCjqsoDWjyg&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ZCjqsoDWjyg&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Dell just introduced the Latitude XT2 XFR; the rugged version of the XT2 multitouch tablet machine I've mentioned a few times before only with a name that is more of a mouth full. So for those of you waiting for a rugged machine before jumping into multitouch wait no longer. The short spec list is 12 inch multitouch display, 5lbs and 1.5 inches thick and mil spec badassness! It also comes with Vista. I guess Windows 7 isn't rugged certified? Just as well, first thing I do when I get a new machine is format it anyway. For all the awesomeness it'll set you back some serious coin. The base model is $3,600 but I loaded one up for just under $5k! I don't think I can justify one of these to Nick, but damn!&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-6850753732402089229?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/d-ls5Mq0rkM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/d-ls5Mq0rkM/dell-latitude-xt2-xfr-rugged-tablet.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/10/dell-latitude-xt2-xfr-rugged-tablet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-3014555119554838789</guid><pubDate>Mon, 26 Oct 2009 22:00:00 +0000</pubDate><atom:updated>2009-10-27T09:31:53.507-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>Dell SX2210T - Multitouch Monitors</title><description>The first standalone multi-touch monitor is the &lt;a href="http://accessories.us.dell.com/sna/products/Displays/productdetail.aspx?c=us&amp;l=en&amp;cs=19&amp;sku=320-1172"&gt; SX2210T&lt;/a&gt;. Looks pretty awesome for those that want to add a multi-touch monitor tho an existing computer.&lt;br /&gt;&lt;br /&gt;Updated: Link goes to the product page (which is up now) rather than the shopping cart.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-3014555119554838789?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/NkcG3_CGt0g" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/NkcG3_CGt0g/dell-sx2210t-multitouch-monitors.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/10/dell-sx2210t-multitouch-monitors.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-2277595076987082555</guid><pubDate>Thu, 15 Oct 2009 14:00:00 +0000</pubDate><atom:updated>2009-10-15T07:00:02.235-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><category domain="http://www.blogger.com/atom/ns#">C++Builder</category><title>Delphi Tips and Tricks - Additional Files</title><description>One of the most useful features in the Delphi IDE is CTRL + F12, or the "Search for units" dialog. One of the problems we encounter is we often want to look at files that are not in any of the opened projects. So a hidden registry key was created to add a list of files to the "Search for units" dialog. You can specify the text file by creating a string value under HKEY_CURRENT_USER\Software\CodeGear\BDS\&lt;version number&gt;\Globals named "AdditionalViewFiles". Set the string to the file you want the IDE to load. Note that IDE environment variables can be used here. For Example I have $(TP) set to "c:\source" and the AdditionalViewFiles string value is set to $(TP)\AdditionalViewFiles.txt.&lt;br /&gt;&lt;br /&gt;The text file format is name value pairs like any other INI file where the name is the short name you want to see and the value is the full path to the file (and this will expand IDE environment variables as well). For example:&lt;br /&gt;&lt;br /&gt;Foo.pas=$(TP)\somedirectory\Foo.pas&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-2277595076987082555?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/RAcqArbSyRQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/RAcqArbSyRQ/delphi-tips-and-tricks-additional-files.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/10/delphi-tips-and-tricks-additional-files.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-6145855114772005440</guid><pubDate>Mon, 12 Oct 2009 14:00:00 +0000</pubDate><atom:updated>2009-10-12T07:00:00.091-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>Sony Touchscreen Computer/TV</title><description>&lt;div style="padding: 0px; margin: 0px; width:320px;"&gt;&lt;embed height="440" width="500" flashvars="&amp;file=http://www.newswire.ca/en/releases/mmnr/smr/Sony.flv" allowfullscreen="true" allowscriptaccess="always" quality="high" src="http://smr.newswire.ca/swf/videoplayer.swf" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;From the specs I think this Sony Vaio L beats pants off the HP Touchsmart. It's got glass, HDMI input, 1080p (I'm not sure if this is the computer resolution as well) Blue-ray, NVIDIA graphics and the monitor can be used as a TV without turning on the computer. I'm not sure what the other computer specs are, but the mouse does look horrible. It also appears that the DVD drive isn't a slot loading drive so that's a bit odd. Check out &lt;a href="http://www.sonystyle.com/webapp/wcs/stores/servlet/CategoryDisplay?catalogId=1&amp;storeId=10151&amp;langId=-1&amp;categoryId=16155&amp;SR=sony_search_seo&amp;SQS=Vaio%20L"&gt;Sony website&lt;/a&gt; for more information.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-6145855114772005440?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/AaHbBHWlCZo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/AaHbBHWlCZo/sony-touchscreen-computertv.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/10/sony-touchscreen-computertv.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-5790501889742346194</guid><pubDate>Wed, 07 Oct 2009 16:00:00 +0000</pubDate><atom:updated>2009-11-02T20:32:38.180-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>Touch Demo Part III</title><description>Previously I posted &lt;a href="http://chrisbensen.blogspot.com/2009/09/touch-demo-part-i.html"&gt;Part I&lt;/a&gt; and &lt;a href="http://chrisbensen.blogspot.com/2009/10/touch-demo-part-ii.html"&gt;Part II&lt;/a&gt; of the Touch Demo.&lt;br /&gt;&lt;br /&gt;This time around we will add the glowing spots and the basic handling of the WM_TOUCH message. Add Generics.Collections to your uses and copy the following code to your unit:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;type&lt;br /&gt;  TGlowSpot = class&lt;br /&gt;  public&lt;br /&gt;    X, Y, Radius: Integer;&lt;br /&gt;    Alpha: Extended;&lt;br /&gt;    FadeIn: Boolean;&lt;br /&gt;    Color: TColor;&lt;br /&gt;&lt;br /&gt;  public&lt;br /&gt;    constructor Create(AParent: TWinControl);&lt;br /&gt;&lt;br /&gt;    procedure Paint(Canvas: TDirect2DCanvas);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TGlowSpotList = class(TList&amp;lt;TGlowSpot&amp;gt;);&lt;br /&gt;...&lt;br /&gt;&lt;b&gt;implementation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;procedure PaintGlow(Canvas: TDirect2DCanvas; Alpha: Single;&lt;br /&gt;  X, Y, Radius: Integer; Color: TColor);&lt;br /&gt;var&lt;br /&gt;  Stops: array[0 .. 1] of TD2D1GradientStop;&lt;br /&gt;  Gradient: ID2D1GradientStopCollection;&lt;br /&gt;  BrushProperties: TD2D1RadialGradientBrushProperties;&lt;br /&gt;  RadialBrush: ID2D1RadialGradientBrush;&lt;br /&gt;  Brush: TDirect2DBrush;&lt;br /&gt;begin&lt;br /&gt;  Stops[0].position := 0;&lt;br /&gt;  Stops[0].Color := D2D1ColorF(Color, Alpha);&lt;br /&gt;  Stops[1].position := 1;&lt;br /&gt;  Stops[1].Color := D2D1ColorF(Color, 0);&lt;br /&gt;  Canvas.RenderTarget.CreateGradientStopCollection&lt;br /&gt;    (@Stops[0], Length(Stops), D2D1_GAMMA_2_2, D2D1_EXTEND_MODE_CLAMP,&lt;br /&gt;    Gradient);&lt;br /&gt;  BrushProperties.center := D2D1PointF(X, Y);&lt;br /&gt;  BrushProperties.gradientOriginOffset.X := 0;&lt;br /&gt;  BrushProperties.gradientOriginOffset.Y := 0;&lt;br /&gt;  BrushProperties.radiusX := Radius;&lt;br /&gt;  BrushProperties.radiusY := Radius;&lt;br /&gt;  Canvas.RenderTarget.CreateRadialGradientBrush&lt;br /&gt;    (BrushProperties, nil, Gradient, RadialBrush);&lt;br /&gt;  Brush := TDirect2DBrush.Create(Canvas);&lt;br /&gt;  Brush.Handle := RadialBrush;&lt;br /&gt;  Canvas.Pen.Color := clNone;&lt;br /&gt;  Canvas.Brush := Brush;&lt;br /&gt;  Canvas.Ellipse(X - Radius, Y - Radius,&lt;br /&gt;    X + Radius, Y + Radius);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TGlowButton }&lt;br /&gt;&lt;br /&gt;constructor TGlowSpot.Create(AParent: TWinControl);&lt;br /&gt;begin&lt;br /&gt;  inherited Create;&lt;br /&gt;  Alpha := 1;&lt;br /&gt;  Radius := 80;&lt;br /&gt;  FadeIn := False;&lt;br /&gt;  Randomize;&lt;br /&gt;  Color := RGB(Random(255), Random(256), Random(256));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TGlowSpot.Paint(Canvas: TDirect2DCanvas);&lt;br /&gt;begin&lt;br /&gt;  PaintGlow(Canvas, Alpha, X, Y, Radius, Color);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Add a local to hold a lists of TGlowSpots to your form then create it and free it:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  TTouchForm = class(TForm)&lt;br /&gt;...  &lt;br /&gt;  private&lt;br /&gt;    FSpots: TGlowSpotList;&lt;br /&gt;...&lt;br /&gt;constructor TTouchForm.Create(AOwner: TComponent);&lt;br /&gt;begin&lt;br /&gt;  inherited;&lt;br /&gt;  FCanvas := TDirect2DCanvas.Create(Handle);&lt;br /&gt;  FSpots := TGlowSpotList.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TTouchForm.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FCanvas.Free;&lt;br /&gt;  FSpots.Free;&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Update the Paint routine to paint the spots:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;procedure TTouchForm.Paint;&lt;br /&gt;var&lt;br /&gt;  Spot: TGlowSpot;&lt;br /&gt;begin&lt;br /&gt;  Canvas.BeginDraw;&lt;br /&gt;&lt;br /&gt;  try&lt;br /&gt;    // Clear Background&lt;br /&gt;    Canvas.RenderTarget.Clear(D2D1ColorF(clBlack));&lt;br /&gt;&lt;br /&gt;    for Spot in FSpots do&lt;br /&gt;      Spot.Paint(Canvas);&lt;br /&gt;&lt;br /&gt;    // FPS&lt;br /&gt;    Canvas.Font.Color := clWhite;&lt;br /&gt;    Canvas.Brush.Color := clNone;&lt;br /&gt;    Canvas.Font.Size := 14;&lt;br /&gt;    Canvas.TextOut(10, 10, FloatToStrF(FFPS, ffFixed, 2, 2) + ' FPS');&lt;br /&gt;  finally&lt;br /&gt;    Canvas.EndDraw;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Modify the Update method to fade the spots:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;procedure TTouchForm.Update;&lt;br /&gt;var&lt;br /&gt;  Spot: TGlowSpot;&lt;br /&gt;begin&lt;br /&gt;  Inc(FFrames);&lt;br /&gt;&lt;br /&gt;  if GetTickCount - FStartTime &gt;= 1000 then&lt;br /&gt;  begin&lt;br /&gt;    FFPS := FFrames;&lt;br /&gt;    FFrames := 0;&lt;br /&gt;    FStartTime := GetTickCount;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  for Spot in FSpots do&lt;br /&gt;  begin&lt;br /&gt;    if Spot.FadeIn then&lt;br /&gt;      Spot.Alpha := Spot.Alpha + 0.012&lt;br /&gt;    else&lt;br /&gt;      Spot.Alpha := Spot.Alpha - 0.012;&lt;br /&gt;&lt;br /&gt;    if Spot.Alpha &lt; 0.3 then&lt;br /&gt;    begin&lt;br /&gt;      Spot.FadeIn := True;&lt;br /&gt;      Spot.Alpha := 0.4&lt;br /&gt;    end&lt;br /&gt;    else if Spot.Alpha &gt; 1 then&lt;br /&gt;      Spot.FadeIn := False;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And last handle the WM_TOUCH message:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  TTouchForm = class(TForm)&lt;br /&gt;...&lt;br /&gt;  procedure WMTouch(var Message: TMessage); message WM_TOUCH;&lt;br /&gt;...&lt;br /&gt;procedure TTouchForm.WMTouch(var Message: TMessage);&lt;br /&gt;&lt;br /&gt;  function TouchPointToPoint(const TouchPoint: TTouchInput): TPoint;&lt;br /&gt;  begin&lt;br /&gt;    Result := Point(TouchPoint.X div 100, TouchPoint.Y div 100);&lt;br /&gt;    PhysicalToLogicalPoint(Handle, Result);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  TouchInputs: array of TTouchInput;&lt;br /&gt;  TouchInput: TTouchInput;&lt;br /&gt;  Handled: Boolean;&lt;br /&gt;  Point: TPoint;&lt;br /&gt;  Spot: TGlowSpot;&lt;br /&gt;begin&lt;br /&gt;  Handled := False;&lt;br /&gt;  SetLength(TouchInputs, Message.WParam);&lt;br /&gt;  GetTouchInputInfo(Message.LParam, Message.WParam, @TouchInputs[0],&lt;br /&gt;    SizeOf(TTouchInput));&lt;br /&gt;  try&lt;br /&gt;    for TouchInput in TouchInputs do&lt;br /&gt;    begin&lt;br /&gt;      Point := TouchPointToPoint(TouchInput);&lt;br /&gt;      Spot := TGlowSpot.Create(Self);&lt;br /&gt;      Spot.X := Point.X;&lt;br /&gt;      Spot.Y := Point.Y;&lt;br /&gt;      FSpots.Add(Spot);&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    Handled := True;&lt;br /&gt;  finally&lt;br /&gt;    if Handled then&lt;br /&gt;      CloseTouchInputHandle(Message.LParam)&lt;br /&gt;    else&lt;br /&gt;      inherited;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you ran your app at this point you wouldn't get any touch messages. You need to call RegisterTouchWindow and UnregisterTouchWindow. I find it easiest to call UnregisterTouchWindow in the FormClose:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;procedure TTouchForm.FormClose(Sender: TObject; var Action: TCloseAction);&lt;br /&gt;begin&lt;br /&gt;  UnregisterTouchWindow(Handle);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and to call RegisterTouchWindow in the CreateWnd:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;procedure TTouchForm.CreateWnd;&lt;br /&gt;begin&lt;br /&gt;  inherited;&lt;br /&gt;  RegisterTouchWindow(Handle, 0);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now when you run your app and press the screen you'll get glowing spots wherever you touch the screen. Depending on your hardware 1, 2 or more at a time.&lt;br /&gt;&lt;br /&gt;UPDATE: There is a memory leak in this program because I didn't want to delete any code for the next step.&lt;br /&gt;&lt;br /&gt;UPDATE: Fixed HTML to make TGlowSpotList = class(TList) actually read TGlowSpotList(TList&amp;lt;TGlowSpot&amp;gt;);&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-5790501889742346194?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/R1s6uumrlec" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/R1s6uumrlec/touch-demo-part-iii.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">15</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/10/touch-demo-part-iii.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-8002444258492287921</guid><pubDate>Tue, 06 Oct 2009 20:00:00 +0000</pubDate><atom:updated>2009-10-07T09:07:54.064-07:00</atom:updated><title>How to Write Applications Useful for Color Blind Users</title><description>&lt;a href="http://www.wearecolorblind.com"&gt;We Are Color Blind&lt;/a&gt; is an online repository of information for anyone involved with creating content for the web and making it accessible to the color blind. This is a great resource that I feel is useful for anyone creating content or building applications, not just for the web.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.wearecolorblind.com/articles/quick-tips/"&gt;Quick Tips&lt;/a&gt; is probably a good place to start.&lt;br /&gt;&lt;br /&gt;UPDATE: Fixed links.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-8002444258492287921?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/SPNQeUyZTp8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/SPNQeUyZTp8/how-to-write-applications-useful-for.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/10/how-to-write-applications-useful-for.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-564082044553700552</guid><pubDate>Tue, 06 Oct 2009 15:00:00 +0000</pubDate><atom:updated>2009-10-06T10:00:01.612-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>Touch Demo Part II</title><description>Last week I posted &lt;a href="http://chrisbensen.blogspot.com/2009/09/touch-demo-part-i.html"&gt;Touch Demo Part I&lt;/a&gt;. This is the continuation to that series.&lt;br /&gt;&lt;br /&gt;In Part I I demonstrated how to add the Direct2D Canvas to a form. This step is another foundation step that will add frames to your application by adding a timer.&lt;br /&gt;&lt;br /&gt;At the moment the form looks like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;type&lt;/b&gt;&lt;br /&gt;  TTouchForm = &lt;b&gt;class&lt;/b&gt;(TForm)&lt;br /&gt;  &lt;b&gt;private&lt;/b&gt;&lt;br /&gt;    FCanvas: TDirect2DCanvas;&lt;br /&gt;  &lt;b&gt;protected&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;procedure&lt;/b&gt; Paint; override;&lt;br /&gt;    &lt;b&gt;procedure&lt;/b&gt; Resize; override;&lt;br /&gt;    &lt;b&gt;procedure&lt;/b&gt; WMEraseBkgnd(&lt;b&gt;var Message&lt;/b&gt;: TWMEraseBkgnd); &lt;b&gt;message&lt;/b&gt; WM_ERASEBKGND;&lt;br /&gt;&lt;br /&gt;  &lt;b&gt;public&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;constructor&lt;/b&gt; Create(AOwner: TComponent); &lt;b&gt;override&lt;/b&gt;;&lt;br /&gt;    &lt;b&gt;destructor&lt;/b&gt; Destroy; &lt;b&gt;override&lt;/b&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;property&lt;/b&gt; Canvas: TDirect2DCanvas &lt;b&gt;read&lt;/b&gt; FCanvas&lt;br /&gt;      &lt;b&gt;write&lt;/b&gt; FCanvas;&lt;br /&gt;  &lt;b&gt;end&lt;/b&gt;;  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Add the following private fields to keep track of the frames:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    FFPS: Integer;&lt;br /&gt;    FFrames: Integer;&lt;br /&gt;    FStartTime: Cardinal;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and initialize them in the FormShow:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;procedure&lt;/b&gt; TTouchForm.FormShow(Sender: TObject);&lt;br /&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;  FFPS := 0;&lt;br /&gt;  FFrames := 0;&lt;br /&gt;  FStartTime := GetTickCount;&lt;br /&gt;&lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next update the Paint function:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;procedure&lt;/b&gt; TTouchForm.Paint;&lt;br /&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;  Canvas.BeginDraw;&lt;br /&gt;  &lt;b&gt;try&lt;/b&gt;&lt;br /&gt;    &lt;font color=green&gt;// Clear Background&lt;/font&gt;&lt;br /&gt;    Canvas.RenderTarget.Clear(D2D1ColorF(clBlack));&lt;br /&gt;&lt;br /&gt;    &lt;font color=green&gt;// FPS&lt;/font&gt;&lt;br /&gt;    Canvas.Font.Color := clWhite;&lt;br /&gt;    Canvas.Brush.Color := clNone;&lt;br /&gt;    Canvas.Font.Size := &lt;font color=blue&gt;14&lt;/font&gt;;&lt;br /&gt;    Canvas.TextOut(&lt;font color=blue&gt;10&lt;/font&gt;, &lt;font color=blue&gt;10&lt;/font&gt;, FloatToStrF(FFPS, ffFixed, &lt;font color=blue&gt;2&lt;/font&gt;, &lt;font color=blue&gt;2&lt;/font&gt;) + &lt;font color=blue&gt;' FPS'&lt;/font&gt;);  &lt;b&gt;finally&lt;/b&gt;&lt;br /&gt;    Canvas.EndDraw;&lt;br /&gt;  &lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And then add a protected Update method that updates the frames:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;procedure&lt;/b&gt; TTouchForm.Update;&lt;br /&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;  Inc(FFrames);&lt;br /&gt;&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; GetTickCount - FStartTime &gt;= 1000 &lt;b&gt;then&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;    FFPS := FFrames;&lt;br /&gt;    FFrames := 0;&lt;br /&gt;    FStartTime := GetTickCount;&lt;br /&gt;  &lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Last, drop a TTimer on your form and set the interval to 10. Also set the form's Align to alClient and the BorderStyle to bsNone.&lt;br /&gt;&lt;br /&gt;Next create the OnTimer event and simply call two functions, Update and Paint:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;procedure&lt;/b&gt; TTouchForm.Timer1Timer(Sender: TObject);&lt;br /&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;  Update;&lt;br /&gt;  Paint;&lt;br /&gt;&lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;At this point your form should look like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;type&lt;/b&gt;&lt;br /&gt;  TTouchForm = &lt;b&gt;class&lt;/b&gt;(TForm)&lt;br /&gt;    Timer1: TTimer;&lt;br /&gt;    &lt;b&gt;procedure&lt;/b&gt; Timer1Timer(Sender: TObject);&lt;br /&gt;    &lt;b&gt;procedure&lt;/b&gt; FormShow(Sender: TObject);&lt;br /&gt;  &lt;b&gt;private&lt;/b&gt;&lt;br /&gt;    FCanvas: TDirect2DCanvas;&lt;br /&gt;    FFPS: Integer;&lt;br /&gt;    FFrames: Integer;&lt;br /&gt;    FStartTime: Cardinal;&lt;br /&gt;  &lt;b&gt;protected&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;procedure&lt;/b&gt; Update;&lt;br /&gt;    &lt;b&gt;procedure&lt;/b&gt; Paint; override;&lt;br /&gt;    &lt;b&gt;procedure&lt;/b&gt; Resize; override;&lt;br /&gt;    &lt;b&gt;procedure&lt;/b&gt; WMEraseBkgnd(&lt;b&gt;var Message&lt;/b&gt;: TWMEraseBkgnd); &lt;b&gt;message&lt;/b&gt; WM_ERASEBKGND;&lt;br /&gt;&lt;br /&gt;  &lt;b&gt;public&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;constructor&lt;/b&gt; Create(AOwner: TComponent); &lt;b&gt;override&lt;/b&gt;;&lt;br /&gt;    &lt;b&gt;destructor&lt;/b&gt; Destroy; &lt;b&gt;override&lt;/b&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;property&lt;/b&gt; Canvas: TDirect2DCanvas &lt;b&gt;read&lt;/b&gt; FCanvas&lt;br /&gt;      &lt;b&gt;write&lt;/b&gt; FCanvas;&lt;br /&gt;  &lt;b&gt;end&lt;/b&gt;;  &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-564082044553700552?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/UMqiBmURj90" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/UMqiBmURj90/touch-demo-part-ii.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/10/touch-demo-part-ii.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-3519685742618506254</guid><pubDate>Mon, 05 Oct 2009 17:00:00 +0000</pubDate><atom:updated>2009-10-05T10:41:12.496-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>HP Touchsmart</title><description>If you buy a Touchsmart be sure to spend the extra duckets to get the NVIDIA graphics card. It comes with an NVIDIA GeForce 9300M which is a pretty smokin' card and you'll be much happier.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-3519685742618506254?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/FyggNZ_vJD8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/FyggNZ_vJD8/hp-touchsmart.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/10/hp-touchsmart.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-6615502801186067966</guid><pubDate>Thu, 24 Sep 2009 22:00:00 +0000</pubDate><atom:updated>2009-09-24T15:00:00.719-07:00</atom:updated><title>Failure Doesn't Preclude Success</title><description>This is a brilliant video on how failure doesn't preclude future success:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Y6hz_s2XIAU&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Y6hz_s2XIAU&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-6615502801186067966?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/GtfkT8-4M1Q" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/GtfkT8-4M1Q/failure-doesnt-preclude-success.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/09/failure-doesnt-preclude-success.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-7385487004049998013</guid><pubDate>Tue, 22 Sep 2009 17:00:00 +0000</pubDate><atom:updated>2009-10-06T13:29:19.066-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">CodeGear</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>Touch Demo Part I</title><description>Over the next few posts I am going to walk you through building one of the touch demos I used in my &lt;a href="http://cc.embarcadero.com/download.aspx?id=27253"&gt;CodeRage 4 Session&lt;/a&gt;. This demo demonstrates using Direct2D and the WM_TOUCH message. Before we get started here is a brief explanation of these two technologies.&lt;br /&gt;&lt;br /&gt;Since Windows Vista GDI has become a legacy drawing API supported with software rendering on top of Direct3D. Direct3D is great but it is very raw. This is where Direct2D shines for applications. Direct2D has all the performance benefits of Direct3D and adds support for bitmaps and text and support for GDI Interop all with a much simpler API. And Delphi 2010 has made it even simpler by wrapping it up with a TDirect2DCanvas that is very similar to TCanvas. Direct2D supports remote rendering through Remote Desktop which is very cool.&lt;br /&gt;&lt;br /&gt;WM_TOUCH is the raw multi-touch message that provides various states of contact with the input digitizer for hot sizzling touch applications.&lt;br /&gt;&lt;br /&gt;Now that we got that out of the way, create yourself a VCL Application. We want to start painting with Direct2D so add Direct2D and D2D1 to the uses and a TDirect2DCanvas property to your form like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &lt;b&gt;private&lt;/b&gt;&lt;br /&gt;    FCanvas: TDirect2DCanvas;&lt;br /&gt;  ...&lt;br /&gt;  &lt;b&gt;public&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;constructor&lt;/b&gt; Create(AOwner: TComponent); &lt;b&gt;override&lt;/b&gt;;&lt;br /&gt;    &lt;b&gt;destructor&lt;/b&gt; Destroy; &lt;b&gt;override&lt;/b&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;property&lt;/b&gt; Canvas: TDirect2DCanvas &lt;b&gt;read&lt;/b&gt; FCanvas&lt;br /&gt;      &lt;b&gt;write&lt;/b&gt; FCanvas;&lt;br /&gt;  &lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;...&lt;br /&gt;&lt;b&gt;constructor&lt;/b&gt; TTouchForm.Create(AOwner: TComponent);&lt;br /&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;inherited&lt;/b&gt;;&lt;br /&gt;  FCanvas := TDirect2DCanvas.Create(Handle);&lt;br /&gt;&lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;destructor&lt;/b&gt; TTouchForm.Destroy;&lt;br /&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;  FCanvas.Free;&lt;br /&gt;  &lt;b&gt;inherited&lt;/b&gt;;&lt;br /&gt;&lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This creates a Direct2D surface (TDirect2DCanvas) that we can draw to instead of the traditional GDI surface (TCanvas).&lt;br /&gt;&lt;br /&gt;Depending on the type of application you build you may experience some flicker. To avoid this handle the message WM_ERASEBKGND and returns true.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;procedure&lt;/b&gt; TTouchForm.WMEraseBkgnd(&lt;br /&gt;  &lt;b&gt;var&lt;/b&gt; Message: TWMEraseBkgnd);&lt;br /&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;  Message.Result := 1;&lt;br /&gt;&lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next override Paint and just draw a line:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;procedure&lt;/b&gt; TTouchForm.Paint;&lt;br /&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;  Canvas.BeginDraw;&lt;br /&gt;  &lt;b&gt;try&lt;/b&gt;&lt;br /&gt;    Canvas.Pen.Color := clRed;&lt;br /&gt;    Canvas.MoveTo(10, 10);&lt;br /&gt;    Canvas.LineTo(40, 40);&lt;br /&gt;  &lt;b&gt;finally&lt;/b&gt;&lt;br /&gt;    Canvas.EndDraw;&lt;br /&gt;  &lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you run your application at this point and resize the form you will noticed that the line changes size. This is because the view port is resizing to scale to the window and  your line will do the same. To prevent this override the Resize method and add the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;procedure&lt;/b&gt; TTouchForm.Resize;&lt;br /&gt;&lt;b&gt;var&lt;/b&gt;&lt;br /&gt;  HwndTarget: ID2D1HwndRenderTarget;&lt;br /&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;inherited&lt;/b&gt;;&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; Supports(Canvas.RenderTarget,&lt;br /&gt;    ID2D1HwndRenderTarget, HwndTarget) &lt;b&gt;then&lt;/b&gt;&lt;br /&gt;    HwndTarget.Resize(D2D1SizeU(ClientWidth, ClientHeight));&lt;br /&gt;  Invalidate;&lt;br /&gt;&lt;b&gt;end&lt;/b&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now you have a form that renders everything drawn to the Canvas through a Direct2D surface.&lt;br /&gt;&lt;br /&gt;UPDATE: Added Invalidate to Resize because when resizing the window larger it will force a redraw but smaller will not because typically a redraw isn't required.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-7385487004049998013?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/JT8AElwN5fM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/JT8AElwN5fM/touch-demo-part-i.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/09/touch-demo-part-i.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-6340840714169702414</guid><pubDate>Tue, 22 Sep 2009 15:00:00 +0000</pubDate><atom:updated>2009-09-22T09:22:53.272-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><category domain="http://www.blogger.com/atom/ns#">C++Builder</category><title>Delphi 2010 - Touch and Pen added to TShiftState</title><description>While we were researching adding Touch and Gesturing to VCL we quickly realized it was important to detect what type of input produced the mouse messages. So we introduced some new elements to TShiftState: ssTouch and ssPen:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  TShiftState = &lt;b&gt;set of&lt;/b&gt; (ssShift, ssAlt, ssCtrl,&lt;br /&gt;    ssLeft, ssRight, ssMiddle, ssDouble, ssTouch, ssPen);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;One of the key reasons this is so important is when handling WM_TOUCH messages the mouse messages are also fired. Chances are you only want to handle one of them. On a non-touch machine you want to handle the mouse. So this allows input to be filtered and handled independently.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-6340840714169702414?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/fj2KPdMyVaY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/fj2KPdMyVaY/delphi-2010-touch-and-pen-added-to.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/09/delphi-2010-touch-and-pen-added-to.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-208541682022528919</guid><pubDate>Thu, 17 Sep 2009 04:49:00 +0000</pubDate><atom:updated>2009-09-22T09:23:39.451-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">photo</category><title>September Photo of the Month</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HmveHAmi4No/SrG_8dWYqZI/AAAAAAAABnQ/3UOYhdJGIPE/s1600-h/CottonwoodLake.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 102px;" src="http://1.bp.blogspot.com/_HmveHAmi4No/SrG_8dWYqZI/AAAAAAAABnQ/3UOYhdJGIPE/s320/CottonwoodLake.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5382294075076028818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a photo of Cottonwood Lake in Inyo National Forest. This photo is a panorama stitched from 14 photos! And one of the most beautiful mornings I've ever had the pleasure to see.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-208541682022528919?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/9UMkuMRnHRk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/9UMkuMRnHRk/september-photo-of-month.html</link><author>noreply@blogger.com (Chris Bensen)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_HmveHAmi4No/SrG_8dWYqZI/AAAAAAAABnQ/3UOYhdJGIPE/s72-c/CottonwoodLake.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/09/september-photo-of-month.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-9211976709607479980</guid><pubDate>Tue, 15 Sep 2009 16:00:00 +0000</pubDate><atom:updated>2009-09-15T18:11:58.940-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><title>Interactive Gestures 101</title><description>As promised at my CodeRage 4 session I will be blogging about Gestures and the Touch feature of Delphi 2010. So here is a quick set of steps to use interactive gestures. It will require a multi-touch system such as I described &lt;a href="http://chrisbensen.blogspot.com/2009/08/touch-hardware.html"&gt;here&lt;/a&gt; (the mouse will not work here) and some context by watching my CodeRage 4 session from &lt;a href="http://cc.embarcadero.com/download.aspx?id=27253"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;1. File | New VCL Application&lt;br /&gt;2. Drop a TPanel on your form &lt;i&gt;(there is a known bug using interactive gestures on the form)&lt;/i&gt;&lt;br /&gt;3. Select Panel1 and expand the Touch property&lt;br /&gt;4. Check igoPanSinglerFingerHorizontal, and check igPan. I also like to turn off toPressandHold&lt;br /&gt;5. Go to events and add the following code to the OnGesture event:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;if&lt;/b&gt; EventInfo.GestureID = igiPan &lt;b&gt;then&lt;/b&gt;&lt;br /&gt;  Caption := IntToStr(EventInfo.Location.X);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now run the application and move your finger left and right on the panel.&lt;br /&gt;&lt;br /&gt;Note: Interactive Gestures don't require a TGestureManage. Only Gestures require the Gesture Manager.&lt;br /&gt;&lt;br /&gt;Update: Fixed the code and added links for touch hardware and my CodeRage 4 session.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-9211976709607479980?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/03FsMH684oA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/03FsMH684oA/interactive-gestures-101.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/09/interactive-gestures-101.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-2988312039319044859</guid><pubDate>Wed, 02 Sep 2009 21:00:00 +0000</pubDate><atom:updated>2009-09-02T14:37:13.738-07:00</atom:updated><title>CodeRage 4</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://conferences.embarcadero.com/coderage"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 196px; height: 196px;" src="http://1.bp.blogspot.com/_HmveHAmi4No/Sp1rz2GSPrI/AAAAAAAABnI/vV0Pftqbxic/s320/196x196_logo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5376572068589616818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Register for CodeRage4 and come check out the &lt;a href="http://conferences.embarcadero.com/coderage/sessions"&gt;sessions&lt;/a&gt;. It's all free so why not, it should be a lot of fun.&lt;br /&gt;&lt;br /&gt;I'll be at three talks answering questions:&lt;br /&gt;&lt;br /&gt;Building Awesome Touch Enabled Applications by Chris Bensen&lt;br /&gt;Tuesday, September 8, 2009 -- 11:00am - 11:45am PDT&lt;br /&gt;Wednesday, September 9, 2009 -- 9:00am - 9:45am PDT&lt;br /&gt;&lt;br /&gt;Hands-On: Gestures in the VCL by Seppy Bloom&lt;br /&gt;Tuesday, September 8, 2009 -- 4:00pm - 4:45pm PDT&lt;br /&gt;&lt;br /&gt;What's New in the VCL *&lt;br /&gt;Tuesday, September 8, 2009 -- 3:00pm - 3:45pm PDT&lt;br /&gt;Thursday, September 10, 2009 -- 8:00am - 8:45am PDT (I won't be here because I'll be on vacation!)&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-2988312039319044859?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/jUPfs9DcKIo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/jUPfs9DcKIo/coderage-4.html</link><author>noreply@blogger.com (Chris Bensen)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_HmveHAmi4No/Sp1rz2GSPrI/AAAAAAAABnI/vV0Pftqbxic/s72-c/196x196_logo.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/09/coderage-4.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-8024482623242313197</guid><pubDate>Thu, 20 Aug 2009 21:31:00 +0000</pubDate><atom:updated>2009-08-20T17:44:22.467-07:00</atom:updated><title>RAD Studio 2010 - SOAP 1.2</title><description>Chris White here.  This cycle around I have moved from working on the product's many areas that make up the IDE's Help experience to something that has been brand new to me, SOAP.&lt;br /&gt;&lt;br /&gt;This posed quite a few challenges for me, one being I knew nothing about SOAP.  So after familiarizing myself with SOAP, I started working on the largest feature request in the SOAP area, upgrading our SOAP client support to SOAP 1.2.  So, I flew headlong into learning the differences between the specs for SOAP 1.1 and 1.2.  With the new SOAP 1.2 client support, our ability to communicate with other SOAP Web Services has greatly increased.&lt;br /&gt;&lt;br /&gt;Also since it had been a while, I gave the WSDL Importer Wizard a face lift.  I simplified the UI greatly.  There are only 3 dialogs (4 if you don't have a project open), all of which are in succession; as well as moved it to an easier to get to location (Component -&gt; Import WSDL...).  One nice thing about moving it to the Component menu, you can now import a WSDL without a project open.  Hopefully this will be as useful to users as it has been to me; creating a project just to look at a WSDL got tiresome.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_chsEO63IbNk/So3Ih6c0ljI/AAAAAAAAAAM/B_H1_o7cBaA/s1600-h/WSDLWizard1.jpg"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 262px;" src="http://3.bp.blogspot.com/_chsEO63IbNk/So3Ih6c0ljI/AAAAAAAAAAM/B_H1_o7cBaA/s320/WSDLWizard1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5372170415474251314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_chsEO63IbNk/So3IltTMC1I/AAAAAAAAAAU/Xlms6ecyst8/s1600-h/WSDLWizard2.jpg"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 262px;" src="http://2.bp.blogspot.com/_chsEO63IbNk/So3IltTMC1I/AAAAAAAAAAU/Xlms6ecyst8/s320/WSDLWizard2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5372170480663661394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_chsEO63IbNk/So3Iqa6gvuI/AAAAAAAAAAc/vwa4Ge0DFqg/s1600-h/WSDLWizard3.jpg"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 261px;" src="http://1.bp.blogspot.com/_chsEO63IbNk/So3Iqa6gvuI/AAAAAAAAAAc/vwa4Ge0DFqg/s320/WSDLWizard3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5372170561627668194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_chsEO63IbNk/So3IuKPGmcI/AAAAAAAAAAk/5C9UOgehCfQ/s1600-h/WSDLWizard4.jpg"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 262px;" src="http://2.bp.blogspot.com/_chsEO63IbNk/So3IuKPGmcI/AAAAAAAAAAk/5C9UOgehCfQ/s320/WSDLWizard4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5372170625870109122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;WSDLImp.exe also got sync'd up with the IDE's WSDL Importer Wizard.  So now you can do everything with the commandline as you can with the IDE.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-8024482623242313197?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/_0qWLuJ16-I" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/_0qWLuJ16-I/rad-studio-2010-soap-12.html</link><author>noreply@blogger.com (Chris White)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_chsEO63IbNk/So3Ih6c0ljI/AAAAAAAAAAM/B_H1_o7cBaA/s72-c/WSDLWizard1.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/08/rad-studio-2010-soap-12.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-5362370629762121762</guid><pubDate>Mon, 17 Aug 2009 21:00:00 +0000</pubDate><atom:updated>2009-10-05T10:39:59.354-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">CodeGear</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><category domain="http://www.blogger.com/atom/ns#">C++Builder</category><title>Touch Hardware</title><description>One of the first questions people ask about multi-touch is what hardware to get.&lt;br /&gt;&lt;br /&gt;Everything is supported just at different levels. First you have touch screens that emulate the mouse such as most Point-of-Sale monitors. We have a Dell POS and a Planar PT 19. These are only good for big buttons. Any sort of dragging your finger across the screen is lost by the device/driver. The Planar doesn't loose the mouse as bad as the Dell.&lt;br /&gt;&lt;br /&gt;Then you have the old school tablet laptops. These add pen and sometimes support touch with the finger as well. The pen resolution is equal to or better than the mouse. The finger with these older systems is an afterthought. Lenovo IBM X61 is an example of such a system.&lt;br /&gt;&lt;br /&gt;Next you have all-in-one systems such as the Asus EeeTop which has better drivers/hardware than the Point-of-Sale monitors but they are still just a touch screen mouse. I.E. push the monitor with your finger and you get a left mouse click. The Asus has a pretty decent touch screen but still only supports one touch point and it is just emulating the mouse. The processor on the Asus is really slow.&lt;br /&gt;&lt;br /&gt;Now enters multi-touch which only Windows 7 really supports. Some Vista systems support multi-touch but just go with Windows 7, you'll be much happier.&lt;br /&gt;&lt;br /&gt;Building on the tablet there are currently two shipping multi-touch laptops. One by Dell and one by HP. These make touch a forethought and add multi-touch. The HP supports 2 touch points and with an updated driver 4. The Dell supports 10 touch points. They are the exact same display so it must be the driver or other components that allow the extra touch points on the Dell. A Dell is currently sitting on my desk and it is the nicest of the systems. It feels like a laptop that I would buy for myself. The Dell is priced a bit high but it is a nice slimline laptop. The HP feels a bit cheap and has some flowery patterns on it.&lt;br /&gt;&lt;br /&gt;Lastly you have the all-in-one multi-touch systems such as the HP TouchSmart which features a large display and two touch points. We have purchased two batches of these. The first batch is pretty bad. I'm pretty sure these are the ones currently selling on Woot. The second batch is a lot better but the Dell and HP laptops I mentioned above are better. Update: If you buy one of these be sure to get the NVIDIA graphics card.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-5362370629762121762?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/FFoWClVDGJ0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/FFoWClVDGJ0/touch-hardware.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">19</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/08/touch-hardware.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-7124517210039859353</guid><pubDate>Thu, 13 Aug 2009 16:00:00 +0000</pubDate><atom:updated>2009-08-13T14:14:29.849-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><title>Delphi 2010 - New Units</title><description>A lot of header translations and new units have been added. Here are just a few that are interesting:&lt;br /&gt;&lt;br /&gt;Wincodec.pas&lt;br /&gt;Enables TWICImage. Support for Tiff, CR2 or NEF anyone?&lt;br /&gt;&lt;br /&gt;Cor.pas&lt;br /&gt;.NET unmanaged compiler API. Always fun to crack open Assemblies from native code.&lt;br /&gt;&lt;br /&gt;Direct3D.pas, D3DX9.pas, D2D1.pas&lt;br /&gt;DirectX header translations.&lt;br /&gt;&lt;br /&gt;Direct2D.pas&lt;br /&gt;TDirect2DCanvas. Get to Direct2D using the same TCanvas methods you know and love.&lt;br /&gt;&lt;br /&gt;Manipulations.pas&lt;br /&gt;The inertia manipulators. Great for spinning and throwing things around your screen.&lt;br /&gt;&lt;br /&gt;Gestures.pas, GestureMgr.pas, GestureCtrls.pas&lt;br /&gt;Hot gesturing goodness.&lt;br /&gt;&lt;br /&gt;Keyboard.pas, KeyboardTypes.pas&lt;br /&gt;TTouchKeyboard for all your touchscreen input needs.&lt;br /&gt;&lt;br /&gt;IOUtils.pas&lt;br /&gt;A serious addition to the RTL with TDirectory, TPath, and TFile.&lt;br /&gt;&lt;br /&gt;Update: I forgot one RTTI.pas&lt;br /&gt;For some very cool runtime stuff.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-7124517210039859353?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/b_HCz_KfPQ8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/b_HCz_KfPQ8/delphi-2010-new-units.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">13</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/08/delphi-2010-new-units.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-3242750137975154890</guid><pubDate>Thu, 13 Aug 2009 01:00:00 +0000</pubDate><atom:updated>2009-08-12T18:00:03.129-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>RAD Studio 2010 - Gestures and Multi-Touch</title><description>One of the most exciting features in RAD Studio 2010 is Gestures and Multi-Touch (or what I like to call Interactive Gestures). I can't really show much here because it requires video, but if you've seen the videos or my Delphi Live! talk then you've seen some of what can be done.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HmveHAmi4No/SoLnyLAkcEI/AAAAAAAABnA/vXaCgZKhkWI/s1600-h/TouchProperty.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 233px; height: 320px;" src="http://1.bp.blogspot.com/_HmveHAmi4No/SoLnyLAkcEI/AAAAAAAABnA/vXaCgZKhkWI/s320/TouchProperty.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5369108554913706050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Gestures takes full advantage of synthetic properties so you don't see much in the Object Inspector until a GestureManager is assigned. But Interactive Gestures and Tablet Options can be fully utilized without any setup, just check a few check boxes and add some code to the OnGesture event.&lt;br /&gt;&lt;br /&gt;Gestures of all flavors can be added per control but different flavors of gestures are mutually exclusive. So you can have a panel with the Gestures and another panel with Interactive Gestures. It's pretty slick.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-3242750137975154890?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/Q3_Q2UyzBg0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/Q3_Q2UyzBg0/rad-studio-2010-gestures-and-multi.html</link><author>noreply@blogger.com (Chris Bensen)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_HmveHAmi4No/SoLnyLAkcEI/AAAAAAAABnA/vXaCgZKhkWI/s72-c/TouchProperty.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/08/rad-studio-2010-gestures-and-multi.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-3780397456910811830</guid><pubDate>Wed, 12 Aug 2009 13:00:00 +0000</pubDate><atom:updated>2009-08-12T06:00:06.700-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><title>RAD Studio 2010 - Touch Keyboard</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HmveHAmi4No/SoH3ReBaW5I/AAAAAAAABm4/mpQAO0qeDM0/s1600-h/Keyboard.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 178px;" src="http://3.bp.blogspot.com/_HmveHAmi4No/SoH3ReBaW5I/AAAAAAAABm4/mpQAO0qeDM0/s320/Keyboard.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5368844110291164050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Touch Keyboard (TTouchKeyboard) is a new component designed specifically for touch systems. It supports a pile of languages and multi-touch. You can see the multi-touch in action in the screen shot above where I was holding down shift and pressing G. The Touch Keyboard is supported on Windows 2000, XP, Vista and Windows 7, but only Windows 7 gets multi-touch.&lt;br /&gt;&lt;br /&gt;The Touch Keyboard is designed to be embedded in your applications where you need input from the users. Notice there is no Windows key. After much thought we decided to take a different approach to the Touch Keyboard than Microsoft did with their on screen keyboard. Our focus was on touch systems without a physical keyboard, hence the name, where Microsoft emulated the hardware keyboard.&lt;br /&gt;&lt;br /&gt;A lot of thought was given to the colors and the font uses. Touch systems are probably more likely to be used in harsh light so there needed to be a lot of contrast between the keys and the background.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-3780397456910811830?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/KcboU58AdYw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/KcboU58AdYw/rad-studio-2010-touch-keyboard.html</link><author>noreply@blogger.com (Chris Bensen)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_HmveHAmi4No/SoH3ReBaW5I/AAAAAAAABm4/mpQAO0qeDM0/s72-c/Keyboard.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">20</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/08/rad-studio-2010-touch-keyboard.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-7498190357536405705</guid><pubDate>Tue, 11 Aug 2009 13:00:00 +0000</pubDate><atom:updated>2009-08-12T08:34:33.210-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><title>RAD Studio 2010 - Touch Preview Video</title><description>Watch the &lt;a href="http://etnaweb04.embarcadero.com/rad-studio-2010/"&gt;Touch and Gesturing preview video&lt;/a&gt; where David I and I did some serious acting. And then there was some serious editing by someone that isn't David I.
&lt;br /&gt;
&lt;br /&gt;&lt;embed src='http://etnaweb04.embarcadero.com/includes/mediaplayer/player-viral.swf' height='300' width='400' allowscriptaccess='always' allowfullscreen='true' flashvars='file=http%3A%2F%2Faltd.embarcadero.com%2Fdownload%2Fvideo%2Fweaver%2Frad-studio-touch-gestures-preview.mp4&amp;plugins=viral-1d'/&gt;
&lt;br /&gt;
&lt;br /&gt;Update: Here is a Japanese version that was translated before the editing:
&lt;br /&gt;
&lt;br /&gt;&lt;embed src='http://etnaweb04.embarcadero.com/includes/mediaplayer/player-viral.swf' height='300' width='400' allowscriptaccess='always' allowfullscreen='true' flashvars='file=http%3A%2F%2Faltd.embarcadero.com%2Fdownload%2Fvideo%2Fweaver%2Frad-studio-touch-gestures-preview-jp.mp4&amp;plugins=viral-1d'/&gt;
&lt;br /&gt;
&lt;br /&gt;For those interested the songs used in the video are "I Touch Myself by Divinyls" and "Touch Me by The Doors". You can listen or buy them here (I wish Amazon would just let me put a little play button so you didn't have to go to their website):
&lt;br /&gt;
&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=chribens-20&amp;o=1&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;md=10FE9736YVPPT7A0FBG2&amp;asins=B0011Z933I" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=chribens-20&amp;o=1&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;md=10FE9736YVPPT7A0FBG2&amp;asins=B000TDUUZS" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-7498190357536405705?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/4vUr79ohnoU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/4vUr79ohnoU/rad-studio-2010-touch-preview-video.html</link><author>noreply@blogger.com (Chris Bensen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/08/rad-studio-2010-touch-preview-video.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8857431988988627285.post-4343889245877566641</guid><pubDate>Thu, 06 Aug 2009 15:30:00 +0000</pubDate><atom:updated>2009-08-06T09:39:14.934-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delphi</category><category domain="http://www.blogger.com/atom/ns#">CodeGear</category><title>RAD Studio 2010 - Actions</title><description>One very useful feature is an updated Action property editor. The little drop down hasn't changed in years and we wanted to get to our Actions quicker. So &lt;a href="http://blogs.embarcadero.com/seppybloom/"&gt;Seppy Bloom&lt;/a&gt; through some Object Inspector trickery, which you can find all about in his &lt;a href="http://conferences.embarcadero.com/coderage/"&gt;CodeRage 4&lt;/a&gt; session &lt;a href="http://conferences.embarcadero.com/coderage/sessions"&gt;Customizing the Object Inspector&lt;/a&gt;, updated the Action property editor.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HmveHAmi4No/Snr9Js_WDpI/AAAAAAAABmo/J4h3343LWSM/s1600-h/Actions2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 194px; height: 132px;" src="http://1.bp.blogspot.com/_HmveHAmi4No/Snr9Js_WDpI/AAAAAAAABmo/J4h3343LWSM/s320/Actions2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5366880249102864018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HmveHAmi4No/Snr5HiOs-MI/AAAAAAAABmg/sLpr7IT3U7E/s1600-h/Actions.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 236px;" src="http://3.bp.blogspot.com/_HmveHAmi4No/Snr5HiOs-MI/AAAAAAAABmg/sLpr7IT3U7E/s320/Actions.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5366875813808240834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What you are looking at is a new drop down that allows you to selection from one simple menu any standard action from the action list, choose any existing actions, or create a new action.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HmveHAmi4No/Snr-ippVb3I/AAAAAAAABmw/8GlZpP7Mjp8/s1600-h/Actions3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 298px;" src="http://4.bp.blogspot.com/_HmveHAmi4No/Snr-ippVb3I/AAAAAAAABmw/8GlZpP7Mjp8/s320/Actions3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5366881777213599602" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you have more than one action list then just choose which one to use.&lt;br /&gt;&lt;br /&gt;Just one more example of increased productivity.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4398465119811197";
/* 468x60, created 7/20/08 */
google_ad_slot = "3994176404";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8857431988988627285-4343889245877566641?l=chrisbensen.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ChrisBensenBlog/~4/KNnzZGXZrbY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/ChrisBensenBlog/~3/KNnzZGXZrbY/rad-studio-2010-actions.html</link><author>noreply@blogger.com (Chris Bensen)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_HmveHAmi4No/Snr9Js_WDpI/AAAAAAAABmo/J4h3343LWSM/s72-c/Actions2.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://chrisbensen.blogspot.com/2009/08/rad-studio-2010-actions.html</feedburner:origLink></item></channel></rss>
