Our Blog, FileMaker only, Xojo only, Archive (older)     Follow us on Twitter, Xing, LinkedIn or Facebook.

MBS Xojo Plugins, version 21.1pr6


New in this prerelease of the 21.1 plugins: Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

Data Detectors for Xojo


You may have seen Safari, Mail, Notes or other applications highlighting information in some text and they may offer to do something with the data, e.g. take a date and make a new event in your calendar or take an address and add it to your contacts.

Have you wondered how this works?

Apple provides data detectors in their frameworks to identify those data bits. We just added a new class NSDataDetectorMBS to use those in Xojo. While you can do a lot with regular expressions yourself, these pre-built detectors are convenient to use as they are.

You tell what to look for, either Date, Address, Link, PhoneNumber or TransitInformation. You can combine those types and look for multiple things together. The plugin then uses Apple's framework and returns the result as NSTextCheckingResultMBS objects for you to inspect. Let us show you the screenshot from our example project:



As you see we have a listbox with results. Each result has always the text found with the position and length to define the range in the original text. Then we provide the type of item found and type specific information. For a phone number this is simply an entry PhoneNumber with the number. If you need to format the phone number, check Using libPhoneNumber for phone number formatting. For an address, you may see Name, JobTitle, Organization, Street, City, State, ZIP and Country listed. Date results come with date, time zone and duration while links comes with an URL. The items we find are highlighted in the TextArea control in color.

Please try those functions later in the next days with our next pre-release and let us know how they work for you.

MBS Xojo Plugins, version 21.1pr5


New in this prerelease of the 21.1 plugins:
  • Added NSNetServiceMBS and NSNetServiceBrowserMBS classes for macOS and iOS.
  • Added runOnce method to NSRunLoopMBS class.
  • Upgraded BigNumberMBS to a 1280 bit floating point number for even bigger range and precision. 256 bit exponent and 1024 bit fraction.
  • Updated InstallDragImageMBS to support newer API and work in Xojo 2020 or newer.
  • Changed SQL Plugin to ignore or add @ in parameter name if needed.
Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

NSNetService classes for Xojo


We had for years the MBS Xojo Network Kit to provide Bonjour services for Xojo iOS applications.

Since Xojo 2020r2 can use plugins on iOS, we deprecated the Kit and now provide a replacement via NSNetServiceMBS and NSNetServiceBrowserMBS classes.

The classes includes:
  • asynchronously browses for domains to use
  • asynchronously browses for services with given type
  • asynchronously publishes services
  • query/publish TXT Record data.
  • Receive events for a service and in browser.
  • Parses IPv4 and IPv6 addresses
  • Encode and decode TXT record data.
Seems to work fine so far for console, web, desktop and iOS projects.

If you have needs for performing network tasks using Apple's frameworks, check NSURLSessionMBS class. It allows upload and download via lots of options and latest TLS encryption.

Coming soon with next pre-release. Please do not hesitate to send us comments, questions or feedback.


Installing a Xojo Web App Server


After installing several servers for a client with various configurations, I collected the notes and made a video for you guys:

Installing a Xojo Web App Server

We show how to install a virtual private server and run both Xojo 2019 and Xojo 2020 web apps. Maybe it is useful for you?


Understanding Memory Statistics


While looking for a memory leak in a Xojo app, I printed repeatedly Runtime.MemoryUsed value to the console and the object count with Runtime.ObjectCount. While objects and strings are created and destroyed, the memory used goes up regularly, often by jumps. Object count goes up and down as we do stuff in the application. So what is going on?

How is memory allocated?

When I remember the old days, over 20 years ago, where I used Turbo Pascal with DOS, the memory was allocated in paragraphs, a 16 byte unit. System memory was small in size (1 mega byte max) and even there allocating memory in smaller units was not done as it is highly inefficient to do so. And the memory model with Segments and Offsets made it convenient to only manage the segment part. Anyway, today memory is still allocated in 16 byte chunks with malloc, the C library to manage allocations.

