<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tips &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/tag/tips/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.xojo.com</link>
	<description>Blog about the Xojo programming language and IDE</description>
	<lastBuildDate>Wed, 21 Feb 2024 21:00:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Tips for using Xojo&#8217;s issue tracking system</title>
		<link>https://blog.xojo.com/2022/07/21/tips-for-using-xojos-issue-tracking-system/</link>
		
		<dc:creator><![CDATA[Dana Brown]]></dc:creator>
		<pubDate>Thu, 21 Jul 2022 17:17:52 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Issues]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Xojo Feedback]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=10603</guid>

					<description><![CDATA[Recently Xojo made the switch to using Issues for tracking bugs and feature requests. Issues is a web-based system you can find here: https://www.xojo.com/issues The&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Recently Xojo made the switch to using <a href="https://blog.xojo.com/2022/05/25/improving-feedback-2/" target="_blank" rel="noreferrer noopener">Issues</a> for tracking bugs and feature requests. Issues is a web-based system you can find here: <a href="https://www.xojo.com/issues" target="_blank" rel="noreferrer noopener">https://www.xojo.com/issues</a></p>



<p>The system brings a lot of improvements and more visibility, but there are some changes. Some users have asked<em> </em>&#8220;how do I find the bugs I have reported&#8221; or &#8220;how do I search for an issue number&#8221; and if you haven&#8217;t used this system, those may not be obvious. </p>



<p>Here are some tips for using Issues:</p>



<h4 class="wp-block-heading"><strong>When do I use Issues?</strong></h4>



<p>Use Issues to let us know you have a bug or feature request for Xojo, the Xojo documentation, our website, or an example project. Discussing these things on the forum can be helpful but in order to officially let us know about a problem, please create a <a rel="noreferrer noopener" href="https://tracker.xojo.com/xojoinc/xojo/-/issues/new" target="_blank">new issue</a>.</p>



<p>For Customer Support, please contact us via email at <a href="mailto:hello@xojo.com">hello@xojo.com</a>. Contact Customer Support for general questions about licensing, questions about your account, technical support, etc. If you&#8217;re not sure, write us, we are here to help and usually respond very quickly.</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h4 class="wp-block-heading"><strong>How do I search for a specific issue?</strong></h4>



<p>If you are trying to find an issue by the issue number make sure you put &#8220;#&#8221; before it. For example, if you&#8217;re looking for issue 69360, make sure to type it in the search bar like this:</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="60" src="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.49.53-AM-1024x60.png" alt="" class="wp-image-10604" srcset="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.49.53-AM-1024x60.png 1024w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.49.53-AM-300x18.png 300w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.49.53-AM-768x45.png 768w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.49.53-AM-1536x90.png 1536w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.49.53-AM-2048x120.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>If you forget to type in the #, your search will not return any results. </p>



<p>To link to a specific issue, use <code>https://www.xojo.com/issue/&lt;issuenumber></code>.</p>
</div></div>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h4 class="wp-block-heading"><strong>How do I create an issue?</strong></h4>



<p>Click &#8220;<a rel="noreferrer noopener" href="https://tracker.xojo.com/xojoinc/xojo/-/issues/new" target="_blank">New Issue</a>&#8221; to create an issue. When you start typing in the title field, you&#8217;ll see a list of possible matches populate as you are typing which is helpful to see if your issue already exists.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.31.52-AM-1024x402.png" alt="" class="wp-image-10617" width="576" height="226" srcset="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.31.52-AM-1024x402.png 1024w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.31.52-AM-300x118.png 300w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.31.52-AM-768x301.png 768w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.31.52-AM-1536x603.png 1536w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.31.52-AM-2048x803.png 2048w" sizes="(max-width: 576px) 100vw, 576px" /></figure>
</div></div></div>



<h4 class="wp-block-heading"><strong>How do I find the issues I have created?</strong></h4>



<p>There are many options for searching. If you click inside the search field, you&#8217;ll see a pop-up menu with criteria you can choose from like Author, Label, My-Reaction, etc.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="408" src="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.42-AM-1024x408.png" alt="" class="wp-image-10605" srcset="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.42-AM-1024x408.png 1024w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.42-AM-300x120.png 300w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.42-AM-768x306.png 768w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.42-AM-1536x613.png 1536w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.42-AM.png 1680w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>To find the issues you created, perform this search using the popup menu: <code>Author = [Your Username]</code>. For example, the search below will find the issues I have created. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="54" src="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.58.23-AM-1024x54.png" alt="" class="wp-image-10607" srcset="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.58.23-AM-1024x54.png 1024w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.58.23-AM-300x16.png 300w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.58.23-AM-768x41.png 768w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.58.23-AM-1536x81.png 1536w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.58.23-AM.png 1666w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>You can search for your issues or those created by other users. Keep in mind that Issues uses the same username as the Xojo Forum.</p>



<h4 class="wp-block-heading"><strong>What do I do if my issue already exists?</strong></h4>



<p>If you are searching for a problem that you&#8217;re experiencing and find that an issue already exists, please add a thumbs up. If you have additional information, you can add a comment by scrolling to the bottom of the issue. </p>



<p>If your information should be kept private please check the checkbox at the bottom: <em>This note should only be visible to Xojo.</em></p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.14.37-AM-1024x459.png" alt="" class="wp-image-10612" width="682" height="306" srcset="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.14.37-AM-1024x459.png 1024w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.14.37-AM-300x135.png 300w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.14.37-AM-768x344.png 768w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.14.37-AM.png 1494w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<h4 class="wp-block-heading"><strong>How do I bring more attention to an issue?</strong></h4>



<p>If there’s an issue you feel needs more attention than others, you can click the thumbs up button to upvote it. Conversely, if you feel there’s an issue that should get less attention, you can downvote it. </p>



<p>Be aware that the more you upvote issues, the less your votes matter. The same is true of downvoting issues though upvoting and downvoting have independent impact. In other words, upvoting several issues doesn’t change the impact you have when you downvote issues and vice-versa.</p>



<h4 class="wp-block-heading"><strong>How do I find the issues I have added a <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f44d.png" alt="👍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> to?</strong></h4>



<p>To see what issues you have added a <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f44d.png" alt="👍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> to, search for: <code>My-Reaction = &#x1f44d;</code></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="66" src="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.54-AM-1024x66.png" alt="" class="wp-image-10606" srcset="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.54-AM-1024x66.png 1024w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.54-AM-300x19.png 300w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.54-AM-768x50.png 768w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.54-AM-1536x100.png 1536w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-9.52.54-AM.png 2034w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading"><strong>How do I see the top feature requests from users?</strong></h4>



<p>You can search by Popularity using the dropdown menu to the right of the search field to sort your results. It is important to remember that the Popularity list is not our <a rel="noreferrer noopener" href="https://documentation.xojo.com/resources/roadmap.html#roadmap" target="_blank">Roadmap</a>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.46.59-AM.png" alt="" class="wp-image-10620" width="373" height="374" srcset="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.46.59-AM.png 748w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.46.59-AM-300x300.png 300w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.46.59-AM-150x150.png 150w" sizes="auto, (max-width: 373px) 100vw, 373px" /></figure>
</div>


<p>Note: If you do a search that you like, add a Bookmark to quickly go back to it in the future. </p>



<h4 class="wp-block-heading"><strong>How do I view my recent searches?</strong></h4>



<p>Click the icon to the left of the search bar to see a list of your recent searches:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.30.14-AM.png" alt="" class="wp-image-10616" width="371" height="189" srcset="https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.30.14-AM.png 888w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.30.14-AM-300x153.png 300w, https://blog.xojo.com/wp-content/uploads/2022/07/Screen-Shot-2022-07-21-at-10.30.14-AM-768x391.png 768w" sizes="auto, (max-width: 371px) 100vw, 371px" /></figure>
</div>


<h4 class="wp-block-heading"><strong>How do I reopen a closed issue?</strong></h4>



<p>If you are the original author of an issue you can close and re-open it yourself. You do not have to ask Xojo to do it. If you are not the author and want to re-open it, just leave a comment on the issue to let us know that it still affects you and you&#8217;d like it re-opened. Then either Xojo or the original author will re-open it for you.</p>



<h4 class="wp-block-heading"><strong>Does <em>Milestone</em> mean a feature will be coming in that specific milestone?</strong></h4>



<p>Just because something has a Milestone listed, that is not a guarantee that it will be fixed or added in that milestone. It means that it is an issue we are considering for that release. </p>



<p>If you want to read more about issues, check out <a rel="noreferrer noopener" href="https://documentation.xojo.com/resources/reporting_bugs_and_making_feature_requests.html#resources-reporting-bugs-and-making-feature-requests-reporting-ide-performance-issues" target="_blank">this</a> page in the documentation. Do you have other tips for using Issues? Please share on the <a href="https://forum.xojo.com" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Make a ToDo List in the Xojo IDE</title>
		<link>https://blog.xojo.com/2020/06/23/how-to-make-a-todo-list-in-the-xojo-ide/</link>
		
		<dc:creator><![CDATA[Robin Lauryssen-Mitchell]]></dc:creator>
		<pubDate>Tue, 23 Jun 2020 10:00:00 +0000</pubDate>
				<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=7134</guid>

					<description><![CDATA[My own projects have #PRAGMA warning “TODO” in the App.Open event. Wherever you want a ToDo note in your code type #PRAGMA warning “Your message”.]]></description>
										<content:encoded><![CDATA[
<p>As early as possible in your code place this line:</p>



<p>#PRAGMA warning “TODO”</p>



<p>My own projects have this line in the App.Open event. Wherever you want a ToDo note in your code type #PRAGMA warning “Your message”.</p>



<p>When the project is analysed all the ‘PRAGMA warning’ messages will appear at the top of the ‘Errors &amp; Warnings’ dialogue at the bottom of the IDE. Not the greatest ToDo list ever, but it’s free!</p>



<p>Extra bonus:</p>



<p>I also use ‘///TODO: message’ in my code.&nbsp; Can then search for ‘///TODO:’</p>



<p>If you wish it is possible to mix both and have ‘#PRAGMA warning “///TODO: “Your message”’ </p>



<p>Enjoy!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What is Xojo Pro Plus&#8230;and what it is not</title>
		<link>https://blog.xojo.com/2019/03/26/what-is-xojo-pro-plus-and-what-it-is-not/</link>
		
		<dc:creator><![CDATA[Dana Brown]]></dc:creator>
		<pubDate>Tue, 26 Mar 2019 15:10:39 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Beta List]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Licenses]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Xojo Licensing]]></category>
		<category><![CDATA[Xojo Pro Plus]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=5562</guid>

					<description><![CDATA[Xojo Pro Plus users get the highest priority support we offer. For users whose businesses rely on Xojo, upgrading to Xojo Pro Plus can be a huge bonus. ]]></description>
										<content:encoded><![CDATA[<p>Recently we changed the name of Xojo Enterprise to Xojo Pro Plus. This brought about a lot of questions. For users whose businesses rely on Xojo, upgrading to Xojo Pro Plus can be very beneficial. For everyone else in the community, this change doesn&#8217;t effect you or your Xojo license.</p>
<p>We offer a range of license types as well as ways for users to get additional help from us. But our help comes at an opportunity cost for us because if we are helping someone with their issue, we aren’t helping others at that time. Xojo Pro users get higher priority support than Xojo Desktop users, who get higher priority support than Xojo Lite users, who get higher priority support than those using Xojo for free. Xojo Pro Plus users get the highest priority support of all.</p>
<p>Here is what Xojo Pro Plus is, what it isn&#8217;t and what that means for you.</p>
<p><span id="more-5562"></span></p>
<h2>Xojo Pro Plus includes:</h2>
<p class="wow fadeInUp animated" data-wow-delay=".2s"><strong>Top Priority Support</strong><br />
We understand that some Xojo users need support issues resolved ASAP. With Xojo Pro Plus, you&#8217;ll get support questions answered first and Feedback reports will be verified first.</p>
<p class="wow fadeInUp animated" data-wow-delay=".2s"><strong>Fast Fixes</strong><br />
We make it a priority to help you resolve your issues. That may mean helping you track down an issue in your code, getting a bug you’ve discovered fixed more quickly and/or helping you find a workaround when you need one.</p>
<p class="wow fadeInUp animated" data-wow-delay=".2s"><strong>2X Activations</strong><br />
We recognize that some users have several devices or virtual machines they use for testing and as a result, Xojo Pro Plus users can activate their licenses on up to 6 machines.</p>
<h2><strong>Frequently Asked Questions:</strong></h2>
<p class="wow fadeInUp animated" data-wow-delay=".2s"><strong>Do we guarantee a fix in a certain amount of time?</strong><br />
Not all issues are equal, some take more time, some less, some depend on outside factors, etc. While we do give priority to Pro Plus customers, we simply cannot guarantee how quickly an issue will be resolved. This will be evaluated on a case by case basis. But we will work with you and will stay in communication with you to circumvent issues you encounter with workarounds if we cannot fix it quickly enough.</p>
<p class="wow fadeInUp animated" data-wow-delay=".2s"><strong>How will Xojo know when I have reported a case in Feedback?</strong><br />
Our system notifies the Xojo team when Xojo Pro Plus users report an issue in Feedback. If the issue is critical, take the extra step to report the issue you have filed in Feedback to Xojo support immediately.</p>
<p class="wow fadeInUp animated" data-wow-delay=".2s"><strong>Do I get more Feedback points with Xojo Pro Plus?</strong><br />
No. As mentioned above, our system notifies the Xojo team when Xojo Pro Plus users report an issue in Feedback. Xojo Pro Plus is a level of support beyond Feedback points.</p>
<p class="wow fadeInUp animated" data-wow-delay=".2s"><strong>Does this mean other users are going to experience changes to support response time?</strong><br />
<em>Absolutely not.</em> We have always offered different levels of support. Nothing has changed with the level of support offered for any Xojo license.</p>
<p class="wow fadeInUp animated" data-wow-delay=".2s"><strong>Who is Xojo Pro Plus right for?</strong><br />
We have users that depend on Xojo for their living. We created Xojo Pro Plus for them. We will spend more time with Pro Plus users to resolve their issues more quickly.</p>
<p>If Xojo Pro Plus sounds like it might be right for you, you can <a href="https://www.xojo.com/store/">buy now,</a> <a href="https://www.xojo.com/account/licenses/">upgrade from your current license</a> or <a href="mailto:hello@xojo.com">contact us</a> with questions!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Loading 3rd Party Frameworks in Xojo iOS</title>
		<link>https://blog.xojo.com/2019/01/17/loading-3rd-party-frameworks-in-xojo-ios/</link>
		
		<dc:creator><![CDATA[Greg O'Lone]]></dc:creator>
		<pubDate>Thu, 17 Jan 2019 10:00:57 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Declares]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Third Party]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=5319</guid>

					<description><![CDATA[If you're familiar with Declares in iOS, loading a 3rd Party framework requires just a couple of extra lines of code in Xojo and a CopyFilesStep. In this example build and run SimulatorStatusMagic in the Simulator in order to always show a default date and time values when you do a debug run. ]]></description>
										<content:encoded><![CDATA[<p>Did you know that it&#8217;s possible to load and use 3rd Party Frameworks in your Xojo iOS projects? There&#8217;s quite a number of good projects out there, many of which are on sites like <a href="https://github.com">GitHub</a> and freely available for use in your projects. If you&#8217;re familiar with Declares in iOS, loading a 3rd Party framework requires just a couple of extra lines of code and a CopyFilesStep.</p>
<p>Last year at XDC 2018, <a href="https://github.com/jkleroy">Jérémie Leroy</a> talked about making sure your screenshots mimicked the Apple method so that the date was always Jun 9th, the time was always 9:41 AM, the battery always shows as full and the WiFi strength always shows full. It got me thinking that it might be handy to be able to make the simulator <em>always</em> show those values when you do a debug run so that you don&#8217;t need to think about it when you are ready to start taking screenshots and movies of your app. One way to do that is to build &amp; run project like <a href="https://github.com/shinydevelopment/SimulatorStatusMagic">SimulatorStatusMagic</a> on the simulator before running your project, but it would be more useful if it was <em>automatic</em>.</p>
<p><span id="more-5319"></span></p>
<h3>Build the Framework</h3>
<p>First of all, go to the SimulatorStatusMagic Github page and clone or download the project. Just like Xojo iOS development, you&#8217;ll need <a href="https://developer.apple.com/xcode/">Xcode</a> for this step. After you&#8217;ve downloaded the project, double-click on the SimulatorStatusMagic.xcodeproj file to open it in Xcode. When the project opens, change the target to SimulatorStatusMagiciOS and build it by either pressing CMD-B or pressing the Play button. Once the build is complete, go to the project navigator, scroll down to the bottom and open the Products group to reveal the built parts of this project. The only item we&#8217;re concerned with here is the file named SimulatorStatusMagiciOS.framework. Right-click on it and select Show in Finder.</p>
<h3>Build the Project</h3>
<p>Let&#8217;s start off by making sure the framework will be available to your project at runtime.</p>
<ol>
<li>Create a folder on your drive named SimulatorStatusMagic and copy the framework file that you just built into it.</li>
<li>Launch Xojo and create a new iOS project. Save the project into that folder as well.</li>
<li>To make sure the framework will be available to your project when debugging, go to the iOS target in the Xojo navigator, right-click and select Build Step &gt; Copy Files. Make sure the step is between the Build step and the Sign step.</li>
<li>Drag the SimulatorStatusMagiciOS.framework file from the Finder into the Copy Files Step.</li>
<li>In the Xojo inspector, set Applies To to &#8220;Debug&#8221; and Destination to &#8220;App Parent Folder&#8221;.</li>
</ol>
<p>Now let&#8217;s make it so you can access the framework! We&#8217;re going to add this code in the App.Open event so that the status bar gets set up before you do anything else.</p>
<p>Getting the framework to load is fairly straightforward:</p>
<pre>#If DebugBuild
  Declare Function dlopen Lib "/usr/lib/libSystem.dylib" (name As CString, flags As Int32) As Ptr
  Call dlopen("@executable_path/SimulatorStatusMagiciOS.framework/SimulatorStatusMagiciOS", 1 Or 8)
#EndIf</pre>
<p>That magic string &#8220;@executable_path&#8221; gets translated into &#8220;wherever the current application currently is&#8221; at runtime. Now this just loads the framework. We still need to hook up the methods and properties. <em>Note: If you&#8217;re working with a framework that &#8220;activates itself&#8221; like the one that comes with <a href="https://revealapp.com">Reveal</a> (an excellent tool for tracking down iOS layout issues), this is as far as you would need to go.</em></p>
<p>To figure out what we need to do next, we need to look at the documentation and header files that come with SimulatorStatusMagic. Go back to Xcode and look at the navigator. What we&#8217;re looking for is a header file (with a .h extension) which has the definitions of each of the methods and properties which are available in this framework. The only file that meets this criteria (and the one that all the others seem to point to) is named SDStatusBarManager.h. There&#8217;s a bit of functionality available here, but the framework is set up to use the Apple recommended settings by default, so all we&#8217;re going to do here is call the enableOverrides method to activate it.</p>
<p>Go back to Xojo and update App.Open event:</p>
<pre>#If DebugBuild
  Declare Function dlopen Lib "/usr/lib/libSystem.dylib" (name As CString, flags As Int32) As Ptr
  Call dlopen("@executable_path/SimulatorStatusMagiciOS.framework/SimulatorStatusMagiciOS", 1 Or 8)

  // Start by creating a pointer to the SDStatusBarManager class itself
  Declare Function NSClassFromString Lib "Foundation" (clsName As CFStringRef) As Ptr
  Dim smclass As Ptr = NSClassFromString("SDStatusBarManager")

  // Next, we need a pointer to the shared instance of the SDStatusBarManager class
  Declare Function sharedInstance Lib "Foundation" Selector "sharedInstance" (clsref As Ptr) As Ptr
  Dim smclassShared as Ptr = sharedInstance(smclass)

  // Last, turn on the overrides
  // NOTE: We're specifically NOT using the actual lib name here. 
  // This is just to satisfy the Xojo linker. The correct framework will be used at runtime.
  Declare Sub enableOverrides Lib "Foundation" Selector "enableOverrides" (obj As Ptr)
  enableOverrides(smclassShared)
#EndIf</pre>
<p>Now if you run the project, when it opens the status bar automatically changes to the recommended defaults!</p>
<p>Please Note: These changes persist until the simulator device that you are running on is completely erased. If you need to disable it, you can do that with the disableOverrides method.</p>
<p>After posting this article, it was brought to my attention that I&#8217;d forgotten to show you how to sign the frameworks so you can build for the app store. To do that, you&#8217;ll need to add a script build step to your project, just after the Copy Files step you added above. The step can probably be set to Applies To: Release. The code should look like this:</p>
<pre>// Replace the text in the signingIdentity property with your own
Dim signingIdentity As String = "iPhone Distribution: Your Company (XXXXXXXXXX)"
Dim code As Integer
Dim cmd As String
Dim result As String
Dim builtApp As String

builtApp = CurrentBuildLocation + "/" + ReplaceAll(CurrentBuildAppName, " ", "\ ")

// Get a list of all frameworks, one per line
cmd = "ls -d1 " + builtApp + "/*.framework"
result = Trim(DoShellCommand(cmd, 30, code))

// If there was no error (like none being there), sign each one
If code = 0 Then
  Dim frameworks() As String = split(result, chr(13))
  For i As Integer = 0 To UBound(frameworks)
    frameworks(i) = ReplaceAll(frameworks(i), " ", "\ ")
    cmd = "/usr/bin/codesign -fs """ + signingIdentity + """ " + frameworks(i)

    Result = DoShellCommand(cmd, 30, code)

    // If the sign fails, print the error and stop the build
    If code &lt;&gt; 0 Then
      print Result
      cancelBuild
    End If
  Next i
End If</pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Two-Finger Tap: Undo Gesture for iOS Apps</title>
		<link>https://blog.xojo.com/2019/01/16/the-two-finger-tap-undo-gesture-for-ios-apps/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Wed, 16 Jan 2019 09:00:05 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=5306</guid>

					<description><![CDATA[The built-in gesture for undo on iOS at the moment is to shake the device.  If you are looking for a more intuitive gesture, the two-finger tap is an excellent alternative. Here is all the code you need to implement this in your Xojo iOS apps.]]></description>
										<content:encoded><![CDATA[<p>The only built-in gesture for undo on iOS at the moment is to shake the device. This is not very intuitive to me and I&#8217;ve certainly done it by accident many times. The makers of Procreate chose a <a href="https://procreate.art/insight/2018/take-our-undo-gesture">two-finger tap</a> and have found that their users adapted to it nicely. This gesture is being adopted by more and more iOS developers. Here&#8217;s all the code you need to implement the two-finger tap for undo in your Xojo iOS apps.</p>
<p><span id="more-5306"></span><img loading="lazy" decoding="async" class="aligncenter wp-image-5329" src="https://blog.xojo.com/wp-content/uploads/2020/01/Image-from-iOS.jpg" alt="" width="310" height="321" /></p>
<h3>An Example in Xojo</h3>
<p>If you haven&#8217;t worked with gestures in Xojo, it&#8217;s really not that difficult. To demonstrate, I&#8217;ve created a simple iOS app that draws a circle wherever you tap.</p>
<p><img loading="lazy" decoding="async" class="wp-image-5313 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2020/01/Two-Tap-Demo-Movie.gif" alt="" width="242" height="500" /></p>
<p>The basic idea is that every time the user taps with a single finger, the tap information (tap as iOSEventInfo in the code below) is added to an array called TapHistory and the Canvas is forced to repaint. In the Canvas&#8217; Paint event, it loops through the TapHistory array and draws a circle at each location:</p>
<pre><span style="color: #0000ff;">For Each</span> tap <span style="color: #0000ff;">As</span> iOSEventInfo <span style="color: #0000ff;">In</span> TapHistory
 <span style="color: #0000ff;">Dim</span> d, x, y <span style="color: #0000ff;">As Integer</span>
 d = <span style="color: #00ccff;">50</span> <span style="color: #ff0000;">'the diameter of the circle to draw</span>

 <span style="color: #ff0000;">'get the X, Y position of the tap</span>
 x = tap.PointerPosition(<span style="color: #00ccff;">0</span>).X
 y = tap.PointerPosition(<span style="color: #00ccff;">0</span>).Y

 <span style="color: #ff0000;">'Draw the circle centered on the tap</span>
 g.FillOval(x - d/<span style="color: #00ccff;">2</span>, y - d/<span style="color: #00ccff;">2</span>, d, d)
<span style="color: #0000ff;">Next

</span></pre>
<p>To create the TapHistory array to keep track of all the taps, you use the Canvas control&#8217;s PointerDown event which fires anytime a tap occurs. The eventInfo as iOSEventInfo parameter tells you everything you need to know about a tap. In addition to the location, it tells you how many fingers were used. In this event, the example code determines if one or two fingers were used. If a single finger was used, the eventInfo is added to the TapHistory array to be used for drawing the circles. If two fingers are used, the user wants to undo so that last entry in the TapHistory array is removed.</p>
<pre><span style="color: #0000ff;">Select Case</span> eventInfo.PointerCount

 <span style="color: #0000ff;">Case</span> 1 <span style="color: #ff0000;">'Tap with 1 finger</span>
 <span style="color: #ff0000;">'Add the tap to the list of taps</span>
 TapHistory.Append(eventInfo)

 <span style="color: #0000ff;">Case</span> 2 'Tap with 2 fingers
 <span style="color: #ff0000;">'Remove the last 1 Finger Tap as long as there</span>
<span style="color: #ff0000;"> 'are any circles on the screen</span>

 <span style="color: #0000ff;">If</span> TapHistory.Ubound &gt; -1 <span style="color: #0000ff;">Then</span>
  TapHistory.Remove(TapHistory.Ubound)
 <span style="color: #0000ff;">End If</span>
<span style="color: #0000ff;">End Select</span>

<span style="color: #ff0000;">'Repaint the canvas</span>
Canvas1.Invalidate</pre>
<p>Either way, the Canvas is invalidated which forces it to repaint thus looping through the TapHistory array and redrawing circles at all the remaining tap locations.</p>
<p>The <a href="https://blog.xojo.com/wp-content/uploads/2020/01/Two-Tap-Undo-Example.zip">Two Tap Undo Example </a>is available if you&#8217;d like to play around with it.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Set Focus to a Field Using an iOS Declare</title>
		<link>https://blog.xojo.com/2018/04/12/set-focus-to-a-field-using-an-ios-declare/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Thu, 12 Apr 2018 17:39:50 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Declares]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=4123</guid>

					<description><![CDATA[A short post walking through the steps to call into Cocoa Touch APIs to use methods and properties that are not built into the framework by using the Declare command. If you want to use this function often you can wrap it in an Extension method so that it is available everywhere.]]></description>
										<content:encoded><![CDATA[<p>You can call into Cocoa Touch APIs to use methods and properties that are not built into the framework by using the Declare command. To create a Declare statement you first need to track down the API you want to use in Apple&#8217;s documentation: <a href="https://developer.apple.com/documentation?language=objc">Apple Developer Documentation</a>. Most of the time you will reference the Foundation and UIKit libraries, but there are many other libraries as well. Xojo Declares use the Objective-C names so be sure to refer to those in the documentation rather than the Swift naming.</p>
<p><span id="more-4123"></span></p>
<p>When you call Cocoa methods you supply the method name using the Selector part of the Declare command. The selector name has to end in a &#8220;:&#8221; if there are any parameters that are passed, an oddity of how Objective-C works. Unlike with Xojo methods, the case of the name also has to match exactly. For the Xojo Declare, the first parameter is always required and must be a reference to the class containing the method you are calling.</p>
<p>To start with a simple example, consider that you may want to set focus to a text control such as an iOSTextField. Xojo does not provide a method for this. Looking at the Summary on the iOSTextField page you&#8217;ll see that the actual UIKit control is called &#8220;UITextField&#8221;. Click the link to open the <a href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextField_Class/index.html#//apple_ref/doc/uid/TP40006888">Apple doc page</a>. On the doc page you&#8217;ll find information about calling becomeFirstResponder to show the keyboard, which is what happens when a text field gets focus. When you click on <a href="https://developer.apple.com/documentation/uikit/uiresponder/1621113-becomefirstresponder">becomeFirstResponder</a> you&#8217;ll get to its doc page with this declaration:</p>
<pre>(BOOL)becomeFirstResponder;</pre>
<p>The above is Objective-C code that indicates that this is a function that returns a Boolean value. You should also note on the page that this is part of the UIKit library. With this information you can now create a Xojo Declare command to call it:</p>
<pre>Declare Function becomeFirstResponder Lib "UIKit" Selector "becomeFirstResponder" (controlHandle As Ptr) As Boolean</pre>
<p>The important thing to note here is that you have to always have a parameter (the first parameter) that is a reference to an instance of the class (or control in this case).</p>
<p>You can call this method just as you would any other Xojo method, but remember you have to pass it a reference to the control. Assuming you have a control called TextField1 on the view you can call the method like this:</p>
<pre>Call becomeFirstResponder(TextField1.Handle)</pre>
<p>The Call command is used to ignore the return value, which is not relevant in this situation.</p>
<p>If you want to use this function often you can wrap it in an Extension method so that it is available everywhere. To do this, create a module and add a global method to it with this declaration:</p>
<pre>SetFocus(Extends c As iOSTextField) As Boolean</pre>
<p>To the method, add the Declare code as follows:</p>
<pre>Declare Function becomeFirstResponder Lib "UIKit" Selector "becomeFirstResponder" (controlHandle As Ptr) As Boolean
Return becomeFirstResponder(c.Handle)</pre>
<p>Now you can call the method like this:</p>
<pre>Call TextField1.SetFocus</pre>
<p>For more information:</p>
<ul>
<li><a href="http://developer.xojo.com/calling-native-ios-apis">Call Native iOS APIs</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>5 Tips For Setting Up Your Home Office for Sanity and Productivity</title>
		<link>https://blog.xojo.com/2017/08/16/5-tips-for-setting-up-your-home-office-for-sanity-and-productivity/</link>
		
		<dc:creator><![CDATA[Alyssa Foley]]></dc:creator>
		<pubDate>Wed, 16 Aug 2017 10:00:03 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Citizen Developer]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[virtual office]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2657</guid>

					<description><![CDATA[These days, it seems like everyone is working from home at least a few days a week. That is great for us humans and our home planet too. As more of us are working from home more often, it's important to set some basic guidelines for your job and your sanity. Here are 5 tips to help you stay efficient in your local, home office:]]></description>
										<content:encoded><![CDATA[<p>These days it seems <a href="https://www.nytimes.com/2017/02/15/us/remote-workers-work-from-home.html">everyone is working from home</a> at least a few days a week. That is great for us humans and our home planet too. Your commute across the hall is quick and traffic-free, which is amazing for your personal stress-level and the local air quality. And your home office is likely to make you more productive and happier in your job, if set up right.</p>
<p>As more of us are working from home more often, it&#8217;s important to set some basic guidelines for your job and your sanity.</p>
<p>Here are 5 tips to help you set up your home office right, along with a peek into the Xojo team&#8217;s own offices.</p>
<p><span id="more-2657"></span></p>
<p><strong>1. Make a dedicated work space.</strong><br />
You don&#8217;t work in the cafeteria or the waiting room when you go into the office. In that same light, you need a dedicated workspace at home. Don&#8217;t work at the kitchen table or in a temporary area; there are too many potential distractions and interruptions. A dedicated space will make it easier for you to stay focused as well, as to &#8220;log off&#8221; and walk away from work. (This is so important!)</p>
<p>To keep your home and work lives from overlapping too much, work in your work space and live in your living space.</p>
<div align="center"><img loading="lazy" decoding="async" class="alignnone wp-image-3233" src="https://blog.xojo.com/wp-content/uploads/2017/05/DanaDesk.jpg" alt="" width="363" height="287" />  <img loading="lazy" decoding="async" class="alignnone wp-image-3231" src="https://blog.xojo.com/wp-content/uploads/2017/05/PaulDesk2.png" alt="" width="363" height="272" /></div>
<p><strong>2. Create rules, it&#8217;s still an office.</strong><br />
It&#8217;s still an office and you have work to do. If there are other people (kids&#8230;I&#8217;m looking at you) at home while you are working it can be easy for them to forget you are working and inadvertently interrupt you. Have rules in place for your office hours such as “when the door is closed, do not interrupt” and &#8220;when it is open but I&#8217;m talking and you see my boss on the screen, quietly close the door and go away.&#8221; My 4 year-olds can abide by these rules so I&#8217;m sure you can get your &#8220;officemates&#8221; to do the same. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<div align="center"><img loading="lazy" decoding="async" class="wp-image-3218 alignnone" src="https://blog.xojo.com/wp-content/uploads/2017/05/Office.jpg" alt="" width="360" height="270" />  <img loading="lazy" decoding="async" class="alignnone wp-image-3217" src="https://blog.xojo.com/wp-content/uploads/2017/05/office.jpeg" alt="" width="360" height="270" /></div>
<p><strong>3. Stick to a routine.</strong><br />
Get up at a scheduled time each day and get yourself ready to go to work, mentally and physically. Shower, dress, work out, eat breakfast &#8211; whatever it is you do, do it daily. Let your routine further exemplify the lines between your work and home.</p>
<p>Remember to take breaks. It&#8217;s far too easy to work too many hours without moving when you are not distracted by the comings and goings of general office commotion, which is not healthy. Leave your desk everyday, more than once even! Go eat lunch, walk the dog, do some laundry, water your tomatoes. Paul never eats lunch at his desk, Geoff walks his dog every morning, and I like to prep dinner when I make my lunch. The perks of working from home are many and varied!</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3262" src="https://blog.xojo.com/wp-content/uploads/2017/05/Screen-Shot-2017-08-11-at-4.53.01-PM.png" alt="" width="1472" height="484" /></p>
<p><strong>4. Interact with others.</strong>Working from home can be lonely and that can wear down even the most introverted of employees. Mitigate this by taking advantage of the many ways to remotely communicate. Video and audio conferencing software like Skype, Google Hangouts and <a href="https://www.zoom.us">Zoom</a> are free and incredibly easy to use. IM via Messages, <a href="https://slack.com/lp/one?cvosrc=ppc.google.slack&amp;cvo_campaign=&amp;cvo_campaign=&amp;cvo_crid=209474819210&amp;Matchtype=e&amp;utm_source=&amp;utm_medium=google&amp;utm_campaign=brand_hv&amp;c3api=5542,209474819210,slack&amp;c3api=5542,209474819210,slack&amp;cvosrc=ppc.google.slack&amp;cvo_campaign=&amp;cvo_crid=209474819210&amp;Matchtype=e&amp;utm_source=google&amp;utm_medium=ppc&amp;c3api=5523,209474819210,slack&amp;gclid=EAIaIQobChMIh4yRo4G_1QIVApJ-Ch1Z1QvyEAAYASAAEgLOHvD_BwE&amp;gclsrc=aw.ds&amp;dclid=CKLGzaWBv9UCFYmOfgodl14JIg">Slack</a> and others are another great way to chat. Social networks can be nice to interact with others, but be careful to not let them distract you from getting your actual work done.</p>
<p>If at times you truly need to be in the same space with actual humans and the local coffee shop isn&#8217;t cutting it, look into coworking offices. A coworking office is a community office that people can share while working. Or consider making your own; I meet regularly at my home (office) with another working mom.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3212" src="https://blog.xojo.com/wp-content/uploads/2017/05/alyssa-desk.jpg" alt="" width="2160" height="1724" /></p>
<p><strong>5. Enjoy the flexibility.</strong><br />
Working from home is incredibly convenient, which can make it far too easy to work far too many hours. Enjoy the flexibility you have: eat lunch outside on nice days, attend family activities, get something in the crock-pot, tidy a room. Don&#8217;t let work consume your entire life just because it shares space with it &#8211; ironically that&#8217;s the best way to end up being inefficient at both your job and your life.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-3216" src="https://blog.xojo.com/wp-content/uploads/2017/05/geoff-desk.jpg" alt="" width="1000" height="750" /></p>
<p>Xojo moved to a virtual office model in 2009 and we&#8217;ve only looked back to revel in the metrics. This policy allows us to hire the right person for the right job, and then keep them on the Xojo team. Our employee turn-over rate is low, really low &#8211; and that reflects well on our employes&#8217; happiness. Going virtual enabled me to keep my job at Xojo when my husband got a great offer in another state 8 years ago &#8211; next year is my 10th anniversary with Xojo.</p>
<p>If you set up your office right, working from home can have so many benefits, for you and your job.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Free Marketing! 4 Practical Tips For Developers New To Twitter</title>
		<link>https://blog.xojo.com/2017/06/29/free-marketing-4-practical-tips-for-developers-new-to-twitter/</link>
		
		<dc:creator><![CDATA[Alyssa Foley]]></dc:creator>
		<pubDate>Thu, 29 Jun 2017 08:00:11 +0000</pubDate>
				<category><![CDATA[Dev Marketing]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Marketing]]></category>
		<category><![CDATA[Developer Marketing]]></category>
		<category><![CDATA[Social Media Marketing]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2655</guid>

					<description><![CDATA[For those of you who didn’t grow up with social media, it can seem like an arbitrary and daunting undertaking. Here are 4 simple tips to market your app on Twitter.]]></description>
										<content:encoded><![CDATA[
<p>So you developed this great app, now&nbsp;how does your marketing team of one get the word out? Social media can be an amazing tool for developers without a big marketing budget and Twitter is a great place to start.</p>



<p>You’ve opened your Twitter account using a Twitter handle that defines and promotes your brand and your app, check. You’ve added a close-up headshot of yourself or a clear, simple logo, check. Now, how do you get the followers and engagement you need to successfully promote your app?</p>



<p>For those of you, like me, who didn’t grow up with social media, it can seem like an arbitrary and daunting undertaking. But dip your toe in and you&#8217;ll find Twitter can be fun, informative and rewarding.</p>



<p>Here are 4 tested and simplified tips to get you started marketing your app on Twitter.</p>



<span id="more-2655"></span>



<p><strong>1. Learn the Language</strong><br>You’re a developer so you get it, you need to learn the ins and outs of the Twitter language.</p>



<p>#hashtags: Using hashtags makes your tweets more searchable, helping you connect to people with similar interests, i.e. potential customers. Research and identify the hashtags that apply to your app and use them, an average of 2 hashtags per tweet is a good start. For example, if you make a web app development tool you might want to use #programming and #webapps.</p>



<p>140: You only get 140 characters so make your words count. Think of each tweet as a headline, use your words to draw people in- asking a question is great way to do this!</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" decoding="async" width="586" height="203" src="https://blog.xojo.com/wp-content/uploads/2017/05/Screen-Shot-2017-06-20-at-11.27.25-AM.png" alt="" class="wp-image-2997"/></figure></div>



<p><strong>2. Be Social</strong><br>Remember this is *social* media. It’s OK, even preferable, to be less formal than you would be in a professional email or even a phone conversation. Light, friendly and even off-topic is a great way to start a conversation and gain followers. But keep in mind what you say is public and can be retweeted by anyone.</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" decoding="async" width="245" height="475" src="https://blog.xojo.com/wp-content/uploads/2017/05/Screen-Shot-2017-06-27-at-3.18.48-PM.png" alt="" class="wp-image-3052"/></figure></div>



<p>Engage #FF (Follow Friday) and #TBT (Throwback Thursday) to help you reach a broader audience. Also, keep an eye on trending hashtags; they are a great way to promote to people you may not otherwise reach.</p>



<p><strong>3. Be Consistent</strong><br>Tweet consistently throughout the day and the week. Tools like <a href="https://hootsuite.com/" target="_blank" rel="noopener noreferrer">Hootsuite</a> and <a href="https://chrome.google.com/webstore/detail/tweetdeck-by-twitter/hbdpomandigafcibbmofojjchbcdagbl" target="_blank" rel="noopener noreferrer">TweetDeck</a>&nbsp;are free and&nbsp;allow you to easily schedule future tweets.</p>



<p><a href="https://analytics.twitter.com/about" target="_blank" rel="noopener noreferrer">Check out Twitter&#8217;s&nbsp;analytic tool</a>&nbsp;to find out which of your tweets perform best and when. Tweet the same information multiple times but with different angles, hashtags and images. Remember after a few hours, that first tweet isn’t likely to be seen again.</p>



<p>On the flip side, you&#8217;ll want to respond to tweets quickly. Where it may be acceptable to take a day or two days to respond to an email, people on Twitter expect almost immediate responses. If you haven’t already, load up your Twitter client on your phone and respond to tweets whenever possible- it’s 140 characters and shouldn’t take you long!</p>



<p><strong>4. Be Engaging</strong><br>Start conversations with your followers and those accounts you follow. Find, tweet and comment on original content. And share more than just your app: images, blog posts and videos will receive more attention than a simple homepage link. Don’t feel limited to talking only about your app or even technology, remember you are being <em>social</em>! Your Tweet profile should be a colorful, visual mix of images, videos, your tweets and retweets.</p>



<p><strong>Tip:</strong> Twitter offers the ability to create lists to help you keep your feed organized. Create categories that help you engage with your existing users, popular accounts and potential new customers. Tweeting with and retweeting tweets from popular people or companies is a great way to grow your audience and build your brand.</p>



<p>Don’t let Twitter overwhelm you, start tweeting and you’ll see it can be really fun and rewarding!</p>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Raspberry Pi Remote Debugging</title>
		<link>https://blog.xojo.com/2017/03/28/raspberry-pi-remote-debugging/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Tue, 28 Mar 2017 10:30:22 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Remote Debugging]]></category>
		<category><![CDATA[RPi]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2485</guid>

					<description><![CDATA[Using the Remote Debugger means that you can run Xojo apps on the Pi for testing and development without have to first purchase a Xojo license.]]></description>
										<content:encoded><![CDATA[<p>With Xojo 2017 Release 1 you can now use the Remote Debugger to easily debug and test your Xojo apps on a Raspberry Pi (Raspberry Pi 2, 3+ are supported by Xojo).</p>
<p>Using the Remote Debugger means that you can now run Xojo apps on the Pi for testing and development without having to first purchase a Xojo license.</p>
<p>We&#8217;ve put together a short video to quickly walk you through how to set up and use the Remote Debugger:</p>
<p><iframe loading="lazy" title="Hello Xojo! Raspberry Pi App" width="500" height="281" src="https://www.youtube.com/embed/C7ZelqOyVIQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<p>For more information about using Raspberry Pi with the Remote Debugger, refer to this topic in the Dev Center:</p>
<ul>
<li><a href="https://documentation.xojo.com/topics/raspberry_pi/remote_debugging.html">Raspberry Pi Remote Debugging</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>You don&#8217;t have to renew, but you probably should&#8230;</title>
		<link>https://blog.xojo.com/2017/01/09/you-dont-have-to-renew-but-you-probably-should/</link>
		
		<dc:creator><![CDATA[Alyssa Foley]]></dc:creator>
		<pubDate>Mon, 09 Jan 2017 19:05:39 +0000</pubDate>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2188</guid>

					<description><![CDATA[People new to Xojo are often surprised when I tell them that they are never required to renew their license and they can continue to build apps with any Xojo release we put out before their license expired. So, no, you are never required to renew your Xojo license but that doesn't mean you never should!]]></description>
										<content:encoded><![CDATA[<p>Do you recall when your most indispensable app was last updated?</p>
<p><figure id="attachment_2195" aria-describedby="caption-attachment-2195" style="width: 3264px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-full wp-image-2195" src="https://blog.xojo.com/wp-content/uploads/2017/01/Wiki.jpg" alt="Well, do you?" width="3264" height="1952" /><figcaption id="caption-attachment-2195" class="wp-caption-text">Well, do you?</figcaption></figure></p>
<p><span id="more-2188"></span></p>
<p>I consider it an essential part of what Xojo has to offer that you can continue to compile your Xojo apps after your license expires. People new to Xojo are often surprised when I tell them<strong> you are never required to renew your Xojo license and you can continue to build apps with any Xojo release dated before your Xojo license expires, indefinitely.</strong> So, no, you are never required to renew your Xojo license but that doesn&#8217;t mean you never ever should!</p>
<p>In all the years I&#8217;ve been leading Xojo&#8217;s Customer Support team I&#8217;ve lost count of the number of people who are desperate to update a long-neglected but totally essential app that &#8220;suddenly&#8221; stopped working on a new OS or after some other update. Just this week, I was contacted by someone who needs to update an app they last compiled in 2006. The app is indispensable to their job and won&#8217;t run on their new OS. And though I can help you find your decade old license key in your <a href="https://xojo.com/account/licenses/legacy.php">Legacy License page</a>, and I can get you access to previous releases at our <a href="https://xojo.com/download/archives.php">Archived Release page</a>, and I can point out what has changed in Xojo at our <a href="https://documentation.xojo.com/Resources:Deprecations">Deprecations page</a>, I can&#8217;t guarantee a Xojo release from 2006 is going to run on this year&#8217;s OS</p>
<p>Keeping your projects current is always a good idea &#8211; for your projects and for Xojo. After all, your renewals help us keep Xojo moving forward and the underlying Xojo Framework improves in reliability with each release. As operating systems and the machines they run on update, your projects will also need to keep up &#8211; if not just in features, definitely in regard to security.</p>
<p>I hope you consider using Xojo&#8217;s auto-renew feature or renewing your license in the near future (auto-renew will give you an automatic 10% discount). And if annual renewals isn&#8217;t for you, that&#8217;s no problem. <strong>A small bit of maintenance once a year &#8211; or every other year &#8211; is much easier than a huge overhaul of a project that has not been updated in several years.</strong></p>
<p>Do yourself a favor and keep Xojo and your code (at least somewhat) up to date. Have a question about Xojo licenses? Email me anytime at hello@xojo.com.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>IDE Scripts for Text Insertion</title>
		<link>https://blog.xojo.com/2017/01/03/ide-scripts-for-text-insertion/</link>
		
		<dc:creator><![CDATA[Greg O'Lone]]></dc:creator>
		<pubDate>Tue, 03 Jan 2017 23:35:12 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2105</guid>

					<description><![CDATA[IDE Scripts to the rescue! With a simple script (less than 10 lines), whenever you have quoted text to paste into the IDE, just select your script from the File > IDE Scripts menu instead.]]></description>
										<content:encoded><![CDATA[<p>Working on the Xojo family of products, I spend a lot of time copying and pasting text into of the code editor and I <em>really hate</em> wasting time. One particularly challenging thing is bringing text into the code editor that contains quotes because they all need to be doubled up to work. For example for text that looks like this:</p>
<pre>CREATE TABLE "Servers" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" TEXT, "ip" TEXT)</pre>
<p>If you wanted to use that in a string, you need to double up each of those quotes to make them work:</p>
<pre>dim sql as string = "CREATE TABLE ""PendingControllers"" (""id"" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, ""name"" TEXT, ""ip"" TEXT)"</pre>
<p>One line isn&#8217;t bad, but if you have a bunch to do, it can become quite tedious.</p>
<p>IDE Scripts to the rescue! With a simple script (less than 10 lines) you can have the IDE do this for you automatically.</p>
<ol>
<li>In the Xojo IDE, select <strong>File &gt; IDE Scripts &gt; New IDE Script</strong></li>
<li>In the script editor place the following code:
<pre>// Get the text from the clipboard
Dim c As String = Clipboard

// Double up all of the quotes
c = c.ReplaceAll("""","""""")

// Insert the text into the code editor
SelText = c</pre>
</li>
<li>Select <strong>File &gt; Save As</strong> and save the script to the &#8220;Scripts&#8221; folder next to the IDE.</li>
</ol>
<p>Now whenever you have quoted text to paste into the IDE, just select your script from the File &gt; IDE Scripts menu instead!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>About PostgreSQL Case Sensitivity</title>
		<link>https://blog.xojo.com/2016/09/28/about-postgresql-case-sensitivity/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Wed, 28 Sep 2016 07:01:21 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=1912</guid>

					<description><![CDATA[Sometimes you hear that PostgreSQL is case-insensitive, but it isn't really. What it actually does is convert your SQL to lowercase by default.]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve ran into PostgreSQL case sensitivity myself before and I&#8217;ve seen it <a href="https://forum.xojo.com/34715-postgresql-and-fieldschema">come up on the forums</a>, so I thought it might be a good thing to bring up here.</p>
<p>Sometimes you hear that PostgreSQL is case-insensitive, but it isn&#8217;t really. What it actually does is convert your SQL to lowercase by default. So take a look at this SQL:</p>
<pre>SELECT FullName FROM Person</pre>
<p>This gets converted to:</p>
<pre>SELECT fullname FROM person</pre>
<p>That is nice if you happen to like to write your queries with mixed casing.</p>
<p><span id="more-1912"></span></p>
<p>But you&#8217;ll start to run into a problem if you&#8217;ve actually created the table with case-sensitive names, which happens when you use quotes around the names. For example, consider these SQL CREATE statements:</p>
<pre>CREATE TABLE person (fullname VARCHAR(100), address VARCHAR(100))</pre>
<pre>CREATE TABLE Person (FullName VARCHAR(100), Address VARCHAR(100))</pre>
<pre>CREATE TABLE "Person" ("FullName" VARCHAR(100), "Address" VARCHAR(100))</pre>
<p>In the first two examples, you get a table called &#8220;person&#8221; with two columns called &#8220;fullname&#8221; and &#8220;address&#8221;. That may not be obvious in the second example since the names are not lowercase, but remember that PostgreSQL converts your SQL to lowercase for you.</p>
<p>In the last example, the names are in quotes so their case is maintained. This means you&#8217;ll get a table called &#8220;Person&#8221; with two columns called &#8220;FullName&#8221; and &#8220;Address&#8221;. Now what happens if you try to run a query with a table called &#8220;Person&#8221;? Well, using SQL like this:</p>
<pre>SELECT FullName FROM Person</pre>
<p>you&#8217;ll get a syntax error:</p>
<p><strong>ERROR: relation &#8220;person&#8221; does not exist</strong><br />
<strong>LINE 1: SELECT FullName FROM Person</strong></p>
<p>This is because PostgreSQL is converting &#8220;Person&#8221; to &#8220;person&#8221;, but there is no table called &#8220;person&#8221;. It is actually called &#8220;Person&#8221;.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1913" src="https://blog.xojo.com/wp-content/uploads/2016/09/2016-09-23_09-38-33.png" alt="2016-09-23_09-38-33" width="800" height="595" /></p>
<p>To avoid this error you instead have to write the SQL with quotes like this:</p>
<pre>SELECT "FullName" FROM "Person"</pre>
<p>Obviously that can start to become a bit of a pain, so the moral of the story is don&#8217;t use quotes when creating tables or writing SQL queries so that everything is created as lowercase and things will work like you probably expect. You&#8217;ll especially want to pay attention to any tools you use to create SQL for you. If you use a tool&#8217;s UI to create a table and have a habit of typing in mixed case, the tool might generate SQL (or even the table itself) for you using quotes, which as you can see could mess you up later.</p>
<p>Learn more about <a href="http://developer.xojo.com/userguide/postgresql">PostgreSQL</a> in the Xojo Dev Center.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo IDE Script Menu Shortcuts</title>
		<link>https://blog.xojo.com/2016/09/22/ide-script-menu-tip/</link>
		
		<dc:creator><![CDATA[Norman Palardy]]></dc:creator>
		<pubDate>Thu, 22 Sep 2016 09:20:20 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Scripting]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=1495</guid>

					<description><![CDATA[In the Xojo IDE Scripts Menu there are some new shortcuts you may find helpful. The items in the IDE Scripts menu under File &#62;&#8230;]]></description>
										<content:encoded><![CDATA[<p>In the Xojo IDE Scripts Menu there are some new shortcuts you may find helpful.</p>
<p>The items in the IDE Scripts menu under File &gt; IDE Scripts now have shortcuts assigned for the first nine items (these are the scripts that you add to the Scripts folder). On OS X the shortcuts are Cmd + Option + digit and on Windows and Linux they are Ctrl + Alt + digit.</p>
<p>And for those scripts that do not get shortcuts assigned, selecting them from the menu will run them.</p>
<p>On OS X, if you hold down the Ctrl key + the above shortcut, then the script will be opened in the editor instead of run. On Windows and Linux holding the Shift key in addition to the above shortcut will accomplish this. These modifiers also works if you select the item from the menu. Hold the Ctrl key on OS X or Shift key on Windows and Linux the item will be opened in the editor instead of run.</p>
<p>Read more about <a href="http://developer.xojo.com/userguide/ide-scripting">IDE Scripting in the User Guide</a>.</p>
<p>Happy IDE Scripting!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Guest Post: 5 Tips to Control Development Business Chaos</title>
		<link>https://blog.xojo.com/2016/08/23/guest-post-5-tips-to-control-development-business-chaos/</link>
		
		<dc:creator><![CDATA[Xojo]]></dc:creator>
		<pubDate>Tue, 23 Aug 2016 06:00:28 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Team Development]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=1612</guid>

					<description><![CDATA[If you can put a few systems in place, you will deliver better customer service, increase your productivity, and communicate better. Here are five tips to help you on your path of reigning in the chaos.]]></description>
										<content:encoded><![CDATA[<p>Having problems controlling your projects and clients enough to enjoy your life and have fun developing software? If you can put a few systems in place, you will deliver better customer service, increase your productivity, and communicate better. Here are five tips to help you on your path of reigning in the chaos.</p>
<p><span id="more-1612"></span></p>
<p><strong>1. Manage Scope – Keep a Wish List</strong></p>
<p>You want the client to dream, right? Having a place where you can keep things that they would like to do “some day” or brilliant ideas that weren’t in the initial scope will help you keep your project within scope. If you don’t actually complete a project, the client gets no value from it. You spend time upfront scoping the project based on the client’s needs and then the sparks of brilliance can get in the way. So, when that great new idea comes up, the answer can be, “Absolutely! Let&#8217;s get that on the list for after we finish developing what we said we&#8217;d develop.” Having a Wish List gives you a place to put things that are known to be out of initial scope. Plus, it gives the client a sense of, &#8220;Okay, good! This is going to get addressed one day and you heard what I needed.&#8221;</p>
<p>Here’s the secret: most of what goes on that list will never get done. The client will either forget what it is when you go back through the list after your project is complete. Or once they starts using the software, they will realize the solution doesn’t need it. But, you&#8217;re guaranteeing that what you&#8217;re creating ends up having real, lasting value for your client. A happier client will keep coming back to you for more work.</p>
<p>At the end of the project, you can go through the Wish List with your client and include the new requests in the scope for Phase 2 or write a Change Order to address them.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1615" src="https://blog.xojo.com/wp-content/uploads/2016/08/Reign-in-the-Chaos.jpg" alt="Reign in the Chaos" width="800" height="800" /></p>
<p><strong>2. Projects Must End! (But What About the Bugs?!)</strong></p>
<p>Let’s face it. When you deliver something to a client, you&#8217;re not guaranteeing it for five years, right? If the client finds a bug in five years, you’re not coming in and fixing it for free. It&#8217;s custom software; there will be bugs; there will always be bugs.</p>
<p>Part of your sales process needs to address that there will be bugs, how you are going to handle them, and how they get paid for. You can always fix newly found bugs as part of Phase 2 or a Change Order, so you aren’t telling your client they have to live with it forever. But, make sure the client understands that it is part of the process!</p>
<p>Plan to deliver a project based on when testing begins to ensure an end date. Tell your client that they have a certain time to do alpha testing. (Two weeks is a good time period depending on the scope.) Then, you can make some of your magic developer tweaks and fixes, before returning it to the client for two weeks of beta testing. Finally, take it live, possibly with known bugs that you will continue to work on as part of the original scope. Bugs and tweaks found <b>after</b> the timeframe can go to the Wish List.</p>
<p>It is your obligation as a professional to provide a completed project that brings value to your client. If you don&#8217;t make them test it by providing a consequence, they won&#8217;t do it. And then, they won’t have the value of the completed project. In essence, by forcing this, you are better serving him.</p>
<p><strong>3. Project Manage Your Own Business</strong></p>
<p>Where is <b>your</b> list kept? As a developer, you always have to-do lists for your clients. But, what about the things you need to do to run your business? How do you remember to invoice when you your head is buried in the development that you love?</p>
<p>First step: Stop managing projects via email. Stop the madness now! There are simple-to-use and inexpensive project management solutions out there, like <a href="http://www.basecamp.com/">Basecamp</a>, that can be set up to manage your clients’ projects and track communications. You don’t have to insert a bureaucratic process to manage your work better; simply be more deliberate in how you communicate. (If you need assistance on how to set up Basecamp to work best for you and your clients, don’t hesitate to <a href="mailto:susan@beyondthechaos.biz?subject=Help%2520me%2520with%2520Basecamp!">contact me</a>.)</p>
<p>Second step: Don’t manage your business with sticky notes. Add a project into your solution (I call mine Operations.), and add your to-do&#8217;s into that project. Most of these types of software will allow you to set dates and reminders. You can even assign a to-do to your subcontractors to submit their timesheets.</p>
<p><strong>4. Avoid Interruptions</strong></p>
<p>Plan your tomorrow before you end today. Check your schedule vs. your to-do list and confirm you have a plan. Then, focus on what you&#8217;ve planned to do. You’ll be a lot more efficient, both in not burning your clients’ hours and in getting to completed work.</p>
<p>The only reason you should stop what you&#8217;ve planned to do is if the client has an actual emergency. The fact that the client found a typo on one of the layouts is not a reason to stop what you&#8217;re doing. You want to train your clients to work in a more efficient way. The benefit to them is that when you have six typos to fix at once, it&#8217;s going to cost them the same amount as if you had just fixed one. The benefit to you is you&#8217;re not thrown off your plan, and you don&#8217;t have to change directions in your mind.</p>
<p>You want to encourage your clients to use your selected project management software properly to report issues and to use email or the phone in an emergency only.</p>
<p>If you proactively change your schedule because you need to think about something else or you&#8217;re struggling to solve a problem, actively choose to change directions. However, if you&#8217;re reacting to an email or responding to a client call &#8211; that&#8217;s throwing you off, you have to limit those interruptions. You can close your email; emails don’t disappear if you don’t read them immediately. You can turn off your phone; we’ve had voicemail since at least the 1980s. (And, guess what? I had to do <b>both</b> those things just to write this blog post!)</p>
<p><strong>5. You’re Always Selling</strong></p>
<p>To help you gain better clients and also to keep your schedule more consistent, keep selling, even when you’re booked. Clients who really want to work with you are probably willing to wait a month or more to get started. Work on filling the pipeline so you are better able to pick and choose your clients, resulting in getting to work on projects and with people you like. <b>Create a real sales process.</b> For more details on a sales process development, check out this blog post: <a href="http://beyondthechaos.biz/sales_process_vs_income/">Lack of Sales Process Limiting Your Income?</a></p>
<p><i>Susan Fennema is the Chaos Eradicating Officer (CEO) of Beyond the Chaos, a consultancy helping small business owners gain control of their lives through better processes, organization, and structure of their business operations and projects. She has over 25 years experience in the software development, creative, marketing, and advertising industries, after receiving her BA in journalism from Texas A&amp;M University. She lives and works in McKinney, Texas, with her husband, her dog, and two cats.</i></p>
<p><i>Website: </i><a href="http://www.beyondthechaos.biz/"><i>www.beyondthechaos.biz</i></a><br />
<i>Twitter: </i><a href="http://www.twitter.com/susanfennema"><i>@susanfennema</i></a><br />
<i>Facebook: </i><a href="http://www.facebook.com/beyondthechaos"><i>Beyond the Chaos</i><i><br />
</i></a><i>LinkedIn: </i><a href="http://www.linkedin.com/in/susanfennema"><i>Susan Fennema</i></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Untie These Chains &#8211; A Solution</title>
		<link>https://blog.xojo.com/2016/07/15/untie-these-chains-solution/</link>
		
		<dc:creator><![CDATA[Norman Palardy]]></dc:creator>
		<pubDate>Fri, 15 Jul 2016 13:14:36 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Function Chain]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=1123</guid>

					<description><![CDATA[Earlier I posed the question about why these two similar bits of code do slightly different things: dim path1 as string = """C:\users\ieuser\desktop\new folder""" path1 =&#8230;]]></description>
										<content:encoded><![CDATA[<p>Earlier I posed the question about why these two similar bits of code do slightly different things:</p>
<pre style="padding-left: 30px;">dim path1 as string = """C:\users\ieuser\desktop\new folder"""
path1 = path1.mid(2)
path1 = path1.left(path1.len()-1)
 
dim path2 as string = """C:\users\ieuser\desktop\new folder"""
path2 = path2.mid(2).left(path2.len()-1)</pre>
<p>The issue here is the second bit of code, not the first. In the second each function in the chain returns a result and these results are held in temporary variables with the next function in the chain applied to that. The problem comes with:</p>
<pre style="padding-left: 30px;">left(path2.len()-1)
</pre>
<p>Why? Because path2 has not been altered yet. It is as if this is evaluated as:</p>
<pre style="padding-left: 30px;">dim path2 as string = """C:\users\ieuser\desktop\new folder"""

dim t1, t2 as string
t1 = path2.mid(2)
t2 = t1.left(path2.len()-1)</pre>
<pre style="padding-left: 30px;">path2 = t2</pre>
<p>Now you can see the issue. Where we compute t2 we want the altered length to be able to calculate the right number of characters to retain. But we don&#8217;t have access to that temporary, so your solution is to do something like this:</p>
<pre style="padding-left: 30px;">dim path2 as string = """C:\users\ieuser\desktop\new folder"""
path2 = path2.mid(2).left(path2.mid(2).len()-1)</pre>
<p>And now they both give us the same value!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Untie These Chains &#8211; A Riddle</title>
		<link>https://blog.xojo.com/2016/07/15/untie-these-chains-a-riddle/</link>
		
		<dc:creator><![CDATA[Norman Palardy]]></dc:creator>
		<pubDate>Fri, 15 Jul 2016 10:02:14 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Function Chain]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=1121</guid>

					<description><![CDATA[Here&#8217;s a riddle for you! Suppose you are in the habit of using &#8220;function chaining&#8221; like this to reduce your lines of code: path2 =&#8230;]]></description>
										<content:encoded><![CDATA[<p>Here&#8217;s a riddle for you!</p>
<p>Suppose you are in the habit of using &#8220;function chaining&#8221; like this to reduce your lines of code:</p>
<pre style="padding-left: 30px;">path2 = path2.mid(2).left(path2.len()-1)</pre>
<p>If so, be careful as they can sometimes surprise you with the results you get. Consider  the following code:</p>
<pre style="padding-left: 30px;">dim path1 as string = """C:\users\ieuser\desktop\new folder"""
path1 = path1.mid(2)
path1 = path1.left(path1.len()-1)
 
dim path2 as string = """C:\users\ieuser\desktop\new folder"""
path2 = path2.mid(2).left(path2.len()-1)

break
</pre>
<p>These two look a lot alike but do not give you the same result. Share your thoughts as to why this happens in the comments or go right to<a href="https://blog.xojo.com/?p=1123&amp;preview=true"> the solution</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo Programming Language: 6 Fascinating Facts</title>
		<link>https://blog.xojo.com/2016/04/18/xojo-programming-language-6-fascinating-facts/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Mon, 18 Apr 2016 00:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[GPIO]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2016/04/18/xojo-programming-language-6-fascinating-facts/</guid>

					<description><![CDATA[Learn fascinating facts about the Xojo programming language.]]></description>
										<content:encoded><![CDATA[<h2>Xojo is similar to VB, Java and C#</h2>
<p>The Xojo programming language is fully object-oriented and uses an object model that is quite similar to VB, Java and C#. If you are used those languages at all, you&#8217;ll be right at home with Xojo.</p>
<p>Available since 1998, Xojo was one of the first languages to use <a href="../../../com/xojo/blog/automatic-reference-counting.html" target="_blank" rel="noopener noreferrer">Automatic Reference Counting</a> (ARC), something that other languages such as Swift and Objective-C now use. Xojo is type-safe and fully object-oriented making it easy to learn and use, but it also has advanced features such as namespaces, extension methods, exception handling, introspection, delegates and more.</p>
<p><span id="more-353"></span></p>
<h2>You can code on any platform</h2>
<p>Xojo itself runs on Windows, OS X and Linux. So you can choose to do your programming on the platform you prefer. And unlike some other languages, you do this using a powerful and friendly IDE, not a text editor.</p>
<h2>Xojo is a great learning language</h2>
<p>Xojo strives to keep things simple, making it a great first programming language. In fact, there is a free book, <a href="http://xojo.com/learn/">Introduction to Programming with Xojo</a>, to help you get started.</p>
<p>In addition to the book, Xojo ships with over 300 example projects, plus there are tutorials, videos and thousands of pages of documentation at the <a href="http://developer.xojo.com">Xojo Dev Center</a>.</p>
<h2>Xojo is updated regularly</h2>
<p>Xojo is generally updated quarterly with a variety of new features and bug fixes. Since 2014, major new features include <a href="http://developer.xojo.com/userguide/ios-ui-overview">iOS apps</a>, <a href="../../../com/xojo/blog/raspberry-pi-3-announced.html" target="_blank" rel="noopener noreferrer">Raspberry Pi apps</a>, <a href="http://developer.xojo.com/64-bit-guidelines">64-bit apps</a> and <a href="http://developer.xojo.com/hidpi-support">HiDPI (retina) support</a>.</p>
<h2>Lots of open-source projects</h2>
<p>Xojo is free to use and in addition to the over 300 example projects included with it, Xojo developers have created many open-source projects that you can use with your own Xojo projects to add features or to learn from. Check out <a href="http://developer.xojo.com/community-open-source-projects" target="_blank" rel="noopener noreferrer">this list</a> of open-source projects and others on GitHub.</p>
<h2>Xojo makes All The Things</h2>
<p>The bottom line is that as a cross-platform and multi-plaform programming tool, Xojo makes All the Things.</p>
<p><img decoding="async" class="aligncenter" title="XojoAllThings.jpg" src="https://blog.xojo.com/wp-content/uploads/2016/04/XojoAllThings.jpgt1466486449161" alt="XojoAllThings.jpg" /></p>
<p>Xojo can make desktop and console apps for Windows, OS X and Linux. Xojo can make desktop and console apps for <a href="http://developer.xojo.com/raspberry-pi">Raspberry Pi</a> that interface with the <a href="https://github.com/xojo/GPIO">GPIO port</a>. Xojo makes web apps. Xojo makes iOS apps. All Xojo apps are native, compiled apps that use standard OS controls.</p>
<p>Try Xojo today for free to see how easy it is to make your own apps!<!-- end HubSpot Call-to-Action Code --></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Use IDE Scripting To Be More Efficient</title>
		<link>https://blog.xojo.com/2015/12/17/use-ide-scripting-to-be-more-efficient/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Thu, 17 Dec 2015 00:00:00 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[XojoScript]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/12/17/use-ide-scripting-to-be-more-efficient/</guid>

					<description><![CDATA[Review your workflows to see if you can make improvements. IDE Scripts can help with that.]]></description>
										<content:encoded><![CDATA[<p>Did you know that you can create scripts to control the Xojo IDE? And many of these scripts could be real time savers.</p>
<p><span id="more-336"></span></p>
<p>As you roll into the new year, it can be a good time to review your workflows to see if you can make some improvements. Perhaps IDE Scripts can help with that.</p>
<p><img decoding="async" style="width: 320px; display: block; margin-left: auto; margin-right: auto;" title="WatercoolerPic.jpg" src="https://blog.xojo.com/wp-content/uploads/2015/12/WatercoolerPic.jpgt1466486449161ampwidth320" sizes="(max-width: 320px) 100vw, 320px" alt="WatercoolerPic.jpg" width="320" /></p>
<p>I was reminded of this by the wonderful &#8220;<a href="https://forum.xojo.com/14442-share-useful-ide-scripts">Share useful IDE scripts</a>&#8221; forum conversation (started by Jeremy Cowgar) that has some great script examples. Be sure to check it out. Some of the script examples include:</p>
<ul>
<li>Sort lines of code</li>
<li>Toggle Find Panel Display</li>
<li>Reload a Project</li>
<li>Find/Find Next</li>
<li>Project Diff</li>
<li>Markdown Preview</li>
<li>Obfuscate Code</li>
</ul>
<p>And don&#8217;t forget Jeremy&#8217;s wonderful Code Formatting IDE Script which is available on GitHub:</p>
<ul>
<li><a href="https://github.com/jcowgar/xojo-format-code">Xojo Format Code</a></li>
</ul>
<p>When you&#8217;re ready to create your own scripts, read the IDE Scripting docs in the Xojo Dev Center:</p>
<ul>
<li><a href="http://developer.xojo.com/ide-scripting">IDE Scripting</a></li>
<li><a href="http://developer.xojo.com/ide-scripting-commands">IDE Scripting Commands</a></li>
</ul>
<p>I&#8217;ve written about IDE Scripts before (<a href="../../../com/xojo/blog/build-all-the-things.html" target="_blank">Build All The Things</a> and <a href="/2013/12/17/ide_scripting/">IDE Scripts Included with Xojo</a>), so also be sure to review those scripts for examples and ideas.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo Secrets: Tips and Tricks to Save Development Time</title>
		<link>https://blog.xojo.com/2015/11/13/xojo-secrets-tips-and-tricks-to-save-development-time/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Fri, 13 Nov 2015 00:00:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/11/13/xojo-secrets-tips-and-tricks-to-save-development-time/</guid>

					<description><![CDATA[Here are some secrets and tips to help you be more productive with Xojo.]]></description>
										<content:encoded><![CDATA[<p>New to Xojo? Been using it for a while? Either way, here are some secrets that can speed your development. Do you know them already? Do you have some of your own?</p>
<p><span id="more-354"></span></p>
<h2>Code Completion</h2>
<p>When typing code block commands in the code editor, you can press <a href="http://developer.xojo.com/keyboard-shortcuts">Shift-Return</a> at the end of the line to have it fill in the &#8220;End&#8221; part of the block. For example, if you start typing an If statement like so:</p>
<pre>If value = 123</pre>
<p>then you can press Shift-Return after typing &#8220;123&#8221;, then the code editor will automatically add the &#8220;Then&#8221;,  &#8220;End If&#8221; and put the cursor between them so you can type your code. This is a great time-saver! This also works with other block commands, such as Select&#8230;Case, Try&#8230;Catch and While&#8230;Wend.</p>
<h2>Easy Subclassing</h2>
<p>You can drag controls from the <a href="http://developer.xojo.com/userguide/library-inspector$Library">Library</a> directly to the Navigator. This creates a new class that is a subclass of the control. You can then drag the subclassed control from the Navigator onto a layout to use it.</p>
<p>You can also right-click on any class in the Navigator and select &#8220;<a href="http://developer.xojo.com/userguide/navigator$Working%20with%20Project%20Items%20in%20the%20Navigator">New Subclass</a>&#8221; which creates a new class with the Super already filled in for you.</p>
<h2>Navigator</h2>
<p>Collapse all in Navigator by clicking &#8220;Hide&#8221; then &#8220;Show&#8221; next to <a href="http://developer.xojo.com/userguide/navigator$Contents">Contents</a> (hover to see this).</p>
<p>You can multi-select items in the Navigator and drag them to other parts of the Navigator, which is useful for organization.</p>
<p>You can even do this with with members of a class, such as properties and methods. For example, you can drag a method (or multiple ones) from a class and drop it onto a new class to move the method.</p>
<h2>Auto-Save</h2>
<p>You can use an <a href="http://developer.xojo.com/userguide/ide-scripting">IDE Script</a> to automatically save your project each time you run it. Use the Insert button or menu to add a new Build Step-&gt;Script and enter this one line of code:</p>
<pre>DoCommand("SaveFile")</pre>
<p>Now drag the script onto one of the OS items in the Build Settings and place it before the Build step that appears. This runs the script before each run or build.</p>
<h2>Refactoring</h2>
<p>When writing code in the <a href="http://developer.xojo.com/userguide/code-editor">code editor</a>, you may end up with a method that is longer than you might like. Generally, 100 lines or so is probably the most you want in a single method. You can easily move a chunk of code to its own method by selecting it in the code editor, right-clicking on it and selecting &#8220;Convert to Method&#8221; from the menu.</p>
<p>This creates a new method with the selected code added to it (and the selected code removed from the original method). You can then give the method a new name (and possible parameters) and call it from the original method.</p>
<p>Convert to Constant works similarly, creating a new constant with the selected text as its value.</p>
<p>There are also &#8220;Wrap&#8221; commands to wrap code blocks into If&#8230;Then, Do&#8230;Loop, While&#8230;Wend.</p>
<h2>Library</h2>
<p>In addition to using the search field at the top, you can click on <a href="http://developer.xojo.com/userguide/library-inspector$Library">Library</a> and start typing to quickly highlight a control.</p>
<p>Click the Gear icon to drop down a menu that lets you change how the controls in the Library are displayed. I prefer &#8220;Small Icons and Labels&#8221; with &#8220;Show Group Banners&#8221; selected.</p>
<p><img decoding="async" style="width: 320px; display: block; margin-left: auto; margin-right: auto;" title="" src="https://blog.xojo.com/wp-content/uploads/2015/11/ContolDisplayGearIcon.pngt1466486449161ampwidth320" sizes="(max-width: 320px) 100vw, 320px" width="320" /></p>
<h2>Debugging</h2>
<p>Use the <a href="http://developer.xojo.com/break">Break</a> command for conditional breakpoints when debugging. By using the Break command, you can force the debugger to appear when specific conditions are met. For example, this displays the debugger when the value reaches 100:</p>
<pre>If counter = 100 Then Break</pre>
<p>Break has no effect in a built app, but if you want to ensure the code is not in the built app at all, you can use the DebugBuild constant:</p>
<pre>#If DebugBuild Then
  If counter = 100 Then Break
#Endif</pre>
<p><strong>One final secret</strong>: All of the above items are in the documentation! Read more in the <a href="http://developer.xojo.com/user-guide">updated User Guide</a>, now available online at the <a href="http://developer.xojo.com/">Dev Center</a>.</p>
<p>What are your favorite Xojo secrets? Share them in the comments!</p>
<p><span id="hs-cta-wrapper-ab064e20-19a4-4785-8b3b-1e54dc67c8e8" class="hs-cta-wrapper"><span id="hs-cta-ab064e20-19a4-4785-8b3b-1e54dc67c8e8" class="hs-cta-node hs-cta-ab064e20-19a4-4785-8b3b-1e54dc67c8e8"> <!-- [if lte IE 8]>


<div id="hs-cta-ie-element"></div>


<![endif]--> <a href="http://blog.xojo.com/2015/07/22/rapid-application-development/"><img loading="lazy" decoding="async" id="hs-cta-img-ab064e20-19a4-4785-8b3b-1e54dc67c8e8" class="hs-cta-img aligncenter" style="border-width: 0px; margin: 0 auto; display: block; margin-top: 20px; margin-bottom: 20px;" src="https://blog.xojo.com/wp-content/uploads/2015/07/ab064e20-19a4-4785-8b3b-1e54dc67c8e8.png" alt="Rapid App Development" width="607" height="103" align="middle" /></a></span></span> <!-- end HubSpot Call-to-Action Code --></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Build All The Things</title>
		<link>https://blog.xojo.com/2015/11/11/build-all-the-things/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Wed, 11 Nov 2015 00:00:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/11/11/build-all-the-things/</guid>

					<description><![CDATA[Use an IDE Script to build for all Xojo's new supported platforms including 32 &#038; 64-bit &#038; Raspberry Pi.]]></description>
										<content:encoded><![CDATA[<p>As you may have heard, Xojo 2015 Release 3 added the long-awaited ability to create 64-bit apps. And it also added the ability to create Raspberry Pi 2 apps (Linux ARM). This now means there are lots more apps that can get built.</p>
<p><span id="more-256"></span></p>
<p>For the short-term you may be finding that you need (or want) to build for all the target platforms to test your apps. But in can be tedious to repeatedly change the Architecture setting for each app target and then press Build.</p>
<p><img decoding="async" style="width: 316px; display: block; margin-left: auto; margin-right: auto;" title="build all the things" src="https://blog.xojo.com/wp-content/uploads/2015/11/Build_All_The_Things_Meme.pngt1466486449161ampwidth320" sizes="(max-width: 320px) 100vw, 320px" alt="build all the things" width="320" data-constrained="true" /></p>
<p>But never fear, I&#8217;m here to help! Instead of doing this manually, use an IDE Script. This IDE Script will build for all the targets in one easy step:</p>
<pre> // Build all target platforms
 Const kOSX32 = 7
 Const kOSX64 = 16
 Const kWin32 = 3
 Const kWin64 = 19
 Const kLin32 = 4
 Const kLin64 = 17
 Const kLinARM = 18

 Dim path As String
 path = BuildApp(kOSX32)
 path = BuildApp(kOSX64)
 path = BuildApp(kWin32)
 path = BuildApp(kWin64)
 path = BuildApp(kLin32)
 path = BuildApp(kLin64)
 path = BuildApp(kLinARM)

 Dim result As String
 result = ShowDialog("Build All", _
 "Finished building.", _
 "OK", "", "", -1)</pre>
<p>You can save this script to a file (with the name BuildAll.xojo_script) extension into the Scripts folder that is in your Xojo installation folder. Then you can go to File -&gt; IDE Scripts -&gt;Build All to run the script. This will build all seven targets for you in one step.</p>
<p><strong>Note</strong>: Windows and Linux are not yet able to build 64-bit OS X apps, so you will want to comment out that line from the script if you are using Windows or Linux.</p>
<p>This script is included with Xojo 2015 Release 3 in the Examples folder:</p>
<p>Examples/Advanced/IDE Scripting/BuildAllDesktop</p>
<p><!--HubSpot Call-to-Action Code --> <span id="hs-cta-wrapper-d5b654ff-f12d-4fa8-8edc-b1152d8b19c1" class="hs-cta-wrapper"> <span id="hs-cta-d5b654ff-f12d-4fa8-8edc-b1152d8b19c1" class="hs-cta-node hs-cta-d5b654ff-f12d-4fa8-8edc-b1152d8b19c1"><br />
<!-- [if lte IE 8]>


<div id="hs-cta-ie-element"></div>


<![endif]--> <a href="http://blog.xojo.com/2015/10/20/64-bit-apps-are-here/" target="_blank"><img loading="lazy" decoding="async" id="hs-cta-img-d5b654ff-f12d-4fa8-8edc-b1152d8b19c1" class="hs-cta-img aligncenter" style="border-width: 0px;" src="https://blog.xojo.com/wp-content/uploads/2015/11/d5b654ff-f12d-4fa8-8edc-b1152d8b19c1.png" alt="64bit desktop apps Xojo Mac Windows Linux" width="533" height="81" /></a></span></span> <!-- end HubSpot Call-to-Action Code --></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Guest Post: Part 2, The Power of Templates</title>
		<link>https://blog.xojo.com/2015/11/09/guest-post-part-2-the-power-of-templates/</link>
		
		<dc:creator><![CDATA[Xojo]]></dc:creator>
		<pubDate>Mon, 09 Nov 2015 00:00:00 +0000</pubDate>
				<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Templates]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/11/09/guest-post-part-2-the-power-of-templates/</guid>

					<description><![CDATA[A tip for creating transparent labels on Windows in Xojo and using Templates to save development time]]></description>
										<content:encoded><![CDATA[<p>Read <a href="../../../com/xojo/blog/guest-post-transparent-label-tip-for-windows.html" target="_blank">Part 1</a> for a simple solution to set up a transparent label in Windows.</p>
<p>Xojo has three default project types on Windows (four on OS X with iOS).</p>
<p><img decoding="async" style="width: 215px;" title="Xojo Windows Project Chooser" src="https://blog.xojo.com/wp-content/uploads/2015/11/Win_Project_Types.pngt1466486449161" alt="Xojo Windows Project Chooser" data-constrained="true" /></p>
<p><span id="more-279"></span></p>
<p>These project types can be overwritten by placing suitably named binary projects in the Template Folder. See page the <a href="http://developer.xojo.com/project-types$Changing%20Default%20Projects">Templates section fo the User Guide</a>.</p>
<p>So having already created a project with our transparent label, we donât want to have to do that every time we create a new desktop project. We can save time by creating a template and copying it to the program files Xojocurrent version Templates which will allow us to select that template when creating a new project.</p>
<p><img decoding="async" style="width: 211px;" title="Xojo Project Template" src="https://blog.xojo.com/wp-content/uploads/2015/11/Project_Template.pngt1466486449161" alt="Xojo Project Template" data-constrained="true" /></p>
<p>But if we saved our project with the name &#8220;Default Desktop Project&#8221; in binary format then that will override the Desktop project on the choose a project dialog.  Due to Windows permissions, it is necessary to save your project elsewhere and copy it to the program files folder.</p>
<p><img decoding="async" style="width: 574px;" title="Program Files Folder Windows" src="https://blog.xojo.com/wp-content/uploads/2015/11/Program_Files_Folder_Windows.pngt1466486449161" alt="Program Files Folder Windows" data-constrained="true" /></p>
<p>Now when I create a new desktop project my transparent label is already included.  Of course I also have routines to get and set the main window location in the registry.</p>
<p>You can download my template <a href="https://dl.dropboxusercontent.com/u/18858366/Default%20Desktop%20Project.xojo_binary_project" target="_blank">here</a>. If you do download this project, make sure to replace &#8220;Axis Direct Ltd&#8221; with your own organisation.</p>
<p><em>Wayne Golding has been a Xojo developer since 2005. He operates an IT Company Axis Direct Ltd <a href="http://www.axisdirect.nz/" target="_blank">www.axisdirect.nz</a> which primarily develops applications using Xojo that integrate with Xero <a href="http://www.xero.com/" target="_blank">www.xero.com</a>.  Wayne&#8217;s hobby is robotics where he uses Xojo to build applications for his Pi2 often implementing IoT for remote control.</em><em><span id="hs-cta-wrapper-ee3c17a9-e8c9-4b5d-92ea-421a48777319" class="hs-cta-wrapper"><span id="hs-cta-ee3c17a9-e8c9-4b5d-92ea-421a48777319" class="hs-cta-node hs-cta-ee3c17a9-e8c9-4b5d-92ea-421a48777319"><br />
<!-- [if lte IE 8]>


<div id="hs-cta-ie-element"></div>


<![endif]--> <a href="http://blog.xojo.com/2014/06/12/creating-installers-for-windows-apps/" target="_blank"><img loading="lazy" decoding="async" id="hs-cta-img-ee3c17a9-e8c9-4b5d-92ea-421a48777319" class="hs-cta-img aligncenter" style="border-width: 0px; margin: 0 auto; display: block; margin-top: 20px; margin-bottom: 20px;" src="https://blog.xojo.com/wp-content/uploads/2015/02/ee3c17a9-e8c9-4b5d-92ea-421a48777319.png" alt="Xojo Windows" width="611" height="108" align="middle" /></a></span></span> <!-- end HubSpot Call-to-Action Code --> </em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tips: Dealing with the Problem of Passwords</title>
		<link>https://blog.xojo.com/2015/10/09/tips-dealing-with-the-problem-of-passwords/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Fri, 09 Oct 2015 00:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Passwords]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/10/09/tips-dealing-with-the-problem-of-passwords/</guid>

					<description><![CDATA[Tips on how to better handle user passwords in your apps. Though too much security is never enough, as developers, there are things we can do to keep our users' passwords secure.]]></description>
										<content:encoded><![CDATA[<p>Passwords are a problem, as we frequently see in the news when databases containing password and login information are hacked and exposed.</p>
<p>Though <a href="/2014/06/19/too_much_security_is_never_enough/" target="_blank" rel="noopener noreferrer">too much security is never enough</a>, as developers, there are things we can do to keep our users&#8217; passwords secure.</p>
<p><span id="more-266"></span></p>
<p>The best way to not allow passwords to be compromised is to not store the password at all. Unfortunately, I&#8217;ve seen far too many apps that have databases with a &#8220;password&#8221; column that contains the actual password! And I&#8217;m sure you&#8217;ve seen web sites that, when you click the &#8220;forgot password&#8221; link, send you an email with your actual password! This is not good. <strong>The only one who should know the password is the person who created the password.</strong></p>
<p><img decoding="async" style="width: 320px; display: block; margin-left: auto; margin-right: auto;" title="security keys" src="https://blog.xojo.com/wp-content/uploads/2015/10/keys-525732_1280.jpgt1466486449161" alt="security keys" data-constrained="true" /></p>
<p>So the first thing to do is to <em>not</em> store the password. Instead store a one-way hash of a password. A hash is a function that given a value, returns a new value of a fixed length that is always the same for the original value. A one-way hash is a hash that can convert text to a hash value but cannot convert the hash value back to the original text.</p>
<p>It just so happens that Xojo has several built-in one-way hash functions in the <a href="http://developer.xojo.com/xojo-crypto">Crypto</a> namespace: MD5, SHA1, SHA256, SHA512 and PBKDF2.</p>
<p>For example, given a password &#8220;frenchfries&#8221;, MD5 generates this hash value (converted to hex):</p>
<p>8D32A4B407DE20D2465467EE38DEF24C</p>
<p><strong>The idea is that instead of storing the actual password, you use the hash of the password.</strong> To validate that the password is correct, when the user logs in you calculate the hash of the password they entered and then check to see if it matches the hash of the password you have stored. If they are the same then you know the password is correct even though you do not know the actual password.</p>
<p>This strategy is a great start, but it has a flaw: it is susceptible to a &#8220;brute-force&#8221; attack. This is where a nefarious hacker pre-calculates hash values for large amounts of common words. This is referred to as a <a href="https://en.wikipedia.org/wiki/Rainbow_table">rainbow table</a>. Since most people choose relatively simple passwords, they will more than likely be found in a rainbow table. If a hacker gets access to your hash value and they know how it was calculated, they can then look it up in the rainbow table to see what the plain text password is.</p>
<p>One way to help mitigate this is to use a &#8220;salt&#8221; along with the password to create the hash. The salt is an extra value that you add to the password to generate hashes that make rainbow tables largely useless. You can use the same salt value for all the passwords or you can use something more specific for each password.</p>
<p>Creating an MD5 hash on the combination of the hash for &#8220;frenchfries&#8221; and the text &#8220;salted&#8221; generates this hash using MD5:</p>
<p class="p1">AE4D2A78B0681171F8E030C30A20F8F8</p>
<p>Such a value is not likely to show up in a rainbow table anywhere because it&#8217;s specific to you, thus limiting its general usefulness. A hacker would actually need to figure out how you are creating your salt value before they can generate a rainbow table.</p>
<p>Using a hash with a salt works well, but you also have to use a secure hashing function. It has <a href="http://arstechnica.com/security/2015/10/sha1-crypto-algorithm-securing-internet-could-break-by-years-end/">been known for some time that MD5 and SHA1 are no longer secure hashing function</a>s and are not recommended for use. The primary problem is that it is possible for two completely different values to generate the same hash. This flaw has been used to fake security certificates among other things. You may think it does not matter much for your purposes, but don&#8217;t be the one that is easier to hack. Use one of the other available hashing functions such as SHA256.</p>
<p>But even better, you can use the <a href="https://en.wikipedia.org/wiki/PBKDF2">PBKDF2</a> function which is essentially a &#8220;slow&#8221; function which makes brute-force attacks more difficult to achieve. PBKDF2 with a salt and SHA256 can work really well. Here is an example:</p>
<pre>Dim salt As Text = "salted"
Dim saltData As Xojo.Core.MemoryBlock
saltData = Xojo.Core.TextEncoding.UTF8.ConvertTextToData(salt)
Dim password As Text = "frenchfries"
Dim passwordData As Xojo.Core.MemoryBlock
passwordData = Xojo.Core.TextEncoding.UTF8.ConvertTextToData(password)
Dim hashData As Xojo.Core.MemoryBlock
hashData = Xojo.Crypto.PBKDF2(saltData, passwordData, 500, _
  32, Xojo.Crypto.HashAlgorithms.SHA256)</pre>
<p>The resulting hash is a <a href="http://developer.xojo.com/xojo-core-memoryblock">MemoryBlock</a> so to display it, you&#8217;ll want to convert it to a hexadecimal value. This code can easily do that:</p>
<pre>Private Function ConvertToHex(mb As Xojo.Core.MemoryBlock) As Text
  Dim hex As Text

  For b As Int8 = 0 To mb.Size - 1
    hex = hex + mb.UInt8Value(b).ToHex(2)
  Next

  Return hex
End Function</pre>
<p>The hash for &#8220;frenchfries&#8221; with the salt &#8220;salted&#8221; yields this hash value using the above PBKDF2 function:</p>
<p class="p1">6A9C1E745EEBD7A9687DF04FC61E5C4C685537EEB4A3384531DE5687270C9DF4</p>
<p><a href="http://files.xojo.com/BlogExamples/PasswordHashing.xojo_binary_project">Download the sample project</a> to play around with the various hashing functions.<br />
<span><span style="font-size: xx-small;"><i>Updated (Sep 11, 2018) to ensure correct hex values are always displayed.<br />
</i></span></span><em><span style="font-size: 10px;">Updated (Oct 15, 2015) to ensure 2-digit hex values are used.</span></em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What&#8217;s Next: Xojo Licensing</title>
		<link>https://blog.xojo.com/2013/06/24/whats-next-xojo-licensing/</link>
		
		<dc:creator><![CDATA[Alyssa Foley]]></dc:creator>
		<pubDate>Mon, 24 Jun 2013 00:00:00 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Licenses]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Xojo Pro]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2013/06/24/whats-next-xojo-licensing/</guid>

					<description><![CDATA[All Xojo licenses let you develop and build your apps with the current release as well as give you access to all updates and releases for the next year. ]]></description>
										<content:encoded><![CDATA[<p>Now that you have tried Xojo, you&#8217;re probably thinking of creating stand-alone apps. Maybe you are considering selling your app or maybe you just want to share your app with some friends.</p>
<div>
<p>So now you are ready to build and deploy your apps, and to do that you need a Xojo license. No problem, Xojo has a straightforward licensing scheme.</p>
<p><span id="more-39"></span></div>
<p><img /><strong>Xojo Pro</strong></p>
<p>A single license for Desktop, Web, Mobile, Raspberry Pi and Console and includes priority support, beta program access, consulting leads, and a license you can activate on 3 machines simultaneously for $699.</p>
<div><a href="https://www.xojo.com/store/proplus.php"><strong>Xojo Pro Plus</strong></a></div>
<div>Everything in Xojo Pro, plus top priority support, fast fixes and a total of 6 license activations for $1999.</div>
<div>
<p><a href="https://www.xojo.com/products/desktop.php"><strong>Xojo Desktop</strong></a><br />
Allows you to develop and build apps for OS X, Windows and Linux and includes full database support for $299.</p>
<p><a href="https://www.xojo.com/products/web.php"><strong>Xojo Web</strong></a><br />
Build web applications that can run on Linux, Windows or macOS servers and support all the popular browsers for $299.</p>
<p><a href="https://www.xojo.com/products/mobile.php"><b>Xojo Mobile</b></a></div>
<div>Build native apps for iOS (iPhone and iPad) for $299. Android support coming soon!</div>
<div></div>
<div><strong><a href="https://www.xojo.com/raspberrypi/">Xojo Pi * Free!</a></strong></div>
<div>Develop apps for desktop and console apps for single board computers like Raspberry Pi. Get a free activation code now :)You can buy your new Xojo license at our <a href="https://xojo.com/store/">Store page</a>. Or you can extend a current license from your <a href="https://xojo.com/account/licenses/">account page</a>.</p>
</div>
<p>All Xojo licenses let you develop and build your apps with the current release as well as give you access to all updates and releases for the next year. After a year, you can extend your license if you want to build with newer releases or you can continue building indefinitely with the release you have.  Your apps continue to be yours to sell or share as you please. Xojo does not limit the amount of apps you can build, distribute or sell in any way. No royalties are due to Xojo for the apps you create.</p>
<p><i>*Xojo license pricing is subject to change, please check the Xojo Store for current pricing. Last updated 04.09.2019</i></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Merging iCloud and Apple ID Accounts</title>
		<link>https://blog.xojo.com/2013/06/20/merging-icloudapple-id-accounts/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Thu, 20 Jun 2013 00:00:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iTunes]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2013/06/20/merging-icloudapple-id-accounts/</guid>

					<description><![CDATA[Merging iCloud/Apple ID Accounts]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.xojo.com/blog/en/assets_c/2013/06/iCloudLogo-24.php"><img decoding="async" style="text-align: center; margin-top: 0px; margin-bottom: 20px; float: left; width: 320px;" title="iCloud.jpeg" src="https://blog.xojo.com/wp-content/uploads/2013/06/iCloud.jpegt1466486449161" alt="iCloud.jpeg" data-constrained="true" /></a>If you have been around the Mac community long enough, you may have ended up with two Apple IDs. I have one for iTunes and another one that came from MobileMe. This resulted in effectively having two iCloud accounts. This can be inconvenient and probably will become more so in the future. Apple doesn&#8217;t provide a means to merge Apple IDs. They know they need to provide this, but they do not yet do so. I, however, have found a way.</p>
<p>Since the introduction of iCloud, I have wanted to have a single Apple ID. When Apple recently added the two-step authentication for Apple IDs to make them more secure, I decided to sign in and update my Apple ID account. Part of the process is to verify a device you own which will be used, along with your password, to authenticate that you are who you say you are should you want to make changes (such as your password) to your Apple ID in the future. The webpage said it would list my devices, but none were listed. It didn&#8217;t take long to figure out why. The Apple ID I was updating was for iTunes, while the Apple ID Apple was using to find my devices was the one associated with my iCloud (MobileMe/mac.com) account.</p>
<p><span id="more-37"></span></p>
<p>I finally decided that I really had to find a way to merge the data from my iCloud Apple ID with my iTunes Apple ID so that I would have a single Apple ID. It took some research and experimentation, but I figured it out.</p>
<p>If you have two Apple IDs and you want to merge the data into one, here are the steps. For the purposes of this post, I&#8217;ll refer to the two accounts as OldAppleID (the one you are currently using for iCloud) and NewAppleID (the one you want to use for iCloud).</p>
<ol>
<li>If you have any documents you have stored in iCloud (Pages, Numbers, Keynote, etc.), Save copies of these to your Mac desktop before proceeding because the copies in iCloud will be lost.</li>
<li style="text-align: left;">Next, open Photos (or iPhoto if you are still using that) and make sure your Photostream imports any photos from each of your devices as those will also be lost in this process. In Photos, click the Albums button at the top of the window then double-click on the album titled &#8220;My Photo Stream&#8221; and give it a moment to import any new photos.</li>
<li style="text-align: left;"><img decoding="async" style="width: 320px; display: block; margin-left: auto; margin-right: auto;" title="" src="https://blog.xojo.com/wp-content/uploads/2013/06/Photos.pngt1466486449161" /></li>
<li style="text-align: left;">If you are still using iPhoto, click on Photo Stream in the navigation pane on the left.</li>
</ol>
<p><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 10px auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2013/06/photostream-thumb-303x77-27.pngt1466486449161ampwidth303ampheight77" sizes="auto, (max-width: 303px) 100vw, 303px" alt="Photostream.png" width="303" height="77" /></p>
<ol>
<li>On all the devices you sync to iCloud, open each application on each device to allow it to sync. This is just to make sure your data is completely synced up. You will see a progress wheel spin in the status bar (next to your carrier name on an iPhone or next to the wifi indicator on the iPad or iPod Touch) while the sync is going on. Wait for this to end before continuing to the next app.</li>
</ol>
<p><a href="http://www.xojo.com/blog/en/assets_c/2013/06/iOS%20Progress%20Wheel-30.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 10px auto 20px; width: 227px;" title="iPhone_Progress.png" src="https://blog.xojo.com/wp-content/uploads/2013/06/iPhone_Progress.pngt1466486449161ampwidth227ampheight39" sizes="auto, (max-width: 227px) 100vw, 227px" alt="iPhone_Progress.png" width="227" height="39" data-constrained="true" /></a></p>
<ol>
<li>Choose one of your iOS devices to use as a source for the iCloud data.</li>
<li>On that device, go to Settings -&gt; Mail Contacts, Calendars and tap on your OldAppleID iCloud account.</li>
<li>Scroll to the bottom and click the <strong>Sign Out</strong> button.<a href="http://www.xojo.com/blog/en/assets_c/2013/06/iCloud%20Delete%20Button-36.php"><img decoding="async" style="text-align: center; display: block; margin: 10px auto 20px; width: 320px;" title="iCloud_Sign_Out.png" src="https://blog.xojo.com/wp-content/uploads/2013/06/iCloud_Sign_Out.pngt1466486449161" alt="iCloud_Sign_Out.png" data-constrained="true" /></a></li>
<li>First, you&#8217;ll get a warning that all of your photos in Photostream and documents in iCloud on the device will be deleted. Tap the <strong>Sign Out</strong> button to continue.</li>
<li>Next, you&#8217;ll be asked if you want to turn off Notes. Tap <strong>Delete</strong>.</li>
<li>Lastly, you&#8217;ll be given the option to delete the data associated with the iCloud account from this device or keep it on the device. This is the most critical step in this process. Make sure you tap the <strong>Keep on my iPhone/iPad</strong> button.</li>
<li>When your device is done deleting, go back to Settings -&gt; Mail, Contacts, Calendar and under Accounts, tap on <strong>Add Account</strong>.</li>
<li>Select iCloud from the list and add your NewAppleID account. It will take some time for the new account to appear.</li>
<li>Once the new account appears, launch each of the apps on that device that sync to iCloud (Contacts, Notes, Calendar, Reminders, etc.). Again you will see a progress wheel appear in the status bar at the top of your device. Depending on how much data you have, this could take from a few seconds to a few minutes. Wait for this to finish before proceeding to the next app.</li>
<li>At this point, the iCloud account associated with your NewAppleID now has all your data synced. Next, you will need to update your other iOS devices (if you have any) and your Mac.</li>
<li>For each of your other iOS devices, go to Settings -&gt; Mail, Contacts, Calendar and sign out of your iCloud account. This time, when it asks you if you want to delete the data on the device, tap <strong>Delete Data from my iPhone/iPad</strong>.</li>
<li>Next on Mail, Contacts, Calendar tap Add Account and add the iCloud account associated with your NewAppleID. Note that it may take several minutes for your device to resync with the NewAppleID account. Watch the progress wheel icon next to the WIFI icon in the top-left corner of the screen. Once that stops, your data should be resynced.</li>
<li>When it&#8217;s finished setting up, open each application that syncs with iTunes and verify that your data is there. It should be, or it will be momentarily, so wait for it to appear. Update the rest of the iOS devices you wish to have associated with your NewAppleID iCloud account.</li>
<li>Last but not least, update your Mac. This is the easiest step. Choose System Preferences from the Apple menu.</li>
<li>In the System Preferences window, click on <strong>iCloud</strong>.</li>
<li>Click the <strong>Sign Out</strong> button.</li>
<li>It will take a moment to sign out. If it says it can&#8217;t sign out, make sure all the options for syncing Mail, Contacts, etc., are unchecked and then click Sign Out again.</li>
<li>The Sign Out button will now be labeled <strong>Sign In</strong> so click it and sign in with your NewAppleID. This will sync your data to your Mac.</li>
<li>Verify that your Notes, Calendar, Contacts, Photostream and Reminders are all intact on your Mac.</li>
<li>If you had documents in iCloud, open each of these on your Mac, click on the document name in the titlebar of the window and choose <strong>AppName &#8211; iCloud</strong> from the Where drop down menu. Once you do this, your document will be moved immeidately to iCloud. I recommend going to iCloud.com and making sure that the document is there before moving on to the next one.</li>
<li>In older versions of apps like Pages and Numbers, you&#8217;ll see an item called <strong>Move to iCloud</strong> which when selected will present a confirmation dialog. In that dialog, click <strong>Move</strong>.<a href="http://www.xojo.com/blog/en/assets_c/2013/06/Move%20to%20iCloud2-42.php"><img decoding="async" style="text-align: center; display: block; margin: 0px auto 20px; width: 320px;" title="Moving_to_iCloud.png" src="https://blog.xojo.com/wp-content/uploads/2013/06/Moving_to_iCloud.pngt1466486449161" alt="Moving_to_iCloud.png" data-constrained="true" /></a></li>
</ol>
<p>You now have a single iCloud account and can ignore your old one. This also means that you effectively have a single Apple ID and can ignore the old one.</p>
<p>The fact that iOS can do this is really a hidden gem of a feature. Some times software features get used in unexpected ways. Being able to use iOS to merge iCloud accounts is a great example of that.</p>
<p>I hope that you found these tips helpful. One good turn deserves another, right? Take 2 minutes to learn what you can do with Xojo.<!-- end HubSpot Call-to-Action Code --></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
