<?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>Geoff Perlman &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/author/geoff/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, 01 Apr 2026 23:42:40 +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>Reflecting on 30 Years of Xojo</title>
		<link>https://blog.xojo.com/2026/04/01/reflecting-on-30-years-of-xojo/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Wed, 01 Apr 2026 23:42:38 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=16110</guid>

					<description><![CDATA[Today marks the 30th anniversary of founding of this company. It&#8217;s hard to believe that nearly half of my life has passed since then. I&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Today marks the 30th anniversary of founding of this company. It&#8217;s hard to believe that nearly half of my life has passed since then. I could not have imagined that I would still be doing this 30 years later. I frequently remind my kids that you can plan all you want but be prepared for things to change. My experience at Xojo is a perfect example of that: things have to change and adapt to survive.</p>



<p>That&#8217;s why Xojo is still here: relentless adaptation.</p>



<p>Back when Xojo was REALbasic, version 1.0 only supported MacOS 8/9 and the 68000 and PowerPC processors. Since then we have seen countless changes in the computer technology landscape. Classic MacOS, Windows NT, Windows 95, Internet Explorer 6, Early versions of GTK on Linux, diskettes, and spinning hard drives are now ancient technology.</p>



<p>Xojo itself has changed dramatically over time as well. Though the basic idea of it, that you should be able to quickly and easily both learn Xojo and build apps, has not changed. Some code from an example project back then would be recognizable to a Xojo user today. Assigning variables, conditional statements, loops, even many classes like Graphics, FolderItem, TextInputStream, would all look familiar. That said, almost everything else has changed:</p>



<ul class="wp-block-list">
<li>The IDE was originally written in C++. It is now written in Xojo.</li>



<li>There entire Xojo framework was originally written in C++. Today it&#8217;s a big blend of languages including quite a bit of Xojo.</li>



<li>It originally had a single pass compiler. The entire compilation process has been rewritten. It is a modern, two-pass system that uses LLVM as its backend.</li>



<li>REALbasic v1 could only produce desktop apps for MacOS 8 and 9 running on 68000 and PowerPC processors. Today, Xojo supports x86 and ARM processors, desktop apps for Linux, MacOS and Windows, mobile apps for Android and iOS and web apps.</li>



<li>The documentation was originally almost entirely in printed form. It cost $30, weighed 49 ounces (just over 3 lbs.) and we shipped it to you right from our office. Now, the documentation is all online.</li>



<li>The way users reported bugs and made feature requests has changed several times over the years.</li>



<li>The community formed in mailing lists, and occasional Xojo events, now exists on our online forum.</li>
</ul>



<p>And that adaption continues. We improve the frameworks with each release. We have added the ability to build Libraries. We are working on making web apps more responsive. We are continuing our march towards updating the Windows framework to WinUI. We are making changes to the Xojo IDE so that you can use AI tools such as Anthropic&#8217;s Claude Code, Google&#8217;s Gemini Code Assist, and Open.AI&#8217;s Codex, which, coincidentally, was almost the name we chose for what is now Xojo.</p>



<p>Companies survive by adapting, and Xojo, Inc. is no exception. Over the years we&#8217;ve changed everything from offices, personnel, and policies. While the team has changed over the years, many members have been with the company a very long time. In the tech industry, the average turnover is 2 to 3 years. Over the last 30 years, our average turnover is 7 years. Counting current team members, however, it&#8217;s a whopping 16.6 years! And among the current engineering team, there are 136 person-years of development on Xojo. We started working out of my apartment, then my house and then into an office here in Austin, Texas. Over time, about half of us found we were working from home a lot, so we decided to go entirely remote in 2008. We have changed many of our internal policies to make Xojo a great place to work. Every member of the Xojo team works so well together that it makes coming to work every day genuinely rewarding.</p>



<p>In general, only about 5% of businesses last 30 years. In tech it&#8217;s closer to 1%. It&#8217;s an honor to be a member of the tech industry&#8217;s 1% club!</p>



<p>What drives all of us at Xojo is helping you turn what started as an idea, into reality. We couldn&#8217;t have done it without all the dedicated Xojo users. That some of you have been with us for the entire journey, so far, is especially gratifying.</p>



<p>On behalf of the entire team, thank you for making Xojo possible.</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>When Doing More Is Faster: A Curious Xojo Performance Test</title>
		<link>https://blog.xojo.com/2026/01/05/when-doing-more-is-faster-a-curious-xojo-performance-test/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Mon, 05 Jan 2026 20:45:13 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[ARM64]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Performance Tuning]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15751</guid>

					<description><![CDATA[I ran across something recently that had me truly scratching my head. My goal was to measure how much extra time it would take for&#8230;]]></description>
										<content:encoded><![CDATA[
<p>I ran across something recently that had me truly scratching my head. My goal was to measure how much extra time it would take for some additional functionality I wished to add to a project. The initial code was performing a query on a table in a database and then looping through the RowSet returned to populate five columns of a DesktopListBox with each row from the RowSet. I created a new project to test a simple form of the code. I added some code to measure the performance in microseconds. Next, I created an identical test except this time there was an extra line of code inside the loop that assigned a DatabaseRow from the RowSet to the row&#8217;s RowTag. This was the extra functionality I wanted. The tests would show me the cost of this functionality in terms of performance.</p>



<h2 class="wp-block-heading">Test 1</h2>



<pre class="wp-block-code"><code>Var rs As rowset = SQLiteDatabase1.SelectSQL("SELECT invoices.invoiceno, invoices.invoicedate, invoices.invoiceamount, customers.firstname, customers.lastname FROM Invoices JOIN Customers ON invoices.customerid = customers.id")
Results1.RemoveAllRows
Var grandTotal As Integer
Var totalIterations As Integer  = 10
For i As Integer = 1 To totalIterations
  Var start As Integer = System.Microseconds
  For Each row As databaserow In rs
    ListBox1.AddRow(rs.Column("InvoiceNo"), rs.Column("lastname"), rs.Column("firstname"), rs.Column("InvoiceDate"), rs.Column("InvoiceAmount"))
  Next
  Var stop As Integer = System.Microseconds
  Var total As Integer = stop - start
  grandTotal = grandTotal + total
  Results1.AddRow("Test " + i.ToString + ": " + total.ToString)
Next
Var avg As Integer = grandTotal / totalIterations
results1.AddRow("Average: " + avg.ToString)</code></pre>



<h2 class="wp-block-heading">Test 2</h2>



<pre class="wp-block-code"><code>Var rs As rowset = SQLiteDatabase1.SelectSQL("SELECT invoices.invoiceno, invoices.invoicedate, invoices.invoiceamount, customers.firstname, customers.lastname FROM Invoices JOIN Customers ON invoices.customerid = customers.id")
Results2.RemoveAllRows
Var grandTotal As Integer
Var totalIterations As Integer  = 10
For i As Integer = 1 To totalIterations
  Var start As Integer = System.Microseconds
  For Each row As databaserow In rs
    ListBox1.AddRow(rs.Column("InvoiceNo"), rs.Column("lastname"), rs.Column("firstname"), rs.Column("InvoiceDate"), rs.Column("InvoiceAmount"))
    <strong>ListBox1.RowTagAt(ListBox1.LastAddedRowIndex) = row</strong>
  Next
  Var stop As Integer = System.Microseconds
  Var total As Integer = stop - start
  grandTotal = grandTotal + total
  Results2.AddRow("Test " + i.ToString + ": " + total.ToString)
Next
Var avg As Integer = grandTotal / totalIterations
results2.AddRow("Average: " + avg.ToString)</code></pre>



<p>I assumed the second test would take longer since it&#8217;s doing the extra step of assigning the row to the RowTag property. However, when I ran the test, something curious occurred. The second test, rather than taking more time to complete, took <em>less</em>. This made no sense to me. It&#8217;s doing <em>more</em> so it should take longer. It&#8217;s not logical that asking it to do more would result in the task taking less time. After examining my code, I could not find any issues with it.</p>



<p>I modified the code to run each test 10 times then compute the average of all 10 tests. Depending on the run, the average time for Test 2 was nearly always shorter. Occasionally the average for Test 1 would be shorter than Test 2 but rarely. In fact, on my M4-based MacBook Pro, Test 2&#8217;s average was, in most cases, anywhere from 5% to 25% faster than Test 1. Next I tested it on an M1-based MacBook Pro with similar results. Then I tested it on an x86-based PC running Windows 11. This time Test 2 was slightly slower than Test 1 as I had been expecting from the beginning. Last but not least, I tested on Windows 11 running via Parallels on my MacBook Pro, compiling for ARM-64. In this test, Test 2 was indeed faster. I tried running these tests by changing the order (Test 1 then Test 2 followed by Test 2 then Test 1) and by quitting between runs. None of that seemed to matter.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="693" src="https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.10@2x-1024x693.png" alt="" class="wp-image-15752" srcset="https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.10@2x-1024x693.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.10@2x-300x203.png 300w, https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.10@2x-768x520.png 768w, https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.10@2x-1536x1040.png 1536w, https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.10@2x.png 1628w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="693" src="https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.17@2x-1024x693.png" alt="" class="wp-image-15753" srcset="https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.17@2x-1024x693.png 1024w, https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.17@2x-300x203.png 300w, https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.17@2x-768x520.png 768w, https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.17@2x-1536x1040.png 1536w, https://blog.xojo.com/wp-content/uploads/2026/01/CleanShot-2026-01-05-at-13.37.17@2x.png 1628w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>The difference appears to be ARM. It could be the compiler or the CPU. Our Director of Engineering, Travis Hill, suspects that perhaps something like the branch predictor in the CPU is hopping a <em>tiny</em> bit faster because of the extra assignment and thus can better predict the next operation with the For Each loop. That could be. The timing is in microseconds so the difference is so small that for my purposes, it doesn&#8217;t matter. However, that it&#8217;s faster to do more work in this case is fascinating and unexpected.</p>



<p>In any case, it&#8217;s interesting to see code behave in a way that is so counterintuitive. Asking the method to do more, at least on ARM-based machines, caused the method to take less time.</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>Creating Libraries that Support Multiple Project Types</title>
		<link>https://blog.xojo.com/2025/12/09/creating-libraries-that-support-multiple-project-types/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Tue, 09 Dec 2025 16:31:12 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[2025r3]]></category>
		<category><![CDATA[LibMerge]]></category>
		<category><![CDATA[Libraries]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15588</guid>

					<description><![CDATA[Libraries, introduced in Xojo 2025r3, make it easy to reuse your classes and interface items such as windows, webpages, and mobile screens across projects. As&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Libraries, introduced in Xojo 2025r3, make it easy to reuse your classes and interface items such as windows, webpages, and mobile screens across projects. As compiled code, Libraries ensure your projects always use a specific version of your functionality while allowing you to share features with other Xojo users without exposing your intellectual property. Think of them like plugins written in Xojo instead of C++, with the flexibility to use them in a single project folder or in the Plugins folder for access across all projects. The Xojo documentation provides guidance on <a href="https://documentation.xojo.com/topics/code_management/sharing_code_among_multiple_projects.html" target="_blank" rel="noreferrer noopener">creating your own Libraries</a>.</p>



<p>When you create a Library in Xojo, it’s tailored to the project type you’re working in, whether that is Desktop, Web, Mobile or Console, so everything stays organized and easy to manage. The Library format was designed to support all project types simultaneously; unfortunately, the Xojo IDE was not. The good news is that there are still ways to take advantage of the flexible underlying format. Since Libraries are simply .zip files, you can change the extension to .zip and decompress them to explore their contents. Inside, you’ll find a folder named for the project type you originally created it from, making it easy to understand the structure. Here are two ways to create Libraries that support multiple project types.</p>



<h2 class="wp-block-heading"><strong>Merging Libraries Manually</strong></h2>



<p>To manually create a multi-project-type Library, start by building a separate Library for each project type your functionality supports, then change each one’s extension to .zip and decompress it. Choose one decompressed Library to serve as the final version, and copy the project-type folders (Desktop, Web, iOS, Android or Console) from the others into it. When everything is combined, recompress the folder back into a .zip file and change the extension to .xojo_library. You now have a single Library that works across all the project types you included.</p>



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



<p>LibMerge is a utility we created to make it easier to merge Libraries.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="561" src="https://blog.xojo.com/wp-content/uploads/2025/11/LibMerge-1-1024x561.jpg" alt="" class="wp-image-15597" srcset="https://blog.xojo.com/wp-content/uploads/2025/11/LibMerge-1-1024x561.jpg 1024w, https://blog.xojo.com/wp-content/uploads/2025/11/LibMerge-1-300x165.jpg 300w, https://blog.xojo.com/wp-content/uploads/2025/11/LibMerge-1-768x421.jpg 768w, https://blog.xojo.com/wp-content/uploads/2025/11/LibMerge-1.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ol class="wp-block-list">
<li>Download LibMerge for <a href="https://blog.xojo.com/wp-content/uploads/2025/12/LibMergeLinux.zip" data-type="attachment" data-id="15691" target="_blank" rel="noreferrer noopener">Linux</a>, <a href="https://blog.xojo.com/wp-content/uploads/2025/12/LibMergeMac.zip" data-type="attachment" data-id="15693" target="_blank" rel="noreferrer noopener">macOS</a> or <a href="https://blog.xojo.com/wp-content/uploads/2025/12/LibMergeWindows.zip" data-type="attachment" data-id="15692" target="_blank" rel="noreferrer noopener">Windows</a>. It will be included in the Extras folder in the next major release.</li>



<li>Launch LibMerge and then click the Add button to select the Libraries you wish to merge or drag them into the Libraries list in the LibMerge window.</li>



<li>On the Info tab, make sure the Version, Copyright and Description values are as you want them for the merged Library. These initial values are loaded from the first Library you add to the list.</li>



<li>Click the Save As button to choose a name and location for your merged Library. That&#8217;s it!</li>
</ol>



<p>If you choose two libraries that both already support the same project type, LibMerge will tell you and not load the second Library. Included with LibMerge is the LibMerge Library which you can use to build the merging of Libraries into your own build tools. Check out the included LibMerge API Guide for details. Here is an example:</p>



<pre class="wp-block-code"><code>Try
   Var merge As New LibMerger
   merge.AddLibrary(SpecialFolder.Desktop.Child("MyDesktopLibrary.xojo_library"))
   merge.AddLibrary(SpecialFolder.Desktop.Child("MyWebLibrary.xojo_library"))
   merge.SaveMergedLibrary(SpecialFolder.Desktop.Child("MergedLibrary.xojo_library"))
Catch error as UnsupportedFormatException
   System.Beep
   MessageBox(error.Message)
End Try</code></pre>



<p>Whether you prefer to roll up your sleeves and merge Libraries manually or let LibMerge handle the heavy lifting, Xojo gives you the flexibility to build reusable components that work across all your project types. With a little exploration and the right tools you can streamline your workflow, reduce duplication and keep your projects cleaner and more maintainable. LibMerge makes this process fast and reliable whether you’re merging two Libraries or twenty. Read more about <a href="https://documentation.xojo.com/topics/code_management/sharing_code_among_multiple_projects.html" target="_blank" rel="noreferrer noopener">Libraries</a> in the Xojo Documentation.</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>Modern and Evolving: macOS and iOS 26 and WinUI in Xojo</title>
		<link>https://blog.xojo.com/2025/12/09/modern-and-evolving-macos-and-ios-26-and-winui-in-xojo/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Tue, 09 Dec 2025 16:30:56 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[2025r3]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[macOS 26]]></category>
		<category><![CDATA[macOS Tahoe]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[WinUI]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15650</guid>

					<description><![CDATA[As the platforms we develop for continue to evolve, so does Xojo. Each year brings new design directions, updated frameworks and refreshed user experience standards&#8230;]]></description>
										<content:encoded><![CDATA[
<p>As the platforms we develop for continue to evolve, so does Xojo. Each year brings new design directions, updated frameworks and refreshed user experience standards across macOS, iOS and Windows. Staying aligned with these changes is essential, not just to keep apps looking modern, but to ensure they feel right at home on every device. In this post, we’ll take a look at how Xojo is adapting to Apple’s latest updates and our ongoing work to bring a modern Windows experience through WinUI.</p>



<h2 class="wp-block-heading">macOS 26 and iOS 26</h2>



<p>Over time, Apple has brought the user experiences of macOS and iOS closer together. macOS 26 and iOS 26, now aligned in version numbers, also share more similarities than ever in their user experience. These updates represent the most significant user experience changes from Apple since iOS was introduced in 2007 and Aqua for macOS seven years earlier. With such a big update, especially when designing elements to work on both large computers displays as well as small smartphone screens, it’s no surprise there’s some tweaking requiring after release. Clearly, Apple is still refining its platforms.</p>



<p>We continue to update Xojo as Apple defines its preferred user experience, ensuring that you can deliver the best possible experience to your users.</p>



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



<p>We are also hard at work upgrading our Windows framework to WinUI, providing a modern user experience for Windows apps. You can see our progress in each release by enabling the Use WinUI (Experimental) option on the Advanced tab in Windows build settings. The “Experimental” label is a reminder that the feature is still evolving, and it will be removed once WinUI is fully ready. Our goal has always been to keep Xojo on a steady path, prepared for whatever challenges lie ahead.</p>



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



<p>On behalf of the entire Xojo team, I can say that we love what we do and we appreciate your support in allowing us to do it. We are Xojo users ourselves (after all, we make Xojo with Xojo) and we enjoy seeing what you make with it. With that in mind, feel free to tell us about your creations. Send your screenshots, descriptions and your story to hello@xojo.com.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo Support for macOS 26 and iOS 26</title>
		<link>https://blog.xojo.com/2025/09/15/xojo-support-for-macos-26-and-ios-26/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Mon, 15 Sep 2025 17:56:25 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Liquid Glass]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15358</guid>

					<description><![CDATA[Apple is rolling out some of its biggest design changes in years and we want to update you on where Xojo stands. Apple released macOS&#8230;]]></description>
										<content:encoded><![CDATA[
<p><em>Apple is rolling out some of its biggest design changes in years and we want to update you on where Xojo stands.</em></p>



<p>Apple released <strong>macOS 26 and iOS 26</strong> today, the first versions to ship with Apple’s new&nbsp;Liquid Glass&nbsp;look and feel.</p>



<p>The current release of Xojo (2025r2.1) runs smoothly on macOS 26 and can build apps that run on both macOS 26 and iOS 26. However, because 2025r2.1 uses an older version of Apple&#8217;s SDKs, many controls in both the IDE and the apps you build will still use the previous look and feel when running on these new macOS and iOS versions.</p>



<p>We’ve been working throughout Apple’s beta cycle to bring full support for Liquid Glass to Xojo. As you might imagine, Apple made a lot of changes to the OSs along the way — changes that affected things like our layout editor, control sizing, and behavior. Some of these changes were still happening very late in the process. Now that macOS 26 and iOS 26 are officially shipping, we finally know what the end result looks like and how it behaves.</p>



<p>Supporting Liquid Glass and the underlying system changes is a big undertaking and we still have more work to do. Since we build Xojo with Xojo, this means updating not only the Xojo framework but also parts of the IDE itself so it looks and behaves correctly on macOS 26 with Liquid Glass. Our goal is to let you use Liquid Glass in both built-in Xojo controls and third-party party plugins as soon as possible. That&#8217;s why the next release of Xojo, 2025r3, will be built for macOS 26 and iOS 26, giving your apps the latest look and feel while still allowing them to run on older versions of macOS and iOS. This includes projects still using API 1 windows and controls.</p>



<p>Because of the scope of these changes — along with other big, exciting features in the works — the testing cycle for 2025r3 will be longer than usual. As a result, 2025r3 will likely be our last major release of the year, followed by any needed point releases. The good news is that 2025r3 will pack in everything you’d normally see across two releases, plus more. It’s shaping up to be one of the biggest Xojo releases in recent years, with plenty beyond just Liquid Glass to look forward to. Additionally, the updates for 2025r3 aren’t limited to macOS or iOS — there are improvements and new features coming for all platforms, so every Xojo user benefits.</p>



<p>If you have a current license and would like to get early access, we’d love your help testing 2025r3. Just reach out and we’ll be happy to add you to the beta program. We can’t wait to hear your feedback once testing begins!</p>



<p>If you are a long time Xojo user, you know we have been through a <em>lot</em> of big changes like this. Sometimes we get it all done in a single release and sometimes it takes a few to get to 100%. Regardless, our goal is to make the transition for you a smooth one.</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>Writing Drawing Code for Android, Desktop, iOS and Web</title>
		<link>https://blog.xojo.com/2025/04/21/writing-drawing-code-for-android-desktop-ios-and-web/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Mon, 21 Apr 2025 19:28:10 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Variants]]></category>
		<category><![CDATA[WebGraphics]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14826</guid>

					<description><![CDATA[When writing code it&#8217;s always a good idea to be thinking about the future. Today you are creating a desktop project but tomorrow you might&#8230;]]></description>
										<content:encoded><![CDATA[
<p>When writing code it&#8217;s always a good idea to be thinking about the future. Today you are creating a desktop project but tomorrow you might need to create an Android or iOS project. That code you&#8217;re writing might be code you could use for another project for another platform. </p>



<p>For the most part, writing drawing code will <em>just work</em> because you use Xojo&#8217;s <a href="https://documentation.xojo.com/api/graphics/graphics.html#graphics" target="_blank" rel="noreferrer noopener">Graphics</a> class for Android, Desktop and iOS projects. Web projects, however, don&#8217;t use the Graphics class. The <a href="https://documentation.xojo.com/api/user_interface/web/webcanvas.html#description" target="_blank" rel="noreferrer noopener">WebCanvas</a> control&#8217;s <a href="https://documentation.xojo.com/api/user_interface/web/webcanvas.html#webcanvas-paint" target="_blank" rel="noreferrer noopener">Paint</a> event is passed a <a href="https://documentation.xojo.com/api/graphics/webgraphics.html" target="_blank" rel="noreferrer noopener">WebGraphics</a> object. While the Graphics and WebGraphics classes have a lot in common, sharing many of the same methods with the same parameters, they are two distinctly different classes from the perspective of the Xojo compiler. That means that while the code you write will look almost identical, you still have to use a Graphics object for Android, Desktop and iOS projects and a WebGraphics object for Web projects. </p>



<p>Your instinct might be to simply write the code for one and then copy it to the other projects, changing Graphics to WebGraphics for Web projects. This will of course work, but then you have to remember to do this copy/paste/change operation every time you update your code. That&#8217;s not ideal.</p>



<h2 class="wp-block-heading">Graphics vs. WebGraphics</h2>



<p>With Xojo, the code can be written in such a way as to automatically handle the difference between Graphics/WebGraphics. Most often your graphics methods will be called from something that provides a Graphics or WebGraphics object for you to draw into such as a Canvas control&#8217;s Paint event. From there your code will call your methods that do the drawing. The problem is that your methods can&#8217;t use a Graphics or a WebGraphics type as a parameter because Graphics is not going to work for your Web projects and WebGraphics doesn&#8217;t exist in any framework except the Web framework. Thus using it anywhere else will result in a compiler error.</p>



<h3 class="wp-block-heading">Using a Variant</h3>



<p>Getting around this limitation is, fortunately, quite easy. Instead of using Graphics or WebGraphics as a parameter type, you use <a href="https://documentation.xojo.com/api/data_types/variant.html" target="_blank" rel="noreferrer noopener">Variant</a>. A Variant can hold any type of data from Strings to Integers, to Graphics to WebGraphics and more.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="560" height="466" src="https://blog.xojo.com/wp-content/uploads/2025/04/CleanShot-2025-04-17-at-14.46.40@2x.png" alt="" class="wp-image-14827" srcset="https://blog.xojo.com/wp-content/uploads/2025/04/CleanShot-2025-04-17-at-14.46.40@2x.png 560w, https://blog.xojo.com/wp-content/uploads/2025/04/CleanShot-2025-04-17-at-14.46.40@2x-300x250.png 300w" sizes="auto, (max-width: 560px) 100vw, 560px" /></figure>



<p>Once your drawing method gets the Variant though, it can&#8217;t use it to draw. It can only use a Graphics or WebGraphics objects. The trick is to then copy it into a Graphics or WebGraphics class variable:</p>



<pre class="wp-block-code"><code><code>Var g As Graphics = context</code></code></pre>



<p>or</p>



<pre class="wp-block-code"><code><code>Var g As WebGraphics = context</code></code></pre>



<p>The problem you now face, as mentioned earlier, is that WebGraphics only exists in Web projects. That means you have to write your code in such a way that you will declare the variable g as a Graphics object in Android, Desktop and iOS projects and as a WebGraphics object in Web projects. This can be achieved via conditional compilation. This is a simple technique that tells the Xojo compiler to only compile code into your app if conditions you specify are met. In this case, if you&#8217;re targeting Desktop or Mobile, it should compile in the line that uses the Graphics type, and if you are targeting a Web app, the line that uses WebGraphics. To conditionally compile, you just need to add that conditional code around these two lines:</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<pre class="wp-block-code"><code>#If TargetDesktop Or TargetMobile Then
   Var g As Graphics = context
#EndIf

#If TargetWeb Then
   Var g As WebGraphics = context
#EndIf</code></pre>
</div></div>
</div></div>



<p>Since a project must be only one of the above types, when you run or build your project, the appropriate line of code will be compiled in. From there, you now have a variable (g) of the right type can use this to draw whatever you like. For example, there are four identical example projects (one for each project type) that show off this technique. They can be found in the Xojo IDE by choosing File > New Project, clicking on Examples, choosing the Graphics folder in the list and then the Cross-Platform Drawing folder. The examples all draw a checkerboard that looks like this:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="912" height="916" src="https://blog.xojo.com/wp-content/uploads/2025/04/CleanShot-2025-04-17-at-15.12.41@2x.png" alt="" class="wp-image-14828" style="width:315px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2025/04/CleanShot-2025-04-17-at-15.12.41@2x.png 912w, https://blog.xojo.com/wp-content/uploads/2025/04/CleanShot-2025-04-17-at-15.12.41@2x-300x300.png 300w, https://blog.xojo.com/wp-content/uploads/2025/04/CleanShot-2025-04-17-at-15.12.41@2x-150x150.png 150w, https://blog.xojo.com/wp-content/uploads/2025/04/CleanShot-2025-04-17-at-15.12.41@2x-768x771.png 768w" sizes="auto, (max-width: 912px) 100vw, 912px" /></figure>
</div>


<p>They all contain the an identical Checkerboard class that handles the drawing. This class has DrawBorder and DrawCheckers methods that both take a Variant as a parameter. In each project is a Canvas control whose Paint event calls these methods:</p>



<pre class="wp-block-code"><code>Var cb As New Checkerboard
cb.DrawBoard(g)
cb.DrawCheckers(g)</code></pre>



<p>The full DrawBoard method looks like this:</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<pre class="wp-block-code"><code>#If TargetDesktop Or TargetMobile Then
  Var g As Graphics = context
#EndIf

#If TargetWeb Then
  Var g As WebGraphics = context
#EndIf 

Var boxSize As Integer = Min(g.Width/8, g.Height/8) 'The size of the box
'Draw the rows
For y As Integer = 0 To 7
  For x As Integer = 0 To 7
    'Switch colors for each box in the row
    If g.DrawingColor = Color.Black Then
      g.DrawingColor = Color.White
    Else
      g.DrawingColor = Color.Black
    End If
    'Draw a box
    g.FillRectangle(x * boxSize, y * boxSize, boxSize, boxSize)
  Next
  'Switch colors again for the beginning of the next row
  If g.DrawingColor = Color.Black Then
    g.DrawingColor = Color.White
  Else
    g.DrawingColor = Color.Black
  End If
Next</code></pre>
</div></div>



<p>In the example projects, check out the DrawCheckers method as well. It uses the same technique. What is great about this is that this class can be copied into any Android, Desktop, iOS or Web project and it will indeed <em>just work</em>.</p>



<h3 class="wp-block-heading">Checking Out the Examples</h3>



<p>There are four example projects (one for each project type &#8211; Android, Desktop, iOS and Web) that demonstrate the technique explained here. You can find them in the Xojo IDE by choosing File > New Project, clicking on Examples, choosing the Graphics folder in the list and then the Cross-Platform Drawing folder.</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>Testing and Debugging Code Assistants</title>
		<link>https://blog.xojo.com/2025/02/12/testing-and-debugging-code-assistants/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Wed, 12 Feb 2025 16:00:00 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Code Assistants]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<category><![CDATA[XojoScript]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14458</guid>

					<description><![CDATA[As Senior Engineer Paul Lefebvre wrote back in 2022, Xojo added the ability to create Code Assistants starting with Xojo 2022r1. Code Assistants are functions&#8230;]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="984" height="1024" src="https://blog.xojo.com/wp-content/uploads/2025/02/CleanShot-2025-02-05-at-13.12.17@2x-984x1024.png" alt="" class="wp-image-14459" style="width:318px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/CleanShot-2025-02-05-at-13.12.17@2x-984x1024.png 984w, https://blog.xojo.com/wp-content/uploads/2025/02/CleanShot-2025-02-05-at-13.12.17@2x-288x300.png 288w, https://blog.xojo.com/wp-content/uploads/2025/02/CleanShot-2025-02-05-at-13.12.17@2x-768x799.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/CleanShot-2025-02-05-at-13.12.17@2x.png 1026w" sizes="auto, (max-width: 984px) 100vw, 984px" /></figure>



<p>As Senior Engineer Paul Lefebvre <a href="https://blog.xojo.com/2022/04/05/using-the-new-user-code-assistants-feature/" target="_blank" rel="noreferrer noopener">wrote</a> back in 2022, Xojo added the ability to create Code Assistants starting with Xojo 2022r1. Code Assistants are functions that manipulate the code selected in the Code Editor to help with various code editing tasks. Code Assistants are written in <a href="https://documentation.xojo.com/api/language/xojoscript.html" target="_blank" rel="noreferrer noopener">XojoScript</a>, but XojoScript has no access to the Xojo Debugger. Fortunately, there&#8217;s a simple solution to this problem.</p>



<p>Xojo&#8217;s Code Assistant Tester example project makes it easy to test and debug your code before you create your Code Assistant. Go to File &gt; New Project, click on Examples then open the IDE folder to find it. With this example, you can enter the code that would go into your eventual XojoScript that will be your Code Assistant. Because this code is in methods in Xojo itself, you can test it and debug it with the Xojo Debugger.</p>



<p>Here&#8217;s a quick video on how to use Code Assistants and the Code Assistant Tester:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Introducing Xojo&#039;s New Code Assistants" width="500" height="281" src="https://www.youtube.com/embed/GDWQC1c6svQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>If you write some handy Code Assistants, consider sharing them on the <a href="https://forum.xojo.com">Xojo Forum</a> they could be useful to others in the community.</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 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>A Programming Pioneer has Died</title>
		<link>https://blog.xojo.com/2024/11/18/a-programming-pioneer-has-died/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Mon, 18 Nov 2024 19:59:46 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[BASIC]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14021</guid>

					<description><![CDATA[On November 12th Thomas Kurtz, the co-inventor (along with John Kemeny who passed in 1992) of the BASIC programming language died at the age of&#8230;]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="983" height="538" src="https://blog.xojo.com/wp-content/uploads/2024/11/image-6.png" alt="" class="wp-image-14023" srcset="https://blog.xojo.com/wp-content/uploads/2024/11/image-6.png 983w, https://blog.xojo.com/wp-content/uploads/2024/11/image-6-300x164.png 300w, https://blog.xojo.com/wp-content/uploads/2024/11/image-6-768x420.png 768w" sizes="auto, (max-width: 983px) 100vw, 983px" /></figure>



<p>On November 12th <a href="https://en.wikipedia.org/wiki/Thomas_E._Kurtz">Thomas Kurtz</a>, the co-inventor (along with John Kemeny who passed in 1992) of the <a href="https://en.wikipedia.org/wiki/BASIC">BASIC</a> programming language died at the age of 96. It would be difficult to overstate the impact he had on computing. BASIC made it possible for so many people (myself included) to begin their journey into programming.</p>



<p>In the late 1970s I became interested in learning to code. My father, who was an electrical engineer and coded in Fortran at work, brought home a book that taught the basics of programming. Written and published by Apple, it appeared to only cover 6502 Assembler, the chip that was in the Apple II. Just a few pages in my eyes began to glaze over and I started to wonder if programming was really for me. Fortunately, I flipped the book over to find it was actually two books in one. From the other side it was a book about AppleSoft BASIC. As I looked at the language, it made immediate sense to me. Assembler was too low level and not a great first language but BASIC was ideal for this purpose. I learned enough to get going and my life was forever changed.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="650" height="234" src="https://blog.xojo.com/wp-content/uploads/2024/11/image-7.png" alt="" class="wp-image-14024" srcset="https://blog.xojo.com/wp-content/uploads/2024/11/image-7.png 650w, https://blog.xojo.com/wp-content/uploads/2024/11/image-7-300x108.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<p>Programming has evolved a lot since then but we still design Xojo with the same principle that Thomas and John espoused with their original version of BASIC: that programming should be accessible to anyone with an interest. We have many users whose first experience with programming was with Xojo just as mine was with BASIC. In our own way, Xojo is continuing what Thomas and John began. Today more people have the ability to learn programming than ever before. Thomas and John both were true pioneers that contributed significantly to making that happen.</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>Welcome to Mobile Orientation Orientation!</title>
		<link>https://blog.xojo.com/2024/10/07/welcome-to-mobile-orientation-orientation/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Mon, 07 Oct 2024 19:34:19 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[mobileScreen]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13840</guid>

					<description><![CDATA[Mobile apps sometimes have to adjust to the user rotating the device from portrait mode to landscape mode and the reverse. For the most part,&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Mobile apps sometimes have to adjust to the user rotating the device from portrait mode to landscape mode and the reverse. For the most part, Xojo handles this for you. For Android projects, if you have locked controls properly and for iOS projects, if you have set the constraints properly, the controls will do the right thing when the device is rotated.</p>



<p>If there&#8217;s something you need to do in code when the orientation changes, you&#8217;re in luck. The <a href="https://documentation.xojo.com/api/user_interface/mobile/mobilescreen.html#mobilescreen-methods">MobileScreen</a> class has an <a href="https://documentation.xojo.com/api/user_interface/mobile/mobilescreen.html#mobilescreen-orientationchanged">OrientationChanged</a> event. When this event fires, that means the user has rotated their device and the orientation has changed. This is where your code would go should you need to respond to an orientation change.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Note: If you need to know when the screen has changed in size, that&#8217;s what the <a href="https://documentation.xojo.com/api/user_interface/mobile/mobilescreen.html#mobilescreen-resized">Resized</a> event is for (at least on iOS &#8211; it&#8217;s not yet supported for Android).</p>
</blockquote>



<p>What might not be immediately intuitive or obvious is that rotating your device does not automatically mean the orientation has changed. Consider the following example project that displays the Resized and OrientationChanged events in a table when they occur. While this is on iOS, it works the same way (without the Resized event) on Android. The device is starting in portrait mode.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="513" height="1024" src="https://blog.xojo.com/wp-content/uploads/2024/10/1-1-513x1024.png" alt="" class="wp-image-13847" style="width:249px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/1-1-513x1024.png 513w, https://blog.xojo.com/wp-content/uploads/2024/10/1-1-150x300.png 150w, https://blog.xojo.com/wp-content/uploads/2024/10/1-1-768x1534.png 768w, https://blog.xojo.com/wp-content/uploads/2024/10/1-1-769x1536.png 769w, https://blog.xojo.com/wp-content/uploads/2024/10/1-1.png 806w" sizes="auto, (max-width: 513px) 100vw, 513px" /></figure>



<p>We will focus on just the OrientationChanged events for now. It gets an initial OrientationChanged event. Then the user rotates their phone clockwise enough that the orientation is changed from portrait to landscape.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1610" height="805" src="https://blog.xojo.com/wp-content/uploads/2024/10/2-1024x512.png" alt="" class="wp-image-13850" style="width:471px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/2-1024x512.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/10/2-300x150.png 300w, https://blog.xojo.com/wp-content/uploads/2024/10/2-768x384.png 768w, https://blog.xojo.com/wp-content/uploads/2024/10/2-1536x768.png 1536w, https://blog.xojo.com/wp-content/uploads/2024/10/2.png 1610w" sizes="auto, (max-width: 1610px) 100vw, 1610px" /></figure>



<p>You can see that another OrientationChanged event has fired as you&#8217;d expect. Next the user rotates the phone clockwise again.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="512" height="1024" src="https://blog.xojo.com/wp-content/uploads/2024/10/3-512x1024.png" alt="" class="wp-image-13851" style="width:267px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/3-512x1024.png 512w, https://blog.xojo.com/wp-content/uploads/2024/10/3-150x300.png 150w, https://blog.xojo.com/wp-content/uploads/2024/10/3-768x1536.png 768w, https://blog.xojo.com/wp-content/uploads/2024/10/3.png 806w" sizes="auto, (max-width: 512px) 100vw, 512px" /></figure>



<p>Now the phone is upside down. Notice, however, the orientation from the perspective of the OS has not changed. The layout is still in landscape orientation. This is not a bug. The device does not support portrait mode when the device is turned upside down. Thus the layout is still in landscape orientation and thus no OrientationChanged event has fired because there has been no orientation change.</p>



<p>Next the user rotates the phone clockwise yet again.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="513" src="https://blog.xojo.com/wp-content/uploads/2024/10/4-1024x513.png" alt="" class="wp-image-13852" style="width:537px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/4-1024x513.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/10/4-300x150.png 300w, https://blog.xojo.com/wp-content/uploads/2024/10/4-768x384.png 768w, https://blog.xojo.com/wp-content/uploads/2024/10/4-1536x769.png 1536w, https://blog.xojo.com/wp-content/uploads/2024/10/4.png 1610w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>You might think that an OrientationChanged event would fire, but it doesn&#8217;t. Why not? Because as far as the OS is concerned, the layout is still in landscape orientation. It has not changed its orientation. Finally, the user rotates the device clockwise once last time.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="512" height="1024" src="https://blog.xojo.com/wp-content/uploads/2024/10/5-512x1024.png" alt="" class="wp-image-13853" style="width:334px;height:auto" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/5-512x1024.png 512w, https://blog.xojo.com/wp-content/uploads/2024/10/5-150x300.png 150w, https://blog.xojo.com/wp-content/uploads/2024/10/5-768x1536.png 768w, https://blog.xojo.com/wp-content/uploads/2024/10/5.png 806w" sizes="auto, (max-width: 512px) 100vw, 512px" /></figure>



<p>This time the orientation has changed from landscape to portrait and thus the OrientationChanged event fired. Given that the initial OrientationChanged event fired when the app launched, out of the four 90 degree clockwise rotations, only two orientation changes occurred and thus only two OrientationChanged events fired.</p>



<p>This is one of those cases where what is initially intuitive turns out to be wrong until you look more closely at what is really going on.</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>Make Your Apps Super Smart, Start Calling ChatGPT in Xojo</title>
		<link>https://blog.xojo.com/2024/03/26/make-your-apps-super-smart-start-calling-chatgpt-in-xojo/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Tue, 26 Mar 2024 15:00:00 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[2024r1]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12783</guid>

					<description><![CDATA[Being able to call ChatGPT from inside your apps for specific purposes opens up a world of new possibilities. ChatGPT is an AI or more specifically a Large Language Model (LLM). To make using ChatGPT in Xojo easier, you can use the new ChatGPTConnection class. You can find an example project showing you how by launching Xojo, clicking on Examples in the Project Chooser and then looking in the AI section. Using this class, you can make use of ChatGPT from within your Xojo projects. ]]></description>
										<content:encoded><![CDATA[
<p>Being able to call ChatGPT from inside your apps for specific purposes opens up a world of new possibilities. ChatGPT is an AI or more specifically a Large Language Model (LLM). To make using ChatGPT in Xojo easier, you can use the new ChatGPTConnection class. You can find an example project showing you how by launching Xojo, clicking on Examples in the Project Chooser and then looking in the AI section. Using this class, you can make use of ChatGPT from within your Xojo projects. </p>



<p>As an example of how you might use ChatGPT in Xojo, I looked for a way to turn statements into questions. So I ask ChatGPT:</p>



<p><em>Turn &#8220;numerical limits of double in xojo&#8221; into a sentence.</em></p>



<p>ChatGPT&#8217;s response is:</p>



<p><em>What are the numerical limits of the double data type in XOJO?</em></p>



<h2 class="wp-block-heading">Getting Started</h2>



<p>Before you can run the example to test out the ChatGPTConnection class or use it in your own projects, you&#8217;ll need to do three things:</p>



<ol class="wp-block-list">
<li>Create an account at <a href="https://openai.com">OpenAI.com</a>. This is free.</li>



<li>Add a payment method to your account (to use ChatGPT via an API, you need pay &#8211; more on that in a bit).</li>



<li>Get an <a href="https://platform.openai.com/api-keys">API key</a>. You&#8217;ll need to have added a payment method before you can get an API key.</li>
</ol>



<p>One you have done this, open the ChatGPT Example project, open the ChatGPTConnection class and in the Inspector assign your API key to the APIKey constant. Now you can run the example. The example presents a window where you converse with ChatGPT.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="882" src="https://blog.xojo.com/wp-content/uploads/2024/03/chatgpt-1024x882.png" alt="" class="wp-image-12791" srcset="https://blog.xojo.com/wp-content/uploads/2024/03/chatgpt-1024x882.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/03/chatgpt-300x258.png 300w, https://blog.xojo.com/wp-content/uploads/2024/03/chatgpt-768x661.png 768w, https://blog.xojo.com/wp-content/uploads/2024/03/chatgpt-1536x1322.png 1536w, https://blog.xojo.com/wp-content/uploads/2024/03/chatgpt.png 1812w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Each window is a separate context. Try choosing File > New Conversation. Referring to questions you asked in another window won&#8217;t work because in this example each has its own context.</p>



<h2 class="wp-block-heading">Using the ChatGPT Classes in Your Project</h2>



<p>To use the ChatGPTConnection class in your project, copy both the ChatGPTConnection and the ChatGPTException classes to your project.</p>



<p>To use the ChatGPTConnection class, either drag it onto a window, webpage or mobile screen or create an instance in code. Most of the work is done by a single method: ReplyToPrompt. The syntax for ReplyToPrompt is:</p>



<pre id="xojo" class="wp-block-code"><code>ReplyToPrompt(prompt As String, Optional MaintainContext As Boolean = False) As String</code></pre>



<p>In its simplest form, just pass your prompt and the class will return ChatGPT&#8217;s response. For example:</p>



<pre id="xojo" class="wp-block-code"><code>Var gpt As New ChatGPTConnection
Var response As String = gpt.ReplyToPrompt("Where were the 1980 Olympic Games held?")
MessageBox(response)</code></pre>



<p>When you want ChatGPT to consider past requests in the same session, pass True for the MaintainContext parameter. This  tells the ChatGPTConnection class to keep a history of all your requests and the responses from ChatGPT which it then sends along with your new request each time you call the ReplyToPrompt method. The amount of text you can send is not unlimited so only set MaintainContext to True when you really do need it to consider previous requests and responses. ChatGPTConnection defaults to GPT 3.5 Turbo which has a maximum limit of 16,385 tokens per context. A <em>token</em> is a number of characters. The conversion is approximately 4 characters per token. Think of a token as a typical word. When you set the MaintainContext property to True, the ChatGPTConnection class monitors your usage of tokens. When it gets to 90% of the allowed maximum for the model you are using, it will start trimming the oldest requests and responses from your history (stored in the ContextHistory property) to avoid you going over the limit.</p>



<h2 class="wp-block-heading">ChatGPTConnection Class Properties</h2>



<p>You don&#8217;t need to set any of the properties in the ChatGPTConnection class as they all have useful default values. However, if you want to use a model different from the default (gpt-3.5-turbo), you can set the Model property before calling the ReplyToPrompt method. You can find a list of models <a href="https://platform.openai.com/docs/models/overview">here</a>. Models have different limits as to how many tokens you can use so when you change the Model property, make sure to also change the MaximumTokensPerContext property to the appropriate value for the model. The Temperature property indicates how creative ChatGPT will be. Another way of saying this is how much it will <a href="https://en.wikipedia.org/wiki/Hallucination_(artificial_intelligence)#:~:text=In%20the%20field%20of%20artificial,based%20on%20a%20fake%20URL">hallucinate</a>. Its value range is from 0 (don&#8217;t hallucinate at all) to 2 (hallucinate all you want). The default is 0.5. Finally, the TimeOut property is how long ReplyToPrompt will wait for a response. The default is 30 seconds.</p>



<p>If anything goes wrong, the ChatGPTConnection class will raise a ChatGPTException so make sure to put your calls to the ReplyToPrompt method in a Try Catch statement:</p>



<pre id="xojo" class="wp-block-code"><code>Try
   Var gpt As New ChatGPTConnection
   Var response As String = gpt.ReplyToPrompt("Where were the 1980 Olympic Games held?")    MessageBox(response)
Catch e As ChatGPTException
  MessageBox("Error: " + e.Message)
End Try</code></pre>



<p><a href="https://openai.com/pricing">Pricing for ChatGPT</a> is by millions of tokens. Chat GPT 3.5 is relatively inexpensive so if it gives you the results you want, use it. As of this writing, every 1 million words/tokens you send it will only cost 50 cents in US dollars. Every 1 million words/tokens you get back in response will cost $1.50 USD. If you need higher quality responses, consider Chat GPT 4. </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>
]]></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>Localizing XAML Controls in Windows Projects</title>
		<link>https://blog.xojo.com/2023/08/16/localizing-xaml-controls/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Wed, 16 Aug 2023 13:00:00 +0000</pubDate>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[App Localization]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[XAML]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11937</guid>

					<description><![CDATA[If you build desktop apps for Windows and wish to start using the new XAML-based controls via the DesktopXAMLContainer but aren't sure how to localize those controls, here's the solution:]]></description>
										<content:encoded><![CDATA[
<p>If you build desktop apps for Windows and wish to start using the new XAML-based controls via the DesktopXAMLContainer but aren&#8217;t sure how to localize those controls, here&#8217;s the solution:</p>



<ol class="wp-block-list">
<li>Drag a <a href="https://documentation.xojo.com/api/user_interface/desktop/desktopxamlcontainer.html#desktopxamlcontainer">DesktopXAMLContainer</a> to a window.</li>



<li>Add the Opening event handler.</li>



<li>In the Opening event handler, create the XAML string that defines the control you want and concatenate in your localized constant.</li>
</ol>



<p>Here&#8217;s an example of a simple button with a localized constant named Hello used to define the button text:</p>



<pre id="Xojo" class="wp-block-code"><code><code>Me.Content = "&lt;Button Name='Button' Content='" + Hello + "' /&gt;"</code></code></pre>



<p>Notice that you can use single quotes for the the values.  Which makes concatenating them via code easier.</p>



<p>If you&#8217;re not exactly sure what the right XAML code is, drag out a <a href="https://documentation.xojo.com/api/user_interface/desktop/desktopxamlcontainer.html#desktopxamlcontainer">DesktopXAMLContainer</a>, click on the Pencil icon on it and then choose the control you want and click the OK button. In the Inspector, you can now edit the Content property of your control to see what the XAML code is to create that control. You can then set the Content property in the Opening event (as described above) using that string.</p>



<p><em>Geoff Perlman is the Founder and CEO of Xojo. When he&#8217;s not leading the Xojo team he can be found playing drums in Austin, Texas and spending time with his family. </em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Using XAML in Cross-Platform Projects</title>
		<link>https://blog.xojo.com/2023/08/11/using-xaml-in-cross-platform-projects/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Fri, 11 Aug 2023 14:00:00 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11927</guid>

					<description><![CDATA[Some of you likely want to start using XAML but your desktop projects also run on macOS and perhaps Linux. If that&#8217;s the case, what&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Some of you likely want to start using XAML but your desktop projects also run on macOS and perhaps Linux. If that&#8217;s the case, what do you do to use XAML for Windows? What you <strong>can&#8217;t do</strong> is simply drag a DesktopXAMLContainer onto the layout and expect the compiler to ignore it when you build for macOS and Linux. That won&#8217;t work. But fear not. There is a solution!</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-full"><img loading="lazy" decoding="async" width="454" height="202" src="https://blog.xojo.com/wp-content/uploads/2023/08/control_mac-1.png" alt="" class="wp-image-11931" srcset="https://blog.xojo.com/wp-content/uploads/2023/08/control_mac-1.png 454w, https://blog.xojo.com/wp-content/uploads/2023/08/control_mac-1-300x133.png 300w" sizes="auto, (max-width: 454px) 100vw, 454px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="442" height="198" src="https://blog.xojo.com/wp-content/uploads/2023/08/control_windows-2.png" alt="" class="wp-image-11932" srcset="https://blog.xojo.com/wp-content/uploads/2023/08/control_windows-2.png 442w, https://blog.xojo.com/wp-content/uploads/2023/08/control_windows-2-300x134.png 300w" sizes="auto, (max-width: 442px) 100vw, 442px" /></figure>
</div>
</div>



<p>You can add a subclass of DesktopXAMLContainer to your project then create an instance of it at runtime when your project compiles for Windows. I created an example project that is available now (thanks to the fact that Xojo now loads examples over the Internet). It&#8217;s called ChameleonControls and you can find it by going to the Project Chooser, clicking on Examples then going to Platforms > Desktop > Windows > XAMLContainer > ChameleonControls.</p>



<p>The example project explains how it works but essentially you:</p>



<ol class="wp-block-list">
<li>Add a subclass to your project setting its Super to DesktopXAMLContainer.</li>



<li>In its Opening event or the Constructor method, set the Content property to the appropriate XAML to create the control you want. You can get this by dragging a DesktopXAMLContainer to a layout, then clicking the Pencil, choosing the control you want and copying the contents of the Content property from the Inspector.</li>



<li>Next you add a property of the type of the subclass you created to the window. In the example, the subclass is called ToggleSwitch (because that&#8217;s the type of XAML control it creates) so the property on the window is MyToggleSwitch As ToggleSwitch.</li>



<li>Using conditional compilation, in the code of the Opening event of the control you wish to swap out on Windows, you hide the control then create an instance of your subclass, setting it&#8217;s Left and Top to the same values as the control on the window.</li>



<li>In Build Settings &gt; Windows &gt; Advanced, set the Use WinUI (Experimental) option to ON. When you run, the control on your layout is hidden and the XAML control appears.</li>
</ol>



<p>Download the example project and check it out.</p>



<p>Got ideas for examples you&#8217;d like to see us add or topics for blog posts? <a href="https://xojo.com/company/contact.php">Contact us.</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Creating an Android Emulator in Android Studio</title>
		<link>https://blog.xojo.com/2023/08/09/creating-an-android-emulator-in-android-studio/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Wed, 09 Aug 2023 13:30:00 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Emulator]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Remote Debugging]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11702</guid>

					<description><![CDATA[In order to test the Android apps you create in Xojo, you either need to have an actual Android device (Xojo supports on-device testing/debugging) or you need to set up an Android Emulator in Android Studio. Read on or jump over to Xojo YouTube Channel to watch this process in this Creating an Android Emulator video.]]></description>
										<content:encoded><![CDATA[
<p>In order to test the Android apps you create in Xojo, you either need to have an actual Android device (Xojo supports on-device testing/debugging) or you need to set up an Android Emulator in Android Studio. Read on or jump over to Xojo YouTube Channel to watch this process in our <a href="https://youtu.be/hsmkUIHRvq8">Creating an Android Emulator</a> video.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="695" src="https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator-1024x695.png" alt="" class="wp-image-11703" srcset="https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator-1024x695.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator-300x204.png 300w, https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator-768x521.png 768w, https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator-1536x1043.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator.png 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<ol class="wp-block-list">
<li>If you haven&#8217;t already downloaded and installed Android Studio, do that now.</li>



<li>Launch Android Studio.</li>



<li>If you have already created a project in Android Studio, you can open that project. Otherwise, click the New Project button.</li>



<li>In the dialog box that is displayed, choose the default project type.</li>



<li>Click the Next button then click the Finish button.</li>



<li>Once you have a project open, choose Tools &gt; Device Manager. The Device Manager pane appears on the right side of the project window.</li>



<li>Click on the Create Device button. The Virtual Device Configuration dialog box appears.</li>



<li>Choose the category for the type of emulator you need. Phone is chosen by default.</li>



<li>Scroll through the list of devices to find one that suits you. We recommend choosing one that has the Google Play Store icon in the Play Store column.</li>



<li>Click the Next button.</li>



<li>On the System Image page the appropriate system image for the device you selected should be automatically selected for you. Just make sure the version of Android is at least the <a href="https://documentation.xojo.com/resources/system_requirements_for_current_release.html">minimum version supported by Xojo</a>.</li>



<li>Click the Next button.</li>



<li>On the final page you can rename the device if you&#8217;d like. If you&#8217;re going to be creating a lot of Android apps, consider increasing the storage in your emulator by clicking the Show Advanced Settings button and then scrolling the lefthand pane down a bit until you see the Internal Storage field. It defaults to 2048MB so you might want to increase that a bit.</li>



<li>Click the Finish button. Your emulator appears in the Device Manager pane.</li>



<li>Quit Android Studio and go to Xojo. Android Studio cannot be running while you use emulators in Xojo.</li>
</ol>



<p>Now you&#8217;re ready to use the emulator you created.</p>



<p>In Xojo, open an Android project, in the Navigator click on Android under Build Settings and you&#8217;ll see the Android Debugging section. If you have only created one emulator, it will be selected by default. If you&#8217;ve created several, they will all be listed.</p>



<p>The first time you use a new emulator it takes Android Studio it takes a bit longer than normal for it to launch. These emulators also sometimes stop working. When that happens, launch Android Studio, open a project or create a new one, go to Tools &gt; Device Manager to display the Device Manager pane, delete the bad emulator and create a new one.</p>



<p>Don&#8217;t forget that Xojo supports on-device debugging (<a href="https://youtu.be/8B9dLxe2asY">Video</a>: Setting Up On-Device Debugging on Your Android Device) as well so if you have an Android phone or tablet, you can run your apps directly on the device which you may find to be a better overall experience for testing and debugging.</p>



<p>Learn more about using Xojo Android in the <a href="https://blog.xojo.com/category/cross-platform/android/">Android</a> category in the Xojo Programming Blog.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo and Apple Vision Pro</title>
		<link>https://blog.xojo.com/2023/06/22/xojo-and-apple-vision-pro/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Thu, 22 Jun 2023 17:18:28 +0000</pubDate>
				<category><![CDATA[Fun]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11647</guid>

					<description><![CDATA[Apple has released the developer documentation for Vision Pro, their recently announced mixed reality headset. So far, it looks promising that iOS apps written in Xojo will just work. Of course, we don't yet have one of these to use for testing. If we did, we'd be too busy playing with it to write this blog post, however we have tried running some Xojo iOS projects in the Vision Pro Simulator and they work without modification so that's a very good sign.]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2023/06/CleanShot-2023-06-22-at-08.15.30@2x-1024x572.png" alt="" class="wp-image-11651" width="425" height="237" srcset="https://blog.xojo.com/wp-content/uploads/2023/06/CleanShot-2023-06-22-at-08.15.30@2x-1024x572.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/06/CleanShot-2023-06-22-at-08.15.30@2x-300x168.png 300w, https://blog.xojo.com/wp-content/uploads/2023/06/CleanShot-2023-06-22-at-08.15.30@2x-768x429.png 768w, https://blog.xojo.com/wp-content/uploads/2023/06/CleanShot-2023-06-22-at-08.15.30@2x.png 1224w" sizes="auto, (max-width: 425px) 100vw, 425px" /></figure>



<p>Apple has released the <a href="https://developer.apple.com/documentation/visionos/checking-whether-your-app-is-compatible-with-visionos/">developer documentation</a> for <a href="https://www.apple.com/apple-vision-pro/?afid=p238%7CbDSl8o9e-dc_mtid_20925qtb42335_pcrid_77653214969036_pgrid_1242449430563648_&amp;cid=wwa-us-kwbi-VisionPro-slid---Brand-AppleVision-Announce-">Vision Pro</a>, their recently announced mixed reality headset. So far, it looks promising that iOS apps written in Xojo will just work. Of course, we don&#8217;t yet have one of these to use for testing. If we did, we&#8217;d be too busy playing with it to write this blog post, however we have tried running some Xojo iOS projects in the Vision Pro Simulator and they work without modification so that&#8217;s a very good sign.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.xojo.com/wp-content/uploads/2023/06/xojo_app_visionpro-1024x768.jpg" alt="" class="wp-image-11655" srcset="https://blog.xojo.com/wp-content/uploads/2023/06/xojo_app_visionpro-1024x768.jpg 1024w, https://blog.xojo.com/wp-content/uploads/2023/06/xojo_app_visionpro-300x225.jpg 300w, https://blog.xojo.com/wp-content/uploads/2023/06/xojo_app_visionpro-768x576.jpg 768w, https://blog.xojo.com/wp-content/uploads/2023/06/xojo_app_visionpro-1536x1151.jpg 1536w, https://blog.xojo.com/wp-content/uploads/2023/06/xojo_app_visionpro-2048x1535.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Testing REST-based Web Services</title>
		<link>https://blog.xojo.com/2023/03/07/testing-rest-based-web-services/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Tue, 07 Mar 2023 15:16:55 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[URLConnection]]></category>
		<category><![CDATA[Web Service]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11358</guid>

					<description><![CDATA[Using Xojo's URLConnection to communicate with web services is pretty straightforward. But testing the actual REST API calls can get tricky. To make it easier to test and experiment with REST API calls, Paul created a app in Xojo that lets you test REST APIs. He called it RESTy in its original format back in 2015. You can download the updated project here built with Xojo 2022r4.1.]]></description>
										<content:encoded><![CDATA[
<p>Using Xojo&#8217;s URLConnection to communicate with web services is pretty straightforward. But testing the actual REST API calls can get tricky. To make it easier to test and experiment with REST API calls, Paul created an app in Xojo for doing just this. He called it RESTy in its original format back in 2015. The most recent version of the example project can be found in Xojo by choosing File > New Project, clicking on Examples then clicking on Communication > Internet > Web Services >RESTy.</p>



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



<p>RESTy uses the <a href="https://documentation.xojo.com/api/networking/urlconnection.html#urlconnection">URLConnection</a> class to send a request to a web service and get a result. If the result is text (JSON, for example)&nbsp;it displays in the <strong>Response</strong> tab. Here, I am calling the <a href="https://documentation.xojo.com/topics/communication/internet/testing_a_web_service.html">Eddie&#8217;s Electronics web service</a> to return a list of all the customers by specifying the URL and clicking the Fetch button:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="965" height="1024" src="https://blog.xojo.com/wp-content/uploads/2023/03/getallcustomers-965x1024.png" alt="" class="wp-image-11365" srcset="https://blog.xojo.com/wp-content/uploads/2023/03/getallcustomers-965x1024.png 965w, https://blog.xojo.com/wp-content/uploads/2023/03/getallcustomers-283x300.png 283w, https://blog.xojo.com/wp-content/uploads/2023/03/getallcustomers-768x815.png 768w, https://blog.xojo.com/wp-content/uploads/2023/03/getallcustomers.png 1200w" sizes="auto, (max-width: 965px) 100vw, 965px" /></figure>



<p>For other data (binary data such as pictures) you can use the Fetch to File button to save the request to a file.</p>



<p>The Authentication tab is used to provide Basic Authentication should the web service require it.</p>



<p>The Request Content tab can be used to provide Content data that the request might need. For example, the Eddie&#8217;s Electronics web service also lets you request the details for a specific customer by providing simple JSON containing the customer ID. To try this using RESTy app:</p>



<ol class="wp-block-list">
<li>Click on the Request Content Tab.</li>



<li>To indicate the customer you wish to retrieve, enter the following JSON into the field on that tab: <code>{"ID": 10039}</code></li>



<li>Select <strong>POST</strong> from the Send Method popup menu.</li>



<li>In the URL field, enter: <code>https://eews-demos.xojo.com/GetCustomer</code></li>



<li>Press the Fetch button.</li>
</ol>



<p>If you have entered everything correctly, will see the data for Caleb Horn in JSON format:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="965" height="1024" src="https://blog.xojo.com/wp-content/uploads/2023/03/getonecustomer-1-965x1024.png" alt="" class="wp-image-11367" srcset="https://blog.xojo.com/wp-content/uploads/2023/03/getonecustomer-1-965x1024.png 965w, https://blog.xojo.com/wp-content/uploads/2023/03/getonecustomer-1-283x300.png 283w, https://blog.xojo.com/wp-content/uploads/2023/03/getonecustomer-1-768x815.png 768w, https://blog.xojo.com/wp-content/uploads/2023/03/getonecustomer-1.png 1200w" sizes="auto, (max-width: 965px) 100vw, 965px" /></figure>



<p>And to see the JSON formatted nicely, click the Format JSON button:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="965" height="1024" src="https://blog.xojo.com/wp-content/uploads/2023/03/formattedJSON-965x1024.png" alt="" class="wp-image-11368" srcset="https://blog.xojo.com/wp-content/uploads/2023/03/formattedJSON-965x1024.png 965w, https://blog.xojo.com/wp-content/uploads/2023/03/formattedJSON-283x300.png 283w, https://blog.xojo.com/wp-content/uploads/2023/03/formattedJSON-768x815.png 768w, https://blog.xojo.com/wp-content/uploads/2023/03/formattedJSON.png 1200w" sizes="auto, (max-width: 965px) 100vw, 965px" /></figure>



<p>This will let you you explore calling various REST API services. You can explore the source code to see how it uses URLConnection to do so.</p>



<p>To be sure, RESTy is very basic, but you have the source code so you and add features to it and modify it for your own testing needs.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Using Emojis in Xojo</title>
		<link>https://blog.xojo.com/2022/09/15/using-emojis-in-xojo/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Thu, 15 Sep 2022 19:00:18 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Fun]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Emoji]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=10674</guid>

					<description><![CDATA[Xojo has very good graphics support. You can drop images into your project and use them with several controls. You can use the various Paint events to draw your own graphics. And there's another source of graphics you may not have considered: emojis. Emojis can be used anywhere that text can be used because they are simply Unicode characters. That means they can be used in textfields, buttons, labels, popup menus, listboxes and more.]]></description>
										<content:encoded><![CDATA[
<p>Xojo has very good graphics support. You can drop images into a Xojo project and use them with several controls. You can use the various Paint events to draw your own graphics. And there&#8217;s another source of graphics you may not have considered: emojis. Emojis can be used anywhere that text can be used because they are Unicode characters. That means they can be used in textfields, buttons, labels, popup menus, listboxes and more.</p>



<p>Emojis are available on every operating system and platform that Xojo supports from desktop to mobile to web. Because they are built-in to the OS as characters, they are client-side which means that web applications don&#8217;t have to load them from the server as they are already available to the browser from the user&#8217;s OS. As characters, they are scalable to any font size. There are also a lot of them. According to <a href="https://emojipedia.org/stats/">Emojipedia</a> (yes, that&#8217;s a thing), there are over 3,600 emojis as of September 2021. </p>



<p>Emojis can be especially useful for listboxes in web applications because unlike the <a href="https://documentation.xojo.com/api/user_interface/desktop/desktoplistbox.html#desktoplistbox">DesktopListBox</a>, the <a href="https://documentation.xojo.com/api/user_interface/web/weblistbox.html#weblistbox">WebListBox</a> does not have a PaintCellBackground event that can be used to draw graphics into a cell. Instead, if you can find an emoji that represents what you&#8217;d otherwise draw into a cell, you can simply assign it without having to deal with graphics at all. For example, there are a series of emojis that are just boxes in different colors that could be used to indicate the state of something: <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e9.png" alt="🟩" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e5.png" alt="🟥" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e6.png" alt="🟦" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e7.png" alt="🟧" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e8.png" alt="🟨" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7eb.png" alt="🟫" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b1b.png" alt="⬛" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b1c.png" alt="⬜" class="wp-smiley" style="height: 1em; max-height: 1em;" />. The famous web game <a href="https://www.nytimes.com/games/wordle/index.html">Wordle</a> uses these when you share your results. With over 3600 available, you can likely find an emoji to represent nearly anything you might need from the common smiling face <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> to the less common umbrella on the ground<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26f1.png" alt="⛱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> , banjo <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1fa95.png" alt="🪕" class="wp-smiley" style="height: 1em; max-height: 1em;" /> or moai <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5ff.png" alt="🗿" class="wp-smiley" style="height: 1em; max-height: 1em;" />from Easter Island.</p>



<p>Again, emojis can be used in any type of application, desktop, mobile or web. Here&#8217;s an example of them in a web popup menu:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="366" height="368" src="https://blog.xojo.com/wp-content/uploads/2022/09/drop.png" alt="" class="wp-image-10748" srcset="https://blog.xojo.com/wp-content/uploads/2022/09/drop.png 366w, https://blog.xojo.com/wp-content/uploads/2022/09/drop-298x300.png 298w, https://blog.xojo.com/wp-content/uploads/2022/09/drop-150x150.png 150w" sizes="auto, (max-width: 366px) 100vw, 366px" /></figure>



<p>And here they are in a web list box:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="390" height="378" src="https://blog.xojo.com/wp-content/uploads/2022/09/box.png" alt="" class="wp-image-10749" srcset="https://blog.xojo.com/wp-content/uploads/2022/09/box.png 390w, https://blog.xojo.com/wp-content/uploads/2022/09/box-300x291.png 300w" sizes="auto, (max-width: 390px) 100vw, 390px" /></figure>



<p>The key thing is to realize that they are individual characters which means they can appear alone or mixed in with other characters. If you need them to be larger, increase the font size. Here&#8217;s the lion for example at 60 point size:</p>



<p style="font-size:60px"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f981.png" alt="🦁" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>Because they are characters, you can copy and paste emojis anywhere you&#8217;d use a character, including in your code:</p>



<pre class="wp-block-code"><code>ListBox1.AddRow("Fox &#x1f98a;")
ListBox1.AddRow("Lion &#x1f981;")
ListBox1.AddRow("Chipmunk &#x1f43f;")</code></pre>



<p>Just remember that emojis are characters, not graphics, so you should treat them as such. Notice in the code above, they are inside the quotes. You could even use them to name a variable:</p>



<pre class="wp-block-code"><code>Var &#x1f30b;&#x1f965;&#x1f4b0; As String = "Yes, you can do this!"</code></pre>



<p>I&#8217;m not sure that&#8217;s useful, but it clearly demonstrates how an emoji is a characters like any other.</p>



<p>On Emojipedia you can search for emojis by keyword and copy them to the clipboard. Again because they are simply characters, you can then paste them into a Xojo constant, make them the default value of a property or even paste them into the Code Editor to assign them in code.</p>



<p>Keep emojis in mind the next time you need an image in an application.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo and NetSuite</title>
		<link>https://blog.xojo.com/2022/08/23/xojo-and-netsuite/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Tue, 23 Aug 2022 17:26:02 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[NetSuite]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=10672</guid>

					<description><![CDATA[Tim has found that many NetSuite users want to create custom applications that interact with their data in NetSuite and Xojo is truly ideal for this. Some NetSuite users contract this work out to developers like Tim while others are interested in creating apps themselves. During the webinar, Tim and I demonstrated Xojo to NetSuite users while also demonstrating NetSuite to Xojo users who may be interested in incorporating it into their organizations or providing development services to NetSuite users.]]></description>
										<content:encoded><![CDATA[
<p>Earlier this month Xojo user and NetSuite developer <a href="https://timdietrich.me">Tim Dietrich</a> and I did a webinar about using Xojo with <a href="https://www.netsuite.com/portal/home.shtml">NetSuite</a>. If you&#8217;ve never heard of NetSuite, it&#8217;s a Software-As-A-Service ERP app provided by Oracle that provides business management functions such as tracking leads, customers, vendors and a whole lot more. It&#8217;s quite customizable as well both directly through the browser and also via an API which Tim demonstrated.</p>





<p>Tim is quite familiar with the NetSuite API and created an easy to use, free and open source Xojo class that does the heavy lifting on things like authentication, so that you can focus on sending data back and forth. Check out the <a href="https://youtu.be/K6nQzPbeW_g">video of the webinar</a> and <a href="https://timdietrich.me/blog/netsuite-xojo-webinar-follow-up/">Tim&#8217;s blog post</a> about it for more details.</p>



<p><em>Geoff is the Founder and CEO of Xojo, Inc. He started what became Xojo in 1996 and he has been working to improve it ever since. When he’s not steering the ship at Xojo, he’s keeping the beat for the band he formed in high school and learning Korean.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sending Text Messages From Xojo Apps</title>
		<link>https://blog.xojo.com/2022/06/13/texting-yourself-from-your-xojo-app/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Mon, 13 Jun 2022 13:00:00 +0000</pubDate>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[SMTPSecureSocket]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=10343</guid>

					<description><![CDATA[I recently wrote a big data processing app that was going to run for a while dealing with data that was occasionally inconsistent in ways&#8230;]]></description>
										<content:encoded><![CDATA[
<p>I recently wrote a big data processing app that was going to run for a while dealing with data that was occasionally inconsistent in ways I couldn&#8217;t anticipate. I knew that it was going to encounter trouble at some point and when it did, I would see what the problem was, fix it and start it running again. It was running on a server and after I started running it I found myself frequently checking on its progress.</p>



<p>Rather than continue to check on it constantly, I decided it would save me so much time and trouble if the app could text me when it runs into a problem it can&#8217;t manage. Fortunately, this is relatively easy to do. Most carriers allow you to <a href="https://www.liquisearch.com/list_of_sms_gateways">send text messages in the form of an email message</a>. In short, you form an email address from your cell phone number and a special domain your carrier provides. With this email address you then use Xojo&#8217;s <a href="https://documentation.xojo.com/api/networking/smtpsecuresocket.html#smtpsecuresocket">SMTPSecureSocket</a> class, designed specifically for sending email, and provide the socket information on how to login to your email server (the same info you provide when adding your email account to an email app) and then send a message to the appropriate email address for your carrier so that it will be sent to your phone in the form of a text message. If you&#8217;ve never used the SMTPSecureSocket before, check out the <a href="https://documentation.xojo.com/api/networking/smtpsecuresocket.html#sample-code">example code</a> in the Xojo Documentation.</p>



<p>This isn&#8217;t a general purpose solution for sending text messages because the carrier will only allow you to send messages to numbers it manages. But this example is a good and simple solution for monitoring you own apps via text messages. There are paid-services that provide REST APIs for a more general purpose solution. In fact, if that is what you need, here&#8217;s an earlier Xojo <a href="https://blog.xojo.com/2017/07/17/quick-tip-sending-text-messages-using-twilio/">blog post</a> about sending text messages using Twilio. </p>



<p><em>Geoff is the Founder and CEO of Xojo, Inc. He started what became Xojo in 1996 and he has been working to improve it ever since. When he’s not steering the ship at Xojo, he’s keeping the beat for the band he formed in high school and learning Korean. </em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>My Thoughts on the WWDC 2022 Keynote</title>
		<link>https://blog.xojo.com/2022/06/06/my-thoughts-on-the-wwdc-2022-keynote/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Mon, 06 Jun 2022 21:45:33 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[WWDC]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=10460</guid>

					<description><![CDATA[I've learned over the years not to have any specific expectations from Apple's WWDC keynote. Some years they introduce something big and new that we were pretty much expecting. Other years they blindside us. As the CEO of a company that creates tools for building apps for most of Apple's ecosystem and given Apple's history of secrecy, I'm understandably curious just how blindsided I might be each June. Fortunately, this year's keynote was filled with features that ranged from mildly interesting to really awesome but all incremental improvements across Apple's software line.]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve learned over the years not to have any specific expectations from Apple&#8217;s WWDC keynote. Some years they introduce something big and new that we were pretty much expecting. Other years they blindside us. As the CEO of a company that creates tools for building apps for most of Apple&#8217;s ecosystem and given Apple&#8217;s history of secrecy, I&#8217;m understandably curious just how blindsided I might be each June. Fortunately, this year&#8217;s keynote was filled with features that ranged from mildly interesting to really awesome but all incremental improvements across Apple&#8217;s software line.</p>



<p>There&#8217;s a lot of neat new features coming in<strong> </strong>iOS 16. The kinds of customizations Apple is adding to the Lock Screen are quite nice both aesthetically and practically. While I&#8217;m personally not prone to sending text messages I later regret, being able to edit messages and more importantly unsend them, is going to save many relationships. That you can easily switch between dictation and the keyboard means I will probably use dictation a lot more than I have in the past. I have a friend that uses it constantly and I can&#8217;t tell you how many times a second text message arrives to explain the incomprehensible message that had arrived moments earlier. That it now adds punctuation will make me want to use it more as dictating punctuation has always felt awkward to me. It will however likely infuriate my kids who think punctuation in text messages is rude. That ApplePay is going to have integrated order tracking is really nice. I have been using an app for that and sadly quite recently several of the companies it allows you to track have dramatically reduced the functionality of their APIs making the app almost useless. That you will be able to easily share photos amongst family members via an iCloud Shared Photo Library is a feature my family will definitely be using. It&#8217;s very cool that you can have it automatically share photos that were taken when family members were close by or when they are in the photo itself. It&#8217;s a very nice use of Apple Neural Engine.</p>



<p>That Apple announcing a feature to help people escaping abuse says a lot about what they value and how important privacy is to one’s personal safety. It goes right along with features they have added in the past that allow you to reach into your pocket and dial 911 should you need to do that in secret. I&#8217;m big into making my home smarter so I was happy to see the Home app getting a facelift as well as Apple working with other companies on smart home interoperability. I&#8217;m also a huge fan of CarPlay and seeing Apple&#8217;s vision for it becoming nearly the entire way in which you interact with displays and controls in your car and being able to customize that to your liking was far more than I had ever thought would happen. That future is clearly years away because it requires a lot of cooperation with the automakers but as they adopt it, it will certainly sway my future car purchases.</p>



<p>I wear an Apple Watch and very much care about the quality of my sleep. That they have added the ability to see your REM, core and deep sleep cycles is very cool. I will definitely be wearing my watch to bed more often as a result. They are adding a medication reminder system which I can see as being a benefit. I only take one pill a day so it&#8217;s not something I would use but my wife takes several and on her busy days sometimes forgets to take them so it&#8217;s a feature she will definitely use.</p>



<p>The M2 was something I was fully expecting and it&#8217;s nice to see it incrementally getting better. Apple made it clear that performance per watt is the key metric for them and that makes a lot of sense. We need that kind of metric in many other places in society so that we better understand the impact we are having on each other and our planet.</p>



<p>The surprise feature in macOS Ventura was Stage Manager. it makes it easy to avoid the clutter of having a lot of windows open. I wasn&#8217;t expecting it and yet I&#8217;m sure I will use it. Like Messages, Mail is getting an unsend feature and lots of other nice improvements especially to search (which has always felt weak to me) but I&#8217;ll have to test it to know just how much it has improved. Passkeys is Apple&#8217;s name for their implementation of the <a href="https://fidoalliance.org/apple-google-and-microsoft-commit-to-expanded-support-for-fido-standard-to-accelerate-availability-of-passwordless-sign-ins/">Fido</a> standard they are collaborating on with Google and Microsoft. It&#8217;s designed to get rid of passwords entirely, something of which I will definitely be an early adopter. They really have thought that one through. It will make all of our devices and data far more secure. Being able to use FaceTime with Handoff will be really nice. I&#8217;ve been on a FaceTime call and then hung up to call someone back from my Mac so it will be nice to be able to just transfer it from one device to another.</p>



<p>The new MacBook Air is a nice incremental upgrade. If you have an Intel-based MacBook Air, this is a good time to upgrade.</p>



<p>iPadOS 16<strong> </strong>is bringing some more desktop-like features to iPad. Things like standard ways for accessing documents, renaming them, collaboration, etc., all make iPad feel a little more like a desktop without it being a desktop. It feels like Apple is striking the right balance. They also previewed a new app called Freeform which is essentially a digital whiteboard that you can use to collaborate with others. Though now that I say that, it seems to not really do it justice given that you can share so many different things in a common space, from text, drawings, photos, video and more. It would be great for brainstorming with a remote team.</p>



<p>Overall, this keynote demonstrated a lot of incremental improvements across the software side of the product line and that&#8217;s a good thing. We all want something big, new and flashy but those often come at the cost of a lot fewer incremental improvements. I&#8217;m actually quite happy that we weren&#8217;t blindsided by something that could potentially change our short term plans here at Xojo. I look forward to using many of the new features they are adding this year.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Improving Feedback</title>
		<link>https://blog.xojo.com/2022/05/25/improving-feedback-2/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Wed, 25 May 2022 15:54:55 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Xojo Feedback]]></category>
		<category><![CDATA[Xojo Resources]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=10423</guid>

					<description><![CDATA[For a while now we have been managing our API proposals with Issues, a web-based task management system from Gitlab. Issues can be used for&#8230;]]></description>
										<content:encoded><![CDATA[
<p>For a while now we have been managing our API proposals with <em>Issues</em>, a web-based task management system from Gitlab. Issues can be used for many things but one for which it&#8217;s especially well-suited is bug and feature request tracking.&nbsp;</p>



<p>Lots of big projects (both open and closed source) use it for that purpose. We found it has some really great features. For example, they have simplified the process of entering a new case which almost certainly leads to more people using it.&nbsp;The author of a case can close it themselves and then later reopen it without having to ask someone to do so. You can upvote or downvote any case. I could go on and on. That it&#8217;s so full-featured and well-thought out is actually unsurprising upon reflection since that&#8217;s Gitlab&#8217;s business. Naturally we wanted to have all of those features in our own bug/feature tracking system, Feedback.&nbsp;</p>



<p>Over time that list grew and grew. We decided that some testing of Issues was in order so I wrote an app (in Xojo of course) to transfer all of the data from Feedback into Issues. There are just over 59,000 cases (since Feedback began more than a decade ago) and as you can imagine, transferring all the data along with all the attached files, was a long process. It took nearly a week running almost non-stop 24/7. The API they provide is extensive and allowed me to represent in Issues every case as it was in Feedback. Having all the cases in Issues helped us to see how well it really works.</p>



<p>After much research, test usage and consideration, maintaining bug base software is not the business we are in. While we are disappointed that our nearly complete web-based version is not what we will be using, we are confident that using Issues instead makes more sense. We are in the business of providing Xojo and anything we can do to devote more resources to that, is an improvement. In this case, a system that already does everything we want and more and is being maintained by others out-weighs having one written in Xojo. We already have hundreds of example projects, a great web-based example (Eddie&#8217;s Electronics which we will continue to improve), the Xojo Showcase, the Xojo Cloud control panel as well as many internal web apps, all of which are written in Xojo. The development of each of those has resulted in many improvements to the Xojo Web Framework and will continue to do so in the future. Many of you have created even larger and more sophisticated web apps in Xojo such that we have no shortage of feedback from you on how it can be improved. We continue to be grateful for that. We also develop the Xojo IDE and much of the frameworks in Xojo as well. The engineers at Xojo spend more time in Xojo every day than in anything else.</p>



<p>Our migration to <a href="https://www.xojo.com/issues">Issues</a> is now complete, so launching the Feedback app or clicking on Feedback in the Xojo toolbar will take you to the new Issues system. You will find all of your cases there and you will be notified when they change. You can begin using the <a href="https://documentation.xojo.com/resources/reporting_bugs_and_making_feature_requests.html#reporting-bugs-and-making-feature-requests">new system</a> to look for existing issues, up or down vote them, add new comments, files, create new issues, etc. It&#8217;s also very well-designed to promote conversation about an issue. I think you will find it to be easier to use and at the same time more powerful than Feedback. We have implemented single-sign on so you will be automatically logged in using your Xojo credentials. All of the Feedback case links on the forum are being updated to point to the same case but in Issues. </p>



<p>Issues is far more transparent than Feedback. The benefit to you is that you&#8217;ll see more information about each issue. You can see how many issues have been created. You can see to which member of the Xojo team an issue is assigned. You can see which Xojo release (milestone) it&#8217;s assigned to as well. Remember that this is only a best guess. When it comes time to begin pre-release testing, if an issue is not yet closed, it likely will be moved to a later release.</p>



<p>We have always strived to be quite open with the community. While change always comes with some cost, we are convinced that this one is in the long-term best interests of the Xojo community and that in the end is what drives us to do what we do.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>New Xojo Documentation Site</title>
		<link>https://blog.xojo.com/2022/02/11/new-documentation/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Fri, 11 Feb 2022 20:07:35 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=9893</guid>

					<description><![CDATA[We are always looking for ways to help you be more successful using Xojo and the documentation is a critical component to your success. With that in mind, we have been working on updating Xojo's documentation for a while now. This Xojo Documentation uses a completely new engine, offers improved searching and more to help you, and us, use it more effectively. ]]></description>
										<content:encoded><![CDATA[
<p>We are always looking for ways to help you be more successful using Xojo and the documentation is a critical component to your success. With that in mind, we have been working on updating Xojo&#8217;s documentation for a while now. This <a rel="noreferrer noopener" href="http://documentation.xojo.com" target="_blank">Xojo Documentation</a> uses a completely new engine, offers improved searching and more to help you, and us, use it more effectively. </p>



<p>With this Xojo Documentation site you&#8217;ll find:</p>



<ul class="wp-block-list"><li>A single help window that includes all pages of the documentation rather than just the Language Reference</li><li>A table of contents is always available on every page, making it easy to navigate</li><li>Class pages have been redesigned to have a top-down view (basic information at the top and more detailed information below), making them easier to use and review</li><li>Dark mode support</li><li>Pages that automatically adjust to smaller screens</li><li>Starting with Xojo 2022r1, documentation for each version of Xojo will be available online</li><li>Documentation that is far easier for Xojo to maintain because it&#8217;s designed to be used with version control</li></ul>



<p>In Xojo, this documentation system will be online by default, that means that when you access the documentation from within Xojo, rather than using local files, it will access the online Documentation  site. Because of this, new content and fixed issues will be immediately available to you in Xojo and on the Documentation site. As always, each Xojo release will come with a complete set of built-in Documentation to be used when Internet access is slow or unavailable.</p>



<p>This Documentation site is currently available for preview. We are still fixing bugs and it is currently scheduled for release in Xojo 2022r1.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Automated Testing: How We Test Xojo Builds</title>
		<link>https://blog.xojo.com/2021/12/17/automated-testing-how-we-test-xojo-builds/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Fri, 17 Dec 2021 22:04:03 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Automated Builds]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[Build Automation]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=9831</guid>

					<description><![CDATA[Xojo has an extensive testing period where actual users test a pre-release version with their projects but if you are wondering what kind of testing we do internally before each pre-release of Xojo, we have quite a bit of automated testing processes. There are over 400 tests just for the compiler alone. Already, we are approaching 300 tests for our Android framework. In total, across all supported platforms, there are over 2500 automated tests. ]]></description>
										<content:encoded><![CDATA[
<p>Xojo has an extensive testing period where actual users test a pre-release version with their projects but if you are wondering what kind of testing we do internally before each pre-release of Xojo,&nbsp;we have quite a bit of automated testing processes. There are over 400 tests just for the compiler alone. Already, we are approaching 300 tests for our Android framework. In total, across all supported platforms, there are over 2500 automated tests. Most tests run every time we do a full build of Xojo (also a fully automated process) which occurs 2 to 5 times a week. When one of these tests fails, the unlucky engineer responsible is informed and gets to work fixing it. More automated tests are being added to our system regularly.</p>



<p>Primarily, <a href="https://blog.xojo.com/2020/09/29/how-do-we-decide-what-goes-into-xojo/\">we focus</a> on the issues having the greatest impact on the Xojo community. However, that focus is not absolute. The engineering team at Xojo is using Xojo all-day, every day. They will often catch bugs in the early stages of the development of a new feature or as a side effect of fixing some other bug, long before that release gets to pre-release testers. The number of combinations of interactions between various parts of the Xojo frameworks is effectively infinite and no system can test everything. That&#8217;s why pre-release testing by actual users is so important. When you look at the bugs that are reported, 95.6% have only one user reporting them. Though we provide, in fact require, users to search Feedback before submitting a case, users often describe the same bug in varying ways resulting in&nbsp;duplicates. Given both the infinite number of interactions and some number of duplicate reports, the fact that overwhelming majority of reports have just one user is understandable. That we focus on the reports that have multiple users is also understandable. And of course there are exceptions, if it&#8217;s obvious that a new bug is going to effect a lot of users, we will get to work on it ASAP.&nbsp;In addition, if an engineer is working in a particular part of the IDE or a particular framework, since they have take the time to refamiliarize themselves with that code, they will often look for bugs that have been reported against it.&nbsp;</p>



<p>Development tools are special because the type of people who use them are more likely to report bugs and are more likely to want to search the list of open cases, get updates about bugs and more. While it&#8217;s important to report bugs, and we can’t stress enough how much we appreciate the time and care you take in doing so, even if the bug is fixed, you still have to wait for the release in which it&#8217;s fixed. Even our engineers have to wait for bugs fixes just like you do. Still, when you run into a bug, please search <a href="http://www.xojo.com/download">Feedback</a> first to see if it&#8217;s been reported, perhaps think of a few ways it could have been reported and do a few searches. If you find a match, add yourself to the case. If you don&#8217;t, please file a case. If you haven&#8217;t found a workaround, ask on the <a href="https://forum.xojo.com/">forum</a> or contact us directly and we see what we can do to help. </p>



<p>There is a lot of automated testing that goes on before we put out a pre-release to Testers. And we will continue to add more because automated testing is a terrific and efficient way to test anything that can be automatically tested. We are always on the lookout for ways to improve efficiency in our processes. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Improving Feedback</title>
		<link>https://blog.xojo.com/2021/12/01/improving-feedback/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Wed, 01 Dec 2021 21:23:32 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Bug Report]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Xojo Feedback]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=9728</guid>

					<description><![CDATA[Being more efficient means we spend more time on making Xojo better for you. Feedback, our bug and feature tracking system, is a place where we spend a lot of time interacting with you and thus it's something we very much want to improve. We have three improvements in mind. One will be made today and the other two will come sometime next year.]]></description>
										<content:encoded><![CDATA[
<p>As I hope you know by now, we are constantly working to improve our processes. Being more efficient means we spend more time on making Xojo better for you. <a href="https://www.xojo.com/download/">Feedback</a>, our bug and feature tracking system, is a place where we spend a lot of time interacting with you and thus it&#8217;s something we very much want to improve. We have three improvements in mind. One will be made today and the other two will come sometime next year.</p>



<ol class="wp-block-list"><li>Web-based Feedback: We have been developing a web-based version of Feedback for some time now. It&#8217;s been delayed mostly due to other priorities taking precedence. Nevertheless progress on it continues. We expect it to be available this coming year.</li><li>Because several case statuses are misunderstood, we are simplifying them. The bottom line is that a case is open until it&#8217;s not. Changes in status don&#8217;t really mean anything as a case could get resolved the day it was submitted or get stalled for months because we can&#8217;t reproduce it. Thus new cases will have <a href="https://documentation.xojo.com/Resources:Feedback#Case_Status">the status of Open</a> until we need more information from you (in rare cases) or they are closed. The closed statuses (fixed, implemented, etc.) will remain as they were before.</li><li>Sometimes cases stagnate with little progress. In the case of bugs, this is often because we can&#8217;t reproduce them or we don&#8217;t have the information we need. These cases impede all of our efforts to search Feedback. Sometime next year we intend to update the system such that when a case has had no activity in two years, the system will automatically change the status of the case to Archived. If you find an Archived case that is still important to you, please request that we reopen it. </li></ol>



<p>We believe these changes will improve our communication with you about feature requests and bug reports. I know that change can be frustrating. Just know that the reasoning is always to improve. If a change doesn&#8217;t ultimately accomplish that, or if we find a better solution, we will consider implementing it. To all of you that use Feedback, we greatly appreciate your efforts. You are helping to contribute to making Xojo better for the entire community.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