When you allocate memory for an object or a string, the Xojo runtime will ask malloc for memory. And malloc eventually asks the OS for memory pages. A page is usually 4096 bytes, but can be bigger. I've seen computers with 16 KByte pages and newer Intel CPUs can do 4 MB per page. If you allocate a MemoryBlock of e.g. 5 MB, the malloc system will provide you straight away with such pages, maybe rounding up a bit or combining big and small page sizes. But for smaller allocations of 16 byte to 2048 byte, there will be pools. Since allocating pages has an overhead, malloc tends to allocate a bigger block, e.g. 1 MB for a new pool. There are pools for various sizes, e.g. 16, 32, 48, 64, 96, 128, etc. bytes in block sizes.

If you allocate a new string in Xojo with "Hello World", the malloc system will be asked for one block of 11 bytes (actual 12 for the Chr(0) on the end to be used as C string directly). This is rounded up to 16 bytes. If the pool for 16 byte objects is full, a new one is allocated of about 1 MB. That is why we see Runtime.MemoryUsed jump up by 1 MB regularly. There is some extra allocation for the tables used in management of those blocks.

When you free an object, it's marked as free. The block can be filled with a certain bit pattern to later detect reuse of freed memory. If all blocks in the given pool are free, the whole pool could be freed. But this usually doesn't happen. Getting pages from the OS is time consuming, so malloc prefers to keep the pool for later. But most of the pool may usually be marked as free. (more)

MBS Xojo Plugins, version 21.1pr4


New in this prerelease of the 21.1 plugins: Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

RowSet in MBS Xojo SQL Plugin


For MBS Xojo SQL Plugin 21.1, we have RowSet now in 10 places. In general the plugin provides with one Database API the backend for both RowSet and RecordSet. The difference is how the Xojo frameworks provide back errors to you. RecordSet passes error to Database class, while RowSet raises exceptions. Whether you use RowSet or RecordSet is your preference. Here are the 10 places we use RowSet now:

  • In SQLCommandMBS class:
    • AsRowSet as RowSet
  • In SQLPreparedStatementMBS class:
    • SelectSQL(ParamArray bindItems As Variant) As RowSet
    • SelectSQLMT(ParamArray bindItems As Variant) As Rowset
  • In SQLDatabaseMBS class:
    • SelectSQL(sql As String, ParamArray values As Variant) as RowSet
    • SelectSQL(sql As String, values() As Variant) as RowSet
  • In SQLConnectionMBS class:
    • SQLSelectAsRowSet(command as string, CommandType as integer = 0) as RowSet
    • SQLSelectAsRowSetMT(command as string, CommandType as integer = 0) as RowSet
  • globals:
    • BuildRowSetMBS(fieldNames() as string, values() as string) as RowSet

The MT methods allow to perform the query in a preemptive thread, so the GUI may be more responsive if you call it in a Xojo thread. In general the MBS Xojo SQL Plugin allows you to be very flexible. For example you can walk over records with SQLCommandMBS class, with RecordSet or with RowSet. You can mix those if needed.

The plugins hide the RowSet functions if loaded in older Xojo versions.

We add BuildRowSetMBS for the next release. Similar to BuildRecordSetMBS, it allows you to create a RecordSet from string arrays.

Please do not hesitate to contact us if you have questions.


MBS Xojo Plugins, version 21.1pr3


New in this prerelease of the 21.1 plugins:
  • Added CocoaMouseDown, CocoaMouseDrag and CocoaMouseUp events to PDFViewControlMBS control to handle low level mouse events.
  • Added emojis to the documentation to clearer show what items are supported for each platform.
  • Fixed problem in DynaPDFMBS class with graphics, where we reset font to default one on nextpage call.
  • Fixed problem with dictionary processing on iOS.
  • Fixed problem with NSCollectionViewMBS raising events while closing and causing crashes.
  • Updated dyncall library to version 1.2.
  • Updated LCMS to version 2.12.
  • Updated Rockey4ND library to newer version.
  • Updated SQLAPI to version 5.1.4b3.
Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

Xojo Leak Finder


