<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8956571780363253726</id><updated>2011-07-07T20:00:06.942-07:00</updated><category term='zombies'/><category term='cocoa'/><category term='delphiprism'/><category term='.net'/><category term='iphone'/><category term='winforms'/><category term='hebrewconjugation'/><category term='.net news delphiprism'/><category term='.net news android windows_ce'/><category term='vmware'/><category term='macosx'/><title type='text'>LeaukiProg</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://leaukiprog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://leaukiprog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrew J. Brehm</name><uri>http://www.blogger.com/profile/13058608736862971026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://2.bp.blogspot.com/_kOdrnrUVOZY/S9As4MqnK8I/AAAAAAAAADA/m09AprQuX9c/S220/Shmulik.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8956571780363253726.post-2828883144641711611</id><published>2010-04-22T04:15:00.000-07:00</published><updated>2010-04-22T04:28:13.230-07:00</updated><title type='text'>All the Cocoa bindings for Mono in the world...</title><content type='html'>Over the last few years I found it increasingly confusing when yet another Cocoa binding was added to or offered for Mono.&lt;br /&gt;&lt;br /&gt;Cocoa bindings allow .NET/Mono programs to call native Mac OS X APIs. This is usually needed to create a native-looking (and native-being) GUI.&lt;br /&gt;&lt;br /&gt;Just a few days ago Novell announced MonoMac, the newest addition to the team:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tirania.org/blog/archive/2010/Apr-19.html"&gt;http://tirania.org/blog/archive/2010/Apr-19.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I myself use Monobjc. The first library to do this job was CocoaSharp.&lt;br /&gt;&lt;br /&gt;These are the Cocoa binding libraries for Mono that I have heard of:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CocoaSharp (deprecated, part of Mono)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Cocoa# (CocoaSharp) is an effort to bring Mono and the Mac OS X Cocoa toolkits together in a two way bridge, allowing Mac developers that leverage the Mono runtime libraries, while retaining a native Mac look and feel. This bridge also allows Mono based applications to have access to the Cocoa libraries directly.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mono-project.com/CocoaSharp"&gt;http://www.mono-project.com/CocoaSharp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;CocoaSharp is still part of Mono but hasn't been in active development for years.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Monobjc (active, not part of Mono)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Monobjc bridge provides the necessary tools to develop and run .NET applications (written in C#, VB.NET, etc.) that interact with Objective-C frameworks and libraries under Mac OS X. Existing Objective-C classes can be used in .NET code in an almost transparent manner.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since Monobjc is not part of Mono any program that uses Monobjc will have to be distributed with the Monobjc dlls.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.monobjc.net/"&gt;http://www.monobjc.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;mobjc (active, not part of Mono)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;mobjc is a Mono library which allows .NET code to interoperate with Apple frameworks such as foundation and appkit. It makes it possible for managed code to call native Objective-C methods, native methods to call managed code, and new Objective-C classes to be defined in managed code. Exceptions are properly marshaled in both directions.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/mobjc/"&gt;http://code.google.com/p/mobjc/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;mcocoa (active, based on mobjc, not part of Mono)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;mcocoa provides a set of wrapper classes which allow Apple's Cocoa frameworks to be used from Mono. The wrappers are generated using the make file and rely on th&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;e mobjc library to handle the bridging between Objective-C and Mono.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/mcocoa/"&gt;http://code.google.com/p/mcocoa/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MonoTouch (for iPhone OS)&lt;/span&gt;&lt;br /&gt;&lt;p style="font-style: italic;"&gt;MonoTouch allows developers to create C# and .NET based applications that run on Apple's iPhone and Apple's iPod Touch devices, while taking advantage of the iPhone APIs and reusing both code and libraries that have been built for .NET, as well as existing skills.&lt;/p&gt;&lt;a href="http://monotouch.net/"&gt;http://monotouch.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MonoMac (announced for Mono 2.8)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I could find a catchphrase paragraph for MonoMac. But a blog post explaining what MonoMac is can be found here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tirania.org/blog/archive/2010/Apr-19.html"&gt;http://tirania.org/blog/archive/2010/Apr-19.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8956571780363253726-2828883144641711611?l=leaukiprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leaukiprog.blogspot.com/feeds/2828883144641711611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://leaukiprog.blogspot.com/2010/04/all-cocoa-bindings-for-mono-in-world.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/2828883144641711611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/2828883144641711611'/><link rel='alternate' type='text/html' href='http://leaukiprog.blogspot.com/2010/04/all-cocoa-bindings-for-mono-in-world.html' title='All the Cocoa bindings for Mono in the world...'/><author><name>Andrew J. Brehm</name><uri>http://www.blogger.com/profile/13058608736862971026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://2.bp.blogspot.com/_kOdrnrUVOZY/S9As4MqnK8I/AAAAAAAAADA/m09AprQuX9c/S220/Shmulik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8956571780363253726.post-1517042935706895830</id><published>2010-04-02T05:06:00.000-07:00</published><updated>2010-04-02T05:07:36.918-07:00</updated><title type='text'>Mono Tools for Visual Studio 1.1 has been released!</title><content type='html'>&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-weight: bold;"&gt;Mono Tools for Visual Studio 1.1 has been released!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mono-project.com/news/archive/2010/Mar-31.html"&gt;http://www.mono-project.com/news/archive/2010/Mar-31.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think I will get this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8956571780363253726-1517042935706895830?l=leaukiprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leaukiprog.blogspot.com/feeds/1517042935706895830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://leaukiprog.blogspot.com/2010/04/mono-tools-for-visual-studio-11-has.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/1517042935706895830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/1517042935706895830'/><link rel='alternate' type='text/html' href='http://leaukiprog.blogspot.com/2010/04/mono-tools-for-visual-studio-11-has.html' title='Mono Tools for Visual Studio 1.1 has been released!'/><author><name>Andrew J. Brehm</name><uri>http://www.blogger.com/profile/13058608736862971026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://2.bp.blogspot.com/_kOdrnrUVOZY/S9As4MqnK8I/AAAAAAAAADA/m09AprQuX9c/S220/Shmulik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8956571780363253726.post-9189280979162275869</id><published>2010-03-23T04:15:00.000-07:00</published><updated>2010-03-23T04:20:16.642-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net news android windows_ce'/><title type='text'>.NET Old News March 23rd 2010</title><content type='html'>Novell are developing a version of Mono for Google Android. Monodroid will allow developers to write .NET applications for Android phones:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;MonoDroid will give Android developers tools for binding the Java APIs, while making them accessible through the JIT-compiled, 335-powered runtime engine. This will hopefully allow allow developers to reuse their engine and business logic code across all mobile platforms and swapping out the user interface code for a platform-specific API. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://androidcommunity.com/novel-monoc-is-developing-monodroid-20100217/"&gt;http://androidcommunity.com/novel-monoc-is-developing-monodroid-20100217/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This appears to be similar to MonoTouch, a way to develop .NET applications for the iPhone.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://monotouch.net/"&gt;http://monotouch.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I hear Microsoft have released downloadable previews of developer tools for Windows Mobile 7. Apparently the new GUI is based on Silverlight.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.windowsphone.com/windows-phone-7-series/"&gt;http://developer.windowsphone.com/windows-phone-7-series/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8956571780363253726-9189280979162275869?l=leaukiprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leaukiprog.blogspot.com/feeds/9189280979162275869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://leaukiprog.blogspot.com/2010/03/net-old-news-march-23rd-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/9189280979162275869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/9189280979162275869'/><link rel='alternate' type='text/html' href='http://leaukiprog.blogspot.com/2010/03/net-old-news-march-23rd-2010.html' title='.NET Old News March 23rd 2010'/><author><name>Andrew J. Brehm</name><uri>http://www.blogger.com/profile/13058608736862971026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://2.bp.blogspot.com/_kOdrnrUVOZY/S9As4MqnK8I/AAAAAAAAADA/m09AprQuX9c/S220/Shmulik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8956571780363253726.post-2020151592826412406</id><published>2010-03-22T04:58:00.000-07:00</published><updated>2010-03-22T05:06:19.353-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net news delphiprism'/><title type='text'>.NET News March 22nd 2010</title><content type='html'>A new version of Mono has been released, &lt;a href="http://www.mono-project.com/Release_Notes_Mono_2.6.3"&gt;version 2.6.3&lt;/a&gt;. I assume this will fix the bug with Messagebox.Show(). It's in the list.&lt;br /&gt;&lt;br /&gt;According to the &lt;a href="http://www.delphi.org/2010/03/39-marc-hoffman-on-prism-and-mac/"&gt;Podcast at Delphi.org&lt;/a&gt; a new version of Delphi Prism will be released in late April (instead of February as would be the usual rhythm) to match the release of Microsoft Visual Studio 2010 on which it will be based. This new release will most likely come with an updated version of Mono.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8956571780363253726-2020151592826412406?l=leaukiprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leaukiprog.blogspot.com/feeds/2020151592826412406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://leaukiprog.blogspot.com/2010/03/net-news-march-22nd-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/2020151592826412406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/2020151592826412406'/><link rel='alternate' type='text/html' href='http://leaukiprog.blogspot.com/2010/03/net-news-march-22nd-2010.html' title='.NET News March 22nd 2010'/><author><name>Andrew J. Brehm</name><uri>http://www.blogger.com/profile/13058608736862971026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://2.bp.blogspot.com/_kOdrnrUVOZY/S9As4MqnK8I/AAAAAAAAADA/m09AprQuX9c/S220/Shmulik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8956571780363253726.post-7542406094521203382</id><published>2010-01-24T07:30:00.000-08:00</published><updated>2010-01-24T08:06:59.256-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hebrewconjugation'/><category scheme='http://www.blogger.com/atom/ns#' term='delphiprism'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>Hebrew Conjugator Current State</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hebrew Conjugator is a program that conjugates Hebrew verbs, or at least attempts to. Running on Windows Vista it looks like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kOdrnrUVOZY/S1xvrhroP5I/AAAAAAAAAC4/gq56CPYj2Hc/s1600-h/ConjugatorOnWindows.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 253px;" src="http://1.bp.blogspot.com/_kOdrnrUVOZY/S1xvrhroP5I/AAAAAAAAAC4/gq56CPYj2Hc/s320/ConjugatorOnWindows.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5430338044268396434" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;(Click on image for larger version.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The application currently consists of two files, HebrewConjugator.exe and HebrewConjugation.dll.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;HebrewConjugator.exe is a .NET program for Windows that calls methods in HebrewConjugation.dll to conjugate Hebrew verbs. The program runs under Mac OS X but right-to-left language support is broken in Mono and all words are written the wrong way around.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;HebrewConjugation.dll is a pure .NET library (actually it currently imports System.Windows.Forms for debug reasons) used by HebrewConjugator. It expects the program to set the wanted binyan like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// set binyan&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; radioPa3al.Checked &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := 1;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; radioPa3ul.Checked &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := 2;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; radioNif3al.Checked &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := 3;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; radioPi3el.Checked &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := 4;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; radioHitpa3el.Checked &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := 6;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; radioHif3il.Checked &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := 7;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Georgia, serif;font-size:16px;"&gt;and create a HebrewWord from one of the classes provided by the library.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;HebrewConjugation.dll is based on code that should be easy to adapt for other Semitic languages like Arabic and Akkadian, which I hope I will find the time to look at when Hebrew is done. It should also work on Mac OS X and Linux with native front ends or the Web with a Web application using the library. I will also add database support to save corrected verb forms.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;The HebrewWord class deals with the binyan defined and adapts for exceptions:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span style="color:#033efc;"&gt;constructor&lt;/span&gt; HebrewWord(setRoot: String; setBinyan: Int32);&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;begin&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #033efc; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// configure word&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    root := setRoot;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    binyan := setBinyan;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// create a general conjugation object to help with binyan&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; HebrewConjugation;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// specifiy complete binyan&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; &lt;span style="color:#033efc;"&gt;not&lt;/span&gt; (root.Length = 3) &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := 0;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; conjugation.IsHollow(root) &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := binyan + 10;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; conjugation.HasFinalHe(root) &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := binyan + 20;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; conjugation.StartsWithAlef(root) &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := binyan + 40;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;if&lt;/span&gt; (conjugation.StartsWithWeakLetter(root) &lt;span style="color:#033efc;"&gt;and&lt;/span&gt; &lt;span style="color:#033efc;"&gt;not&lt;/span&gt; conjugation.WeakPeSurvives(root)) &lt;span style="color:#033efc;"&gt;then&lt;/span&gt; binyan := binyan + 80;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;    &lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;end&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Georgia, serif;font-size:16px;"&gt;Other exceptions are caught (perhaps) by the Conjugation objects themselves. Conjugation objects are created based on the binyan number (including exception sums):&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// create a general conjugation object&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; HebrewConjugation;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// create a Conjugation object for the right binyan&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;case&lt;/span&gt; binyan &lt;span style="color:#033efc;"&gt;of&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #033efc; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        1: conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; ConjugationPa3al;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        2: conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; ConjugationPa3ul;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        3: conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; ConjugationNif3al;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        4: conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; ConjugationPi3el;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        6: conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; ConjugationHitpa3el;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        7: conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; ConjugationHif3il;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        11: conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; ConjugationPa3alHollow;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        12: conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; ConjugationPa3ulHollow;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        14: conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; ConjugationPi3elHollow;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        17: conjugation := &lt;span style="color:#033efc;"&gt;new&lt;/span&gt; ConjugationHif3ilHollow;&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica, serif;font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Georgia, serif;font-size:16px;"&gt;There is/should be one Conjugation class defined for each binyan and for each exception in each binyan. Hence every Conjugation class only has to implement methods required for its particular type of root and daughter classes only have to implement what is missing in the class handling the binyan with no exceptions.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;The HebrewConjugation base class also handles adding prefixed and suffixes as well as pronouns. Daughter classes refer to those methods to create finite verb forms.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;For example, binyan Nif3al (G-Stem Reflexive) is implemented like this:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span"    style="font-family:Georgia, serif;font-size:130%;color:#000000;"&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span style="color:#033efc;"&gt;function&lt;/span&gt; ConjugationNif3al.GetInfinitive(root: String): String;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;var&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #033efc; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r: String;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;begin&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #033efc; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r := Lamed + He + root;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;result&lt;/span&gt; := r;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;end&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span style="color:#033efc;"&gt;function&lt;/span&gt; ConjugationNif3al.GetPresentTense(root: String; person: Int32; male: Boolean): String;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;var&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #033efc; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r: String;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;begin&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #033efc; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// prepare root&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    root := Nun + root;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// get finite form&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r := AddAffixesPresentTense(root, person, male, Taw);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r := AddPronoun(r, person, male);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;result&lt;/span&gt; := r;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;end&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span style="color:#033efc;"&gt;function&lt;/span&gt; ConjugationNif3al.GetPerfectTense(root: String; person: Int32; male: Boolean): String;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;var&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #033efc; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r: String;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;begin&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #033efc; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// prepare root&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    root := Nun + root;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// get finite form&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r := AddAffixesPerfectTense(root, person, male);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r := AddPronoun(r, person, male);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;result&lt;/span&gt; := r;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#033efc;"&gt;end&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span style="color:#033efc;"&gt;function&lt;/span&gt; ConjugationNif3al.GetImperfectTense(root: String; person: Int32; male: Boolean): String;&lt;/p&gt; &lt;p color="#033efc" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;var&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #033efc; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r: String;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p color="#033efc" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;begin&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #033efc; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// prepare root&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    root := Yud + root;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0c8e12;"&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;// get finite form&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r := AddAffixesImperfectTense(root, person, male);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r := ReplaceLetters(r, &lt;span style="color:#033efc;"&gt;true&lt;/span&gt;, Alef + Yud, Alef);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    r := AddPronoun(r, person, male);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#033efc;"&gt;result&lt;/span&gt; := r;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p color="#033efc" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;end&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p color="#033efc" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;div&gt;This is the entire implementation part of the ConjugationNif3al class. It deals with no-nonsense non-exceptional roots like "kathav" ("he wrote"). Nif3al exceptions are not yet implemented. (However the active binyanim are completely implemented.)&lt;/div&gt;&lt;div&gt;Note that the entire program is specifically written in a very primitive way so that I can keep understanding it without getting confused.&lt;/div&gt;&lt;div&gt;You can download the current development version here:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.netneurotic.net/bin/HebrewConjugator.zip"&gt;http://www.netneurotic.net/bin/HebrewConjugator.zip&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Just unpack both files into the same directory and run the program. This might or might not work and the program might or might not currently work. (The zip file is continuously updated with a more current version. Some new versions break what already worked in another branch.)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:-webkit-xxx-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8956571780363253726-7542406094521203382?l=leaukiprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leaukiprog.blogspot.com/feeds/7542406094521203382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://leaukiprog.blogspot.com/2010/01/hebrew-conjugator-current-state.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/7542406094521203382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/7542406094521203382'/><link rel='alternate' type='text/html' href='http://leaukiprog.blogspot.com/2010/01/hebrew-conjugator-current-state.html' title='Hebrew Conjugator Current State'/><author><name>Andrew J. Brehm</name><uri>http://www.blogger.com/profile/13058608736862971026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://2.bp.blogspot.com/_kOdrnrUVOZY/S9As4MqnK8I/AAAAAAAAADA/m09AprQuX9c/S220/Shmulik.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kOdrnrUVOZY/S1xvrhroP5I/AAAAAAAAAC4/gq56CPYj2Hc/s72-c/ConjugatorOnWindows.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8956571780363253726.post-7358427997860344072</id><published>2009-09-02T02:33:00.000-07:00</published><updated>2009-09-02T08:05:11.769-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphiprism'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>Refactoring Immediately</title><content type='html'>I had to make lots of changes almost immediately in my project.&lt;br /&gt;&lt;br /&gt;(See &lt;a href="http://leaukiprog.blogspot.com/2009/08/hebrew-conjugator-delphi-prism-project.html"&gt;my original article on the Hebrew Conjugator project&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Whenever I had formulated a way to output the correct finite verb form for a given tense/person/gender combination and after implementing exceptions, I found that the formula could be simplified again. So I had to do that in order to avoid that newly discovered exceptions during testing would not make the code ridiculous complicated.&lt;br /&gt;&lt;br /&gt;I also noticed that object-orientation is ideal for this, so I implemented another set of subclasses for conjugations of a certain type and for certain exceptions.&lt;br /&gt;&lt;br /&gt;The program now has a class "Conjugation" which implements a few helper methods and four conjugation methods:&lt;br /&gt;&lt;br /&gt;function GetInfinitive(root: String): String;&lt;br /&gt;function GetPresentTense(root: String; person: Int32; male: Boolean): String;&lt;br /&gt;function GetPastTense(root: String; person: Int32; male: Boolean): String;&lt;br /&gt;function GetFutureTense(root: String; person: Int32; male: Boolean): String;&lt;br /&gt;&lt;br /&gt;Each method simply returns an empty string for all input values. This ensures two things. First, any unsupported conjugation can still be called (see note 1) and will not crash the program or return false results. Second, any non-implemented features in a supported conjugation will not return false results either (see note 2).&lt;br /&gt;&lt;br /&gt;Note 1: If a subclass of Conjugation does not implement an override for a method, the original method will be called and, in this case, return an empty string.&lt;br /&gt;&lt;br /&gt;Note 2: Subclasses of specific conjugations that do not implement an override for a method, will call the specific conjugation's method and return a false result. Hence all subclasses of subclasses of Conjugation will have to implement override methods if the original override method would return false results.&lt;br /&gt;&lt;br /&gt;The program then defines subclasses of Conjugation representing specific conjugations (Hebrew: binyanim = buildings), for example ConjugationPa3al.&lt;br /&gt;&lt;br /&gt;The subclasses define their own override versions of the four methods.&lt;br /&gt;&lt;br /&gt;Orginially, the subclasses also defined new methods for exceptions (like GetPresentTenseHollow for hollow roots), but I found that the code is easier to read if each method follows the same structure in name and content. Hence were born subclasses of the subclasses, including ConjugationPa3alHollow (for hollow roots, like "gar" = "he dwelled" or "ba" = "he came"; "pa3al" is one of the conjugations in Hebrew)and ConjugationPa3alHe (for roots ending on He, like "qanah" = "he bought" and "panah" = "he turned").&lt;br /&gt;&lt;br /&gt;Exceptions that only affect the infinitive are handled by the original subclass.&lt;br /&gt;&lt;br /&gt;For the infinitive of root ending on He, I found a particularly clever (in my opinion) solution. ConjugationPi3el actually returns the correct infinitive for both roots ending on He ("qanah" -&gt; "liqnoth") and normal roots ("katav" -&gt; "likhtov") and ConjugationPi3elHe does not implement an override for the GetInfinitive() method. This constitutes a combination of not rewriting existing code but still keeping different things in different modules, logically.&lt;br /&gt;&lt;br /&gt;Current class tree:&lt;br /&gt;&lt;br /&gt;- Conjugator (GUI program uses Conjugation.dll)&lt;br /&gt;&lt;br /&gt;- HebrewWord (used by Conjugator)&lt;br /&gt;&lt;br /&gt;- Conjugation (all used by HebrewWord)&lt;br /&gt;-- ConjationPa3al&lt;br /&gt;--- ConjugationPa3alHollow&lt;br /&gt;-- ConjugationPi3el&lt;br /&gt;--- ConjugationPi3elHe&lt;br /&gt;&lt;br /&gt;Other classes are not implemented yet.&lt;br /&gt;&lt;br /&gt;Each subclass of Conjugation and their descendants contain implementations of GetInfinitive(), GetPresentTense(), GetPastTense(), and GetFutureTense(), if needed and nothing else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8956571780363253726-7358427997860344072?l=leaukiprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leaukiprog.blogspot.com/feeds/7358427997860344072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://leaukiprog.blogspot.com/2009/09/refactoring-immediately.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/7358427997860344072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/7358427997860344072'/><link rel='alternate' type='text/html' href='http://leaukiprog.blogspot.com/2009/09/refactoring-immediately.html' title='Refactoring Immediately'/><author><name>Andrew J. Brehm</name><uri>http://www.blogger.com/profile/13058608736862971026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://2.bp.blogspot.com/_kOdrnrUVOZY/S9As4MqnK8I/AAAAAAAAADA/m09AprQuX9c/S220/Shmulik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8956571780363253726.post-7689399267227210635</id><published>2009-08-31T14:02:00.000-07:00</published><updated>2009-09-04T03:44:16.218-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphiprism'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='winforms'/><title type='text'>Hebrew Conjugator - a Delphi Prism Project</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kOdrnrUVOZY/Spw_WsBvApI/AAAAAAAAACA/CUYrDW6c_30/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 253px;" src="http://4.bp.blogspot.com/_kOdrnrUVOZY/Spw_WsBvApI/AAAAAAAAACA/CUYrDW6c_30/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5376241714181636754" border="0" /&gt;&lt;/a&gt;&lt;p style="margin: 0px; font-family: Georgia; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;For the past few weeks, I have been working on a Delphi Prism project, a Hebrew verb conjugation program. It is meant to handle regular as well as irregular verbs.&lt;/p&gt; &lt;p face="Georgia" size="16px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Georgia; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;The program consists of two parts, a conjugation library HebrewConjugation.dll and a front end HebrewConjugator.exe. The library defines a class HebrewWord as well as a class Conjugation, a base class from which the several conjugations (in Hebrew: binyanim = buildings) are derived. So far I have implemented parts of two conjugation classes, ConjugationPa3al and ConjugationPi3el.&lt;/p&gt; &lt;p style="margin: 0px; font-family: Georgia; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Georgia; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;The base class also defines as constants all letters of the Alefbet (Hebrew alphabet), helper methods to access the characters (for example to modify final letters when appropriate), and empty conjugation methods that simply return empty strings.&lt;/p&gt; &lt;p style="margin: 0px; font-family: Georgia; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;public&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;function&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Alefbet(i: Int32): String;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;function&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Sofit(s: String): String;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;function&lt;/span&gt;&lt;span style="font-size:100%;"&gt; GetInfinitive(root: String): String; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;virtual&lt;/span&gt;&lt;span style="font-size:100%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;function&lt;/span&gt;&lt;span style="font-size:100%;"&gt; GetPresentTense(root: String; person: Integer; male: Boolean): String; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;virtual&lt;/span&gt;&lt;span style="font-size:100%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;function&lt;/span&gt;&lt;span style="font-size:100%;"&gt; GetPastTense(root: String; person: Integer; male: Boolean): String; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;virtual&lt;/span&gt;&lt;span style="font-size:100%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;function&lt;/span&gt;&lt;span style="font-size:100%;"&gt; GetFutureTense(root: String; person: Integer; male: Boolean): String; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;virtual&lt;/span&gt;&lt;span style="font-size:100%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Georgia; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Georgia; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="font-size:100%;"&gt;An object of the type HebrewWord creates an object named conjugation first of the type Conjugation (i.e. the base class) and then of the correct type (e.g. ConjugationPa3al) if such a class already exists. (This means that all conjugations will technically work and not throw exceptions. If a conjugation is not implemented yet, it will return empty strings for any finite verb form requested.)&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Georgia; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Georgia; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="font-size:100%;"&gt;Catching irregular verbs is done step-by-step, like here:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Georgia; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;function&lt;/span&gt;&lt;span style="font-size:100%;"&gt; ConjugationPa3al.GetPastTense(root: String; person: Int32; male: Boolean): String;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;var&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255); min-height: 12px;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;r: String;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 12px;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;begin&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255); min-height: 12px;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;if&lt;/span&gt;&lt;span style="font-size:100%;"&gt; (root.Length = 2) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;then&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;begin&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 131, 0);font-size:100%;" &gt;// two-letter root&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 131, 0); min-height: 12px;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;r := GetPresentTenseHollow(root, person, male);&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 12px;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;result&lt;/span&gt;&lt;span style="font-size:100%;"&gt; := r;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 12px;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;exit&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 12px;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Helvetica;font-size:10px;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;end&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;else&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;begin&lt;/span&gt;&lt;span style="font-size:100%;"&gt; // three-letter root&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 12px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 12px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;The Windows.Forms front end doesn't work on Mac OS X because of, I think, a bug in how Mono handles right-to-left scripts. (Input also doesn't work. I reported the bug to Novell.) So the current version runs on Windows (and perhaps Linux, I haven't tried).&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;I was planning to build separate front ends for Mac OS X (Monobjc) and Linux (GTK#) anyway, also for WPF and Silverlight (if I find the time).&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Plus I plan to add an option to save a root and all finite forms in a (Blackfish SQL) database so that a conjugation once corrected and confirmed can be remembered by the program and accessed when the same root is asked again.&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Currently the following items work:&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Pa3al: infinitive, present tense (i.e. nouns), past tense (i.e. perfect tense)&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Pi3el: infinitive, present tense&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Hif3il: nothing&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Hitpa3el: nothing&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;passive conjugations: not supported at all for the moment&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Wish me luck!&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Helvetica,fantasy;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8956571780363253726-7689399267227210635?l=leaukiprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leaukiprog.blogspot.com/feeds/7689399267227210635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://leaukiprog.blogspot.com/2009/08/hebrew-conjugator-delphi-prism-project.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/7689399267227210635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/7689399267227210635'/><link rel='alternate' type='text/html' href='http://leaukiprog.blogspot.com/2009/08/hebrew-conjugator-delphi-prism-project.html' title='Hebrew Conjugator - a Delphi Prism Project'/><author><name>Andrew J. Brehm</name><uri>http://www.blogger.com/profile/13058608736862971026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://2.bp.blogspot.com/_kOdrnrUVOZY/S9As4MqnK8I/AAAAAAAAADA/m09AprQuX9c/S220/Shmulik.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kOdrnrUVOZY/Spw_WsBvApI/AAAAAAAAACA/CUYrDW6c_30/s72-c/Picture+1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8956571780363253726.post-5947972597100960236</id><published>2009-07-12T14:54:00.001-07:00</published><updated>2009-07-12T16:21:45.606-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphiprism'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='macosx'/><title type='text'>Delphi Prism - First Experiment</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kOdrnrUVOZY/Slph-oa98pI/AAAAAAAAABw/3N14m-gzW44/s1600-h/5quit.png"&gt;&lt;/a&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;After writing a simple Winforms application I figured I should try out Delphi Prism and Monobjc to write a program for Mac OS X.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;My first attempt was a disaster and I ran into three bugs in the IDE (now reported to Embarcadero), and two problems that I caused myself while trying to figure out how to deal with everything else that went wrong.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;But at the end somebody in the Embarcadero newsgroups managed to explain everything so clearly that even I could understand it.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kOdrnrUVOZY/SlpfShztykI/AAAAAAAAABA/9SDF9iZJVW4/s1600-h/powercourtj.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_kOdrnrUVOZY/SlpfShztykI/AAAAAAAAABA/9SDF9iZJVW4/s320/powercourtj.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5357699478628190786" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 240px; " /&gt;&lt;/a&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;First, I spent a Saturday afternoon at Powerscourt Gardens in Wicklow, which I now realise is an excellent way to start a project.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;It rained, which meant that most visitors were spending their valuable free time in the main building. We pretty much had the entire park for ourselves. It wasn't raining hard.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Powerscourt Gardens has an English garden, a Japanese garden, and a Robin-Hood style valley with cannon tower.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;But be that as it may, Saturday evening and Sunday was spent learning Delphi Prism and playing StarCraft.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Delphi Prism supports Cocoa via Cocoa# and via Monobjc. Monojbc is now the preferred method. Most Cocoa classes, including GUI and other classes are exposed to .NET via wrappers provided by Monobjc. It is possible to create an NSMutableString in Prism and I assume it can be cast into a System.String but I haven't tried.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;But what is perhaps most important is that Monobjc allows Prism (and any other .NET language) to use Cocoa NIB files. NIB files contain, as I understand it, archived (or "serialised") Cocoa objects like windows, buttons, text fields etc.. which can be unarchived and connected to delegates at runtime. Via Monobjc a .NET class can act as the delegate for these Cocoa objects.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Delphi Prism provides tools to read NIB files into Visual Studio and Prism and allows for somewhat easy interaction between the Windows and Mac worlds. Prism also creates a bundle out of the compiled .NET assemblies and adds all required DLLs the usual way.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;After building the application in Visual Studio, the result is a bundle with a Macintosh icon (in this case the default icon for Monobjc projects in Delphi Prism):&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kOdrnrUVOZY/Slph2wS0kFI/AAAAAAAAABQ/tX1QXl6SKII/s1600-h/1bundle.png" style="text-decoration: none;"&gt;&lt;img src="http://4.bp.blogspot.com/_kOdrnrUVOZY/Slph2wS0kFI/AAAAAAAAABQ/tX1QXl6SKII/s320/1bundle.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5357702300015300690" style="text-align: left;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 169px; height: 173px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kOdrnrUVOZY/Slph9yXyTJI/AAAAAAAAABY/4S0Y4BEONP8/s1600-h/2window.png"&gt;&lt;img src="http://2.bp.blogspot.com/_kOdrnrUVOZY/Slph9yXyTJI/AAAAAAAAABY/4S0Y4BEONP8/s320/2window.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5357702420832078994" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 143px; " /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The application uses native Cocoa windows fresh out of a NIB file. Here the text in the text box is not part of the window definition from the NIB but was added by a delegate method awakeFromNib: which is implemented in Pascal.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The text field ("textMessage") is mapped to the NIB in designable.pas, a Pascal file in the NIB folder.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The code for the actual method looks like this:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span style="color:#0000ff;"&gt;method&lt;/span&gt; ApplicationController.AwakeFromNib;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0000ff;"&gt;begin&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #0000ff; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#800000;"&gt;&lt;span style="color:#000000;"&gt;    textInfo.StringValue := &lt;/span&gt;'Hello Prism Cocoa 2 Judgement Day'&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0000ff;"&gt;end&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0000ff;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia, -webkit-fantasy;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;AwakeFromNib() is mapped to the Objective-C method awakeFromNib: automatically. I think Prism's NIB reader tool does that. Not all delegate methods are automatic like that. More about that later.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0000ff;"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kOdrnrUVOZY/Slph-B5QqVI/AAAAAAAAABg/g3ugMUwWzNQ/s1600-h/3alertbox.png" style="text-decoration: none; "&gt;&lt;img src="http://1.bp.blogspot.com/_kOdrnrUVOZY/Slph-B5QqVI/AAAAAAAAABg/g3ugMUwWzNQ/s320/3alertbox.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5357702424999012690" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 242px; " /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Here we have an alert box (NSRunAlertPanel) displayed when the OK button in the main window is clicked.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The method for the button event has to be added as an action in the NIB file and will then show up in designable.pas in the NIB folder. Somehow that maps the Pascal method to the action in the NIB file as Cocoa expects it. &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Embarcadero say that this is a well-designed feature but I think it is magic.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Code:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;     [ObjectiveCMessage(&lt;span style="color:#800000;"&gt;'PushOK:'&lt;/span&gt;)]&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;      &lt;span style="color:#0000ff;"&gt;method&lt;/span&gt; PushOK(aSender: NSObject); &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;empty&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia, fantasy;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(This is the generated code in designable.pas that maps the method to the action in the NIB file.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span style="color:#0000ff;"&gt;method&lt;/span&gt; ApplicationController.PushOK(aSender: NSObject);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0000ff;"&gt;var&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #0000ff; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#800000;"&gt;&lt;span style="color:#000000;"&gt;    msgbox: Integer := AppKitFramework.NSRunAlertPanel(&lt;/span&gt;'Hello Prism Cocoa 2 Judgement Day'&lt;span style="color:#000000;"&gt;, &lt;/span&gt;'Somebody pressed the OK button!'&lt;span style="color:#000000;"&gt;, &lt;/span&gt;'Really?'&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;nil&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;nil&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;nil&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0000ff;"&gt;begin&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #0000ff; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; msgbox = NSPanel.NSAlertDefaultReturn &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt; textInfo.StringValue := &lt;span style="color:#800000;"&gt;'Somebody pressed the OK button just then.'&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#0000ff;"&gt;end&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(This is the code I wrote to make the alert box appear and change the text in the text field.)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kOdrnrUVOZY/Slph-TXuGFI/AAAAAAAAABo/-CX0JquyKg0/s1600-h/4newtext.png"&gt;&lt;img src="http://4.bp.blogspot.com/_kOdrnrUVOZY/Slph-TXuGFI/AAAAAAAAABo/-CX0JquyKg0/s320/4newtext.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5357702429690173522" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 143px; " /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The text field's contents has been changed by the method called by the button pressed.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Everything in the text field is selected. I didn't care because I was only experimenting. But I guess I have to play with a few attributes a bit more.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;div style="text-align: left; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kOdrnrUVOZY/Slph-oa98pI/AAAAAAAAABw/3N14m-gzW44/s1600-h/5quit.png"&gt;&lt;img src="http://4.bp.blogspot.com/_kOdrnrUVOZY/Slph-oa98pI/AAAAAAAAABw/3N14m-gzW44/s320/5quit.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5357702435340939922" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 238px; " /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;One common problem with Cocoa (it's by design for good reason) is that closing the last window does not quit the program. This is very useful in a Web browser or word processor but annoying when the program only has one window and is useless without that one window.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;So I figured this would be a good way to test surprising delegate methods (i.e. those that are not awakeFromNib:).&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;I display an alert box when the red button to close the window is clicked on.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;This requires two things.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;First, the event has to be caught, which turns out is easy because the event has its own delegate method which I can implement somewhere. If I can manage to map my Pascal method to the delegate method the NIB expects, it should work.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Then, the event has to be cancelled in case the user decides "No" and doesn't want to quit.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;This definition in the public type section of the ApplicationController.pas class file maps the Pascal function to the delegate method:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;   [ObjectiveCMessage(&lt;span style="color:#800000;"&gt;'windowShouldClose:'&lt;/span&gt;)]&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; WindowShouldClose(window: NSWindow): Boolean; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt; &lt;/p&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;And this code, further down, implements the function:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; ApplicationController.WindowShouldClose(window: NSWindow): Boolean;&lt;/p&gt; &lt;p color="#0000ff" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;var&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #0000ff; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    msgbox: Integer := AppKitFramework.NSRunAlertPanel(&lt;span style="color:#800000;"&gt;'Hello Prism Cocoa 2 Judgement Day'&lt;/span&gt;, &lt;span style="color:#800000;"&gt;'Really Quit?'&lt;/span&gt;, &lt;span style="color:#800000;"&gt;'Yes'&lt;/span&gt;, &lt;span style="color:#800000;"&gt;'No'&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;nil&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;nil&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p color="#0000ff" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;begin&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #0000ff; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; msgbox = NSPanel.NSAlertDefaultReturn &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt; Environment.Exit(0) &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Result&lt;/span&gt; := &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p color="#0000ff" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;end&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;It works beautifully.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Of course, this program only works on Mac OS X. But I now have a Mac program that can use .NET DLLs at will. This allows for some great portability, as code written for a Windows (.NET) program can also be used for a Mac program. Only the GUI parts and those parts that use other native classes (from Cocoa or Windows COM+) have to be written per platform.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Potential issues:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;I assume that when I use other Cocoa classes that are not available in the form of existing objects from a NIB file, I will have to keep track of them and release them when I am done with them to avoid memory leaks.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Plus, all programs will have to be written in a way that allows for replacing everything GUI-related without breaking the business logic.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(I am hearing that Delphi for Win32 will be cross-platform soon. This will add another choice to a field dominated still by Java and REALbasic.)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8956571780363253726-5947972597100960236?l=leaukiprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leaukiprog.blogspot.com/feeds/5947972597100960236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://leaukiprog.blogspot.com/2009/07/delphi-prism-first-experiment.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/5947972597100960236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/5947972597100960236'/><link rel='alternate' type='text/html' href='http://leaukiprog.blogspot.com/2009/07/delphi-prism-first-experiment.html' title='Delphi Prism - First Experiment'/><author><name>Andrew J. Brehm</name><uri>http://www.blogger.com/profile/13058608736862971026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://2.bp.blogspot.com/_kOdrnrUVOZY/S9As4MqnK8I/AAAAAAAAADA/m09AprQuX9c/S220/Shmulik.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kOdrnrUVOZY/SlpfShztykI/AAAAAAAAABA/9SDF9iZJVW4/s72-c/powercourtj.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8956571780363253726.post-1721477770218617802</id><published>2009-07-06T09:24:00.000-07:00</published><updated>2009-07-12T16:18:52.627-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='zombies'/><category scheme='http://www.blogger.com/atom/ns#' term='macosx'/><title type='text'>iPhone debug zombies and finally VMware</title><content type='html'>&lt;div class="post-text"&gt;                 &lt;p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;A few weeks ago I had an iPhone app running in the simulator that wouldn't quit. I also could not kill it, not using Activity Monitor nor kill or kill -9 or killall.&lt;/span&gt;&lt;/p&gt;  &lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;span class="pln"  style="font-size:78%;"&gt;cyrus&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:~&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; ajbrehm$ ps auxc&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;|&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;grep &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;&lt;br /&gt;ajbrehm  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;76450&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.0&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.1&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;153116&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;5212&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;??&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  UE   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;12&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;59pm&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;00.05&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;&lt;br /&gt;ajbrehm  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;76437&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.0&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.1&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;153116&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;5212&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;??&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  UE   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;12&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;58pm&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;00.05&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;&lt;br /&gt;ajbrehm  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;76350&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.0&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.1&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;153116&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;5212&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;??&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  UE   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;12&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;57pm&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;00.05&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;&lt;br /&gt;ajbrehm  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;76336&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.0&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.1&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;153116&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;5212&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;??&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  UE   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;12&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;56pm&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;00.05&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;&lt;br /&gt;ajbrehm  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;76329&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.0&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.1&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;153116&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;5212&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;??&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  UE   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;12&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;56pm&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;00.05&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;&lt;br /&gt;ajbrehm  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;76276&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.0&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.1&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;153116&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;5212&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;??&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  UE   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;12&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;56pm&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;00.05&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;&lt;br /&gt;ajbrehm  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;76245&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.0&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.1&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;153116&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;5212&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;??&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  UE   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;12&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;55pm&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;00.05&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;&lt;br /&gt;ajbrehm  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;76176&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.0&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.1&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;153116&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;5212&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;??&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  UE   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;12&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;55pm&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;00.05&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;&lt;br /&gt;ajbrehm  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;76159&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.0&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.1&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;153116&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;5212&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;??&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  UE   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;12&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;54pm&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;00.05&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;&lt;br /&gt;ajbrehm  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;76150&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.0&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0.1&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;155136&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;9264&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;??&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;  UE   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;12&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;54pm&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;0&lt;/span&gt;&lt;span class="pun"  style="font-size:78%;"&gt;:&lt;/span&gt;&lt;span class="lit"  style="font-size:78%;"&gt;00.10&lt;/span&gt;&lt;span class="pln"  style="font-size:78%;"&gt; &lt;/span&gt;&lt;span class="typ"  style="font-size:78%;"&gt;Vocky&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;This happened whenever I ran the application in the simulator. Sometimes Xcode's debugger picked up on it and the simulator wouldn't run the application any more because, as the console sayd, it was already running.&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;It took me a while to figure out what was going on. But then misfortune struck and taught me the solution.&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;After a while VMware also started behaving oddly and left "vmware" zombies behind in Activity Monitor. One of the VMware instances then blocked the GUI. (It also kept changing the mouse pointer tracking speed for some reason. I have no idea why VMware is allowed to change system preferences and block the GUI.)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Ultimately I had to bring down the GUI (I killed loginwindow and windowserver) and solve the problem.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;A few days earlier I had tried switching off Spotlight search because it had started indexing 600 GB of incoming data during a copy process (which took nearly 6 hours because of that, from a Firewire 800 disk). For some reason the only way to stop Spotlight from restarting itself during that copy process was to rename ReportCrash to something else ("ReportCrash2") so that it couldn't be found. That made sense at the time.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;The problem was that I had forgotten that I had done that.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Once ReportCrash was usable again, each of the zombies reported its crash and went away, both the iPhone program and the many instances of the VMware interface. This took about 5 minutes. (In the process I learned that the 24" Apple Cinema Display is an EXCELLENT monitor for a text interface! Finally I could see each line without linebreaks.)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;After that was done, I restarted windowserver and loginwindow and could log back into the GUI. My VMware VMs had also survived (since I didn't reboot) and VMware worked again and I could connect to all the Windows VMs and the zombie processes had gone.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Turned out it was a ten minute issue once it was clear that it had nothing to do with Xcode or gdb.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;I hate ReportCrash.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8956571780363253726-1721477770218617802?l=leaukiprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leaukiprog.blogspot.com/feeds/1721477770218617802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://leaukiprog.blogspot.com/2009/07/iphone-debug-zombies-and-finally-vmware.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/1721477770218617802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8956571780363253726/posts/default/1721477770218617802'/><link rel='alternate' type='text/html' href='http://leaukiprog.blogspot.com/2009/07/iphone-debug-zombies-and-finally-vmware.html' title='iPhone debug zombies and finally VMware'/><author><name>Andrew J. Brehm</name><uri>http://www.blogger.com/profile/13058608736862971026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://2.bp.blogspot.com/_kOdrnrUVOZY/S9As4MqnK8I/AAAAAAAAADA/m09AprQuX9c/S220/Shmulik.jpg'/></author><thr:total>0</thr:total></entry></feed>
