<?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>Rapid Application Development &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/tag/rapid-application-development/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, 07 Jan 2026 16:01:52 +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>Checking Out Xojo Libraries</title>
		<link>https://blog.xojo.com/2025/12/09/checking-out-xojo-libraries/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Tue, 09 Dec 2025 16:29:31 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[2025r3]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[Libraries]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15569</guid>

					<description><![CDATA[The ability to create a compiled Library with Xojo has been a long-requested feature. Starting with 2025 Release 3, Library support is now available as&#8230;]]></description>
										<content:encoded><![CDATA[
<p>The ability to create a compiled Library with Xojo has been a long-requested feature. Starting with 2025 Release 3, Library support is now available as a preview. Here’s more information about what it is and how you can use it.</p>



<h2 class="wp-block-heading">What is a Library?</h2>



<p>A Library is a collection of pre-written, reusable code containing methods, classes and UI.&nbsp;Up until now, the way to distribute a Library for use with Xojo was to create a Plugin or to manually re-use project items across projects. Both have pros and cons.</p>



<p>Plugins are compiled and do not expose source code, but plugins cannot be created using Xojo itself and are typically created using C/C++ along with the Xojo Plugin SDK. Sharing project items is fine for internal projects or open-source projects, but less ideal for commercial libraries. They can be harder to manually add to a project and are recompiled along with the project, slowing the debug process.</p>



<p>With a Xojo Library, you can now create your own compiled Library using Xojo itself. This Library can contain nearly any Xojo project item and can be easily used in other Xojo projects because it is distributed as a single file.</p>



<p>At a high-level, you create your Library in Xojo, add your project items to it and built it into a Library package file. Other projects can then use this Library package, which gives them access to the items you included in the Library.</p>



<h2 class="wp-block-heading">Creating a Library</h2>



<p>Here is a brief overview of how you create a Xojo Library:</p>



<ol class="wp-block-list">
<li>In a Desktop, Web, Console or iOS project add a Library by choosing Insert-&gt;Library.</li>



<li>Add the project items you want to the Library. Any Xojo project item is supported, except for Worker.</li>



<li>Build the project. It will build the main app (which should serve as a test app for your Library) and a separate Library package file (with extension .xojo_library).</li>



<li>You can put this Library package alongside another project (on the drive) and it will be loaded when that project is opened by Xojo. You can then use the classes, methods and UI contained in the Library within your project. If you instead put the Library in the Plugins folder, then it will be available for all projects.</li>
</ol>



<p>This is all best demonstrated by a quick example. Go ahead and create a Desktop project and add a Library to it, which adds a Library1 project item to the Navigator. Change its name using the Inspector to LibHello.</p>



<p>While LibHello is selected, choose Insert-&gt;Class. This adds Class1 to it. This new class is now part of the Library. With Class1 selected, change its name to StringStuff.</p>



<p>You can now add whatever methods or properties you want to the class. For our example purposes here we will add a simple method that reverses a string.</p>



<pre class="wp-block-code"><code>Public Function ReverseString(s As String) As String
  Var newString As String
  
  For Each c As String In s.Characters
    newString = c + newString
  Next
  
  Return newString
End Function</code></pre>



<p>The Library could contain many other things of course, but to keep things simple this Library will have just the single class with its single method. Here&#8217;s what it looks like in the project:</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="311" src="https://blog.xojo.com/wp-content/uploads/2025/11/CleanShot-2025-11-25-at-10.13.55@2x-1024x311.png" alt="" class="wp-image-15570" srcset="https://blog.xojo.com/wp-content/uploads/2025/11/CleanShot-2025-11-25-at-10.13.55@2x-1024x311.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/11/CleanShot-2025-11-25-at-10.13.55@2x-300x91.png 300w, https://blog.xojo.com/wp-content/uploads/2025/11/CleanShot-2025-11-25-at-10.13.55@2x-768x233.png 768w, https://blog.xojo.com/wp-content/uploads/2025/11/CleanShot-2025-11-25-at-10.13.55@2x.png 1382w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>The first thing to do is to test this Library ReverseString method. Add a button to Window1 and have it call the function, verifying the result.</p>



<pre class="wp-block-code"><code>Var stuff As New StringStuff
Var result As String = stuff.ReverseString("Xojo")

MessageBox(result)</code></pre>



<p>When you run, you can see the output:</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="744" height="584" src="https://blog.xojo.com/wp-content/uploads/2025/11/CleanShot-2025-11-25-at-10.15.21@2x.png" alt="" class="wp-image-15572" style="width:407px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2025/11/CleanShot-2025-11-25-at-10.15.21@2x.png 744w, https://blog.xojo.com/wp-content/uploads/2025/11/CleanShot-2025-11-25-at-10.15.21@2x-300x235.png 300w" sizes="(max-width: 744px) 100vw, 744px" /></figure>



<p>So far this is all not much different than you would normally be doing with a Xojo project. The next step is to create the Library package for use by other projects.</p>



<p>In the Build Settings area, select Shared. This is where you can enter some information about the Library that can be seen by those that use it.</p>



<ul class="wp-block-list">
<li>In the Version field, enter &#8220;1.0&#8221;.</li>



<li>In the Copyright field, enter &#8220;Acme, Inc.&#8221;</li>



<li>In the Description field, enter &#8220;A Xojo Library test.&#8221;</li>
</ul>



<p>Also in the Build Settings area, check the boxes for the platforms you want the Library to work on. In most situations, you will want to select macOS, Windows and Linux.</p>



<p>Now click Build. This builds the app as usual, but also creates a separate Library package file (LibHello.xojo_library for this example) that can be used with other projects.</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="558" src="https://blog.xojo.com/wp-content/uploads/2025/11/FinderLibrary-1-1024x558.png" alt="" class="wp-image-15577" style="width:590px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2025/11/FinderLibrary-1-1024x558.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/11/FinderLibrary-1-300x163.png 300w, https://blog.xojo.com/wp-content/uploads/2025/11/FinderLibrary-1-768x418.png 768w, https://blog.xojo.com/wp-content/uploads/2025/11/FinderLibrary-1-1536x837.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/11/FinderLibrary-1.png 1542w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Using a Library</h2>



<p>Now that you&#8217;ve created your Library package, you can use it with other Xojo projects. The Library built above was created within a Desktop project, so it can only be used with other Desktop projects. So the first thing to do is to create a new Desktop project (call it MyTest), save it and close it.</p>



<p>Once it is saved, go to Finder or Explorer and place a copy of the LibHello.xojo_library file (from its build location) alongside this saved project file.</p>



<p>Go back to Xojo and open the MyTest project. The project will open normally, but the Library will also be loaded up as well. You can see this by showing the Xojo About window and going to the Plugins &amp; Libraries tab. There you will see the Library name along with the information you entered about it earlier. (Double-click on the Library row to show the description.)</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="726" src="https://blog.xojo.com/wp-content/uploads/2025/11/AboutWindow-1024x726.png" alt="" class="wp-image-15578" style="width:664px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2025/11/AboutWindow-1024x726.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/11/AboutWindow-300x213.png 300w, https://blog.xojo.com/wp-content/uploads/2025/11/AboutWindow-768x544.png 768w, https://blog.xojo.com/wp-content/uploads/2025/11/AboutWindow.png 1524w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Going back to the MyTest project, you can now use the Library with it. Add a button to the window and have it call the StringReverse function the same way you did before:</p>



<pre class="wp-block-code"><code>Var stuff As New StringStuff
Var result As String = stuff.ReverseString("Xojo")

MessageBox(result)</code></pre>



<p>Now run the project and it will use the class and its method just as if it is part of the project.</p>



<p>That&#8217;s the basics of how to create and use a Library. You can of course include whatever you want in the Library, but as with any library it is usually a good idea to keep things well-organized.</p>



<h2 class="wp-block-heading">Considerations</h2>



<ul class="wp-block-list">
<li>A Library package (which uses ZIP) contains compiled code and definitions of the public API in that code.</li>



<li>Only a single Library project item can be added to a project when developing.</li>



<li>A project can use any number of Library packages.</li>



<li>For a built library to work on all OS platforms, then those platforms must be selected before building it.</li>



<li>Libraries only support 64-bit builds.</li>



<li>Library packages are placed alongside the project file and are loaded when the project is loaded.</li>



<li>Library packages can also be placed in the Plugins folder. These libraries will be loaded separately for each project.</li>



<li>If items in your Library have dependencies outside the Library, then the Library package will not be usable in another project without those dependencies. For example, if a Library class method references a class in the main project, then it will build without an error (because the main project is available), but if you use that Library in another project you will get linker errors.</li>
</ul>



<h2 class="wp-block-heading">Why a Preview?</h2>



<p>We are referring to this initial version of Xojo Libraries as a preview release because it is very new and we want to give more developers a chance to test with it so we can iron out issues. We encourage you to try moving your existing reusable code collections over to a Library to help test, while also improving your workflow. If you have any open-source projects that are essentially a Library, you might try building them into a Xojo Library package as well.</p>



<p>You can make Library packages available publicly, but you should probably tag them as a preview, beta or test version until we remove the preview label.</p>



<p>Read more about Libraries in the <a href="https://documentation.xojo.com/topics/code_management/sharing_code_among_multiple_projects.html" target="_blank" rel="noreferrer noopener">Xojo Documentation</a>. Check out these open-source projects on GitHub that have recently been updated for API 2.0 and now have a Library that you can download from the Releases section:</p>



<ul class="wp-block-list">
<li><a href="https://github.com/xojo/VB" target="_blank" rel="noreferrer noopener">Visual Basic Library</a></li>



<li><a href="https://github.com/xojo/FM" target="_blank" rel="noreferrer noopener">FileMaker Library</a></li>



<li><a href="https://github.com/paullefebvre/winapilib" target="_blank" rel="noreferrer noopener">WinAPI Library</a></li>
</ul>



<p><em>Paul learned to program in BASIC at age 13 and has programmed in more languages than he remembers, with Xojo being an obvious favorite. When not working on Xojo, you can find him talking about retrocomputing at <a href="https://goto10.substack.com" target="_blank" rel="noreferrer noopener">Goto 10</a> and </em>on Mastodon @lefebvre@hachyderm.io.</p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Year of Code 2025: October Project &#8211; Multi-Platform Communication</title>
		<link>https://blog.xojo.com/2025/10/13/year-of-code-2025-october-project-multi-platform-communication/</link>
		
		<dc:creator><![CDATA[Gabriel Ludosanu]]></dc:creator>
		<pubDate>Mon, 13 Oct 2025 19:01:53 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Year of Code]]></category>
		<category><![CDATA[#YearofCode]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Lan]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[UDPSocket]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15461</guid>

					<description><![CDATA[For October&#8217;s Xojo Year of Code 2025, I built MPACSocket, a tiny, reusable UDPSocket subclass that enables zero-config, local-network presence and chat across platforms. It&#8230;]]></description>
										<content:encoded><![CDATA[
<p>For October&#8217;s Xojo Year of Code 2025, I built MPACSocket, a tiny, reusable UDPSocket subclass that enables zero-config, local-network presence and chat across platforms. It wraps binding, broadcast, presence beacons, peer tracking, and JSON parsing into a single class with a clean event-based API. Drop it into Desktop projects and you’ve got instant LAN discovery and messaging.</p>



<h2 class="wp-block-heading">What this project includes</h2>



<ul class="wp-block-list">
<li>A self-contained UDPSocket subclass (MPACSocket) that handles bind, presence broadcasting, peer pruning, and chat envelopes with versioned JSON (good for further updates to the protocol).</li>



<li>Simple API: Start(port), Stop(), Rename(name), SendChat(text). Everything else comes through events like Bound, ChatReceived, PeerOnline/PeerOffline, PeerUpdated, StatusChanged, and SocketError.</li>



<li>A sample DesktopWindow (wndMPAC) that wires MPACSocket to a transcript area and peers list.</li>
</ul>



<h2 class="wp-block-heading">How to use</h2>



<ul class="wp-block-list">
<li>Add MPACSocket to your project, drop it onto a DesktopWindow or instantiate in code.</li>



<li>Set DisplayName, call Start(62636), and listen to events to update your UI or console output.</li>



<li>Use SendChat to broadcast a message; presence beacons and peer tracking happen automatically.</li>
</ul>



<h2 class="wp-block-heading">Download</h2>



<p>You can download the entire Xojo project from <a href="https://github.com/xolabsro/Multi-Platform-App-Communication" target="_blank" rel="noreferrer noopener">GitHub</a></p>



<p>This project shows how a small, well-scoped class can turn low-level UDP into a friendly, cross-platform building block. Feel free to adapt the events or JSON schema for your own protocols.</p>



<p><em>Gabriel is a digital marketing enthusiast who loves coding with Xojo to create cool software tools for any platform. He is always eager to learn and share new ideas!</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p><strong>Year of Code Project</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2025/01/09/year-of-code-2025-kickoff/">Year of Code: Kickoff</a></li>



<li><a href="https://blog.xojo.com/2025/01/15/year-of-code-2025-january-project/" target="_blank" rel="noreferrer noopener">January Project: Desktop Apps</a>&nbsp;|&nbsp;<a href="https://forum.xojo.com/t/year-of-code-2025-january-project-sharing/83927" target="_blank" rel="noreferrer noopener">Forum Discussion</a></li>



<li><a href="https://blog.xojo.com/2025/02/11/year-of-code-2025-february-project/">February Project: Database Apps</a>&nbsp;|&nbsp;<a href="https://forum.xojo.com/t/2025-year-of-code-february" target="_blank" rel="noreferrer noopener">Forum Discussion</a></li>



<li><a href="https://blog.xojo.com/2025/03/05/year-of-code-2025-march-project-web-apps/">March Project: Web Apps</a> | <a href="https://forum.xojo.com/t/2025-year-of-code-march/84474?u=alyssa_foley">Forum Discussion</a></li>



<li><a href="https://blog.xojo.com/2025/04/08/year-of-code-2025-april-project-user-interface/">April Project: User Interface</a> | <a href="https://forum.xojo.com/t/2025-year-of-code-april-user-interface/84926">Forum Discussion</a></li>



<li><a href="https://blog.xojo.com/2025/05/07/year-of-code-2025-may-project-mobile-apps/">May Project: Mobile Apps</a> | <a href="https://forum.xojo.com/t/2025-year-of-code-may-is-mobile/85272">Forum Discussion</a></li>



<li><a href="https://blog.xojo.com/2025/06/10/year-of-code-2025-june-project-cross-platform-code-class/">June Project: Code Sharing</a> | <a href="https://forum.xojo.com/t/2025-year-of-code-june-is-code-sharing/85612">Forum Discussion</a></li>



<li><a href="https://blog.xojo.com/2025/07/10/year-of-code-2025-july-project-charting/">July Project: Charting</a> | <a href="https://forum.xojo.com/t/2025-year-of-code-july-is-charting/85896">Forum Discussion</a></li>



<li><a href="https://blog.xojo.com/2025/08/07/year-of-code-2025-august-project-console-apps/">August Project: Console Apps</a> | <a href="https://forum.xojo.com/t/august-2025-year-of-code-console-apps/86203">Forum Discussion</a></li>



<li><a href="https://blog.xojo.com/2025/09/08/year-of-code-2025-september-project-games/">September Project: Games</a> | <a href="https://forum.xojo.com/t/2025-year-of-code-septgamer">Forum Discussion</a></li>



<li><a href="https://blog.xojo.com/2025/10/13/year-of-code-2025-october-project-multi-platform-communication/">October Project: Multi-Platform</a> | <a href="https://forum.xojo.com/t/2025-year-of-code-october-multi-platform-communication/86717">Forum Discussion</a></li>



<li><a href="https://blog.xojo.com/2025/11/10/year-of-code-2025-november-project-pdf-postcard-generator/">November Project: PDF</a> | <a href="https://forum.xojo.com/t/2025-year-of-code-november-pdf/86969">Forum Discussion</a></li>
</ul>



<p><strong>How to Play:</strong></p>



<p>Each month we&#8217;ll announce a new theme and share an example project of our own. Share your projects to the Xojo Forum thread for that month via GitHub (all the links you need are posted above ↑ ). Learn how to use <a href="https://blog.xojo.com/2024/04/02/using-xojo-and-github/">Xojo and GitHub</a>.</p>



<p><strong>The Prizes:</strong></p>



<p>Monthly winners get $100 at the Xojo store. Every month you submit a project is another chance to win the grand prize. The grand prize is $250 cash plus a Xojo Pro license and a year of GraffitiSuite and will be announce in December. Learn more about the <a href="https://blog.xojo.com/2025/01/09/year-of-code-2025-kickoff/#prizes">prizes</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>User-Centric Mobile Apps Design Principles for Developers</title>
		<link>https://blog.xojo.com/2025/02/06/user-centric-mobile-apps-design-principles-for-developers/</link>
		
		<dc:creator><![CDATA[Gabriel Ludosanu]]></dc:creator>
		<pubDate>Thu, 06 Feb 2025 16:00:00 +0000</pubDate>
				<category><![CDATA[Dev Marketing]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14432</guid>

					<description><![CDATA[Ever felt overwhelmed by the sheer complexity of designing a mobile app that not only works but also delights users? As a solo developer, you’re&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Ever felt overwhelmed by the sheer complexity of designing a mobile app that not only works but also delights users? As a solo developer, you’re juggling multiple roles—designer, developer, marketer, and more. It’s easy to feel stretched thin, especially when it comes to crafting an intuitive and visually appealing app design. Don’t worry, you’re not alone in this struggle. Many indie developers face the same challenge. The good news? With the right design principles and strategies, you can create mobile apps that look great, function seamlessly, and leave a lasting impact on your users.</p>



<p>In this article, we’ll explore actionable, real-world design principles tailored to the unique needs of solo developers. Whether you’re building your first app or looking to improve your design skills, this guide will give you the tools and confidence to create apps that stand out in today’s crowded market.</p>



<h2 class="wp-block-heading">Why Design Matters for Solo Developers</h2>



<p>Before diving into specific principles, let’s address a fundamental question: Why is design so crucial for solo developers? The answer is simple—Users judge your app within seconds, forming quick impressions that impact their decision to continue using it. A poorly designed app drives users away, no matter how powerful its functionality is. Good design, on the other hand, builds trust, enhances usability, and keeps users coming back.</p>



<p>For solo developers, good design is also a strategic advantage. With limited resources, you can’t compete with big teams on the number of features. But you <em>can</em> compete on delivering a streamlined, delightful user experience (UX).</p>



<h2 class="wp-block-heading">Core Design Principles for Mobile App Developers</h2>



<p>Let’s break down effective mobile app design into manageable, actionable principles. These are specifically geared toward solo developers who need to maximize their impact without burning out.</p>



<h3 class="wp-block-heading">1. <strong>Start with User-Centered Design (UCD)</strong></h3>



<p>The foundation of great design is understanding your users. Who are they? What problems are they trying to solve? What do they expect from your app?</p>



<h4 class="wp-block-heading">Action Steps:</h4>



<ul class="wp-block-list">
<li><strong>Create user personas</strong>: Develop simple profiles of your target users, outlining their goals, challenges, and preferences. For example, if you’re building a productivity app, your persona might be a busy freelancer who values speed and simplicity.</li>



<li><strong>Map user journeys</strong>: Sketch the step-by-step flow of how users interact with your app. Identify any potential friction points and eliminate them.</li>
</ul>



<h4 class="wp-block-heading">Example:</h4>



<p>Imagine you’re building a budgeting app. Your user persona might be a young professional who wants to track expenses quickly. A user-centered approach prioritizes features like one-tap expense logging and clear, visual summaries of spending.</p>



<h3 class="wp-block-heading">2. <strong>Keep It Simple and Intuitive</strong></h3>



<p>Users shouldn’t need a manual to figure out how to use your app. Simplicity doesn’t just mean fewer features; it means making the most important features easy to find and use.</p>



<h4 class="wp-block-heading">Action Steps:</h4>



<ul class="wp-block-list">
<li><strong>Follow established patterns</strong>: Use common design conventions, such as a bottom navigation bar for key actions. Users are already familiar with these patterns, so don’t reinvent the wheel.</li>



<li><strong>Limit choices</strong>: Avoid overwhelming users with too many options or settings. Focus on the core functionality that solves their problem.</li>



<li><strong>Prioritize clarity</strong>: Use simple, descriptive labels for buttons and menus. Avoid jargon or ambiguous terms.</li>
</ul>



<h4 class="wp-block-heading">Example:</h4>



<p>Take inspiration from apps like Instagram. Its clean design makes it instantly clear how to post a photo, view stories, or explore content. Even as a solo developer, you can achieve a similar level of clarity by focusing on simplicity.</p>



<h3 class="wp-block-heading">3. <strong>Optimize for Mobile First</strong></h3>



<p>Mobile screens are small, so every pixel counts. Designing for mobile-first means giving priority to usability on smaller screens before addressing larger screens.</p>



<h4 class="wp-block-heading">Action Steps:</h4>



<ul class="wp-block-list">
<li><strong>Use responsive design</strong>: Ensure your app looks and works great on a wide range of screen sizes, from small phones to large tablets.</li>



<li><strong>Design for touch</strong>: Make buttons and interactive elements easy to tap with a finger. Aim for a minimum touch target size of 48&#215;48 pixels.</li>



<li><strong>Focus on readability</strong>: Use legible font sizes (at least 16px for body text) and maintain sufficient contrast between text and background colors.</li>
</ul>



<h4 class="wp-block-heading">Example:</h4>



<p>Consider a to-do list app. A mobile-first approach designs a clean, vertical layout with large, tappable checkboxes, ensuring users can quickly mark tasks as complete on the go.</p>



<h3 class="wp-block-heading">4. <strong>Embrace Visual Hierarchy</strong></h3>



<p>Visual hierarchy refers to the arrangement of elements to guide users’ attention. When done well, users understand what’s most important at a glance.</p>



<h4 class="wp-block-heading">Action Steps:</h4>



<ul class="wp-block-list">
<li><strong>Use size and color strategically</strong>: Make primary actions (e.g., “Submit” buttons) larger and more visually distinct than secondary actions.</li>



<li><strong>Group related elements</strong>: Use spacing to visually group related items, such as form fields or menu options.</li>



<li><strong>Leverage typography</strong>: Use different font sizes and weights to create contrast between headings, subheadings, and body text.</li>
</ul>



<h4 class="wp-block-heading">Example:</h4>



<p>In a fitness app, display the user’s daily step count in a bold, colorful header, while less critical information (e.g., weekly trends) appears in smaller, subdued text below.</p>



<h3 class="wp-block-heading">5. <strong>Focus on Performance and Speed</strong></h3>



<p>No one likes a slow app. Performance is a key part of the user experience, and it’s especially important for mobile apps, where users expect instant responsiveness.</p>



<h4 class="wp-block-heading">Action Steps:</h4>



<ul class="wp-block-list">
<li><strong>Optimize assets</strong>: Compress images and use vector graphics where possible to reduce load times.</li>



<li><strong>Minimize animations</strong>: While animations can enhance UX, overusing them slows down your app. Use them sparingly and purposefully.</li>



<li><strong>Test on real devices</strong>: Don’t rely solely on simulators. Test your app on actual devices to ensure smooth performance.</li>
</ul>



<h4 class="wp-block-heading">Example:</h4>



<p>If you’re building a weather app, users expect the current weather to load quickly. Preload data where possible and optimize your API calls for speed.</p>



<h3 class="wp-block-heading">6. <strong>Iterate and Test Continuously</strong></h3>



<p>Design is an iterative process. Even the best initial design can be enhanced through user feedback and continuous refinement.</p>



<h4 class="wp-block-heading">Action Steps:</h4>



<ul class="wp-block-list">
<li><strong>Start with a minimum viable product (MVP)</strong>: Focus on the core functionality and get it into users hands quickly.</li>



<li><strong>Gather feedback</strong>: Use surveys, app store reviews, or in-app feedback tools to understand what users like and dislike.</li>



<li><strong>Refine based on data</strong>: Analyze user behavior (e.g., which features are most used) and improve accordingly.</li>
</ul>



<h4 class="wp-block-heading">Example:</h4>



<p>When developing a language learning app, you might discover that users struggle with navigation. Based on feedback, simplify the menu structure or add tooltips to guide new users.</p>



<h2 class="wp-block-heading">Tools to Simplify Design for Solo Developers</h2>



<p>As a solo developer, you don’t need to reinvent the wheel. Leverage tools that streamline the design process:</p>



<ul class="wp-block-list">
<li><strong>Figma</strong>: A powerful design tool for creating wireframes and prototypes.</li>



<li><strong>Xojo</strong>: Xojo’s drag-and-drop interface, combined with its easy-to-learn language, makes creating mobile apps across different form factors straightforward.</li>



<li><strong>Canva</strong>: Great for creating simple, clean graphics for your app.</li>
</ul>



<h2 class="wp-block-heading">Conclusion: You’ve Got This!</h2>



<p>Designing a mobile app as a solo developer is no small feat, but by following these principles, you can create apps that are both functional and enjoyable to use. Remember to start with your users in mind, focus on simplicity and clarity, and continuously refine your work based on feedback.</p>



<p><strong>Your Next Step:</strong> Take a look at your current project (or start a new one!) and apply at least one of the principles discussed in this article. Need a mobile app development platform? Check out <a href="https://xojo.com" data-type="link" data-id="https://xojo.com" target="_blank" rel="noreferrer noopener">Xojo</a> for an intuitive, developer-friendly way to bring your app ideas to life.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo for 4D Developers</title>
		<link>https://blog.xojo.com/2024/12/10/xojo-for-4d-developers/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Tue, 10 Dec 2024 23:35:07 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[4D]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14178</guid>

					<description><![CDATA[If you are a longtime 4D developer you may recognize my name because I worked for 4D, Inc. (then ACIUS, Inc.) back in the early&#8230;]]></description>
										<content:encoded><![CDATA[
<p>If you are a longtime 4D developer you may recognize my name because I worked for 4D, Inc. (then ACIUS, Inc.) back in the early 1990s, as well as authored a book about 4D. But my experience with 4D goes back even further to 1987 when I began using 4D to build database applications for consulting clients. Over time I found the need to build more general purpose applications. This ultimately resulted in my founding the company that has become Xojo, Inc. and developing and publishing what is now Xojo for the last 28 years. Now, with my credentials out of the way, let’s talk about what Xojo can offer 4D developers.</p>



<p>Like 4D, Xojo has a drag and drop user interface builder, a Code Editor, a Debugger and a Compiler as well as a cross-platform framework. While 4D now has an object-oriented language as an option, Xojo has always been object-oriented. The language is a dot syntax not unlike Javascript. You do not have to become an experienced object-oriented programmer to use Xojo. One of its strengths is that you can learn incrementally.</p>



<p>Xojo supports database application development but there are differences between how it and 4D handles that. 4D has its own database engine and query syntax. Xojo supports SQLite, PostgreSQL, MySQL and ODBC for accessing databases. Unsurprisingly it uses SQL as its query syntax. Because 4D is solely designed for database application development, it ties the user interface you create to tables in the database. Xojo does not. 4D&#8217;s model prevents you from having to write code to get data from database records in and out of your user interface. While by default Xojo does not provide this, it provides an add-on called <a href="https://documentation.xojo.com/topics/databases/dbkit.html" target="_blank" rel="noreferrer noopener">DBKit</a> which assists you in connecting to and interacting with databases.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="660" src="https://blog.xojo.com/wp-content/uploads/2024/12/dbkit_window-1024x660.png" alt="" class="wp-image-14180" srcset="https://blog.xojo.com/wp-content/uploads/2024/12/dbkit_window-1024x660.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/12/dbkit_window-300x193.png 300w, https://blog.xojo.com/wp-content/uploads/2024/12/dbkit_window-768x495.png 768w, https://blog.xojo.com/wp-content/uploads/2024/12/dbkit_window-1536x990.png 1536w, https://blog.xojo.com/wp-content/uploads/2024/12/dbkit_window-2048x1320.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Xojo supports desktop development for Linux, macOS, Windows and Raspberry Pi (Linux on ARM). It supports web development as well and mobile development for iOS and Android. You can also build console apps which can be handy when you need an app with no user interface to run on a server. Xojo uses native controls and compiles to native machine code for x86 and ARM. Whether you come to Xojo to build desktop, web or mobile apps, you&#8217;ll find that 95% of what you learn and the code you write will be applicable to all targets. With the exception of iOS (which because of Apple&#8217;s requirements must be built from a Mac) you can build your apps from any platform to any platform. Xojo also includes a Remote Debugger which allows you to build from one operating system and run on another. For example, you might do your development on macOS but want to debug on Windows to track down a Windows-specific issue. With the Remote Debugger, this is quite easy.</p>



<p>Xojo is free to use for development. You only purchase a license when you need to deploy. This is a developer license, not a deployment license. That means that you can deploy as many applications as you like to as many users as you like, without any additional cost. Each developer purchases their own license. A Xojo license comes with 12 months of updates. The new Xojo releases available during your license period continue to be available to you even after your license expires. Renewing your license gets you another 12 months of updates. If you only need to deploy cross-platform desktop applications, the Xojo Desktop license is $399USD. Yearly updates are also $399USD. If you wish to build for any platform we support, the Pro license is $799USD. Yearly updates are also $799USD. <a href="https://xojo.com/store/#prettyPhoto/0/" target="_blank" rel="noreferrer noopener">Compare licenses</a> and find more pricing details at <a href="https://xojo.com/store/" target="_blank" rel="noreferrer noopener">our webstore</a>.</p>



<p>If you&#8217;d like to give Xojo a spin, I recommend starting with the <a href="https://documentation.xojo.com/getting_started/quickstarts/desktop_quickstart.html" target="_blank" rel="noreferrer noopener">QuickStart</a> and then the <a href="https://documentation.xojo.com/getting_started/tutorials/desktop_tutorial.html" target="_blank" rel="noreferrer noopener">full tutorial</a>. After that, check out <a href="https://documentation.xojo.com/topics/databases/dbkit.html" target="_blank" rel="noreferrer noopener">DBKit</a>, the <a href="https://www.youtube.com/watch?v=3Jjf1Xrnm2w&amp;t=401s" target="_blank" rel="noreferrer noopener">video</a> and its <a href="https://documentation.xojo.com/getting_started/tutorials/dbkit_desktop_tutorial.html" target="_blank" rel="noreferrer noopener">tutorial</a> which will make it easier to build database-oriented applications. These are the desktop tutorials but there are also <a href="https://documentation.xojo.com/getting_started/tutorials/index.html" target="_blank" rel="noreferrer noopener">tutorials for mobile and web application development</a>. Because Xojo is a general, cross-platform development tool rather than one specifically for database applications, what you build with it is truly limited only by your imagination. If you have any further questions, please <a href="https://xojo.com/company/contact.php" target="_blank" rel="noreferrer noopener">reach out to us</a>. Our <a href="https://forum.xojo.com" target="_blank" rel="noreferrer noopener">user forum</a> is also filled with experienced and enthusiastic Xojo users that answer and have answered hundreds of questions. And the <a href="https://blog.xojo.com/tag/database/" target="_blank" rel="noreferrer noopener">Xojo Blog</a> has many posts on database development with Xojo.</p>



<p><em>Geoff Perlman is the Founder and CEO of Xojo. When he’s not leading the Xojo team he can be found playing drums in Austin, Texas and spending time with his family.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo Web Rescues a .NET Project</title>
		<link>https://blog.xojo.com/2024/10/23/xojo-web-rescues-a-net-project/</link>
		
		<dc:creator><![CDATA[Wayne Golding]]></dc:creator>
		<pubDate>Wed, 23 Oct 2024 16:40:14 +0000</pubDate>
				<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[URLConnection]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13909</guid>

					<description><![CDATA[I had a call recently from a customer whose upstream supplier informed them that they would not be accepting anything less than TLS 1.2 encryption.&#8230;]]></description>
										<content:encoded><![CDATA[
<p>I had a call recently from a customer whose upstream supplier informed them that they would not be accepting anything less than TLS 1.2 encryption. The customer’s application is written using .NET 1.1 (they are testing a new version but aren’t ready to deploy to production just yet). Their supplier insisted on a 1-week time limit. Can I help?</p>



<p>My answer was, of course, “Let me have a look and get back to you.”</p>



<p>I went to my favourite dev tool, Xojo, and went through the process of developing a solution.&nbsp;The connection is a REST API, so I’ll start with a web project and use the HandleURL event. And I’ll use a URLConnection to pass on the request.&nbsp; Wait … could it be that simple?</p>



<pre class="wp-block-code"><code>Function HandleURL(request As WebRequest, response As WebResponse) Handles HandleURL as Boolean

  // Create the outbound connection
  Var connector As New URLConnection
 
  // Copy the content of the request
  connector.SetRequestContent(request.Body, request.MIMEType)

  // Send the request
  Var result As String
  Try
    result = connector.SendSync("POST", kAddress + request.Path)
  Catch err As RuntimeException
    // Catch DNS, Certificate &amp; Timeout errors
    response.Status = 500
    response.Write(err.Message)
    Return True
  End

  // Return the result of the request
  response.Status = connector.HTTPStatusCode
  response.Write(result)

  Return True

End Function</code></pre>



<p>The answer is, &#8220;Yes!&#8221;&nbsp; This is all the code in the entire project.</p>



<p>You will notice that there is no security, but in this instance that is fine as the virtual machine is running this is on the same network as the client server and the firewall is configured to only allow connections from that server.</p>



<p>After processing over 60 thousand requests, memory use is 7.3MB and never exceeded 13MB.&nbsp;CPU usage was at the maximum 1.5%.</p>



<p>Even after using Xojo for 20 years this still blows my mind.</p>



<p><em>Wayne Golding has been a Xojo developer since 2005 and is a Xojo MVP. He operates the IT Company <a href="http://www.axisdirect.nz">Axis Direct Ltd </a>which primarily develops applications using Xojo that integrate with Xero www.xero.com. Wayne’s hobby is robotics where he uses Xojo to build applications for his Raspberry Pi, often implementing IoT for remote control.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Spotlight On: LX Aer</title>
		<link>https://blog.xojo.com/2024/08/14/spotlight-on-lx-aer/</link>
		
		<dc:creator><![CDATA[Alyssa Foley]]></dc:creator>
		<pubDate>Wed, 14 Aug 2024 15:50:42 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Educational]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Spotlight On]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13446</guid>

					<description><![CDATA[Spotlight On posts focus on Xojo community members. We’ll use this space to tell the stories of people using Xojo, share amazing Xojo-made apps and&#8230;]]></description>
										<content:encoded><![CDATA[
<p><em>Spotlight On posts focus on Xojo community members. We’ll use this space to tell the stories of people using Xojo, share amazing Xojo-made apps and spread awareness of community resources. If you have an app, a project or a person you want to see featured in Spotlight On,&nbsp;<a href="mailto:hello@xojo.com" target="_blank" rel="noreferrer noopener">tell us about it</a>!</em></p>



<p>LX Aer is an AI-powered educational platform developed by student-turned-entrepreneur Leo Medvinsky. In 2020 as the pandemic forced schools to begin using remote learning tools, Leo, a student at the time, saw the gaps and the flaws in the tools he was offered and did what so many Xojo developers do, he decided to build something better. A quick view of LX Aer demonstrates it&#8217;s the solution someone who actually uses such a system would create. LX Aer is a modern take on the LMS with a user interface that centers the student and teacher. Currently, LX Aer uses Xojo Web for the backend and the project has 30,000 lines of Xojo code and growing.</p>



<h2 class="wp-block-heading">10 Questions with Leo Medvinsky of LX Aer</h2>



<h3 class="wp-block-heading">Using Xojo Web for just the backend (web services) is somewhat surprising, tell us about that?</h3>



<p>The LX Aer web app is designed to be the digital hub for students, teachers, and soon, administrators. The original web app was written in between 2020 and 2021 and used Xojo Web for some web service work but was mainly used the conventional way for Xojo Web pages. To increase speed and reliability as well as to improve performance, the decision was made that our next product (a standalone attendance tracking system) would be written using Xojo Web as a backend, with a Xojo iOS app and a standard HTML/CSS/JS web app to accompany it. We found that Xojo Web was a great way for us to have business logic on the backend, with great performance and amazing ease of management with Tim Parnell’s Lifeboat. When, in 2022, we were unifying this attendance system into the LX Aer suite, it was decided that the LX Aer suite would be combined into the attendance technology stack, rather than the other way around. This was a large time investment as it involved rewriting and rethinking significant portions of the existing product offering but has brought our software to a much stronger position.</p>



<h3 class="wp-block-heading">What is your experience with Xojo Web performance for larger scale apps like LX Aer?</h3>



<p>Up until recently, when we began self-hosting most things, we had two instances of the LX Aer Backend running on a Debian server in AWS with just 2 GB of RAM and performance was very good. We are actively developing solutions to allow for much greater scalability and distribution of load across not just instances (with Lifeboat), but across several different servers. Our database server runs CubeSQL, and Marco and I have been discussing ways to implement database sharding into CubeSQL to allow for greater scalability. While we are a startup without too many users right now, LX Aer needs to be able to support the thousands of users each school brings, along with all of their data requirements.</p>



<h3 class="wp-block-heading">Can you tell us why Xojo was chosen as the backend and what other options were ruled out?</h3>



<p>My first programming language was Visual Basic .NET. The original software I had was a simple quizzing application designed to help the user study for tests, but it could only run on Windows. This was a significant limitation. I (mostly) loved the syntax of VB compared to other languages I’ve worked with (Python, C++, Swift…), so I decided to try Xojo when I came across it in 2020. It was an <em>amazing</em> feeling to be able to write with the syntax I already knew to and make an iOS app, albeit a limited one, the same day I downloaded Xojo. Having experimented with Xojo, I started working on major projects in it very soon, and when a web development need came up, it was my go-to. Over the years, I have considered many alternatives, and many in the developer community (not Xojo’s) have discouraged me from relying on a proprietary language for such critical software, but I have never had any interest in switching. Every step of the way, Xojo has scaled with our needs.</p>



<h3 class="wp-block-heading">Mac, Windows or Linux?</h3>



<p>I flip-flop constantly between my dev machine, a Mac, and my business machine, a Surface. I tried many Linux distros on several occasions and have never been much of a fan of it as a consumer operating system.</p>



<h3 class="wp-block-heading">What do you wish more people would ask/talk to you about when it comes to LX Aer?</h3>



<p>Security. LX Aer’s tagline is “Security, Reliability, Innovation.” Notice how “security” comes first. While the Aer Intelligence<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> platform offers incredible AI tools built into LX Aer to improve educational outcomes, and this is one of the largest attention grabbers, I would argue that security is our most interesting innovation. Having graduated from high school just over a year ago, I recall when I found my student data leaked online after a massive breach of PupilPath, a learning management system that my school used at the time. I also recall the school I transferred to for my senior year and the software they used, Genesis, which allows a user to view their own password in plaintext after logging on. This, among other things, motivated me to always put security first. In 2023, we launched LX SecurShield<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />, which provides encryption for student data WITHOUT storing keys on the server, while still allowing a user to seamlessly log on from any device, without any of the hassle typically associated with client-side encryption. LX SecurShield<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> is truly unique and is something I wish more people took an interest in.</p>



<h3 class="wp-block-heading">How would you explain your most recent project to a 5-year-old?</h3>



<p>LX Aer is creating an AI chatbot that will help teachers teach and students learn!</p>



<h3 class="wp-block-heading">What&#8217;s next on your &#8220;Learn Next&#8221; list?</h3>



<p>Tough question… maybe French?</p>



<h3 class="wp-block-heading">What programming moments made you think “Wow, I love my job so much”?</h3>



<p>I’ve always been technically minded, but I have seen it as a means to an end, rather than the end itself. I never wrote code for the sake of writing code. I always had a long-term project in mind. LX Aer has been a project of mine for over 4.5 years, and has changed immensely from March 2020, when it first began. Consequently, the programming moments that made me think how much I love my job were when I was able to finally push an innovation over the edge into a working state. When I was developing LX SecurShield<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />, it required significant portions of LX Aer to be rewritten to support the new encryption. After developing a proof of concept, I worked almost nonstop for close to a week to develop it into a usable and stable state, with several all-nighters along the way. At the end of it all, I thought, “wow, I love my job so much, even with all the craziness associated with it!”</p>



<h3 class="wp-block-heading">What is something that has surprised you about coding in the last <s>10</s> 5 years?</h3>



<p>10 years ago, I was 8 and had no experience writing code <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/263a.png" alt="☺" class="wp-smiley" style="height: 1em; max-height: 1em;" /> (though I was still the go-to tech support for my friends/family). This is a tough question, but if I had to pick it would be the difference in writing code for someone else vs. writing code for your own company. Writing code for someone else is 1,000x more difficult than writing code when you’re your own boss. As for something in the industry itself, I am always surprised by the tendency of web developers to jump around from platform to platform… Angular, React, etc. It just fascinates me.</p>



<h3 class="wp-block-heading">What is a piece of software more people should know about?</h3>



<p>To those in the Xojo community writing a web service, I cannot recommend Tim Parnell’s Lifeboat and Marco Bambini’s CubeSQL enough. To anyone working with cryptography, Björn Eiriksson’s Einhugur plugins are just incredible!&nbsp;</p>



<p>To people in general, I think it would be great if more people knew about Proton. They’re a Swiss company that develops mail, cloud storage, calendar, VPN, and password storage software, all of which uses client-side encryption and is easy-to-use. They were my inspiration for LX SecurShield<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />.&nbsp;</p>



<h3 class="wp-block-heading">What&#8217;s something you worked on recently that you are excited about?</h3>



<p>It would be somewhat cliché to say that I am excited about AI (Aer Intelligence<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />), but I am. Especially in the EdTech industry, I see so much potential for it to improve educational outcomes and make lives easier for overworked teachers.&nbsp; With our software having won the Pitchfest award at the prestigious Future of Education Technology Conference this year, I believe, largely because of our AI capabilities, I think it isn’t just the LX Aer team that’s excited about AI in education.</p>



<p>Thank you to Leo Medvinsky for answering our questions. If you want to learn more about LX Aer visit&nbsp;<a href="https://www.lxaer.com/" target="_blank" rel="noreferrer noopener">https://www.lxaer.com/</a>. To all those in the Xojo community, as a token of gratitude, Leo is offering a free license until December 31<sup>st</sup>, 2024. Email <a href="mailto:sales@lxaer.com" target="_blank" rel="noreferrer noopener">sales@lxaer.com</a> and say that you’re part of the Xojo community! &#8220;Although I have not been very active in the Xojo community in terms of engagement,&#8221; Leo says, &#8220;without the exceptionally great resource that is the Xojo Programming Forum, as well as the software and plugins made by those in the community, such as Tim Parnell, Marco Bambini, Christian Schmitz, Björn Eiriksson, and Sam Rowlands, none of this would have been possible.&#8221; See the full LX Aer Xojo community credits at <a href="https://www.lxaer.com/credits" target="_blank" rel="noreferrer noopener">https://www.lxaer.com/credits</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How Xojo Simplifies Full-Stack Development for Everyone</title>
		<link>https://blog.xojo.com/2024/08/07/how-xojo-simplifies-full-stack-development-for-everyone/</link>
		
		<dc:creator><![CDATA[Gabriel Ludosanu]]></dc:creator>
		<pubDate>Wed, 07 Aug 2024 17:30:00 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Full-Stack Development]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13360</guid>

					<description><![CDATA[The demand for skilled full-stack developers continues to grow in 2024. These developers handle both the frontend and backend of applications, ensuring a smooth user&#8230;]]></description>
										<content:encoded><![CDATA[
<p>The demand for skilled full-stack developers continues to grow in 2024. These developers handle both the frontend and backend of applications, ensuring a smooth user experience from start to finish. As businesses strive to deliver robust, efficient and visually appealing applications, developers and their choice of programming tools can impact the speed, scalability and overall performance of a full software solution.</p>



<p>Presented with choosing what development tool is best for your main, full-stack development needs, let’s discuss the benefits of Xojo development platform for your next web project. With its simplicity, flexibility, and powerful features, Xojo will help you create high-quality web applications quickly and efficiently, with the added bonus of covering backend and frontend development in the same IDE—no more language switching—while also lowering your overall costs.</p>



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



<h2 class="wp-block-heading">Overview of Full-Stack Development</h2>



<p>Full-stack development covers the entire spectrum of technologies and skills required to create a fully functional web application. This approach involves both the frontend, which users interact with directly, and the backend, which powers the application.</p>



<p>At its core, full-stack development refers to the ability to work on both the client-side and server-side of an application. This means that full-stack developers should be proficient in frontend technologies such as HTML, CSS, JavaScript, as well as backend technologies like Node.js, Python, and frameworks such as React and Django. Full-stack developers possess a broad skill set that includes designing user interfaces, managing databases, and server logic, enabling them to oversee the entire development process.</p>



<p><strong>Usually, a full-stack developer handles:</strong></p>



<ul class="wp-block-list">
<li><strong>Frontend Technologies:</strong> These consist of HTML for structure, CSS for styling, and JavaScript for interactivity, crucial for crafting engaging user interfaces. Frameworks such as React, Angular, and Vue.js are also typical choices for building dynamic web applications.</li>



<li><strong>Backend Technologies</strong>: This segment covers server-side programming languages like Node.js, Python, Ruby, and PHP, coupled with frameworks such as Express, Django, and Ruby on Rails, essential for robust backend development. Databases, both relational (e.g., MySQL, PostgreSQL) and NoSQL (e.g., MongoDB), are also crucial for data management.</li>



<li><strong>APIs (Application Programming Interfaces):</strong> APIs enable simple communication between frontend clients and backend applications/servers, facilitating the exchange of data. RESTful APIs and GraphQL are common approaches used in modern web applications.</li>
</ul>



<p><strong>Advantages in adopting a full-stack approach in software development:</strong></p>



<ul class="wp-block-list">
<li><strong>Faster Development Cycles:</strong> With a single developer or a small team capable of handling both frontend and backend tasks, projects can progress more quickly, reducing the time to market.</li>



<li><strong>Easy Integration:</strong> Full-stack developers have a comprehensive understanding of how the different components of an application interact, leading to better integration and fewer compatibility issues.</li>



<li><strong>Enhanced Problem-Solving:</strong> By possessing a complete view of the application, full-stack developers can identify and resolve issues more efficiently, improving overall project quality.</li>
</ul>



<h2 class="wp-block-heading">Why choose Xojo as a full-stack development solution?</h2>



<p>When it comes to full-stack development, selecting the right programming language(s) or frameworks can significantly impact the efficiency and effectiveness of your projects. Xojo is a powerful choice for anyone seeking a robust, user-friendly and versatile development environment that provides everything needed to transform their ideas into fully fledged, working software products, no matter the platform or environment.</p>



<p><strong>Xojo features ideal for full-stack development</strong>:</p>



<ul class="wp-block-list">
<li><strong>Built-in Web Server:</strong> Xojo has its own built-in web server that allows developers to easily test and deploy web applications (on Linux or Windows servers) without the need for additional software. There is no need to set up complicated web server technologies or deal with compatibility issues and security. Xojo handles all of that for you. In production, you can run a web app built with Xojo as stand-alone or behind Apache or Nginx. You decide what works best for your project.</li>



<li><strong>Visual Development Environment:</strong> Xojo offers a visual development environment that allows developers to design user interfaces using drag-and-drop elements. This approach simplifies the process of creating appealing applications, accessible to both novice and experienced developers.</li>



<li><strong>Object-Oriented Programming:</strong> Xojo is object-oriented programming (OOP), enabling developers to create modular and reusable code. OOP encourages better organization and maintainability of applications, making it easier to scale projects over time.</li>



<li><strong>Compiled Code</strong>: Xojo compiles code into machine code, which results in fast and efficient web applications. In the event that some bad actors gain access to your server, rest assured that Xojo built web apps are more secure than those built with other tools.</li>
</ul>



<p>In addition to these features, while many programming languages cater to full-stack development by combining and utilizing multiple external solutions, Xojo distinguishes itself as an ideal, singular solution. Compared to languages like JavaScript, Ruby, PHP or Python, Xojo has a gentle learning curve, making it an attractive option for beginners. Its syntax is straightforward and resembles natural language, which helps new developers learn concepts quickly. Xojo’s visual tools and drag-and-drop features enable developers to prototype applications rapidly. This is particularly advantageous for startups and businesses looking to iterate and launch products quickly.</p>



<h2 class="wp-block-heading">Xojo for Frontend Development</h2>



<p>Creating an engaging and user-friendly frontend is crucial for any web application. With Xojo, developers can quickly prototype and design visually appealing interfaces without the need for 3rd party tools or additional frameworks.</p>



<p>Xojo&#8217;s visual development environment makes building user interfaces an easy and enjoyable thing. With its drag-and-drop interface, developers can easily design and layout their GUI components- buttons, labels, and text fields- without needing any code at all. This intuitive approach allows developers to focus on the logic of the application rather than getting bogged down by low-level details.</p>



<p>So, what makes Xojo&#8217;s frontend capabilities so effective? For starters, it allows frontend developers to quickly:</p>



<ul class="wp-block-list">
<li>Prototype and test ideas without writing code;</li>



<li>Easily create complex layouts and designs;</li>



<li>Focus on the logic of the application rather than the UI;</li>



<li>Collaborate more effectively with designers and other team members.</li>
</ul>



<p><strong>Example: A simple web app frontend built with Xojo</strong></p>



<p>To illustrate the power of Xojo&#8217;s visual development environment, let&#8217;s take a look at a simple web app frontend built using Xojo. In this example, we&#8217;ll create a basic to-do list application with a user-friendly interface without writing any HTML, CSS or JavaScript code.</p>


<div class="wp-block-image is-style-default">
<figure class="aligncenter is-resized"><img decoding="async" src="https://storage.googleapis.com/co-writer/images/HRIwK4xjWLXvNRyAbzXbq5t8wJF3/-1721820376046.webp" alt="Quickly building frontend with Xojo" style="width:915px;height:auto"/><figcaption class="wp-element-caption"><strong>This ToDo web app design can be quickly prototyped in under 10 minutes with Xojo.</strong></figcaption></figure>
</div>


<h2 class="wp-block-heading">Coding Backend Functionality and Connecting it to the Frontend</h2>



<p>While users interact with the frontend of apps, it&#8217;s the backend that does the heavy lifting, handling data and core functionality. Xojo makes building these backend systems easier for developers with useful features that create efficient server-side applications without unnecessary complexity. Xojo is a practical choice for developers who want to build solid, functional backends for web (and even desktop or mobile) apps without getting bogged down in overly complicated processes. Here are some notable aspects:</p>



<ul class="wp-block-list">
<li><strong>Database Integration:</strong> Xojo supports out-of-the box connections to a variety of databases, including MySQL/MariaDB, PostgreSQL, SQLite, and ODBC. Besides the built-in database classes, now there&#8217;s also the <a href="https://documentation.xojo.com/topics/databases/dbkit.html" target="_blank" rel="noreferrer noopener">DBKit</a> project and the new <a href="https://documentation.xojo.com/topics/databases/connecting_to_a_database.html" target="_blank" rel="noreferrer noopener">DatabaseConnection</a> project item.</li>



<li><strong>RESTful API Creation:</strong> Xojo makes it easy to create RESTful APIs, which are essential for enabling communication between the frontend and backend of a web application. By defining endpoints and handling HTTP requests and responses, developers can facilitate data exchange and enhance the interactivity of their varied applications and clients (web, desktop or mobile).</li>



<li><strong>Session Management:</strong> Managing user sessions is crucial for web applications, especially those that require user authentication. Xojo provides built-in support for easy session handling, allowing developers to track user activity and maintain state across different pages, improving the overall user experience.</li>
</ul>



<h2 class="wp-block-heading">Integrating the Frontend and Backend</h2>



<p>Full-stack development works best when the frontend and backend of an app work well together. Xojo makes this easier by offering a single app development software solution for both parts. Developers can use the same programming language throughout the whole project, which saves time and reduces complications. This approach helps programmers focus on creating a smooth user experience without switching between different tools or languages.</p>



<p>Here are some key points worth taking into account when you want to start building your next successful application:</p>



<ul class="wp-block-list">
<li><strong>Unified Language for Development:</strong> One of the standout features of Xojo is that it allows developers to work in one programming language, eliminating the need to switch between multiple languages like HTML, CSS, or JavaScript. This means that both the frontend and backend logic can be implemented using Xojo’s straightforward syntax, streamlining the development process, no matter the OS platform they&#8217;re building for.</li>



<li><strong>Single Integrated Development Environment (IDE):</strong> Xojo’s IDE serves as a centralized hub for managing both frontend design and backend coding. Developers can design user interfaces visually, drag and drop elements, and simultaneously write the corresponding backend code without needing to leave the IDE. This integration enables a more intuitive workflow, reducing the chances of errors and inconsistencies.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>As the demand for agile and efficient software development continues to rise, the choice of programming language solutions and frameworks can have a significant impact on both project timelines and budgets. Xojo stands out as a compelling alternative for developers and teams accustomed to traditional stacks like LAMP (Linux, Apache, MySQL, and PHP) or MEAN (MongoDB, Express.js, Angular, and Node.js) or any other.</p>



<p>For organizations and startups already familiar with other development stacks, transitioning to Xojo can lead to significant savings in training costs. Xojo’s intuitive interface and single programming language approach mean that team members can quickly adapt without needing extensive retraining. This is especially beneficial for companies looking to onboard new developers or expand their teams. And as an extra plus, using Xojo, you can expand your application supported platforms to include building native desktop clients (Mac, Windows, Linux) or mobile clients (iOS, Android) , all with just one codebase.</p>



<p>And let&#8217;s not forget that managing a full-stack application typically involves maintaining multiple technologies, which can result in higher operational costs. Xojo minimizes the need for additional languages and frameworks, resulting in lower maintenance overhead costs and increased efficiency in full-stack development. Updates, debugging, and scaling become more straightforward, allowing teams to allocate resources more effectively.</p>



<p><em>Is it fair to call Xojo not just a <strong>great full-stack development suite</strong> but a full-stack development suite that truly optimizes the entire development process and maximizes productivity?</em></p>



<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-16018d1d wp-block-buttons-is-layout-flex">
<div class="wp-block-button has-custom-width wp-block-button__width-75 is-style-fill" style="font-style:normal;font-weight:700"><a class="wp-block-button__link has-white-color has-text-color has-background has-link-color wp-element-button" href="https://xojo.com/download/" style="background-color:#00875a" target="_blank" rel="noreferrer noopener">Download and start using Xojo for free!</a></div>
</div>



<p><em>Gabriel is a digital marketing enthusiast who loves coding with Xojo to create cool software tools for any platform. He is always eager to learn and share new ideas!</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tutorial: Create QR Codes with vCard Information</title>
		<link>https://blog.xojo.com/2024/08/05/tutorial-create-qr-codes-with-vcard-information/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Mon, 05 Aug 2024 14:41:37 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[QR Code]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[vCard]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13391</guid>

					<description><![CDATA[It&#8217;s the 21st Century and it&#8217;s possible to share contacts with other people directly from your mobile phone, but let&#8217;s face it, business cards are&#8230;]]></description>
										<content:encoded><![CDATA[
<p>It&#8217;s the 21st Century and it&#8217;s possible to share contacts with other people directly from your mobile phone, but let&#8217;s face it, business cards are still a very common way to share personal contact information.</p>



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



<p>For some years now, it has been common for cards to include a <a href="https://www.qrcode.com/en/">QR code</a> that corresponds to the contact details so that, when scanned, they can be added directly to the Address Book on a device or computer.</p>



<p>This tutorial creates an app that generates QR codes with the embedded information in vCard format. Additionally, learn how to to export that file in vCard format and, if you want, include an image like a contact photograph or logo.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="2451" height="1488" src="https://blog.xojo.com/wp-content/uploads/2024/07/CompletedApp.png" alt="" class="wp-image-13405" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/CompletedApp.png 2451w, https://blog.xojo.com/wp-content/uploads/2024/07/CompletedApp-300x182.png 300w, https://blog.xojo.com/wp-content/uploads/2024/07/CompletedApp-1024x622.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/07/CompletedApp-768x466.png 768w, https://blog.xojo.com/wp-content/uploads/2024/07/CompletedApp-1536x933.png 1536w, https://blog.xojo.com/wp-content/uploads/2024/07/CompletedApp-2048x1243.png 2048w" sizes="auto, (max-width: 2451px) 100vw, 2451px" /></figure>
</div>


<p>Download <a href="https://www.xojo.com/download">Xojo</a> and install it on your computer just as you would do with any other application on your operating system of choice (macOS, Windows or Linux).</p>



<p>Once Xojo is installed, launch it and select Desktop in the Choose a Project window. Enter the desired name for this application, as well as the name of the company, etc. You can leave the values presented as default or change them to those of your choice.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1762" height="1182" src="https://blog.xojo.com/wp-content/uploads/2024/07/1-ProjectSelector.png" alt="" class="wp-image-13392" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/1-ProjectSelector.png 1762w, https://blog.xojo.com/wp-content/uploads/2024/07/1-ProjectSelector-300x201.png 300w, https://blog.xojo.com/wp-content/uploads/2024/07/1-ProjectSelector-1024x687.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/07/1-ProjectSelector-768x515.png 768w, https://blog.xojo.com/wp-content/uploads/2024/07/1-ProjectSelector-1536x1030.png 1536w" sizes="auto, (max-width: 1762px) 100vw, 1762px" /></figure>
</div>


<h2 class="wp-block-heading">Designing the User Interface</h2>



<p>This is the process that will likely take us the longest (with the most steps required). Through this process we will see how to use the Container control to our advantage to compartmentalize different aspects of the UI and also the logic associated with each of these components. Let&#8217;s get started!</p>



<h3 class="wp-block-heading">Personal Data Container</h3>



<p>Click the Library button to access the library that displays all of the user interface controls included by default in Xojo for Desktop projects.</p>



<p>Locate the Container control and drag it onto the Project Navigator. This is the vertical area on the left side of the IDE window where all the elements added to the project are displayed.</p>



<p>When you release the control over the Project Navigator you will see that it is added as a new component and the associated Inspector Panel will appear in the right area of the IDE window. Change the following values using the Inspector Panel:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> PersonalInfoContainer</li>



<li><strong>Width:</strong> 374</li>



<li><strong>Height:</strong> 302</li>
</ul>



<p>With the PersonalInfoContainer control still selected in the Navigator, access the Layout Editor for that control by clicking on the Library icon again. Locate the GroupBox control and double-click on it so it is automatically added to the Layout Editor for the container. Use the following values in the associated Inspector Panel:</p>



<ul class="wp-block-list">
<li><strong>Left:</strong> 0</li>



<li><strong>Top:</strong> 0</li>



<li><strong>Width:</strong> 374</li>



<li><strong>Height:</strong> 302</li>



<li><strong>Locking:</strong> Close the four locks</li>



<li><strong>Caption:</strong> Personal Information</li>
</ul>



<p>Next we will add both the labels and the text fields on the GroupBox1 control so the user can enter the data from which both the vCard and the QR will be created with said information.</p>



<p>Add Label and TextField controls from the library so the user interface looks like this:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1064" height="1016" src="https://blog.xojo.com/wp-content/uploads/2024/07/2-PersonalInfoLabels.png" alt="" class="wp-image-13393" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/2-PersonalInfoLabels.png 1064w, https://blog.xojo.com/wp-content/uploads/2024/07/2-PersonalInfoLabels-300x286.png 300w, https://blog.xojo.com/wp-content/uploads/2024/07/2-PersonalInfoLabels-1024x978.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/07/2-PersonalInfoLabels-768x733.png 768w" sizes="auto, (max-width: 1064px) 100vw, 1064px" /></figure>
</div>


<p>Select all the Label items and change the following attribute in the Inspector panel (the change will be applied to all the selection):</p>



<ul class="wp-block-list">
<li><strong>Text Alignment:</strong> Right</li>
</ul>



<p>Next, enter the following values for each of the Labels, selecting them one by one from the top to the bottom:</p>



<p><strong>Label1</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> NameLB</li>



<li><strong>Text:</strong> Name:</li>
</ul>



<p><strong>Label2</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> SurnameLB</li>



<li><strong>Text:</strong> Surname:</li>
</ul>



<p><strong>Label3</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> CompanyLB</li>



<li><strong>Text:</strong> Company:</li>
</ul>



<p><strong>Label4</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> TitleLB</li>



<li><strong>Text:</strong> Title:</li>
</ul>



<p><strong>Label5</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> PhoneLB</li>



<li><strong>Text:</strong> Phone:</li>
</ul>



<p><strong>Label6</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> MobileLB</li>



<li><strong>Text:</strong> Mobile:</li>
</ul>



<p><strong>Label7</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> EmailLB</li>



<li><strong>Text:</strong> Email:</li>
</ul>



<p><strong>Label8</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> WebLB</li>



<li><strong>Text:</strong> Web:</li>
</ul>



<p>Next, select each of the Textfields, starting from the top, and enter the following values in the inspector panel associated with each of them:</p>



<p><strong>TextField1</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> NameTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p>TextField2</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> SurnameTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p>TextField3</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> CompanyTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p><strong>TextField4</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> TitleTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p>TextField5</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> PhoneTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p><strong>TextField6</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> MobileTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p><strong>TextField7</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> EmailTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p><strong>TextField8</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> WebTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p>When you&#8217;re done, the PersonalInfoContainer&#8217;s user interface will look like this:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1000" height="898" src="https://blog.xojo.com/wp-content/uploads/2024/07/3-PersonalInfoCompleted.png" alt="" class="wp-image-13394" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/3-PersonalInfoCompleted.png 1000w, https://blog.xojo.com/wp-content/uploads/2024/07/3-PersonalInfoCompleted-300x269.png 300w, https://blog.xojo.com/wp-content/uploads/2024/07/3-PersonalInfoCompleted-768x690.png 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>
</div>


<h3 class="wp-block-heading">Postal Address Container</h3>



<p>We&#8217;re done with the design of the container that will be used to enter the personal information data. Now, add a new Container to the Project Navigator and select it to access the associated Layout Editor.</p>



<p>Use the Inspector Panel to change the following values:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> PostalContainer</li>



<li><strong>Width:</strong> 398</li>



<li><strong>Height:</strong> 212</li>
</ul>



<p>Next, double-click the GroupBox control in the Library to add it to the new container, and change the following values using the associated inspector panel:</p>



<ul class="wp-block-list">
<li><strong>Left:</strong> 0</li>



<li><strong>Top:</strong> 0</li>



<li><strong>Width:</strong> 398</li>



<li><strong>Height:</strong> 212</li>



<li><strong>Locking:</strong> Close the four locks.</li>



<li><strong>Caption:</strong> Postal Address:</li>
</ul>



<p>Like we did in the previous container, this time add a total of five labels and as many text fields. The result should be similar to this:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="946" height="572" src="https://blog.xojo.com/wp-content/uploads/2024/07/4-PostalContainerLabels.png" alt="" class="wp-image-13395" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/4-PostalContainerLabels.png 946w, https://blog.xojo.com/wp-content/uploads/2024/07/4-PostalContainerLabels-300x181.png 300w, https://blog.xojo.com/wp-content/uploads/2024/07/4-PostalContainerLabels-768x464.png 768w" sizes="auto, (max-width: 946px) 100vw, 946px" /></figure>
</div>


<p>Align all labels to the right, just like we did with the previous Container. Then, from top to bottom, modify the following properties for each of them:</p>



<p><strong>Label1</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> StreetLB</li>



<li><strong>Text:</strong> Street:</li>
</ul>



<p><strong>Label2</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> PostcodeLB</li>



<li><strong>Text:</strong> Postcode:</li>
</ul>



<p><strong>Label3</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> CityLB</li>



<li><strong>Text:</strong> City:</li>
</ul>



<p><strong>Label4</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> ProvinceLB</li>



<li><strong>Text:</strong> Province:</li>
</ul>



<p><strong>Label5</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> CountryLB</li>



<li><strong>Text:</strong> Country or Region:</li>
</ul>



<p>And change the following values in the inspector panel for each of the TextFields, also from top to bottom</p>



<p><strong>TextField1</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> StreetTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p><strong>TextField2</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> PostalCodeTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p><strong>TextField3</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> CityTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p><strong>TextField4</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> ProvinceTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p><strong>TextField5</strong></p>



<ul class="wp-block-list">
<li><strong>Name:</strong> CountryTF</li>



<li><strong>Locking:</strong> Close the left, top and right locks.</li>
</ul>



<p>Once completed, the layout for the PostalContainer container will look similar to this:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1044" height="602" src="https://blog.xojo.com/wp-content/uploads/2024/07/5-PostalContainerCompleted.png" alt="" class="wp-image-13396" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/5-PostalContainerCompleted.png 1044w, https://blog.xojo.com/wp-content/uploads/2024/07/5-PostalContainerCompleted-300x173.png 300w, https://blog.xojo.com/wp-content/uploads/2024/07/5-PostalContainerCompleted-1024x590.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/07/5-PostalContainerCompleted-768x443.png 768w" sizes="auto, (max-width: 1044px) 100vw, 1044px" /></figure>
</div>


<h3 class="wp-block-heading">Completing the UI Design</h3>



<p>With the design of the two containers completed, it is time to add them to the main window of the project (Window1), as well as some remaining controls.</p>



<p>Start by selecting the Window1 item in the Navigator to display it in the Layout Editor. Next, drag the PersonalInfoContainer container and drop it onto the top of the right side of the window in the Layout Editor. It should look like this:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1326" height="1028" src="https://blog.xojo.com/wp-content/uploads/2024/07/6-PersonalContainerWindow.png" alt="" class="wp-image-13397" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/6-PersonalContainerWindow.png 1326w, https://blog.xojo.com/wp-content/uploads/2024/07/6-PersonalContainerWindow-300x233.png 300w, https://blog.xojo.com/wp-content/uploads/2024/07/6-PersonalContainerWindow-1024x794.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/07/6-PersonalContainerWindow-768x595.png 768w" sizes="auto, (max-width: 1326px) 100vw, 1326px" /></figure>
</div>


<p>With the Window1 item still selected in the Navigator, it is a good time to change some of its properties in the associated Inspector:</p>



<ul class="wp-block-list">
<li><strong>Width:</strong> 600</li>



<li><strong>Height:</strong> 604</li>



<li><strong>Minimum Width:</strong> 600</li>



<li><strong>Minimum Height:</strong> 604</li>



<li><strong>Maximum Width:</strong> 600</li>



<li><strong>Maximum Height:</strong> 604</li>



<li><strong>Title:</strong> QR From vCard &#8211; vCard Export</li>
</ul>



<p>Now, select the PostalContainer container and drop it just below the PersonalInfoContainer container in the Layout Editor for Window1. The result should look like this:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1356" height="1406" src="https://blog.xojo.com/wp-content/uploads/2024/07/7-PostalContainerWindow.png" alt="" class="wp-image-13398" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/7-PostalContainerWindow.png 1356w, https://blog.xojo.com/wp-content/uploads/2024/07/7-PostalContainerWindow-289x300.png 289w, https://blog.xojo.com/wp-content/uploads/2024/07/7-PostalContainerWindow-988x1024.png 988w, https://blog.xojo.com/wp-content/uploads/2024/07/7-PostalContainerWindow-768x796.png 768w" sizes="auto, (max-width: 1356px) 100vw, 1356px" /></figure>
</div>


<p>As you can see, the PostalContainer1 container is slightly wider than the PersonalInfoContainer1 item. Select the latter in the Window1 layout editor and use the left middle handle to drag it to the left until the alignment guide appears. This will mean that both containers are aligned.</p>



<p>Now, continue adding the necessary controls to finish the UI:</p>



<ul class="wp-block-list">
<li>An ImageWell control to display the image selected by the user for the vCard.</li>



<li>A button that, when pressed, allows the user to select the image to use in the vCard.</li>



<li>An ImageWell control that displays the preview of the QR generated from the vCard.</li>



<li>A button that, when pressed, allows you to create the QR from the vCard as well as assign the resulting image to the preview control.</li>



<li>A button that, when activated, allows the QR to be exported as an image file in PNG format.</li>



<li>A button that, when pressed, generates the vCard as a file with the selected name and location.</li>



<li>A last button that, when pressed, resets the UI to its default values.</li>
</ul>



<h3 class="wp-block-heading">Selecting the Contact Image</h3>



<p>The contact image selected by the user will be added as part of the vCard generated as a file but not to the QR code because it does not have enough room to accommodate such a large amount of information.</p>



<p>To do this we need to add two controls to Window1: an ImageWell and a Button. Start by adding an ImageWell control to the top left area of the Window1 window in the Layout Editor:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1276" height="1368" src="https://blog.xojo.com/wp-content/uploads/2024/07/8-ImageWellContactWindow.png" alt="" class="wp-image-13399" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/8-ImageWellContactWindow.png 1276w, https://blog.xojo.com/wp-content/uploads/2024/07/8-ImageWellContactWindow-280x300.png 280w, https://blog.xojo.com/wp-content/uploads/2024/07/8-ImageWellContactWindow-955x1024.png 955w, https://blog.xojo.com/wp-content/uploads/2024/07/8-ImageWellContactWindow-768x823.png 768w" sizes="auto, (max-width: 1276px) 100vw, 1276px" /></figure>
</div>


<p>Use the inspector panel associated with that control to change the following values:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> PersonPreview</li>



<li><strong>Left:</strong> 20</li>



<li><strong>Top:</strong> 20</li>



<li><strong>Width:</strong> 150</li>



<li><strong>Height:</strong> 150</li>
</ul>



<p>Next, drop a Button control just below the PersonPreview and use the associated inspector panel to modify the following values:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> OpenPictureBT</li>



<li><strong>Left:</strong> 20</li>



<li><strong>Top:</strong> 182</li>



<li><strong>Width:</strong> 150</li>



<li><strong>Height:</strong> 20</li>



<li><strong>Caption:</strong> Open Picture…</li>
</ul>



<p>The result should look something like this:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1370" height="1414" src="https://blog.xojo.com/wp-content/uploads/2024/07/9-OpenPictureBT.png" alt="" class="wp-image-13400" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/9-OpenPictureBT.png 1370w, https://blog.xojo.com/wp-content/uploads/2024/07/9-OpenPictureBT-291x300.png 291w, https://blog.xojo.com/wp-content/uploads/2024/07/9-OpenPictureBT-992x1024.png 992w, https://blog.xojo.com/wp-content/uploads/2024/07/9-OpenPictureBT-768x793.png 768w" sizes="auto, (max-width: 1370px) 100vw, 1370px" /></figure>



<h3 class="wp-block-heading">QR Preview and Export</h3>



<p>Now, continue with the UI items corresponding to the QR code preview and the buttons to create it, export the QR or export the vCard.</p>



<p>Drop a new ImageWell control from the library onto Window1 in the Layout Editor and modify the following attributes in the associated inspector panel:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> QRPreview</li>



<li><strong>Left:</strong> 20</li>



<li><strong>Top:</strong> 304</li>



<li><strong>Width:</strong> 150</li>



<li><strong>Height:</strong> 150</li>
</ul>



<p>Add a button just below QRPreview and use the following values in the associated Inspector Panel:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> CreateQRBT</li>



<li><strong>Left:</strong> 20</li>



<li><strong>Top:</strong> 466</li>



<li><strong>Width:</strong> 150</li>



<li><strong>Height:</strong> 20</li>



<li><strong>Caption:</strong> Create QR</li>
</ul>



<p>Add a new button under CreateQRBT and modify the following values in the inspector panel:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> ExportQRBT</li>



<li><strong>Left:</strong> 20</li>



<li><strong>Top:</strong> 498</li>



<li><strong>Width:</strong> 150</li>



<li><strong>Height:</strong> 20</li>



<li><strong>Caption:</strong> Export QR</li>



<li><strong>Enabled:</strong> Desactivado</li>
</ul>



<p>Add a new button just below ExportQRBT and modify the following values in the inspector panel:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> ExportVCardBT</li>



<li><strong>Left:</strong> 20</li>



<li><strong>Top:</strong> 530</li>



<li><strong>Width:</strong> 150</li>



<li><strong>Height:</strong> 20</li>



<li><strong>Caption:</strong> Export vCard</li>
</ul>



<p>Add the last of the required buttons, just below the PostalContainer1 container and use the following values in the inspector panel:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> ClearBT</li>



<li><strong>Left:</strong> 500</li>



<li><strong>Top:</strong> 562</li>



<li><strong>Width:</strong> 80</li>



<li><strong>Height:</strong> 20</li>



<li><strong>Locking:</strong> Close the bottom and right locks.</li>



<li><strong>Caption:</strong> Clear</li>
</ul>



<p>We have completed the UI design! This is how it should look:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1340" height="1398" src="https://blog.xojo.com/wp-content/uploads/2024/07/10-Completed-UI.png" alt="" class="wp-image-13401" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/10-Completed-UI.png 1340w, https://blog.xojo.com/wp-content/uploads/2024/07/10-Completed-UI-288x300.png 288w, https://blog.xojo.com/wp-content/uploads/2024/07/10-Completed-UI-982x1024.png 982w, https://blog.xojo.com/wp-content/uploads/2024/07/10-Completed-UI-768x801.png 768w" sizes="auto, (max-width: 1340px) 100vw, 1340px" /></figure>
</div>


<h2 class="wp-block-heading">Adding Functionality to the PersonalInfoContainer</h2>



<p>It&#8217;s time to add the code (functionality) to each of the components that need it. Start with PersonalInfoContainer, select it in the Navigator. With PersonalInfoContainer1 selected, choose the Insert &gt; Method menu option and use the following values in the associated inspector panel:</p>



<ul class="wp-block-list">
<li><strong>Method Name:</strong> GetPersonalInformation</li>



<li><strong>Return Type:</strong> String</li>



<li><strong>Scope:</strong> Public</li>
</ul>



<p>Adding the following code in the Code Editor associated with the newly added method:</p>



<pre class="wp-block-code"><code>Var fullName As String = Nametf.Text + " " + SurnameTF.Text

Var returnedValues() As String

If fullname.ReplaceAll(" ", "") &lt;> "" Then returnedValues.Add("FN:" + fullName)
If SurnameTF.Text &lt;> "" Or nametf.Text &lt;> "" Then returnedValues.Add("N:" + SurnameTF.Text + ";" + NameTF.Text + ";;;")
If CompanyTF.Text &lt;> "" Then returnedValues.Add("ORG:" + CompanyTF.Text + ";")
If TitleTF.Text &lt;> "" Then returnedValues.Add("TITLE:" + TitleTF.Text)
If PhoneTF.Text &lt;> "" Then returnedValues.Add("TEL;Type=HOME:" + PhoneTF.Text)
If MobileTF.Text &lt;> "" Then returnedValues.Add("TEL;Type=CELL:" + MobileTF.Text)
If EmailTF.Text &lt;> "" Then returnedValues.Add("EMAIL;Type=INTERNET;type=WORK;type=pref:" + EmailTF.Text)
If WebTF.Text &lt;> "" Then returnedValues.Add("URL:" + WebTF.Text)

Return String.FromArray(returnedValues, EndOfLine)</code></pre>



<p>As you can see, the code for this method is pretty easy to follow. Basically, only the fields in the vCard whose TextField contains values (i.e. are not empty) will be added to the ReturnedValues array. Similarly, and to keep the code as short as possible, this tutorial does not perform any kind of validation on the entered data.</p>



<p>Add a new method to PersonalInfoContainer that will be responsible for cleaning up the UI of that container; use the following values using the Inspector associated with the new method:</p>



<ul class="wp-block-list">
<li><strong>Method Name:</strong> Clear</li>



<li><strong>Scope:</strong> Public</li>
</ul>



<p>And type the following code in the associated Code Editor for the Clear method:</p>



<pre class="wp-block-code"><code>For Each ctl As DesktopUIControl In Self.Controls
  If ctl IsA DesktopTextField Then
    DesktopTextField(ctl).Text = ""
  End If
Next</code></pre>



<p>As you can see, this code loops through all the controls in the PersonalInfoContainer and uses the IsA keyword to check if the iterated control is a DesktopTextField. If it is, it then casts the iterated control to the DesktopTextField class to access its Text property and assign to it the empty string value (&#8220;&#8221;).</p>



<h3 class="wp-block-heading">Add Functionality to the PostalContainer</h3>



<p>Select the PostalContainer container in the Project Navigator. You will see that the functionality is very similar to that added in the previous one.</p>



<p>Create a new method and use the associated panel to change the following values:</p>



<ul class="wp-block-list">
<li><strong>Method Name:</strong> GetPostalInformation</li>



<li><strong>Return Type:</strong> String</li>



<li><strong>Scope:</strong> Public</li>
</ul>



<p>And type the following code in the Code Editor associated with the method:</p>



<pre class="wp-block-code"><code>Var returnedValue As String
Var inputValues() As String

inputValues.Add(StreetTF.Text)
inputValues.Add(CityTF.Text)
inputValues.Add(ProvinceTF.Text)
inputValues.Add(PostalCodeTF.Text)
inputValues.Add(CountryTF.Text)

Var address As String = String.FromArray(inputValues, ";")

If address.ReplaceAll(";","") &lt;> "" Then returnedValue = "ADR;type=WORK:;;" + address

Return returnedValue</code></pre>



<p>As you can see, it is very similar to the one above. The result will be the one corresponding to the &#8220;ADR&#8221; field of a vCard.</p>



<p>Add a second method with the following values in the inspector panel:</p>



<ul class="wp-block-list">
<li><strong>Method Name:</strong> Clear</li>



<li><strong>Scope:</strong> Public</li>
</ul>



<p>And write the following code in the associated editor:</p>



<pre class="wp-block-code"><code>For Each ctl As DesktopUIControl In Self.Controls
  If ctl IsA DesktopTextField Then
    DesktopTextField(ctl).Text = ""
  End If
Next</code></pre>



<p>In this case, the code is the same as the one used in the previous container when &#8220;resetting&#8221; its UI to the initial values.</p>



<h3 class="wp-block-heading">Add General Functionality to the Window</h3>



<p>Select Window1 in the Project Navigator and add a method using the following values using the Inspector Panel:</p>



<ul class="wp-block-list">
<li><strong>Method Name:</strong> GenerateVCARD</li>



<li><strong>Parameters:</strong> forVCardExport as Boolean = False</li>



<li><strong>Return Type:</strong> String</li>
</ul>



<p>And type the following code in the associated Code Editor:</p>



<pre class="wp-block-code"><code>Var vCard() As String
vCard.Add("BEGIN:VCARD")
vCard.Add("VERSION:3.0")
vCard.Add(PersonalInfoContainer1.GetPersonalInformation)
vCard.Add(PostalContainer1.GetPostalInformation)
If PersonPreview.Image &lt;> Nil And forVCardExport Then
  vCard.Add("PHOTO;ENCODING=BASE64;TYPE=JPEG:" + getPersonImage)
End If
vCard.Add("REV:" + GetRevisionTime)
vCard.Add("END:VCARD")

Return String.FromArray(vCard, EndOfLine)</code></pre>



<p>Add a second method with the following values:</p>



<ul class="wp-block-list">
<li><strong>Method Name:</strong> GetRevisionTime</li>



<li><strong>Return Type:</strong> String</li>
</ul>



<p>And type the following lines of code in the associated code editor:</p>



<pre class="wp-block-code"><code>Var current As DateTime = DateTime.Now
Var currentToUTC As DateTime = New DateTime(current.SecondsFrom1970 - current.Timezone.SecondsFromGMT)

Return currentToUTC.Year.ToString + currentToUTC.Month.ToString + currentToUTC.Day.ToString + "T" + currentToUTC.Hour.ToString + currentToUTC.Minute.ToString + currentToUTC.Second.ToString + "Z"</code></pre>



<p>Add the last of the general methods and use the following values in the Inspector:</p>



<ul class="wp-block-list">
<li><strong>Method Name:</strong> GetPersonImage</li>



<li><strong>Return Type:</strong> String</li>
</ul>



<p>Next, enter the following code into the associated editor:</p>



<pre class="wp-block-code"><code>Var returnedValue As String

Const kWidth as Double = 120
var pHeight as Double

If PersonPreview.Image &lt;> Nil Then
  
  pHeight = (kWidth * PersonPreview.Image.Height) / PersonPreview.Image.Width
  
  Var tempPic As New Picture(kWidth, pHeight)
  tempPic.Graphics.DrawPicture(PersonPreview.Image, 0, 0, kWidth, pHeight, 0, 0, PersonPreview.Image.Width, PersonPreview.Image.Height)
  
  Var mb As MemoryBlock = TempPic.ToData(Picture.Formats.JPEG)
  
  returnedValue = EncodeBase64(mb)
  returnedValue = returnedValue.ReplaceLineEndings("")
End If

Return returnedValue</code></pre>



<h3 class="wp-block-heading">Adding Specific Functionality to Controls</h3>



<p>We just need to add the functionality that will be executed when the different buttons are pressed. Start by selecting ClearBT in the Project Navigator then select the &#8220;Add to &#8216;ClearBT&#8217; &gt; Event Handler…&#8221; option in the context menu. Choose the Pressed event in the resulting window and confirm the selection so that this event is added to the control.</p>



<p>Now, enter the following code in the code editor associated with the Pressed event of the ClearBT control:</p>



<pre class="wp-block-code"><code>PersonPreview.Image = Nil
QRPreview.Image = Nil
ExportQRBT.Enabled = False

PersonalInfoContainer1.Clear
PostalContainer1.Clear</code></pre>



<p>Add the Pressed event to the CreateQRBT control and type the following code in the associated code editor:</p>



<pre class="wp-block-code"><code>QRPreview.Image = Nil

Var theCard As String = GenerateVCARD

Try
  Var p As Picture = Barcode.Image(theCard, 600, 600)
  
  If p &lt;&gt; Nil Then
    QRPreview.Image = p
    ExportQRBT.Enabled = True
  Else
    ExportQRBT.Enabled = False
  End If
  
Catch e As UnsupportedOperationException
  
  MessageBox("Unable to Create QR" + EndOfLine + EndOfLine + "Probably the provided data exceeds the available room for a QR.")
  
End Try</code></pre>



<p>Add the Pressed event to the ExportQRBT control and enter the following code in the associated code editor:</p>



<pre class="wp-block-code"><code>If QRPreview.Image &lt;&gt; Nil Then
  
  Var f As FolderItem = FolderItem.ShowSaveFileDialog("", "ExportedQR.PNG")
  
  If f &lt;&gt; Nil Then
    
    QRPreview.Image.Save(f, Picture.Formats.PNG)
    
  End If
  
End If</code></pre>



<p>Add the Pressed event to the ExportVCardBT control and enter the following code in the associated Code Editor:</p>



<pre class="wp-block-code"><code>Var theCard As String = GenerateVCARD(True)

Var f As FolderItem = FolderItem.ShowSaveFileDialog("", "Exported.vCard")

If f &lt;> Nil Then
  Var tos As TextOutputStream = TextOutputStream.Create(f)
  
  tos.Write(theCard)
  tos.Flush
  tos.Close
End If</code></pre>



<p>Add the Pressed event to the OpenPictureBT control and type the following code using the associated Code Editor:</p>



<pre class="wp-block-code"><code>PersonPreview.Image = Nil

Var f As FolderItem = FolderItem.ShowOpenFileDialog(SupportedImageFormats.All)

If f &lt;> Nil Then
  PersonPreview.Image = Picture.Open(f)
End If</code></pre>



<h2 class="wp-block-heading">Files Filtering</h2>



<p>As you can see, in the second line of the above code we reference the SupportedImageFormats.All object as a parameter to filter the type of files that the user can select.</p>



<p>To do this, add a new File Type Group from Insert &gt; File Type Group. With the newly added item in the Project Navigator selected, click the leftmost button in the toolbar to add the &#8220;image/jpeg&#8221; entry. Repeat this to add &#8220;image/png&#8221; as well.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="2584" height="784" src="https://blog.xojo.com/wp-content/uploads/2024/07/11.FileTypeFilter.png" alt="" class="wp-image-13402" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/11.FileTypeFilter.png 2584w, https://blog.xojo.com/wp-content/uploads/2024/07/11.FileTypeFilter-300x91.png 300w, https://blog.xojo.com/wp-content/uploads/2024/07/11.FileTypeFilter-1024x311.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/07/11.FileTypeFilter-768x233.png 768w, https://blog.xojo.com/wp-content/uploads/2024/07/11.FileTypeFilter-1536x466.png 1536w, https://blog.xojo.com/wp-content/uploads/2024/07/11.FileTypeFilter-2048x621.png 2048w" sizes="auto, (max-width: 2584px) 100vw, 2584px" /></figure>
</div>


<p>Finally, in the inspector panel change the name of the item to SupportedImageFormats. Once finished, it should look like this:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="2294" height="1388" src="https://blog.xojo.com/wp-content/uploads/2024/07/12-ImageFilterCompleted.png" alt="" class="wp-image-13403" srcset="https://blog.xojo.com/wp-content/uploads/2024/07/12-ImageFilterCompleted.png 2294w, https://blog.xojo.com/wp-content/uploads/2024/07/12-ImageFilterCompleted-300x182.png 300w, https://blog.xojo.com/wp-content/uploads/2024/07/12-ImageFilterCompleted-1024x620.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/07/12-ImageFilterCompleted-768x465.png 768w, https://blog.xojo.com/wp-content/uploads/2024/07/12-ImageFilterCompleted-1536x929.png 1536w, https://blog.xojo.com/wp-content/uploads/2024/07/12-ImageFilterCompleted-2048x1239.png 2048w" sizes="auto, (max-width: 2294px) 100vw, 2294px" /></figure>
</div>


<h2 class="wp-block-heading">Let&#8217;s Go!</h2>



<p>Now the design and the functionality of our app are both completed! Let&#8217;s run it and do some tests. Try selecting a contact image (or not), filling in any of the fields, generating the associated QR and exporting it … or exporting the vCard file directly so that you can import it from any compatible application (for example, Contacts on macOS).</p>



<p>Of course, you can expand and complete this small example: from introducing validations for the fields that require it, increasing the number of fields so that the vCard also includes any other fields supported by the standard, etc.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>As you have seen, generating both the vCard and the QR that contains contact information does not require a large amount of code. Best of all, with Xojo, you can check a box and cross-compile your app for macOS, Windows and Linux.</p>



<p>Happy Xojo Coding!</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>New Database Connections</title>
		<link>https://blog.xojo.com/2024/06/26/new-database-connections/</link>
		
		<dc:creator><![CDATA[William Yu]]></dc:creator>
		<pubDate>Wed, 26 Jun 2024 15:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[2024r2]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[ODBC]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13226</guid>

					<description><![CDATA[While Xojo has always supported adding database connections, the old method was far from ideal. Let's delve into the improved approach using the new DatabaseConnection project items and explore some recent additions to our database API.]]></description>
										<content:encoded><![CDATA[
<p>While Xojo has always supported adding database connections, the old method was far from ideal. Let&#8217;s delve into the improved approach using the new Database Connection project items and explore some recent additions to our database API.</p>



<h2 class="wp-block-heading">Out With The Old</h2>



<p>The old database connections were quite limiting, requiring you to create a new connection and re-enter all the parameters whenever one changed. With our new Database Connection items, you can now easily update specific connection parameters directly in the inspector.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="303" src="https://blog.xojo.com/wp-content/uploads/2024/06/PostgresqlDBConnectionModification-1024x303.png" alt="" class="wp-image-13230" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/PostgresqlDBConnectionModification-1024x303.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/06/PostgresqlDBConnectionModification-300x89.png 300w, https://blog.xojo.com/wp-content/uploads/2024/06/PostgresqlDBConnectionModification-768x228.png 768w, https://blog.xojo.com/wp-content/uploads/2024/06/PostgresqlDBConnectionModification-1536x455.png 1536w, https://blog.xojo.com/wp-content/uploads/2024/06/PostgresqlDBConnectionModification-2048x607.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Additionally, you can now choose whether the item will auto-connect or if you prefer to connect to it later in your code.</p>



<h2 class="wp-block-heading">Connecting to a Specific Database</h2>



<p>There are times when you need to connect to a database for debugging and testing, but for the final builds, you want to connect to your production database/server. Setting this up correctly with the old database connection method required creating two separate connection items—one for debug and one for release. With the new Database Connection items, this process is much simpler and fits more easily into the build process.  You now have several new Database Connection subitems that can be customized based on the stage of your build. These subitems are linked to the Stage Code in your Shared Build Settings, ensuring that when you build a final release, your database connection uses the correct settings automatically.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="329" src="https://blog.xojo.com/wp-content/uploads/2024/06/DatabaseConnectionStageCode-1024x329.png" alt="" class="wp-image-13238" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/DatabaseConnectionStageCode-1024x329.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/06/DatabaseConnectionStageCode-300x96.png 300w, https://blog.xojo.com/wp-content/uploads/2024/06/DatabaseConnectionStageCode-768x247.png 768w, https://blog.xojo.com/wp-content/uploads/2024/06/DatabaseConnectionStageCode-1536x493.png 1536w, https://blog.xojo.com/wp-content/uploads/2024/06/DatabaseConnectionStageCode.png 1968w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Additional Database Features</h2>



<p>In addition to this change, there are two new database APIs that may be useful to you:</p>



<ol class="wp-block-list">
<li>A new method, IsConnected, has been added to the SQLiteDatabase, ODBCDatabase, PostgreSQLDatabase, and MySQLCommunityServer classes. This method returns true if the connection is still active, and false if it is not.</li>



<li>We&#8217;ve enhanced <a href="https://documentation.xojo.com/api/databases/database.html#database-addrow">Database.AddRow</a> with a new signature that returns the unique ID of the newly inserted row. This feature is supported for SQLiteDatabase, ODBCDatabase, PostgreSQLDatabase, and MySQLCommunityServer classes. It is recommended to use this new API instead of the deprecated SQLiteDatabase.LastRowID and MySQLCommunityServer.LastInsertedRowID</li>
</ol>



<p>Let&#8217;s explore how the new Database.AddRow feature can assist you. Previously, only SQLiteDatabase and MySQLCommunityServer had APIs to retrieve the unique ID of the last inserted row. Now, PostgreSQLDatabase and ODBCDatabase also have this capability by using the new <code>Database.AddRow(tableName As String, row As DatabaseRow, idColumnName As String = "") As Integer</code></p>



<p>The new aspect of this signature is the idColumnName parameter and the return value. For databases that support the SQL <strong>RETURNING</strong> clause, the idColumnName specifies the column whose value will be returned.  For databases that do not support the <strong>RETURNING</strong> clause, we will use the suitable method for each specific database to return a unique value.</p>



<p>We recognize the significance of databases in your Xojo apps. So with these updates to database connectivity for your desktop, web and console apps, and the addition of new features, we aim to make your database programming easier and more efficient.</p>



<p><em><em><em>William Yu grew up in Canada learning to program BASIC on a Vic-20. He is Xojo’s resident Windows and Linux engineer, among his many other skills. Some may say he has joined the dark side here in the USA, but he will always be a Canadian at heart.</em></em></em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A Beginner&#8217;s Guide to Handling Text Files in Xojo</title>
		<link>https://blog.xojo.com/2024/05/29/a-beginners-guide-to-handling-text-files-in-xojo/</link>
					<comments>https://blog.xojo.com/2024/05/29/a-beginners-guide-to-handling-text-files-in-xojo/#comments</comments>
		
		<dc:creator><![CDATA[Gabriel Ludosanu]]></dc:creator>
		<pubDate>Wed, 29 May 2024 15:33:40 +0000</pubDate>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Text Files]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12946</guid>

					<description><![CDATA[As developers, we often need to work with text files. This could be for reading configuration settings, parsing log files, or generating reports. Text files are a common part of software development, and knowing how to access and manipulate them is important for building strong and flexible Xojo applications. In this article, we will make use the key Xojo classes and techniques for working with text files. We will start by looking at how to read the contents of text files using the TextInputStream class. You will learn how to read an entire file into a string and how to process the file line-by-line.]]></description>
										<content:encoded><![CDATA[
<p>As developers, we often need to work with text files. This could be for reading configuration settings, parsing log files, or generating reports. Text files are a common part of software development, and knowing how to access and manipulate them is important for building strong and flexible Xojo applications.</p>



<p>In this article, we will make use of the key Xojo classes and techniques for working with text files. We will start by looking at how to read the contents of text files using the <a href="https://docs.xojo.com/api/files/textinputstream.html" data-type="link" data-id="https://docs.xojo.com/api/files/textinputstream.html" target="_blank" rel="noreferrer noopener">TextInputStream</a> class. You will learn how to read an entire file into a string and how to process the file line-by-line.</p>



<p>Next, we will cover writing to text files using the <a href="https://docs.xojo.com/api/files/textoutputstream.html" data-type="link" data-id="https://docs.xojo.com/api/files/textoutputstream.html" target="_blank" rel="noreferrer noopener">TextOutputStream</a> class. You will see examples of how to write a complete string to a file and how to write individual lines one-by-one, useful when logging information or saving user preferences.</p>



<p>By the end of this post, you will understand the core techniques for accessing, reading, and writing text files in your Xojo applications. These skills will help you build more robust and flexible software that can work with a wide range of data sources and formats.</p>



<h2 class="wp-block-heading">Reading Text Files</h2>



<p>When it comes to reading the contents of text files in Xojo, the TextInputStream class is the primary tool you&#8217;ll use. This class provides methods for both reading the entire file at once, as well as reading it line-by-line.</p>



<h3 class="wp-block-heading">Using TextInputStream to Open and Read Text Files</h3>



<p>Here is an example that demonstrates how to read an entire file into a string:</p>



<pre id="xojo" class="wp-block-code"><code>// Step 1: Open the File
Var file As FolderItem
file = FolderItem.ShowOpenFileDialog("text/plain") // Show an open file dialog to select the file

If file &lt;&gt; Nil Then
  // Step 2: Create a TextInputStream
  Var inputStream As TextInputStream
  inputStream = TextInputStream.Open(file)
  
  // Step 3: Read the File
  Var fileContents As String
  fileContents = inputStream.ReadAll
  
  // Step 4: Close the Stream
  inputStream.Close
  
  // Output the file contents (for demonstration purposes)
  MessageBox(fileContents)
Else
  MessageBox("No file selected.")
End If</code></pre>



<p>In this example:</p>



<ul class="wp-block-list">
<li>The <a href="https://documentation.xojo.com/api/files/folderitem.html#folderitem-showopenfiledialog" data-type="link" data-id="https://documentation.xojo.com/api/files/folderitem.html#folderitem-showopenfiledialog" target="_blank" rel="noreferrer noopener">FolderItem.ShowOpenFileDialog</a> method is used to display a file dialog, allowing the user to select a text file.</li>



<li>The <a href="https://documentation.xojo.com/api/files/textinputstream.html#textinputstream-open" data-type="link" data-id="https://documentation.xojo.com/api/files/textinputstream.html#textinputstream-open" target="_blank" rel="noreferrer noopener">TextInputStream.Open</a> method opens the selected file for reading.</li>



<li>The <a href="https://documentation.xojo.com/api/files/textinputstream.html#textinputstream-readall" data-type="link" data-id="https://documentation.xojo.com/api/files/textinputstream.html#textinputstream-readall" target="_blank" rel="noreferrer noopener">ReadAll</a> method reads the entire contents of the file into the fileContents string.</li>



<li>The Close method closes the TextInputStream.</li>
</ul>



<p>This approach is useful when you need to process the entire contents of a text file at once. However, for larger files, you may want to read the file line-by-line to manage memory usage more efficiently, which we will cover in the next section.</p>



<h3 class="wp-block-heading">Using TextInputStream to Read Line-by-Line</h3>



<p>Reading a file line-by-line is often more efficient, especially for large files. This method allows you to process each line individually, reducing memory usage and enabling you to handle large datasets more effectively.</p>



<p>Here is an example that demonstrates how to read a file line-by-line in Xojo:</p>



<pre id="xojo" class="wp-block-code"><code>// Step 1: Open the File
Var file As FolderItem
file = FolderItem.ShowOpenFileDialog("text/plain") // Show an open file dialog to select the file

If file &lt;&gt; Nil Then
  // Step 2: Create a TextInputStream
  Var inputStream As TextInputStream
  inputStream = TextInputStream.Open(file)
  
  // Step 3: Read Each Line
  Var line As String
  While Not inputStream.EndOfFile
    line = inputStream.ReadLine
    // Process each line (for demonstration purposes, we'll just output each line in a MessageBox)
    MessageBox(line)
  Wend
  
  // Step 4: Close the Stream
  inputStream.Close
Else
  MessageBox("No file selected.")
End If</code></pre>



<p>This approach is particularly useful when you need to process or analyze each line of a text file individually, such as when parsing log files or reading configuration settings.</p>



<h2 class="wp-block-heading">Writing Text Files</h2>



<p>Writing text files in Xojo is just as straightforward as reading them. The <a href="https://documentation.xojo.com/api/files/textoutputstream.html" data-type="link" data-id="https://documentation.xojo.com/api/files/textoutputstream.html" target="_blank" rel="noreferrer noopener">TextOutputStream</a> class allows you to write data to text files, either all at once or line-by-line and it&#8217;s quite easy.</p>



<h3 class="wp-block-heading">Using TextOutputStream to Write Entire Files</h3>



<p>To write an entire string to a file, follow these steps:</p>



<pre id="xojo" class="wp-block-code"><code>// Step 1: Allow the user to set the path and name of the text file we are about to create
Var file As FolderItem
file = FolderItem.ShowSaveFileDialog("text/plain", "example.txt") // Show a save file dialog to specify the file

If file &lt;&gt; Nil Then
  // Step 2: Create a TextOutputStream
  Var outputStream As TextOutputStream
  outputStream = TextOutputStream.Create(file)
  
  // Step 3: Write to the File
  Var fileContents As String = "Hello, Xojo!"
  outputStream.Write(fileContents)
  
  // Step 4: Close the Stream
  outputStream.Close
  
  MessageBox("File written successfully.")
Else
  MessageBox("No file specified.")
End If</code></pre>



<p>In this example:</p>



<ul class="wp-block-list">
<li>The <a href="https://documentation.xojo.com/api/files/folderitem.html#folderitem-showsavefiledialog" data-type="link" data-id="https://documentation.xojo.com/api/files/folderitem.html#folderitem-showsavefiledialog" target="_blank" rel="noreferrer noopener">FolderItem.ShowSaveFileDialog</a> method is used to display a save file dialog, allowing the user to specify the file name and location.</li>



<li>The <a href="https://documentation.xojo.com/api/files/textoutputstream.html#textoutputstream-create" target="_blank" rel="noreferrer noopener">TextOutputStream.Create</a> method creates a new file or overwrites an existing file.</li>



<li>The <a href="https://documentation.xojo.com/api/files/textoutputstream.html#textoutputstream-write" target="_blank" rel="noreferrer noopener">Write</a> method writes the fileContents string to the file.</li>



<li>The Close method closes the TextOutputStream.</li>
</ul>



<h3 class="wp-block-heading">Using TextOutputStream to Write Line-by-Line</h3>



<p>Writing a file line-by-line is useful when you need to write data incrementally or when dealing with large datasets.</p>



<p>To write a file line-by-line, follow these steps:</p>



<pre id="xojo" class="wp-block-code"><code>// Step 1: Allow the user to set the path and name of the text file we are about to create
Var file As FolderItem
file = FolderItem.ShowSaveFileDialog("text/plain", "example.txt") // Show a save file dialog to specify the file

If file &lt;&gt; Nil Then
  // Step 2: Create a TextOutputStream
  Var outputStream As TextOutputStream
  outputStream = TextOutputStream.Create(file)
  
  // Step 3: Write Each Line
  Var lines() As String = Array("Line 1", "Line 2", "Line 3")
  For Each line As String In lines
    outputStream.WriteLine(line)
  Next
  
  // Step 4: Close the Stream
  outputStream.Close
  
  MessageBox("File written successfully.")
Else
  MessageBox("No file specified.")
End If</code></pre>



<p>In this example:</p>



<ul class="wp-block-list">
<li>The FolderItem.ShowSaveFileDialog method is used to display a save file dialog, allowing the user to specify the file.</li>



<li>The TextOutputStream.Create method creates a new file or overwrites an existing file.</li>



<li>The <a href="https://documentation.xojo.com/api/files/textoutputstream.html#textoutputstream-writeline" data-type="link" data-id="https://documentation.xojo.com/api/files/textoutputstream.html#textoutputstream-writeline" target="_blank" rel="noreferrer noopener">WriteLine</a> method writes each line from the lines array to the file.</li>



<li>The Close method closes the TextOutputStream.</li>
</ul>



<p>By understanding these methods, you can choose the one that best fits your needs. Writing the entire file at once is useful for smaller datasets or when you need to write all data simultaneously. Writing line-by-line is more efficient for larger datasets or when you need to write data incrementally.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>This article has provided you with the skills to handle text files in Xojo using the <a href="https://documentation.xojo.com/api/files/textinputstream.html" target="_blank" rel="noreferrer noopener">TextInputStream</a> and <a href="https://documentation.xojo.com/api/files/textoutputstream.html" target="_blank" rel="noreferrer noopener">TextOutputStream</a> classes. We covered the following essential techniques:</p>



<p><strong>Reading Text Files:</strong></p>



<ul class="wp-block-list">
<li>Reading entire files into a string using TextInputStream.ReadAll</li>



<li>Reading files line-by-line using TextInputStream.ReadLine</li>
</ul>



<p><strong>Writing Text Files:</strong></p>



<ul class="wp-block-list">
<li>Writing entire strings to a file using TextOutputStream.Write</li>



<li>Writing lines to a file using TextOutputStream.WriteLine</li>
</ul>



<p>Try applying these techniques in your own projects. Experiment with different methods to see how they can help you manage text files more effectively. The <a href="https://docs.xojo.com/topics/file_management/accessing_text_files.html" target="_blank" rel="noreferrer noopener">official Xojo documentation on working with text files</a> is a great resource for further reading.</p>



<p>Ready to get started? <a href="https://xojo.com/download/" target="_blank" rel="noreferrer noopener">Download Xojo for free</a> and begin building your applications today!</p>



<p>Happy coding!</p>



<p><em>Gabriel is a digital marketing enthusiast who loves coding with Xojo to create cool software tools for any platform. He is always eager to learn and share new ideas!</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.xojo.com/2024/05/29/a-beginners-guide-to-handling-text-files-in-xojo/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>The One Person Framework for the Rest of Us</title>
		<link>https://blog.xojo.com/2024/05/02/the-one-person-framework-for-the-rest-of-us/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Thu, 02 May 2024 14:00:00 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Development Tools]]></category>
		<category><![CDATA[Enterprise Software]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Object-Oriented]]></category>
		<category><![CDATA[One-Person Framework]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Small Business]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12882</guid>

					<description><![CDATA[The technology and development world is always changing. First released in 1998, Xojo&#8217;s longevity is a testament to its ability and willingness to adapt from&#8230;]]></description>
										<content:encoded><![CDATA[
<p>The technology and development world is always changing. First released in 1998, Xojo&#8217;s longevity is a testament to its ability and willingness to adapt from the early days of desktop apps, to web apps and on to mobile apps.</p>



<p>Throughout that time, software development has generally become more difficult with developers having to learn a wide variety of tools and programming languages, many of which are the hot thing for a short while and then disappear afterwards for the next hot new thing as the cycle repeats.</p>



<p>Up until recently this was not as big a deal for tech companies because they could just hire their way out of the problem. Teams got big and bloated, often because the tools being used were large, complex, rapidly changing and difficult to learn. So the solution, in opposition of the <a href="https://en.wikipedia.org/wiki/The_Mythical_Man-Month">Mythical Man Month</a>, was to throw more people at it. This was feasible because of 0% interest rates and the relative ease of raising capital.</p>



<figure class="wp-block-image"><a href="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c4ae90-9d8d-4b2a-8301-2ee4be611df7_1152x640.jpeg" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c4ae90-9d8d-4b2a-8301-2ee4be611df7_1152x640.jpeg" alt=""/></a></figure>



<p>But that era is over. Interest rates are no longer historically low and raising capital for companies is now much harder and less desirable than it once was. This means technology companies are reducing staff and hiring more judiciously. Fewer people now have to do more with less.</p>



<p>The idea of a “one person framework” is that there should be a way for a single developer to create software using just one development framework. This is not a new idea, but it is being talked about again because of these recent changes with how technology companies work. In many ways, Xojo is the original one person framework. From its inception, with inspiration from Visual Basic, Xojo let you make complete apps more efficiently without having to also learn other tools, languages or frameworks.</p>



<p>So what can Xojo, as a one person framework, do for you? Xojo lets you build most of the apps your company is likely to need, using only Xojo itself and its easy-to learn object-oriented programming language (which is similar to Visual Basic and Python, languages that many people already are familiar with). Xojo is a cross-platform, integrated development environment (IDE) that combines an object-oriented programming language, visual designer, code editor, debugger and more into one tool and one framework.</p>



<p>With Xojo you can make apps for most of the commonly used platforms that your business is likely to need.</p>



<p><strong>Desktop Apps</strong></p>



<p>Xojo has been a great way to make desktop apps since its inception in 1998. Unlike Java, Electron or other frameworks you’ve seen throughout the years, Xojo makes native apps and can do so for the major desktop platforms: Windows, macOS and Linux. Yes, that includes native ARM and x86 apps as well.</p>



<p>With a single project, you can click one button to have Xojo build separate native apps for each of those platforms. To further drive that point home, the Xojo IDE itself is a desktop app made with Xojo that runs on Windows, macOS and Linux.</p>



<p>With Xojo you have access to many commonly-used controls and the Xojo framework with support for databases, JSON, XML, RegEx, Zip/Unzip, networking and so much more.</p>



<p><strong>Web Apps</strong></p>



<p>Since 2010, Xojo has been able to make web apps. Xojo uses a somewhat unique approach to web apps by running compiled code on the web server. This code communicates to the app running on the web browser using an internal JavaScript framework and Bootstrap for the UI, which you don’t really need to worry about. It’s all handled automatically.</p>



<p>This approach is great for business purposes as it lets you make web apps using a development pattern that is very similar to what is used to make desktop apps.</p>



<p>If you don&#8217;t want to deal with the hassle of managing your own web app server, Xojo even offers Xojo Cloud as a fully managed web hosting service with 1-click deployment of your Xojo web apps.</p>



<p><strong>Mobile Apps</strong></p>



<p>Mobile support first appeared for iOS in 2013 and Android support was recently added in 2023. Using Xojo to make native mobile apps that can be deployed in their respective app stores is yet another way Xojo can help one person make more apps.</p>



<p>A developer that already knows how to use Xojo can jump right into mobile development without having to learn yet another IDE and programming language.</p>



<p><strong>Console Apps</strong></p>



<p>Console apps are text apps that run from the command line. These app are great for automating internal processes or other command-line tools. You can even build Console apps that communicate with other console apps to build a chain of tools for processing or converting data, for example.</p>



<h4 class="wp-block-heading">Xojo Framework</h4>



<p>A single person can create all of the above types of apps because Xojo uses the same programming language for all of them. And as mentioned above, the Xojo framework has many built-in features and is broadly compatible across all the different project types. There are differences, of course, but we strive for consistency and compatibility.</p>



<p>For just a few of its many capabilities, all platforms have the same framework classes and methods for things such as Dictionary, Set, URLConnection, files, SQLite, and most graphics. And speaking of examples, Xojo includes over 400 example projects from which to learn.</p>



<figure class="wp-block-image is-resized"><a href="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdb62a-4fe8-4d7a-ac61-cf301408c2dc_1152x640.jpeg" target="_blank" rel="noreferrer noopener"><img decoding="async" src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdb62a-4fe8-4d7a-ac61-cf301408c2dc_1152x640.jpeg" alt="" style="width:915px;height:auto"/></a></figure>



<h2 class="wp-block-heading">Could Xojo Work For You?</h2>



<p>As you should now realize, a single developer using Xojo could reasonably create a desktop app (for Windows, macOS and Linux), a web app, and mobile apps for iOS and Android. If you previously had multiple teams of multiple people creating that many apps, then Xojo could really save you a lot of money and time.</p>



<p>Will you use Xojo to make the next Photoshop, FaceBook, Excel or Google Docs clone? Perhaps not, but most companies don&#8217;t create those types of apps. Xojo does a lot, but it does not and cannot do everything. There is a limit to what any single framework can do, otherwise it becomes too large for its own good, collapsing under its own weight.</p>



<p>Instead, most businesses have much different needs and often require specially created software. For business apps, especially bespoke small-business apps, Xojo can often be an ideal solution by allowing apps to be created faster, more easily and at less cost than can be done with other tools. This saves you money and time, both of which are in short supply these days.</p>



<p><a href="https://www.xojo.com/download/">Xojo is free</a> for learning, development and testing! Give it a spin to see what it can do for you.</p>



<p><em>Paul learned to program in BASIC at age 13 and has programmed in more languages than he remembers, with Xojo being an obvious favorite. When not working on Xojo, you can find him talking about retrocomputing at <a href="https://goto10.substack.com" target="_blank" rel="noreferrer noopener">Goto 10</a> and </em>on Mastodon @lefebvre@hachyderm.io.</p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Free Xojo Linux and Raspberry Pi for Everyone</title>
		<link>https://blog.xojo.com/2024/03/26/free-linux-builds/</link>
		
		<dc:creator><![CDATA[Xojo]]></dc:creator>
		<pubDate>Tue, 26 Mar 2024 15:26:18 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Source Control]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[2024r1]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Binary]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[GitLab]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Version Control]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12631</guid>

					<description><![CDATA[Now with Xojo 2024r1 you can use Xojo's free IDE to build Linux desktop and console apps from Linux, macOS, or Windows, no license required.]]></description>
										<content:encoded><![CDATA[
<p>Beginning with Xojo 2024r1 you can use Xojo&#8217;s free IDE to build Linux desktop and console apps from Linux, macOS, or Windows, no license required.</p>



<h2 class="wp-block-heading" id="free-linux">Xojo Linux is Free</h2>



<p>We have made building for Linux free and included in the Xojo IDE! This means that on Linux you get a version control ready IDE, along with the ability to build desktop and console Linux apps (including Raspberry Pi), all for free. Launch Xojo 2024r1 (or any later release of <a href="https://xojo.com/download/" target="_blank" rel="noreferrer noopener">Xojo</a>) and open any desktop or console project, go to Build Settings, select Linux and in the Inspector choose the appropriate Architecture that matches the Linux OS you want your app to work on, either ARM or x86. Click Build to compile your project to a standalone app that you can then run on Linux &#8211; no license required.</p>



<h2 class="wp-block-heading">Wrapping Up</h2>



<p>All these changes were made based on feedback from the Xojo community and to better match the changing ways that people develop and share software projects. With this change Xojo continues its dedication to supporting Linux.</p>



<p><a href="https://xojo.com/download/">Download Xojo</a> to get started.</p>



<p>Edited 07/2025 to reflect changes to licensing. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Webinar Follow-Up: Using Xojo to Develop NetSuite Web Apps</title>
		<link>https://blog.xojo.com/2024/02/28/webinar-follow-up-using-xojo-to-develop-netsuite-web-apps/</link>
		
		<dc:creator><![CDATA[Tim Dietrich]]></dc:creator>
		<pubDate>Wed, 28 Feb 2024 21:53:39 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[NetSuite]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12615</guid>

					<description><![CDATA[Last week, I presented the third in a series of Xojo / NetSuite webinars. The latest webinar was "Using Xojo to Develop NetSuite Web Apps" webinar, and it follows "Using Xojo to Develop NetSuite iOS Apps" (from January) and "Using Xojo to Develop NetSuite Android Apps" (from last December). This blog post is s a follow-up to last week's "Web" webinar. A recording of last week's webinar is now available here.]]></description>
										<content:encoded><![CDATA[
<p>Last week, I presented the third in a series of Xojo / NetSuite webinars. The latest webinar was &#8220;Using Xojo to Develop NetSuite Web Apps&#8221; webinar, and it follows &#8220;<a href="https://blog.xojo.com/2024/01/29/webinar-follow-up-using-xojo-to-develop-netsuite-ios-apps/">Using Xojo to Develop NetSuite iOS Apps</a>&#8221; (from January) and &#8220;<a href="https://blog.xojo.com/2023/12/19/webinar-follow-up-using-xojo-to-develop-netsuite-android-apps/">Using Xojo to Develop NetSuite Android Apps</a>&#8221; (from last December). This blog post is a follow-up to last week&#8217;s &#8220;Web&#8221; webinar &#8211; &#8220;Using Xojo to Develop NetSuite Web Apps&#8221; &#8211; a recording of that webinar is available <a href="https://youtu.be/qNmZJw_AkrA">here</a>.</p>



<h2 class="wp-block-heading">Downloading the Xojo Project</h2>



<p>The Xojo project that we developed during the webinar is available for download here: </p>



<p><a href="https://tdietrich-opensource.s3.amazonaws.com/Xojo/Xojo%20NetSuite%20Web%20Demo%20-%2020240222.01.zip">https://tdietrich-opensource.s3.amazonaws.com/Xojo/Xojo%20NetSuite%20Web%20Demo%20-%2020240222.01.zip</a></p>



<p>In the zip file, you&#8217;ll find the project and a &#8220;Readme&#8221; file that includes instructions on how to set things up (including SuiteTalk REST, a custom NetSuite role, an integration record, etc). </p>



<p>I suggest downloading the project, setting up NetSuite, and running the project. Then look at how the project was built during the webinar &#8211; the objects, methods, and constants that I added, and so on. After you&#8217;re familiar with the project file, experiment with it. Maybe try modifying the project so that instead of providing access to Order Status information, it provides access to Item information instead (quantity available, pricing, etc). </p>



<p>If you run into any problems, or have questions, please feel free to email me (timdietrich@me.com). Another resource for more general Xojo questions is the Xojo Programming <a href="https://forum.xojo.com">Forum</a>. </p>



<p>I want to thank everyone that attended the webinar, as well as Geoff and the Xojo team for the opportunity to present. I hope that the webinars have increased your awareness of and interest in Xojo, and especially in using Xojo to develop apps that integrate with NetSuite.</p>



<p><em>Tim Dietrich develops custom software for businesses that are running on NetSuite. He makes extensive use of Xojo to develop mobile, desktop, Web apps, and more &#8211; all of which integrate seamlessly with NetSuite. To learn more, visit: https://timdietrich.me</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Webinar Follow-Up: Using Xojo to Develop NetSuite iOS Apps</title>
		<link>https://blog.xojo.com/2024/01/29/webinar-follow-up-using-xojo-to-develop-netsuite-ios-apps/</link>
		
		<dc:creator><![CDATA[Tim Dietrich]]></dc:creator>
		<pubDate>Mon, 29 Jan 2024 16:00:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[NetSuite]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12515</guid>

					<description><![CDATA[Last week, I presented the second in a series of Xojo / NetSuite webinars, Using Xojo to Develop NetSuite iOS Apps. You can watch that webinar here. During the webinar, I demonstrated a Xojo-based iOS mobile app that integrates with NetSuite. This blog post is a follow-up to the webinar.]]></description>
										<content:encoded><![CDATA[
<p>Last week, I presented the second in a series of Xojo / NetSuite webinars, Using Xojo to Develop NetSuite iOS Apps. You can watch that webinar <a href="https://youtu.be/tXbaAnRHnGU">here</a>. During the webinar, I demonstrated a Xojo-based iOS mobile app that integrates with NetSuite. This blog post is a follow-up to the webinar.</p>



<h3 class="wp-block-heading"><strong>Downloading the Xojo Project</strong></h3>



<p>The Xojo project that I demonstrated can be downloaded <a href="https://tdietrich-opensource.s3.amazonaws.com/Xojo/Xojo%20NetSuite%20iOS%20Demo%20-%2020240124.01.zip" target="_blank" rel="noreferrer noopener">here</a>. In the zip file, you’ll find the Xojo project file and a “Readme” file. The Readme file includes step-by-step instructions on setting up SuiteTalk REST, a custom NetSuite role, an integration record, and more.</p>



<h3 class="wp-block-heading"><strong>The SuiteQL Query</strong></h3>



<p>During the webinar, I spent some time discussing the SuiteQL query that&#8217;s used to lookup items based on the keywords that a user enters. I mentioned that there&#8217;s a lot of variation between NetSuite instances, both in terms of how they&#8217;re configured and customized. That makes NetSuite development both challenging and interesting. </p>



<p>As a result of the variation between NetSuite instances, you may need to modify the SuiteQL query based on how your NetSuite instance is configured. In the Xojo project, you&#8217;ll find that the query is stored as a constant named &#8220;SuiteQLQuery,&#8221; and it&#8217;s an attribute of the ListView screen.</p>



<p>The query uses the REGEXP_LIKE condition, which I discussed recently in this <a href="https://timdietrich.me/blog/netsuite-suiteql-regexp-like-keyword-searches/">blog post</a>. If you&#8217;re not already familiar with REGEXP_LIKE, then you might want to read up on it. Also, in the query I&#8217;m using the TO_CHAR function to format the &#8220;first column Base Price&#8221; as currency. Specifically, in the query, you&#8217;ll see this: TO_CHAR ( COALESCE( MAX( Price ), 0 ), &#8216;fmL99G999D00&#8217; ). If you&#8217;d like to learn more about the TO_CHAR function and the format model modifiers that it supports, visit: <a href="https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#SQLRF00216">https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#SQLRF00216</a></p>



<h3 class="wp-block-heading"><strong>Our Next Webinar</strong></h3>



<p>Our next Xojo / NetSuite webinar will be held on Thursday, February 22nd at 1PM CT (US). I&#8217;ll demonstrate how you can use Xojo to develop a Web app that integrates with NetSuite. To signup, please visit Xojo&#8217;s <a href="https://xojo.com/resources/webinar.php">Webinar</a> page. And finally, I want to thank everyone that attended the webinar, as well as Geoff and the entire Xojo team for the opportunity to present.</p>



<p><em>Tim Dietrich develops custom software for businesses that are running on NetSuite. He makes extensive use of Xojo to develop mobile, desktop, Web apps, and more &#8211; all of which integrate seamlessly with NetSuite. To learn more, visit: https://timdietrich.me</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo for Students</title>
		<link>https://blog.xojo.com/2024/01/25/xojo-for-students/</link>
		
		<dc:creator><![CDATA[Xojo]]></dc:creator>
		<pubDate>Thu, 25 Jan 2024 13:00:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Educational]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[GitHub Student Developer Pack]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Student]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11561</guid>

					<description><![CDATA[Students looking to begin their journey into programming look to Xojo for its ease of use and dedication to cross-platform development. Plus, Xojo is true rapid app development and is ideal for building prototypes and mockups really fast. All of these features benefit from Xojo's OOP-focus. Xojo also has a vibrant and helpful community and years worth of free, on-line resources. ]]></description>
										<content:encoded><![CDATA[
<p>Xojo is a programming language and development environment for creating cross-platform applications for macOS, Windows and Linux from whatever computer you use &#8211; Mac, Windows or Linux. You can also create web, iOS, Android and Raspberry Pi apps with Xojo. To empower students, Xojo has partnered with GitHub to offer Xojo Pro to all students in the <a href="https://education.github.com/pack">GitHub Student Developer Pack</a>. In addition to Xojo, the Pack includes tons of free tools to help students expand their technical knowledge and learn new skills. </p>



<p>Students looking to begin their journey into programming choose Xojo for its <strong>ease of use</strong> and dedication to <strong>cross-platform</strong> development. Plus, Xojo is true rapid app development and is ideal for building <strong>prototypes and mockups</strong> really fast. All of these features benefit from Xojo&#8217;s <strong>OOP</strong>-focus. Xojo also has an active and helpful <strong>community</strong> and years worth of free, on-line <strong>resources</strong>. </p>



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



<h3 class="wp-block-heading"><strong>Ease of Use from App Design to Build</strong></h3>



<p>Xojo is known for its user-friendly and visual development environment. It employs a drag-and-drop interface, which can be helpful for students who are new to programming and those who want to rapidly prototype software without delving into complex coding. Xojo is efficient, featuring a streamlined development process and extensive feature set, you can create applications fast without sacrificing quality or functionality. Xojo is based on object-oriented programming principles. <a href="https://documentation.xojo.com/getting_started/object-oriented_programming/index.html">Learning OOP</a> through Xojo can provide students with a solid foundation in programming concepts that are widely applicable in the software development industry.</p>



<h3 class="wp-block-heading"><strong>Multiplatform Development for Windows, macOS, Linux, mobile, &amp; web</strong></h3>



<p>Xojo is incredibly versatile. Whether you&#8217;re interested in desktop, mobile, or web application development, you can built it with Xojo. With its cross-platform capabilities, you can even build applications that run on multiple platforms from a single code-base. This can be particularly valuable for students working on a MacBook but needing app for a Windows machine or vice-versa. Write your app once and compile it for macOS, Windows and Linux.</p>



<h3 class="wp-block-heading"><strong>Rapid Application Development for Prototypes and Mockups</strong></h3>



<p>Xojo is designed for rapid application development (RAD), making it an ideal choice for students who need to create functional applications quickly. Students can use Xojo to build practical, real-world applications. This hands-on experience can be valuable for learning and demonstrating software development skills, especially for those working on the design and usability aspects of software development. </p>



<h3 class="wp-block-heading"><strong>Community and Resources</strong></h3>



<p>Xojo has an active community and offers resources, including documentation, tutorials, and forums. Students can benefit from this support when learning and troubleshooting. With an active and friendly community of developers, top-notch support team and extensive documentation and tutorials, you&#8217;ll always have the help and resources you need to succeed. Learn at your own pace, and have access to the support you need to overcome challenges along the way.</p>



<p>No matter why you choose Xojo, whether for its simplicity, cross-platform capabilities, rapid development or community and resources, Xojo is a valuable tool for learning programming and software development concepts. Xojo is a great place to start when building or looking to expand your development toolkit.</p>



<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-16018d1d wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-white-color has-text-color has-background has-link-color wp-element-button" href="https://xojo.com/download/" style="background-color:#84bd00">Download Xojo</a></div>
</div>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Remote Debugger: How to debug your app on any computer</title>
		<link>https://blog.xojo.com/2024/01/19/remote-debugger-how-to-debug-your-app-on-any-computer/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Fri, 19 Jan 2024 13:00:00 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Remote Debugging]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12482</guid>

					<description><![CDATA[If only you could run your app in debug mode on a specific, remote computer. With Xojo, you can. Let's talk about Xojo's Remote Debugger. ]]></description>
										<content:encoded><![CDATA[
<p>At one time or another we all experienced it. The app you created works beautifully and your users heap praise upon it. Then, a particular user reports that some part of the app (or the entire app) doesn&#8217;t work on their computer. Other users with the same type of computer, same OS version, etc., do not experience the same issue. After scratching your head and thinking to yourself that the fault perhaps lies with the user, you create a special version of your app just for that user with MessageBox commands and/or various points in the code logged to a text file. This will give you the answer as to why your app is failing just for that one user. Alas, your digital spelunking reveals nothing. If only you could run your app in debug mode on <em>their</em> computer.</p>



<h3 class="wp-block-heading">Remote Debugger</h3>



<p>With Xojo, you can. Let&#8217;s talk about Xojo&#8217;s aptly named Remote Debugger. In the instance above, that particular user can install Xojo&#8217;s Remote Debugger app on their computer. You and your users can find the app included in the Extras folder of  the Xojo download. After your user installs, launches and sets the Options in the Remote Debugger app, you can connect to that user&#8217;s computer by adding a connection to it in the Debugging pane of the Settings dialog box in the Xojo IDE on your computer. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="647" src="https://blog.xojo.com/wp-content/uploads/2024/01/debugging_pane_settings_dialog-1024x647.png" alt="" class="wp-image-12483" srcset="https://blog.xojo.com/wp-content/uploads/2024/01/debugging_pane_settings_dialog-1024x647.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/01/debugging_pane_settings_dialog-300x190.png 300w, https://blog.xojo.com/wp-content/uploads/2024/01/debugging_pane_settings_dialog-768x486.png 768w, https://blog.xojo.com/wp-content/uploads/2024/01/debugging_pane_settings_dialog.png 1240w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Press the Add button, choose a name, add the user&#8217;s IP address and the password they created for the Remote Debugger app. If the user is just barely remote (on your local network for example), the Add dialog that appears will show local Remote Debuggers, making the process even easier. If this is the case, you can click on the user&#8217;s machine from the list without having to ask them for the their IP address.</p>



<p>It gets a bit complicated if you and the user are not on the same network. That&#8217;s because their router has to be configured to allow the connection to get through to their computer. That can be complex and potentially not allowed by their network administrator. The easiest solution in these cases is to use a service such as <a href="https://www.zerotier.com">ZeroTier</a> or <a href="https://tailscale.com">Tailscale</a> that creates a secure, private network which effectively puts you both on the same network making it a breeze to connect. (Both of ZeroTier and Tailscale have a service tier that is free.) </p>



<p>Once you&#8217;ve added the remote debug host, you can choose Project &gt; Run Remotely and then choose that host to begin the connection. When you do this, your computer will compile a debug version for the computer and OS running on that remote user&#8217;s computer. It will then send that build to their computer and launch it. The app will then connect back to your Xojo IDE&#8217;s Debugger! You can then debug just as you normally would. Have the user try various functions as you watch what they are doing using screen sharing of some kind. When it drops in to the Debugger, you can step through the code, look at the values of variables and properties, etc., just as you do when debugging on your local computer. In cases like this, it can take a frustrating, painful debugging experience and make it nearly stress-free. In minutes you&#8217;ll be staring at the line of code that just wasn&#8217;t expecting the user to do what they did. </p>



<p>Also, the remote computer doesn&#8217;t have to actually be remote. For example, the Remote Debugger is handy for debugging on local virtual machines or other computers on your desk. It lets you keep your project where it belongs (where you keep it on your computer) while debugging in an OS running somewhere else.</p>



<p>So the next time you wish you could just debug on another computer or virtual machine, remember Xojo&#8217;s Remote Debugger! Watch a 13 minute <a href="https://youtu.be/q0C4NhY7oRg">video</a> on Xojo&#8217;s Remote Debugger to learn more.</p>



<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-16018d1d wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-white-color has-text-color has-background has-link-color wp-element-button" href="https://documentation.xojo.com/getting_started/debugging/remote_debugging.html" style="background-color:#84bd00" target="_blank" rel="noreferrer noopener">Learn more in the Xojo Docs</a></div>
</div>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Webinar Follow-Up: Using Xojo to Develop NetSuite Android Apps</title>
		<link>https://blog.xojo.com/2023/12/19/webinar-follow-up-using-xojo-to-develop-netsuite-android-apps/</link>
		
		<dc:creator><![CDATA[Tim Dietrich]]></dc:creator>
		<pubDate>Tue, 19 Dec 2023 22:06:09 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Android Design Extensions]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[NetSuite]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12462</guid>

					<description><![CDATA[Last week I was thrilled to present Xojo's "Using Xojo to Develop NetSuite Android Apps" webinar. This blog post is intended as a follow-up to that webinar. I hope to provide some additional information that we didn't have time to cover, answer some of the questions that came up during and after the webinar, and also provide a link to the Xojo project that we created during the webinar.]]></description>
										<content:encoded><![CDATA[
<p>Last week I was thrilled to present Xojo&#8217;s &#8220;Using Xojo to Develop NetSuite Android Apps&#8221; webinar (<a href="https://youtu.be/sPOha9-VQRk">watch the webinar</a>). I want to thank everyone who attended, as well as Geoff and the entire Xojo team for the opportunity. It&#8217;s always nice to be able to introduce new developers to the Xojo platform.</p>



<p>This blog post is intended as a follow-up to that webinar. In it, I hope to provide some additional information that we didn&#8217;t have time to cover, answer some of the questions that came up during and after the webinar, and also provide a link to the Xojo project that we created during the webinar.</p>



<h3 class="wp-block-heading">Downloading the Xojo Project</h3>



<p>The Xojo project that we developed during the webinar is available for download <a href="https://tdietrich-opensource.s3.amazonaws.com/Xojo/Xojo%20NetSuite%20Android%20Demo%20-%2020231219.01.zip">here</a>. In the zip file, you&#8217;ll find the project and a &#8220;Readme&#8221; file that includes instructions on how to set things up (including SuiteTalk REST, a custom NetSuite role, an integration record, etc).</p>



<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="758" src="https://blog.xojo.com/wp-content/uploads/2023/12/screen-shot-of-the-Xojo-project-file-1024x758.png" alt="A screen shot of the Xojo project file." class="wp-image-12473" srcset="https://blog.xojo.com/wp-content/uploads/2023/12/screen-shot-of-the-Xojo-project-file-1024x758.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/12/screen-shot-of-the-Xojo-project-file-300x222.png 300w, https://blog.xojo.com/wp-content/uploads/2023/12/screen-shot-of-the-Xojo-project-file-768x568.png 768w, https://blog.xojo.com/wp-content/uploads/2023/12/screen-shot-of-the-Xojo-project-file-1536x1136.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/12/screen-shot-of-the-Xojo-project-file-2048x1515.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>My advice is to download the project, setup NetSuite, and run the project. Then look at how the project was built -the screens, methods, and so on. After you&#8217;re familiar with the project file, experiment with it. Perhaps try modifying the project so that instead of providing access to Items it provides access to Employees instead.</p>



<p>If you run into any problems, or have questions, please feel free to email me (timdietrich@me.com). Another great resource for your general Xojo questions is the Xojo Programming <a href="https://forum.xojo.com">Forum</a>.</p>



<p>Have fun!</p>



<h3 class="wp-block-heading">Questions &amp; Answers</h3>



<h4 class="wp-block-heading">Do you prefer to use RESTlets instead of SuiteTalk REST? If so, why?</h4>



<p>Yes, I much prefer using RESTlets in all of my NetSuite integration projects. With RESTlets I have more control over the functionality that the API provides, and more control over how the responses are formatted. Also, my experience has been that RESTlets are slightly faster than SuiteTalk REST.</p>



<p>That being said, SuiteTalk REST does have some advantages over RESTlets. For example, SuiteTalk REST provides endpoints that you can use to get metadata, which is something that is often difficult to do with a RESTlet. But perhaps the biggest advantage of SuiteTalk REST is that, unlike RESTlets, there is nothing extra that needs to be installed in your NetSuite account. It&#8217;s simply a matter of enabling it.</p>



<h4 class="wp-block-heading">You mentioned some NetSuite customer statistics in your presentation. Can you repeat those?</h4>



<p>Sure. During his SuiteWorld keynote presentation this year, Gary Wiessinger (SVP of NetSuite Application Development) mentioned NetSuite&#8217;s growth in terms of the number of customers that are using NetSuite. So as of October 2023, 37,000 customers are using NetSuite, and that represents 324,000 organizations. And those customers are located in 219 countries and territories.</p>



<h4 class="wp-block-heading">As a Xojo developer, how can I get started with NetSuite?</h4>



<p>You should first try to get access to a NetSuite account that you can experiment with. Unfortunately, that&#8217;s not as easy as it is with other platforms (such as Salesforce or ServiceNow), where they provide developers with test accounts. My advice would be to reach out to a local NetSuite partner, and see if you can build a relationship with them, and try to get their help in getting started.</p>



<h4 class="wp-block-heading">After the demo, you mentioned another Xojo project that extends the Android functionality. What was that?</h4>



<p>It&#8217;s called Android Design Extensions, and there&#8217;s a great blog post about it <a href="https://blog.xojo.com/2023/12/12/android-design-extensions-2-0-for-xojo-2023r3-and-later/" data-type="link" data-id="https://blog.xojo.com/2023/12/12/android-design-extensions-2-0-for-xojo-2023r3-and-later/">here</a>. Read multiple posts about <a href="https://blog.xojo.com/tag/android-design-extensions/">Android Design Extensions</a> on the Xojo Blog.</p>



<h3 class="wp-block-heading">Wrapping Up</h3>



<p>Thanks again for your interest in Xojo and in using it to develop apps that integrate with NetSuite. I hope you&#8217;ve found the webinar and the Xojo project to be helpful.</p>



<p>Happy holidays!</p>



<p><em>Tim Dietrich develops custom software for businesses that are running on NetSuite. He makes extensive use of Xojo to develop mobile, desktop, Web apps, and more &#8211; all of which integrate seamlessly with NetSuite. To learn more, visit: https://timdietrich.me</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Android Design Extensions 2.0 for Xojo 2023r3 and Later</title>
		<link>https://blog.xojo.com/2023/12/12/android-design-extensions-2-0-for-xojo-2023r3-and-later/</link>
		
		<dc:creator><![CDATA[Martin T.]]></dc:creator>
		<pubDate>Tue, 12 Dec 2023 14:30:00 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[2023r3]]></category>
		<category><![CDATA[2023r4]]></category>
		<category><![CDATA[Android Design Extensions]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12396</guid>

					<description><![CDATA[Half a year has passed since the introduction of Android as a new target in Xojo 2023r2, and hundreds of framework and compiler bugs have been fixed and new features introduced. This is also the case in the latest Xojo release 2023r4. So it’s time to take the Android Design Extensions to a new level and release version 2.0. This version works with Xojo 2023r3 and late releases.]]></description>
										<content:encoded><![CDATA[
<p>Half a year has passed since the introduction of Android as a new target in Xojo 2023r2 and hundreds of framework and compiler bugs have been fixed and new features introduced. This is also the case in the latest Xojo release 2023r4. So it’s time to take the Android Design Extensions to a new level and release version 2.0 with over 80 new extensions. This version works with Xojo 2023r3 and late releases.</p>



<h3 class="wp-block-heading">Highlights and New Features in Android Design Extensions 2.0.</h3>



<p>Buttons can now have borders in different thicknesses and colors. Use the SetStrokeColorXC and SetStrokeWidthXC extension methods for this. You can also use the same properties for the Android MobileDateTimePicker. You can also set the color of the button when it is clicked: SetRippleColorXC .</p>



<figure class="wp-block-image size-large is-resized is-style-default"><img loading="lazy" decoding="async" width="1024" height="759" src="https://blog.xojo.com/wp-content/uploads/2023/12/buttons-1024x759.jpg" alt="" class="wp-image-12400" style="width:424px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2023/12/buttons-1024x759.jpg 1024w, https://blog.xojo.com/wp-content/uploads/2023/12/buttons-300x222.jpg 300w, https://blog.xojo.com/wp-content/uploads/2023/12/buttons-768x569.jpg 768w, https://blog.xojo.com/wp-content/uploads/2023/12/buttons.jpg 1080w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>The colors of sliders and progress bars can now be set dynamically via the extension methods  SetProgressBackgroundTintListXC and SetProgressTintListXC.</p>



<p>Would you like to display the top bar of an app, where the time and battery status are displayed, in a dark color instead of white? No problem. The MobileScreen method SetSystemBarsAppearanceXC will help you. The Android Design Extensions sample app shows you how to use it.</p>



<p>The background color of individual segments of a MobileSegmentedButton can now also be set dynamically with SetBackgroundColorAtXC.</p>



<p>MobileTabPanel now supports the display of badges. You can set the color, position, and number of a badge individually.</p>



<figure class="wp-block-image size-large is-resized is-style-default"><img loading="lazy" decoding="async" width="1024" height="759" src="https://blog.xojo.com/wp-content/uploads/2023/12/tab-panel-1024x759.jpg" alt="" class="wp-image-12401" style="width:427px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2023/12/tab-panel-1024x759.jpg 1024w, https://blog.xojo.com/wp-content/uploads/2023/12/tab-panel-300x222.jpg 300w, https://blog.xojo.com/wp-content/uploads/2023/12/tab-panel-768x569.jpg 768w, https://blog.xojo.com/wp-content/uploads/2023/12/tab-panel.jpg 1080w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Would you like a little more for the MobileTextArea? With the SetTextFromHtmlXC method, you can output formatted HTML content in the MobileTextArea. </p>



<figure class="wp-block-image size-large is-resized is-style-default"><img loading="lazy" decoding="async" width="498" height="1024" src="https://blog.xojo.com/wp-content/uploads/2023/12/text-area-498x1024.png" alt="" class="wp-image-12399" style="width:240px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2023/12/text-area-498x1024.png 498w, https://blog.xojo.com/wp-content/uploads/2023/12/text-area-146x300.png 146w, https://blog.xojo.com/wp-content/uploads/2023/12/text-area-768x1579.png 768w, https://blog.xojo.com/wp-content/uploads/2023/12/text-area-747x1536.png 747w, https://blog.xojo.com/wp-content/uploads/2023/12/text-area-996x2048.png 996w, https://blog.xojo.com/wp-content/uploads/2023/12/text-area.png 1080w" sizes="auto, (max-width: 498px) 100vw, 498px" /></figure>



<p>MobileTextFields also experience a push forward with the latest Android Design Extensions. You can now show a clear button or, if it is a password field, show and hide the password. The name of the helper here is SetEndIconModeXC. You can also set the border color and border thickness of text fields. SetBoxStrokeWidthXC, SetBoxStrokeColorXC, and SetBoxBackgroundColorXC are the methods to be used.</p>



<figure class="wp-block-image size-large is-resized is-style-default"><img loading="lazy" decoding="async" width="1024" height="759" src="https://blog.xojo.com/wp-content/uploads/2023/12/textfields-1024x759.jpg" alt="" class="wp-image-12402" style="width:444px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2023/12/textfields-1024x759.jpg 1024w, https://blog.xojo.com/wp-content/uploads/2023/12/textfields-300x222.jpg 300w, https://blog.xojo.com/wp-content/uploads/2023/12/textfields-768x569.jpg 768w, https://blog.xojo.com/wp-content/uploads/2023/12/textfields.jpg 1080w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Feel free to take a look at the developer repository, create feature requests, and provide feedback on extending this extension library.</p>



<p>I’m happy to receive any voluntary financial support for the work I’ve done so far, which you are welcome to <a href="https://www.paypal.com/paypalme/MTrippensee">share</a> here. You can download the project with many examples <a href="https://github.com/XojoGermany/AndroidDesignExtensions">here</a>.</p>



<p>Happy Coding.</p>



<p><em>Martin</em><em> </em><em>T.</em><em> </em><em>is</em><em> </em><em>a</em><em> </em><em>Xojo</em><em> </em><em>MVP</em><em> </em><em>and</em><em> </em><em>has</em><em> </em><em>been</em><em> </em><em>very</em><em> </em><em>involved</em><em> </em><em>in</em><em> </em><em>testing</em><em> </em><em>Android</em><em> </em><em>support.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Simplicity and Security, Xojo Cloud is Ideal Hosting for Xojo Web Apps</title>
		<link>https://blog.xojo.com/2023/10/30/simplicity-and-security-xojo-cloud-is-ideal-hosting-for-xojo-web-apps/</link>
		
		<dc:creator><![CDATA[Xojo]]></dc:creator>
		<pubDate>Mon, 30 Oct 2023 16:00:00 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[App Hosting]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Security-Enhanced Linux]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11553</guid>

					<description><![CDATA[Xojo Cloud is the premier hosting solution for developers looking for a reliable, secure and high-performance hosting environment for Xojo web applications. Xojo Cloud is developed specifically for Xojo web applications and offers a range of benefits for you and your applications that make it worth the investment.]]></description>
										<content:encoded><![CDATA[
<p>Xojo Cloud is the premier hosting solution for developers looking for a reliable, secure and high-performance hosting environment for Xojo web applications. Xojo Cloud is developed specifically for Xojo web applications and offers a range of benefits for you and your applications that make it worth the investment.</p>



<p>Xojo Cloud is <strong>optimized for Xojo applications</strong>. It is specifically designed to provide the best possible performance and stability for Xojo web applications. We optimize Xojo Cloud for performance, so your web apps will run smoothly and seamlessly. You can even monitor server stats from within the Xojo IDE.</p>



<p>Xojo Cloud is <strong>focused on simplicity and ease of use</strong> and requires zero configuration. Designed with the Xojo developer in mind, Xojo Cloud&#8217;s Control Panel makes it easy to deploy and manage web applications. Purchase a server, open a web project in Xojo and click Deploy to upload and install to Xojo Cloud. Not just for web apps, Xojo Cloud includes Apple Push Notification server (APNs) support for your iOS apps. Set up SSL, PostrgeSQL, MySQL, SFTP and a SSH Tunnel with a click in the Xojo Cloud Control Panel (the Control Panel itself is a Xojo web app). The administration of a web server is a significant and constant task; Xojo Cloud allows you to leave that behind and focus on your projects.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="386" data-id="12082" src="https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-1024x386.png" alt="Xojo Cloud Control Panel Apps Tab" class="wp-image-12082" srcset="https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-1024x386.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-300x113.png 300w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-768x289.png 768w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-1536x579.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Apps-Tab-2048x772.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="384" data-id="12083" src="https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-1024x384.png" alt="Xojo Cloud Control Panel Options Tab" class="wp-image-12083" srcset="https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-1024x384.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-300x112.png 300w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-768x288.png 768w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-1536x576.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/09/Xojo-Cloud-Control-Panel-Options-Tab-2048x768.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<p>We take security very seriously. Xojo Cloud <strong>offers advanced security features</strong> to protect your data from cyberthreats, including a smart firewall, intrusion and hacking detection and Security-Enhanced Linux. Unlike most hosting solutions that provide little to no security, each Xojo Cloud server is built with our state-of-the-art, industrial-strength, multi-tiered security system woven into its very core.&nbsp;</p>



<p>Additional features and benefits include daily automatic backups, load balancing and support from the Xojo team. With nine global hosting locations, you are able to host your Xojo web applications close to your users, for speed and an ideal overall experience. </p>



<div class="wp-block-columns are-vertically-aligned-top is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="576" src="https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading-1024x576.png" alt="Xojo Cloud offers 3 packages offering options on RAM, storage and vCPU starting at $49/month. " class="wp-image-12078" srcset="https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading-1024x576.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading-300x169.png 300w, https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading-768x432.png 768w, https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading-1536x864.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/09/Add-a-heading.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>
</div>



<p>In addition to the <a href="http://xojo.com/store/#cloud">standard options</a>, Xojo Cloud servers with more RAM, storage and Virtual CPUs are available. Contact&nbsp;<a href="mailto:hello@xojo.com">customer support</a>&nbsp;for details about personalized plans.&nbsp;</p>



<p>Whether you are a seasoned Xojo developer or just getting started, Xojo Cloud provides an intuitive and user-friendly hosting solution for Xojo web applications. Today is a good day to start using Xojo Cloud, visit our <a href="https://xojo.com/cloud/">website</a> to learn more or see the Xojo <a href="https://xojo.com/store/#cloud">Store</a> to pick your package and location.</p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Android Improvements in Xojo 2023r3</title>
		<link>https://blog.xojo.com/2023/10/10/android-improvements-in-xojo-2023r3/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Tue, 10 Oct 2023 13:30:44 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[2023r3]]></category>
		<category><![CDATA[Declares]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Kotlin]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12123</guid>

					<description><![CDATA[Android remains in Beta, but there have been many fixes and improvements in Xojo 2023r3 and I'd like to highlight a few including: more support for dark mode, additions to MobileTextField, a Destination property, a HasBackButton property, MobilePopupMenu, enhancements to MobileHTMLViewer, support for running JavaScript, the new Kotlin Declare and more detailed in this post.]]></description>
										<content:encoded><![CDATA[
<p>Android remains in Beta, but there have been many fixes and improvements in Xojo 2023r3 and I&#8217;d like to highlight a few including: more support for dark mode, additions to MobileTextField, a Destination property, a HasBackButton property, MobilePopupMenu, enhancements to MobileHTMLViewer, support for running JavaScript, the new Kotlin Declare and more.</p>



<p>Although Xojo for Android does not yet have full dark mode support, things continue to head in that direction. Previously your app would adjust its UI for light/dark if the Support Dark Mode property was turned on in the Android Build Settings. Starting in Xojo 2023r3, Color.TextColor and Color.FillColor also adjust their values when run in light mode or dark mode, making it easier for your custom drawing to also adapt.</p>



<p>MobileTextField gets a couple new additions. The ReturnPressed event is now called when, as the name suggests, return is pressed. The AllowSpellChecking property is now also available for MobileTextField and MobileTextArea.</p>



<p>In the Shared Build Settings Inspector there is now a Destination property as there is with other platforms.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="377" height="434" src="https://blog.xojo.com/wp-content/uploads/2023/10/image.png" alt="" class="wp-image-12124" srcset="https://blog.xojo.com/wp-content/uploads/2023/10/image.png 377w, https://blog.xojo.com/wp-content/uploads/2023/10/image-261x300.png 261w" sizes="auto, (max-width: 377px) 100vw, 377px" /></figure>



<p>Many Android devices have physical back buttons and all let you turn on global software controls that have a back button, but sometimes you want to have the back button clearly shown on the navigation toolbar. With Xojo 2023r3, the new HasBackButton property of MobileScreen can show a back button on the navigation toolbar.</p>



<p>To make it easier to write code that is applicable to both iOS and Android, but not other platforms, there is a new <a href="https://documentation.xojo.com/api/compiler_directives/targetmobile.html">TargetMobile</a> constant available for conditional compilation.</p>



<p><a href="https://documentation.xojo.com/api/user_interface/mobile/mobilepopupmenu.html">MobilePopupMenu</a> is an all-new control for Android that makes it possible to simplify some of your user interfaces. It works similarly to a PopupMenu on Desktop or Web: when the user taps this control a list of items appears and they can choose one.</p>



<p>On the Advanced tab of the Android Build Settings there is a new Manifest section with a Permissions property. Here you can specify the names of <a href="https://developer.android.com/reference/android/Manifest.permission">Android permission constants</a> that are needed by Declares or libraries. They are added to the AndroidManifest.xml file when the app is run/built.</p>



<p>MobileHTMLViewer got several enhancements. It now has various processing events, including: DocumentBegin, DocumentComplete, CancelLoad, Error, NewWindow, DocumentProgressChanged and TitleChanged.</p>



<p>And there is now support for running JavaScript using the ExecuteJavaScript method along with the JavaScriptResult and JavaScriptRequest events. ExecuteJavaScript is asynchronous and results appear in the JavaScriptResult event. To call the JavaScriptRequest event, use xojo.execute() in the JavaScript code. A method name and up to 5 parameters can be passed back to Xojo. <a href="https://documentation.xojo.com/api/user_interface/mobile/mobilehtmlviewer.html#mobilehtmlviewer-javascriptrequest">Learn more</a> in the Xojo Programming Documentation.</p>



<p>The last thing I want to highlight is the new Kotlin <a href="https://documentation.xojo.com/api/language/declare.html">Declare</a>. For advanced users, this adds the ability to create Android declares that can pass untouched calls via Alias (with the exception of required type/object handling) to the Kotlin compilation step. This is done by specifying Lib &#8220;Kotlin&#8221; or adding &#8220;:Kotlin&#8221; to the end of Lib. Here are a couple examples of what this can look like:</p>



<pre class="wp-block-code"><code>Declare Function AndroidVersion Lib "Kotlin" Alias "android.os.Build.VERSION.RELEASE" As CString</code></pre>



<pre class="wp-block-code"><code>Declare Sub findAllAsync Lib "Object:ctrl:MobileHTMLViewer:Kotlin" Alias "findAllAsync(myfind.toString())" (myFind As CString)</code></pre>



<p>Of course there were many bug fixes as well. Be sure to check out the <a href="https://documentation.xojo.com/versions/2023r3/resources/release_notes/2023r3.html">full release notes</a> for all the details.</p>



<p><em>Paul learned to program in BASIC at age 13 and has programmed in more languages than he remembers, with Xojo being an obvious favorite. When not working on Xojo, you can find him talking about retrocomputing at <a href="https://goto10.substack.com" target="_blank" rel="noreferrer noopener">Goto 10</a> and </em>on Mastodon @lefebvre@hachyderm.io.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Using the Zip &#038; Unzip Feature</title>
		<link>https://blog.xojo.com/2023/10/10/using-the-zip-unzip-feature/</link>
		
		<dc:creator><![CDATA[William Yu]]></dc:creator>
		<pubDate>Tue, 10 Oct 2023 13:30:08 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[2023r3]]></category>
		<category><![CDATA[Compression]]></category>
		<category><![CDATA[FolderItem]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Unzip]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<category><![CDATA[Zip]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12107</guid>

					<description><![CDATA[FolderItem has been extended with new methods to Zip and Unzip files and folders in Xojo 2023 Release 3. Take a peek as we look at how easy it is to use this new feature.]]></description>
										<content:encoded><![CDATA[
<p>FolderItem has been extended with new methods to Zip and Unzip files and folders in Xojo 2023 Release 3. Take a peek as we look at how easy it is to use this new feature.</p>



<h3 class="wp-block-heading">What is New?</h3>



<p>Xojo 2023r3 adds new FolderItem.Zip and FolderItem.Unzip methods with support for the most widely used DEFLATE compression format.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li>Zip(destination As FolderItem, contentsOnly As Boolean = False, compression As ZipCompressions = ZipCompressions.Normal) As FolderItem</li>



<li>Zip(contentsOnly As Boolean = False, compression As ZipCompressions = ZipCompressions.Normal) As FolderItem</li>



<li>Unzip()</li>



<li>Unzip(destinationFolder As FolderItem)</li>
</ul>
</blockquote>



<h3 class="wp-block-heading">How to Zip</h3>



<p>Here&#8217;s an example of zipping SomeFolder on your Desktop:</p>



<pre class="wp-block-code"><code>Var someFolder As FolderItem = SpecialFolder.Desktop.Child("SomeFolder")
Var outputFile As FolderItem = someFolder.Zip</code></pre>



<p>The outputFile will be created on your Desktop with the name &#8220;SomeFolder.zip&#8221;.<br>This zip file will contain a single folder called SomeFolder, along with the contents of that folder.</p>



<pre class="wp-block-code"><code>+- SomeFolder.zip
  +- SomeFolder
    +- File1.ext
    +- File2.ext
    +- etc.</code></pre>



<p>If you&#8217;d rather just zip up the contents of SomeFolder then you can pass True to the contentsOnly parameter.</p>



<pre class="wp-block-code"><code>Var outputFile As FolderItem = myFolder.Zip(True)</code></pre>



<p>Now the zip file only contains the contents of the SomeFolder folder.</p>



<pre class="wp-block-code"><code>+- SomeFolder.zip
  +- File1.ext
  +- File2.ext
  +- etc.
</code></pre>



<p><em>Note: on macOS, when the OS unzips this kind of zip folder hierarchy, it will automatically create a folder with the contents, regardless of what the actual zip hierarchy looks like. However, this does not affect our own FolderItem.Unzip method.</em></p>



<p>With the overloaded Zip method that takes a destination FolderItem, you can use this to specify where the zip file is created.</p>



<pre class="wp-block-code"><code>Var destinationFolder As FolderItem = SpecialFolder.Documents
Var outputFile As FolderItem = myFolder.Zip(destinationFolder)</code></pre>



<p>In this case the outputFile is created in the user&#8217;s Documents folder. If you wanted to rename it to something other than the default name with a &#8220;.zip&#8221; appended to it, you can also use this syntax to pass a destination file instead of a destination folder.</p>



<pre class="wp-block-code"><code>Var destinationFile As FolderItem = SpecialFolder.Desktop.Child("MyZipFile.zext")
Var outputFile As FolderItem = myFolder.Zip(destinationFile)</code></pre>



<p>While we only demonstrated how to zip a folder in these examples, the exact same syntax applies for zipping a single FolderItem file too.</p>



<h3 class="wp-block-heading">How to Unzip</h3>



<p>Conversely, if you wanted to unzip a file, this is a simple call to FolderItem.Unzip</p>



<pre class="wp-block-code"><code>outputFile.Unzip</code></pre>



<p>This unzips the outputFile contents to the same directory that the outputFile resides in.  If you wanted to unzip the contents to a different location, pass in a destination folder instead:</p>



<pre class="wp-block-code"><code>outputFile.Unzip(SpecialFolder.Temporary)</code></pre>



<p>This feature is not yet supported in Android. In conclusion, Zipping/Unzipping has never been easier!  Learn more in the Xojo Programming Documentation &#8211; <a href="https://documentation.xojo.com/api/files/folderitem.html#folderitem-zip">Zip</a> and <a href="https://documentation.xojo.com/api/files/folderitem.html#folderitem-unzip">UnZip</a>. (<em>Thanks in part to zlib</em>)</p>



<p><em><em><em>William Yu grew up in Canada learning to program BASIC on a Vic-20. He is Xojo’s resident Windows and Linux engineer, among his many other skills. Some may say he has joined the dark side here in the USA, but he will always be a Canadian at heart.</em></em></em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Get Set</title>
		<link>https://blog.xojo.com/2023/10/10/get-set/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Tue, 10 Oct 2023 13:30:01 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[2023r3]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Set]]></category>
		<category><![CDATA[Sets]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo MVP]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12126</guid>

					<description><![CDATA[If you need to work with sets, you may find Xojo's new Set class useful.

A set is a group of items, not unlike a Dictionary. You can add or remove items from the set, as you might expect, but some of its more unique capabilities let you do a difference, intersection and union of two sets.]]></description>
										<content:encoded><![CDATA[
<p>If you need to work with <a href="https://en.wikipedia.org/wiki/Set_(abstract_data_type)">sets</a>, you may find Xojo&#8217;s new Set class useful.</p>



<p>A set is a group of items, not unlike a Dictionary. You can add or remove items from the set, as you might expect, but some of its more unique capabilities let you do a difference, intersection and union of two sets.</p>



<ul class="wp-block-list">
<li>Difference returns a new Set with members that are unique to each Set. This is essentially the items in the first set that are not in the second set.</li>
</ul>



<ul class="wp-block-list">
<li>Intersection returns a new Set with members that are common to both Sets.</li>
</ul>



<ul class="wp-block-list">
<li>Union returns a new Set that contain the members of both Sets.</li>
</ul>



<p>There are also methods to populate a set from an array or a Dictionary. Learn more about using the <a href="https://documentation.xojo.com/api/language/set.html">Set class</a> in the Xojo Programming Documentation.</p>



<p>Set is based on code written by Xojo MVP Kem Tekinay and works on all platforms.</p>



<p><em>Kem Tekinay is a consultant and developer based in Connecticut. A Xojo MVP, Kem&nbsp;has been an avid Xojo user since the early days and is a world-renowned thinker and philosopher, at least in his own mind. You can find him and his work at <a href="http://www.mactechnologies.com">MacTechnologies Consulting</a>.</em></p>



<p><em>Paul learned to program in BASIC at age 13 and has programmed in more languages than he remembers, with Xojo being an obvious favorite. When not working on Xojo, you can find him talking about retrocomputing at <a href="https://goto10.substack.com" target="_blank" rel="noreferrer noopener">Goto 10</a> and </em>on Mastodon @lefebvre@hachyderm.io.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The XAML Control&#8217;s New Playground</title>
		<link>https://blog.xojo.com/2023/10/10/the-xaml-controls-new-playground/</link>
		
		<dc:creator><![CDATA[William Yu]]></dc:creator>
		<pubDate>Tue, 10 Oct 2023 13:30:00 +0000</pubDate>
				<category><![CDATA[Fun]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[2023r3]]></category>
		<category><![CDATA[DesktopXAMLContainer]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Windows IDE]]></category>
		<category><![CDATA[XAML]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12114</guid>

					<description><![CDATA[With the new XAML Control chooser window that's available in Xojo 2023 Release 3 for Windows, you can now play/experiment with XAML like never before, right in the IDE.]]></description>
										<content:encoded><![CDATA[
<p>With the new XAML Control chooser window that is available in Xojo 2023r3 for Windows you can now play/experiment with XAML like never before, right in the IDE. </p>



<h3 class="wp-block-heading">A Playground Built-In to the IDE</h3>



<p>For those that have already tried the XAML Gallery example project, you may be familiar with one particular part of the demo which allows you to experiment with XAML in what we call the Playground:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="818" src="https://blog.xojo.com/wp-content/uploads/2023/10/XAMLGallery-1024x818.png" alt="" class="wp-image-12115" srcset="https://blog.xojo.com/wp-content/uploads/2023/10/XAMLGallery-1024x818.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/10/XAMLGallery-300x240.png 300w, https://blog.xojo.com/wp-content/uploads/2023/10/XAMLGallery-768x614.png 768w, https://blog.xojo.com/wp-content/uploads/2023/10/XAMLGallery.png 1279w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>This Playground has now been integrated into the Windows IDE in Xojo 2023 Release 3.</p>



<h3 class="wp-block-heading">The New XAML Control Chooser Window</h3>



<p>In Xojo 2023r2 we introduced DesktopXAMLContainer. Dragging one onto your layout and clicking on the edit icon allowed you to pick a pre-defined XAML control via our XAML Control Chooser Window. This XAML Control Chooser Window has now been updated in Xojo 2023r3 to include additional features that mimic what the XAML Gallery example project already provided, and that&#8217;s the Playground.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="918" src="https://blog.xojo.com/wp-content/uploads/2023/10/NewXAMLControlChooser-1024x918.png" alt="" class="wp-image-12117" srcset="https://blog.xojo.com/wp-content/uploads/2023/10/NewXAMLControlChooser-1024x918.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/10/NewXAMLControlChooser-300x269.png 300w, https://blog.xojo.com/wp-content/uploads/2023/10/NewXAMLControlChooser-768x689.png 768w, https://blog.xojo.com/wp-content/uploads/2023/10/NewXAMLControlChooser.png 1056w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Experimenting in the New Playground</h3>



<p>Just like in the XAML Gallery project, you can now enter your own custom XAML code and &#8220;run&#8221; it (using that play looking button next to the XAML editor).</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="918" src="https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLButton-1024x918.png" alt="" class="wp-image-12119" srcset="https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLButton-1024x918.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLButton-300x269.png 300w, https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLButton-768x689.png 768w, https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLButton.png 1056w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>When you are satisfied with how your XAML looks, just click Add to insert it into the DesktopXAMLContainer.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="669" src="https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLAdded-1024x669.png" alt="" class="wp-image-12121" srcset="https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLAdded-1024x669.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLAdded-300x196.png 300w, https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLAdded-768x502.png 768w, https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLAdded-1536x1004.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/10/CustomXAMLAdded.png 2032w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Et voilà!  The new XAML Control Chooser Window provides a unique WYSIWYG interface that you can use to edit your XAML code and to experiment with XAML, now go out and play! Learn more about the the <a href="https://documentation.xojo.com/api/user_interface/desktop/desktopxamlcontainer.html#desktopxamlcontainer">DesktopXAMLContainer</a> in the Xojo Programming Documentation.</p>



<p><em><em><em>William Yu grew up in Canada learning to program BASIC on a Vic-20. He is Xojo’s resident Windows and Linux engineer, among his many other skills. Some may say he has joined the dark side here in the USA, but he will always be a Canadian at heart.</em></em></em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>iOS: Visits and GeoFencing For MobileLocation</title>
		<link>https://blog.xojo.com/2023/10/10/ios-visits-and-geofencing-for-mobilelocation/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 10 Oct 2023 13:30:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[2023r3]]></category>
		<category><![CDATA[MobileLocation]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12135</guid>

					<description><![CDATA[Starting with Xojo 2023r3 there are two new features in the iOS MobileLocation control: Visits and GeoFencing. Visits allows  the operating system to notify an app when a device stays near a given place for some time. GeoFencing can notify an app when the user enters and/or leaves a previously registered region.]]></description>
										<content:encoded><![CDATA[
<p>Starting with Xojo 2023r3 there are two new features in the iOS MobileLocation control: Visits and GeoFencing. Visits allows  the operating system to notify an app when a device stays near a given place for some time. GeoFencing can notify an app when the user enters and/or leaves a previously registered region.</p>



<p>As for any other features involving the MobileLocation control on iOS, the same rules apply when enabling the required capabilities (from the Attributes section in the Inspector Panel with the iOS item selected in the Navigator), and also when requesting the user&#8217;s permission to use location services. In fact, it is advisable to enable the Background Modes &gt; Location capability so your app still gets notified both when using Visits or GeoFencing and the app itself is running in the background.</p>



<p>Because we want to receive these events even when the app is not in use, you will want to use the MobileLocationUsageTypes.Always value for the request:</p>



<pre id="Xojo" class="wp-block-code"><code>location1.RequestUsageAuthorization(MobileLocation.UsageTypes.Always)</code></pre>



<h3 class="wp-block-heading">Have a Nice Visit!</h3>



<p>From the device point of view (iPhone or iPad), Visits are the most power-consumption effective way to track the user location involving almost no code.  The downside is that the operating system does not guarantee the immediate sending of the generated events to the running app.</p>



<p>In order to get this to work in your Xojo iOS app all you need to do is set the VisitAwareness property on the MobileLocation instance of the app to True. Setting the instance to True starts tracking the device location and setting it to False stops tracking and raising Visits based events in the app.</p>



<p>Then, when implementing the VisitChanged Event Handler in the MobileLocation instance of the app, it will receive the following parameters when a new Visit event is raised by the operating system:</p>



<ul class="wp-block-list">
<li>latitude As Double</li>



<li>longitude As Double</li>



<li>accuracy As Double</li>



<li>arrival As DateTime</li>



<li>departure As DateTime</li>
</ul>



<p>So, for example, it will be really easy to automatically add new MapLocation instances to a MobileMap in the app based on the information received. The following snippet of code added to the VisitChanged event shows how to do that on a MobileMap control instance named VisitsMap that has been added to the Screen of the iOS app:</p>



<pre id="xojo" class="wp-block-code"><code>Var arrivalDate As String = If(arrival &lt;&gt; Nil, arrival.ToString, "")
Var departureDate As String = If(departure &lt;&gt; Nil, departure.ToString, "")

Var lc As New MapLocation(latitude, longitude, "Arrival: " + arrivalDate + EndOfLine + "Departure: " + departureDate)
VisitsMap.AddLocation(lc)</code></pre>



<p>It is worth mentioning the checks on the arrival and departure DateTime objects against Nil, iOS does not guarantee to always fulfill this information on the generated Visit events. That means, you may just receive the arrival date and time or the departure date and time, or both of them.</p>



<p>Lastly, the Visits feature will not work when the app is run in the Simulator so you will need to build the app and copy it to the device itself (using Xcode &gt; Devices and Simulators window). You can find an example project for the Visits feature in the Examples folder in the Xojo download, </p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="472" height="1024" src="https://blog.xojo.com/wp-content/uploads/2023/10/Visits-472x1024.jpeg" alt="" class="wp-image-12136" srcset="https://blog.xojo.com/wp-content/uploads/2023/10/Visits-472x1024.jpeg 472w, https://blog.xojo.com/wp-content/uploads/2023/10/Visits-138x300.jpeg 138w, https://blog.xojo.com/wp-content/uploads/2023/10/Visits-768x1665.jpeg 768w, https://blog.xojo.com/wp-content/uploads/2023/10/Visits-709x1536.jpeg 709w, https://blog.xojo.com/wp-content/uploads/2023/10/Visits-945x2048.jpeg 945w, https://blog.xojo.com/wp-content/uploads/2023/10/Visits.jpeg 1179w" sizes="auto, (max-width: 472px) 100vw, 472px" /></figure>
</div>


<p>The screenshot above shows what it looks like after using the app (in the background) for about one hour. As you can see, several MapLocation items have been added to the map tracking the places visited by the user.</p>



<h3 class="wp-block-heading">GeoFencing on iOS</h3>



<p>GeoFencing allows the operating system to notify the app when the device enters and/or exists a previously registered region. These regions are created by providing latitude, longitude and radius (in meters) values along with a String value that uniquely identifies the region. These regions persist even after exiting the app or restarting the device. The main limitation is that a maximum of 20 regions can be registered by an app.</p>



<p>The way to create such regions is through the new MobileCircularRegion class; for example:</p>



<pre id="xojo" class="wp-block-code"><code>Var EiffelTowerRegion As New MobileCircularRegion(48.858093, 2.294694, 20.0, "EiffelTowerExample")</code></pre>



<p>By default it is set to notify when the device enters and leaves the region, this can be changed using the available class properties.</p>



<p>Once the region instance has been created, it needs to be added to the MobileLocation instance of your app using the AddRegion method:</p>



<pre id="xojo" class="wp-block-code"><code>MyLocationInstance.AddRegion(EiffelTowerRegion)</code></pre>



<p>Lastly, and in order to receive GeoFencing events, add the RegionEntered and/or RegionExited Event Handlers to the MobileLocation instance in your app. Both of these will provide the associated MobileCircularRegion instance as the parameter, so the logic of your app can take the required path based on that.</p>



<p>Also, while the Visits feature can only be tested on a physical device, the GeoFencing feature can be tested in the Simulator.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="473" height="1024" src="https://blog.xojo.com/wp-content/uploads/2023/10/GeoFencing-473x1024.png" alt="" class="wp-image-12137" srcset="https://blog.xojo.com/wp-content/uploads/2023/10/GeoFencing-473x1024.png 473w, https://blog.xojo.com/wp-content/uploads/2023/10/GeoFencing-139x300.png 139w, https://blog.xojo.com/wp-content/uploads/2023/10/GeoFencing-768x1662.png 768w, https://blog.xojo.com/wp-content/uploads/2023/10/GeoFencing-710x1536.png 710w, https://blog.xojo.com/wp-content/uploads/2023/10/GeoFencing-946x2048.png 946w, https://blog.xojo.com/wp-content/uploads/2023/10/GeoFencing.png 1170w" sizes="auto, (max-width: 473px) 100vw, 473px" /></figure>
</div>


<p>You will also find other new methods in MobileLocation in order to remove a previously added Region or retrieve all the registered Regions in addition to adding them as we did in the earlier code example above.</p>



<p>As with the Visits, you can find a project in the Examples folder to test GeoFencing on iOS.</p>



<h3 class="wp-block-heading">In Summary</h3>



<p>Both <a href="https://documentation.xojo.com/api/mobile/mobilelocation.html#mobilelocation-visitawareness https://documentation.xojo.com/api/mobile/mobilelocation.html#mobilelocation-visitchanged">Visits</a> and <a href="https://documentation.xojo.com/api/ios/maplocation.html#maplocation-constructor0 https://documentation.xojo.com/api/mobile/mobilecircularregion.html">GeoFencing</a> provide to you new ways of retrieving the user location that can be more suitable for the purposes of the iOS apps you develop with Xojo, and because these are based in events managed by the operating system itself, they have less impact in the iPhone/iPad battery.</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Android Design Extensions 1.5 for Xojo 2023r3</title>
		<link>https://blog.xojo.com/2023/10/10/android-design-extensions-1-5-for-xojo-2023r3/</link>
		
		<dc:creator><![CDATA[Martin T.]]></dc:creator>
		<pubDate>Tue, 10 Oct 2023 13:30:00 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[2023r3]]></category>
		<category><![CDATA[Android Design Extensions]]></category>
		<category><![CDATA[Declares]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12201</guid>

					<description><![CDATA[The Android Design Extensions 1.5 are now available. This version works with Xojo 2023r3 and brings about 90 new extensions.]]></description>
										<content:encoded><![CDATA[
<p>The Android Design Extensions 1.5 are now available. This version works with Xojo 2023r3<strong> </strong>and brings about 90 new extensions:</p>



<ul class="wp-block-list">
<li>Declares for the new MobilePopupMenu </li>



<li>Declares for MobileMoviePlayer</li>



<li>Extensions for all MobileUIControl subclasses </li>



<li>New extensions for AndroidMobileTable</li>



<li>New extensions for MobileScrollableArea </li>



<li>New extensions for MobileSwitch</li>



<li>New extensions for MobileTabPanel</li>



<li>New extensions for MobileTextArea</li>



<li>New extensions for MobileTextField</li>
</ul>



<h3 class="wp-block-heading"><strong>Use MobilePopupMenu to Display it in Other Controls</strong></h3>



<p>The new MobilePopupMenu is a nice new addition to Xojo&#8217;s Android control library. Wouldn&#8217;t it be nice to display the popup menu when clicking on a Button or Canvas as well? With the Android Design Extensions you can achieve this.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="517" height="1024" src="https://blog.xojo.com/wp-content/uploads/2023/10/01A34D47-6DA9-40F8-BA71-5B51781BA373-1-517x1024.png" alt="" class="wp-image-12203" srcset="https://blog.xojo.com/wp-content/uploads/2023/10/01A34D47-6DA9-40F8-BA71-5B51781BA373-1-517x1024.png 517w, https://blog.xojo.com/wp-content/uploads/2023/10/01A34D47-6DA9-40F8-BA71-5B51781BA373-1-151x300.png 151w, https://blog.xojo.com/wp-content/uploads/2023/10/01A34D47-6DA9-40F8-BA71-5B51781BA373-1-768x1521.png 768w, https://blog.xojo.com/wp-content/uploads/2023/10/01A34D47-6DA9-40F8-BA71-5B51781BA373-1-775x1536.png 775w, https://blog.xojo.com/wp-content/uploads/2023/10/01A34D47-6DA9-40F8-BA71-5B51781BA373-1.png 846w" sizes="auto, (max-width: 517px) 100vw, 517px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="498" height="1024" src="https://blog.xojo.com/wp-content/uploads/2023/10/51450EFA-BB92-4443-9196-2AF4D3F68D71-498x1024.png" alt="" class="wp-image-12204" style="width:425px;height:874px" srcset="https://blog.xojo.com/wp-content/uploads/2023/10/51450EFA-BB92-4443-9196-2AF4D3F68D71-498x1024.png 498w, https://blog.xojo.com/wp-content/uploads/2023/10/51450EFA-BB92-4443-9196-2AF4D3F68D71-146x300.png 146w, https://blog.xojo.com/wp-content/uploads/2023/10/51450EFA-BB92-4443-9196-2AF4D3F68D71-768x1579.png 768w, https://blog.xojo.com/wp-content/uploads/2023/10/51450EFA-BB92-4443-9196-2AF4D3F68D71-747x1536.png 747w, https://blog.xojo.com/wp-content/uploads/2023/10/51450EFA-BB92-4443-9196-2AF4D3F68D71-996x2048.png 996w, https://blog.xojo.com/wp-content/uploads/2023/10/51450EFA-BB92-4443-9196-2AF4D3F68D71.png 1080w" sizes="auto, (max-width: 498px) 100vw, 498px" /></figure>
</div>
</div>



<ol class="wp-block-list">
<li>Create a new Android project</li>



<li>Import the Android Design Extension<strong> </strong>folder into your project</li>



<li>Add a MobilePopupMenu<strong> </strong>(<em>PopupMenu1</em>) from the library to <em>Screen1</em></li>



<li>Add some entries to the <em>PopupMenu1 </em>in the Inspector in the InitialValue<strong> </strong>section (say &#8220;Apple&#8221;, &#8220;Banana&#8221;, &#8220;Peach&#8221;)</li>



<li>Set the Visible<strong> </strong>property of the <em>PopupMenu1 </em>to <code>False</code></li>



<li>Add a MobileButton<strong> </strong>(<em>Button1</em>) from the library to <em>Screen1 </em>and place it over the &#8220;invisible&#8221; <em>PopupMenu1</em></li>



<li>Add the Pressed-Event to <em>Button1</em> with the following code:</li>
</ol>



<pre id="Xojo" class="wp-block-code"><code>Call PopupMenu1.PerformClickXC</code></pre>



<p>8. Add the SelectionChanged-Event to the <em>PopupMenu1 </em>with the following code: </p>



<pre id="Xojo" class="wp-block-code"><code>Button1.Caption = Me.SelectedRowText</code></pre>



<p>9. Run your project by clicking Run.</p>



<p>You can use this technique with any control that you want to have a popup menu. For example, in a Canvas you would use the PointerDown-Event.</p>



<p>Feel free to take a look at the developer repository, create feature requests, and provide feedback on extending this extension library.</p>



<p>I’m happy to receive any voluntary financial support for the work I’ve done so far, which you are welcome to share <a href="https://paypal.me/MTrippensee" data-type="link" data-id="https://paypal.me/MTrippensee">here</a>. You can download the project with many examples <a href="https://github.com/XojoGermany/AndroidDesignExtensions" data-type="link" data-id="https://github.com/XojoGermany/AndroidDesignExtensions">here</a>. </p>



<p>Happy Coding.</p>



<p><em>Martin T. is a Xojo MVP and has been very involved in testing Android support.</em></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