Recently I had to find a few leaks in an application and wrote me some leak finder. Here is how it works:

  1. We walk over all objects via Runtime module and put them in an array. Thereby we skip data objects and introspection objects to reduce the number of objects.
  2. We check all those objects we get to find references to other objects. This includes looking on keys and values for a dictionary, controls in a window, row tags in a listbox, fields of a RecordSet and other container classes. For arrays of objects, we look into the values.
  3. By using Introspection we look on the properties in classes to add references.
  4. For each object found, we look via references if there is a circle way through it. If we find a circle, we report it via FoundLeak event.

This seems to work fine and we found a few leaks ourselves.

We will provide this example project with next plugin version for you to try. Already in 21.1pr2 download by now. Please do not hesitate to contact us with questions.

If you have an improvement suggestion, please report back your changes.


RegEx Speedup


Did you notice the RegExMBS Speedup in MBS Xojo Plugins version 21.1pr2?

We recently got a notice about our plugin being slow with RegEx. A test project showed it is even slower than the built-in RegEx class in Xojo, so I looked what we could optimize.

The sample benchmark example (attache to Feedback case 24836) just creates a string with given number of matches and then lets the Xojo and the MBS class look for matches and counts them.

Size Xojo RegEx MBS 20.0 MBS 21.0 MBS 21.1pr3
500 Matches in 1 MB 186.826 msec 359.175 msec 285.546 msec 7.737 msec
5000 Matches in 10 MB 19.338.806 msec 35.494.294 msec 29.938.579 msec 56.555 msec
50000 Matches in 10 MB 19.508.207 msec 316.821.069 msec 292.339.023 msec 58.222 msec

Those numbers are measured here in built 64-bit apps with disabled background tasks. Your numbers may vary with a different CPU, but the relations should be reproducible for you.

As usual for the majority of Xojo developers the built-in classes are fine. And we cater to the small percentage, which needs a little bit more performance. But the new speeds measured are phenomenal.

How did we speed up? Well for MBS Plugin, we used to do a check whether a string is ASCII or UTF-8 and this check takes some time and if you do that on each call, it may kill performance. You see it exactly above as the number of matches defines how often Execute() is called and so how often the plugin did the string check. For our plugin, the check is now made only once and then we see you pass the same string, we skip it for further calls and use cached result.

Please try and let us know. Especially we are looking for similar cases where you pass the same text again and again.


MBS Xojo Plugins, version 21.1pr2


New in this prerelease of the 21.1 plugins:
  • Added BeginTransaction, Commit, and Rollback methods for DuckConnectionMBS class.
  • Added kcfIgnoreICCProfile and kptConvertPage to DynaPDFMBS class.
  • Added PDFAppearanceCharacteristicsMBS class.
  • Added IsASCIIText function to RegExMBS class.
  • Added UnInitialize method to SQLGlobalsMBS class.
  • Fixed a crash in IDE on Big Sur with NSTokenFieldControlMBS on the layout.
  • Fixed bug in Reverse method in StringHandleMBS class.
  • Improved performance a lot of repeated calls to Execute method in RegEXMBS class to find matches.
  • Updated CURL library to version 7.75.
  • Updated DukTape library for JavaScriptEngineMBS class to version 2.6.
  • Updated DynaPDF to version 4.0.48.135.
  • Updated openssl library to version 1.1.1i.
  • Upgraded PDFKit classes to current macOS SDK adding over 200 additional methods and properties.
Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

MBS Xojo Plugins Installation for Windows


We got a video about installing our MBS Xojo Plugins on macOS. Stefanie shows you a few examples and how to use the plugins.



MBS Plugin Installation on macOS   All Xojo Movies   Watch on Youtube.

Enjoy the video and please don't hesitate to contact us with your questions.

MBS Xojo Plugins, version 21.1pr1


New in this prerelease of the 21.1 plugins:
  • Added 30 new trigonometry functions for BigNumberMBS class.
  • Added CNPhoneNumberMBS.CNLabelPhoneNumberAppleWatch function.
  • Added DirectShowAMVideoControlMBS class.
  • Added DuckDatabaseMBS class for DuckDB database engine, a fast column based database engine.
  • Added extra line to CURL debug log to indicate the version of MBS Plugin, CURL library used and what OS is used. See DebugData property in CURLSMBS class.
  • Added FindPin method to DirectShowCaptureGraphBuilderMBS class
  • Added FindTableName function to SQLGlobalsMBS class.
  • Added GetStreamConfig function for DirectShowCaptureGraphBuilderMBS class to accept GUID to identify the pin category.
  • Added ImageIndex and ImageHandle properties to DynaPDFImageMBS class.
  • Added NormInvMBS function.
  • Changed Constructor for PDFBorderMBS to be public.
  • Changed MaxTotalConnections in CURLSMultiMBS class to 4 as default. Avoids excessive connection counts unless you change it.
  • Fixed issue with Graphics.TextHeight for DynaPDFMBS class.
  • Fixed issue with MoveFirst with RecordSet in our SQL Plugin when used with PostgreSQL.
  • Fixed possible crash in CheckUTF8MBS function.
  • Fixed problem in QLPreviewPanelMBS, broken in version 21.0.
  • Fixed problem with GetProfileInfo method and name property in LCMS2ProfileMBS class.
  • Fixed thumbnailSize property for PDFThumbnailViewMBS class.
  • Improved text conversion performance internally for getting text as UTF16 or UTF32. This is used in all plugin parts and speeds up XLSheetMBS and DynaPDFMBS classes a lot!
  • Updated DynaPDF to version 4.0.47.134.
  • Updated LCMS to version 2.12rc1.
  • Updated LibXML to version 2.9.10.
  • Updated LibXSLT to version 1.1.34.
  • Updated to Xcode 12.4.
  • Upgraded BigNumberMBS to a 640 bit floating point number for even bigger range and precision. 128 bit exponent and 512 bit fraction.
  • Upgraded DirectShowGUIDMBS class with more methods and properties.
Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

DuckDB


On the weekend, there happened something on the Xojo forum. 29th January Hans-Norbert Gratzal pointed to DuckDB.org to ask about whether there is a plugin for this. DuckDB is a column based database, which is different than the row based ones like SQLite. Depending on what you do, column based databases can be a lot of quicker to scan lots of records for values in one column. Your mileage may vary, but if you have both available, you can do comparisons.

For fun I started on Saturday to code a few classes and work my way through it. That continued on Sunday. A real nice weekend coding project and I enjoyed it very much. Plugin creator Björn Eiríksson from Island also jumped right on this and released this implementation yesterday. Nice work.

The MBS implementation comes with 21.1pr1 pre-release later today. Build process for 500+ plugin parts takes some time. But feel free to check our classes: DuckDatabaseMBS, DuckConnectionMBS, DuckResultMBS and DuckPreparedStatementMBS. I decided to stick close to the original API and not do a wrapper using Xojo's database API. We may in future add it to MBS Xojo SQL Plugin, but for now, it stays separate due to its size.

The plugin includes pre-built libraries for macOS, iOS, Windows and Linux 32-bit ARM. Currently Linux 32/64bit on Intel is missing. But we built-in the LoadLibrary function to load the library coming with your distribution. The plugin is still big with 23 MB compressed. About 7 MB per target in average.

Since I like variant, I got you Bind and Value functions to read/write values with variant class and automatically handles boolean, integer, floating point and text data types. We got functions to read value as Date or DateTime values. Also we have more native functions to read the components for Date, Time, Timestamp, Huge Ints (128 bit) and Intervals.

The whole thing is early. DuckDB will evolve and we may enhance the plugin classes. Let us know your ideas and please don't hesitate to contact us with questions.

Edit and Update for SQLDatabaseMBS class


For years we had requests to add support for Edit and Update functions in the RecordSet to our own classes, SQLDatabaseMBS and SQLConnectionMBS. Well, till now we didn't have an idea how to do this well for all database types.

Recently we got some ideas, so we started to implement them. Let me explain how it works now: First we got a little SQL parser to find the table name in a SQL statement. If the SQL is complex, has some JOIN operator or references multiple tables, we stop and return an empty string. That means we won't allow you to edit the record set from such a statement.

The function is available for you to try as FindTableName in SQLGlobalsMBS. Let us know if you can find some SQL, where it doesn't work as expected. As we use it later with a record set, the SQL has already be parsed and accepted by the database server, so it is always valid SQL.

If you call Edit on the RecordSet, we just check the pre-conditions. We currently don't do any record locking there, but could maybe in future.

Next you may assign values to some fields in the RecordSet. Please only assign data fields and never the primary key fields as that helps us distinguish the fields.

Finally you call the Update method. The plugin looks up the table name. We separate the fields into two categories: Fields you changed are data fields. Also we count all numeric, double, interval, BLob, CLob and date/time fields in this category. What is left will be a few string and integer fields, which are the invariants to identify the record. This usually may include ID fields and UUID fields. You may notice that we don't need to query the schema this way, which is great when you have 15 different target databases.

To be sure we only edit one record, we make a SELECT query to count the records matching the given keys. This should always find exactly one record. But if your primary key is not part of the record set and no other unique key was selected, we find multiple records and return an error. We fill in the key values from the old values in the RecordSet and fill the new values as passed by Xojo. Data type is either given by Xojo as parameter to the plugin or we pick it from the matching field.

If something goes wrong now, we return an error. For examples if you used AS in the SQL to rename a field or an expression, the update statement will fail with unrecognized field name. The call may also fail if we can't identify a key field.

If you like to get a more detailed update statement or control how it is build, you may just use prepared statement with the UPDATE statement you like to use. Otherwise you can collect record data via dictionary and use our InsertRecord/UpdateRecord methods with those dictionaries:

UpdateRecord(TableName as String, Record as Dictionary, Keys as Dictionary)
InsertRecord(TableName as String, Record as Dictionary)

Please try soon with next pre-release. This new feature may need some testing and tuning. For example we may need to tune the auto generated SQL for some database types. But since this is working, converting a Xojo example from SQLiteDatabase to SQLDatabaseMBS is only a handful of lines to change.

Converting Xojo project to use MBS SQL Plugin


If you like to convert an example project from Xojo to use our plugin, you only need a few simple changes. For example in the SQLiteExample project, you need to only do a few steps:

  • First, search for SQLiteDatabase and change the db property in app to use SQLDatabaseMBS as class name.
  • Next change the new line to use SQLDatabaseMBS class for Action event in CreateDBButton class.
  • Add line to enable SQLite internal database a bit higher there:
    call InternalSQLiteLibraryMBS.Use
  • Change from DatabaseFile to using path in DatabaseName:
    App.DB.DatabaseName = "SQLite:"+dbFile.NativePath
    The prefix SQLite: tells MBS Xojo SQL Plugin to use the right database client library, e.g. the internal one we activated before.
  • Remove the call for CreateDatabase as database is created automatically with our plugin if needed. Instead call connect to connect to new empty database file:
    app.db.Connect

Now you can run the project:

That was it. MBS Xojo SQL Plugin implements the database interface from Xojo and works with both older RecordSet and newer RowSet classes. A few examples are tricky to port as they used Edit/Update on the RecordSets, but we may have a solution for that soon.

Please don't hesitate to contact us if you have questions.


MBS Xojo Plugins Version 21.0 News


In this article I want to introduce you the new functionalities from the MBS Xojo Plugins in version 21.0.

Memory Block

Let's start with the new methods from the class MemoryBlock. With the SetBitMBS method we can set a single bit. To do this, we first specify the bit that should be set by its number. Then we have several other options to choose from. If we make now no further specifications to the value then the value of the bit is set automatically to 1. If we pass a 1 or a 0 in the parameters, the bit is set accordingly. If we pass a true or false then the bit is set to 1, according to the logical values, for true and to 0 for false. With the method IsBitSetMBS you can check whether the bit is set. With the method GetBitMBS you get the value of a bit. If you want to reset the bit to zero you can use the method ClearBitMBS.

Dim m As New MemoryBlock(100)

m.SetBitMBS(123)
Dim v1 As Boolean = m.IsBitSetMBS(123)
m.ClearBitMBS(123)

DynaPDF

We have also a new method for the component DynaPDF. With the method GetTypoLeading from the DynaPDFMBS class we get the typographic leading or line height of the active font. The method can be called after a font was activated in the graphics state, e.g. with SetFont(), SetFontEx(), SetCIDFont(), or ChangeFont(). This helps you to layout your PDF document.

For WriteFText, WriteFTextEx and ConvertStyledText can now use a given leading relative to the font size as shown in the example output on the right.

Additionally we have two new Properties. In the properties you find the information about the number of warnings (WarningCount) and the number of errors (ErrorCount) that occurs while the creating of the PDF.

DynaPDF got new functions to convert a PDF page to outlines with the Optimize function. This makes copying the text impossible as all font information is converted to vector graphics. Outlines are vector graphics describing how a font looks and are highlighted in different colors here:

(more)

Text Encoding Speedups


A client contacted us about some performance problems with our MBS Xojo XL Plugin. Writing 5000 rows into Excel documents takes some time. Looking into a test project, we found that conversion from UTF-8 to UTF-16 or UTF-32 takes most of the time in the whole process. Text encoding conversion needed about 70% of the processing time.

Luckily we found a way to speed up the text encoding conversion and the results are phenomenal. For the client, we got time down from 195 seconds to 80 seconds. The improvements are solely due to optimized text encoding handling.

We did some measurements here with our own test projects:

512000 calls for WriteString method in XLSheetMBS take about 15.9 seconds with old plugin (21.0), but only 4 seconds for newer plugin (21.1). The effect shows well here as text is just added to internal data structures.

The same 512000 calls send to WriteText method in DynaPDFMBS reduce from about 28.6 down to 24.9 seconds. Here the encoding for text to PDF encoding takes more time than our encoding conversion.

This changes will come with 21.1pr1 to be tested by you all. Please do not hesitate to contact us with your questions.
And if you have ideas for other areas where we could improve performance, please let us know.

MonkeyBread Software Releases the MBS Xojo Plugins in version 21.0


Nickenich, Germany - (January 19th, 2021) -- MonkeyBread Software today is pleased to announce MBS Xojo Plugins 21.0 for macOS, Linux and Windows, the latest update to their product that is easily the most powerful plugin collection currently available for Xojo. MBS Xojo Plugins have been updated and now includes over 2800 classes and 72,000 documented features, and the versatile plugins have gained more new functions:

In this release we include plugins for iOS and Apple Silicon. All plugins have been compiled for the new CPU type from Apple. Over 300 plugin parts are ported for iOS and work well. We created a few new example projects for iOS, but usually you can copy & paste code from desktop to iOS projects. We start with new iOS controls for SceneKit (SCNIOSControlMBS), MapKit (MapKitIOSControlMBS) and WebKit (WKWebViewIOSControlMBS). Those iOS controls are nearly identical to the Mac desktop controls, except they now work on iOS.

For macOS the new NSCollectionViewControlMBS control provides access to Apple's implementation of a collection view. This is the control used in applications like Photos or Finder to show a grid of files or photos. You can use container controls in Xojo to provide the views. The control comes with 10 more classes like NSCollectionViewMBS class.

On Windows you can report errors with WindowsReportErrorMBS class to the Windows error log. For WebView2 you can run JavaScript synchronously with ExecuteScriptSync in our WebView2ControlMBS control. The WindowsExecuteMBS function can now minimize the new application you call with ShowWindow parameter. We updated IEDocumentMBS and IEWindowMBS classes to allow you to query frames content. For DirectShow we added more methods to our DirectShowPinMBS class.

On macOS you can run can now manage the contextual menu with new events in WKWebViewControlMBS control. For AVFoundation's AVAudioEngineMBS class we added functions for manual rendering, so you can convert audio files without playing them in real time, but faster.

DynaPDF got updated to newer version and this includes the new GetTypoLeading method. The DynaPDFMBS class now counts errors and warnings, so you can check on the end whether an error happened in-between. We let you pass leading parameter (line spacing) for converting styled text from TextArea or StyledText class to DynaPDF syntax.

The MemoryBlock class got new bit set functions. The MarkDown functions now handle foot notes. The FileMappingMBS class can now handle shared memory views with over 2 GB in size for 64-bit systems. The HTMLToPlainText function in MimeEmailMBS class is improved to better convert HTML to text.

Finally we updated SQLite library to version 3.34.0, curl to 7.74.0, DynaPDF to 4.0.46.132, SQLAPI to 5.1.3 and Xcode to version 12.3.

See release notes for a complete list of changes.

Older blog entries:

2021-01-16 MBS Xojo Plugins, version 21.0pr8
2021-01-14 Visual Studio 2019 dependency
2021-01-13 MBS Xojo Plugins, version 21.0pr7
2021-01-12 Academic licenses for MBS Plugin
2021-01-11 DynaPDF Optimize command
2021-01-10 Adding leading factor for converting styled text
2021-01-09 MBS Xojo Plugins, version 21.0pr6
2021-01-08 Becoming Xojo MVP
2021-01-04 xDev 19.1 Issue
2021-01-02 Two years junior developer at MBS
2021-01-02 MBS Xojo Plugins, version 20.6pr5
2020-12-28 Convert PDF text to outlines
2020-12-27 Tax changes for 2021
2020-12-26 Xojo in Quarantine
2020-12-24 Merry Christmas
2020-12-24 MBS Xojo Plugins, version 20.6pr4
2020-12-23 Plugin installation for Xojo on Windows and Linux
2020-12-21 Three new controls for iOS in Xojo
2020-12-21 MBS Xojo Plugins, version 20.6pr3
2020-12-21 MBS Xojo Plugins Installation

Archives

Feb 2021
Jan 2021
Dec 2020
Nov 2020
Oct 2020
Sep 2020
Aug 2020
Jul 2020
Jun 2020
May 2020
Apr 2020
Mar 2020
Feb 2020
Jan 2020
Dec 2019
Nov 2019
Oct 2019
Sep 2019
Aug 2019
Jul 2019
Jun 2019
May 2019
Apr 2019
Mar 2019
Feb 2019
Jan 2019
Dec 2018
Nov 2018
Oct 2018
Sep 2018
Aug 2018
Jul 2018
Jun 2018
May 2018
Apr 2018
Mar 2018
Feb 2018
Jan 2018
Dec 2017
Nov 2017
Oct 2017
Sep 2017
Aug 2017
Jul 2017
Jun 2017
May 2017
Apr 2017
Mar 2017
Feb 2017
Jan 2017
Dec 2016
Nov 2016
Oct 2016
Sep 2016
Aug 2016
Jul 2016
Jun 2016
May 2016
Apr 2016
Mar 2016
Feb 2016
Jan 2016
Dec 2015
Nov 2015
Oct 2015
Sep 2015
Aug 2015
Jul 2015
Jun 2015
May 2015
Apr 2015
Mar 2015
Feb 2015
Jan 2015
Dec 2014
Nov 2014
Oct 2014
Sep 2014
Aug 2014
Jul 2014
Jun 2014
May 2014
Apr 2014
Mar 2014
Feb 2014
Jan 2014
Dec 2013
Nov 2013
Oct 2013
Sep 2013
Aug 2013
Jul 2013
Jun 2013
May 2013
Apr 2013
Mar 2013
Feb 2013
Jan 2013
Dec 2012
Nov 2012
Oct 2012
Sep 2012
Aug 2012
Jul 2012
Jun 2012
May 2012
Apr 2012
Mar 2012
Feb 2012
Jan 2012
Dec 2011
Nov 2011
Oct 2011
Sep 2011
Aug 2011
Jul 2011
Jun 2011
May 2011
Apr 2011
Mar 2011
Feb 2011
Jan 2011
Dec 2010
Nov 2010
Oct 2010
Sep 2010
Aug 2010
Jul 2010
Jun 2010
May 2010
Apr 2010
Mar 2010
Feb 2010
Jan 2010
Dec 2009
Nov 2009
Oct 2009
Sep 2009
Aug 2009
Jul 2009
Apr 2009
Mar 2009
Feb 2009
Dec 2008
Nov 2008
Oct 2008
Aug 2008
May 2008
Apr 2008
Mar 2008
Feb 2008
XML: RSS Feed XML: Atom Feed