BKeeney Shorts

picAppIcon256Shorts Viewer Shorts Endorsement

Report Designer

Report Designer

Introducing BKeeney Shorts


BKeeney Shorts is a Reporting Tool for Xojo using classes.  You can display them in a print preview, send to a printer, export it to HTML, or export it to PDF (if you are using the MonkeyBread Software DynaPDF plugin).

The classes work on Mac OS X and Windows desktop and console applications.  It might work in Linux but we’re not supporting it simply due to the number of Linux distributions to support.

The following basic drawing elements are available:

Text, Line, Oval, Rectangle, Rounded Rectangle, Text, RTF Text (desktop only), Image

All of these elements can be used in any combination anywhere on a page, group, or in a document.  Each page can be a different size and orientation.

Auto Line Height Adjustments

New in version 1.1 is the ability to have Text objects expand vertically to fit the text in the block.  The new AutoHeightAdjust property is all you need to set to get this to work.  Whenever you, or the rendering classes, request the bounds of the text object the text height is calculated. By adding an AutoHeightAdjust Text object to a GroupItem you automatically grow the GroupItem too!  This makes it really easy to create ‘rows’ of variable height data.

The auto height adjustment isn’t perfect, though.  One drawback is speed.  We recommend that you limit the number of Text objects that get the auto height adjust set to true.

Report Designer

New in version 1.5 is the BKS Shorts Report Designer.  This is a set of Xojo classes that allow you to embed a report designer into your own Xojo projects.  Yes, that’s right, you can embed a full features report designer into your end desktop application.  Now, instead of hours to create a basic report via code you can be done in minutes.

Main ScreenAmong the highlights of the Report Designer:

  • Connects to any database that Xojo natively supports

    Rendered Report

    Rendered Report

  • Easy formatting of all text objects
  • XojoScript programming at the band level that allows runtime decisions based on data
  • An intuitive interface for Xojo developers
  • Works on Mac and Windows desktop apps (Linux isn’t supported but should work)
  • Allows formatting of numbers to whatever the Xojo Format method allows
  • Use the Designer as is, or make your own modifications.  You get the FULL SOURCE CODE with it!

Overview of How BKS Shorts Report Works

Shorts Designer In Action

Integrating the Report Designer Into Your Project

Integrating Shorts Report Designer

Xojo Webinar on BKeeney Shorts


Create Unusual Reports

BKeeney Shorts allows developers to create reports that would be impossible (or very hard at the very least) to create in other reporting environments and even in the Shorts Report Designer.  Shorts allows you to span rows with any of the elements.  Matter of fact, Shorts really has no idea what a ‘row’ means since you get to control every aspect of printing.

The GroupItem makes it easy to group your report elements into logical groups.  Perhaps your Header and Footer elements are groups.  Perhaps a recordset row is a group.  It really is up to you and your reporting requirements.

Many reporting tools offer SubReports, or the ability to add wildly different type of reports into one bigger report.  Shorts doesn’t support Subreports only because it doesn’t need to.  Again, because you control every aspect of the report you can code it to your exact specifications.

Do it With Style

BKeeney Shorts makes heavy use of inherited styles.  Create one text style for the Document and each page and each text element inherits that style.  No need to perform tedious formatting on each element.  Of course, you can override any style and clone styles, when you need.


The Benefits of Coding Reports

We’ll be honest, coding your reports can be slower than many traditional reporting tools.  We think there are quite a few advantages to coding reports than having to rely upon a tool to do them.

You control everything.  Don’t like placement or the way it page breaks?  You can change that because you have the ability to change it.  Perhaps your users want to create a report in Portrait mode and not in the Landscape mode you had anticipated.  Using some simple math you can create reports that handle either situation.



BKeeney Shorts is fast.  We’ve generated 24,000 page reports and have calculated that on a main thread we can generate about 300 pages a second.  More than fast enough for most developers needs.  And since you have control over how many pages are created you can exit out in abnormal conditions (really, who wants a 24,000 page report?).


Unlike some other reporting tools for Xojo we’re not going away.  We stand behind our product and we offer support.  We use this product in our own products and our own consulting clients.  If you need help and support we’ll be there to help.

What does the future bring?

We use Shorts in all of our desktop and web consulting projects that require reports.  We plan on enhancing the product based on feedback and on our own needs.  There is no roadmap, nor timeline, for new releases and updates, nor a guarantee that future updates are free.

If you have a need for something that Shorts doesn’t already do contact us.

Licenses and Pricing

BKeeney Shorts comes in only one package.  The Pro License is $300 and all classes are unencrypted and available for your modification.

Purchase Professional License

Note, all sales of the Shorts are final (no returns). Please read the user guide and understand all the requirements for Shorts before purchasing. If you have any questions, please contact us!


See the Report Designer in Action!

Shorts Report Designer Demo Mac (20.8 MiB, 195 downloads)
Shorts Report Designer Demo Win (25.9 MiB, 256 downloads)

Report Designer User Guide PDF

Report Designer Guide (559.3 KiB, 435 downloads)

BKeeney Shorts Demo Project for Xojo.  Debug only example project.

BKeeney Shorts DEMO (41.6 MiB, 395759 downloads)

Users Guide PDF

BKeeney Shorts User Guide (328.2 KiB, 491 downloads)

Version History

Version 1.8.1 – 11 January 2016


  • French localizations


  • When rendering the report, you can now pass in a dictionary of your own to override constants found in Report File.  If no dictionary, then it uses the constants from the report.

Bug Fixes:

  • Can now resize bottom bands in reports with several breaks.
  • Grand Summary Bands work again.
  • Mouse drag select now works properly over several bands again.
  • Dragging items in multiple bands now works better.

Version 1.8.0 – 27 December 2016


• Added Informix to the list of databases
– Uses the SQL Plugin from MonkeyBread Software. Requires additional license purchase from MBS.
• Added Constants to the tool. Essentially a Dictionary that allows a user to add constants to a report without having to
put it in a database table.
– Constants show up in the Tool List
– Constants Editor is invoked under the Report menu in the Demo
– Constants are saved in the JSON string and can be changed at runtime before rendering
– Constants are by report. Please let us know if you want global constants.
• Added the ability to have nested conditional statements in the filter data option of Report Designer.
– Added two integer properties (Leading and Trailing) to PAF_DatabaseKit.QueryCondition
– required to include these in SerializeJSON, Constructor, and Clone methods
– updates to winDBFilter adding a mousedown event and UpdateList method. Also modified Display method to accomodate the nested conditions
– updatte to winDBFilter added pushbuttons to add, remove and clear groupings.
– update to winDBFilter added headerpressed event to prevent sorting of clumns in listbox so logic is not changed

• Added graphics to the primitive elements (line, rect, oval, image, text) you can drag to the design canvas
• Removed the metadata shortcuts.
• Turned off sorting filters by column in winDBFilter to prevent changes in filter logic
• Changed location of Sakila (example database) download location.
• Resize item behavior changed a bit from previous version. WANT FEEDBACK.
Bug Fixes:
• When rendering directly from JSON string the DB schema isn’t rescanned unless necessary.
• Exporting to CSV not brings back all rows.
• When changing a text format to an already existing style, the stylename was not being updated, thus in some cases causing the style to revert to the default.
This was a particular problem when saving a report and then printing directly to a PDF.
• Positioning of the items in the bands is now relative to the band rather than the page.
– So setting an item to (0,0) will put it to the top/left of the band it’s assigned rather than moving it to top/left of the page.
• Fixed issue with Encoding of special characters. (Thanks to Valdemar De Sousa)
• May have found the issue causing occasional hard crash. Had to do with updating the Property List after it had already been dismissed.

Version 1.7.3 – 08 September 2016

• Added Page Setup: Page Orientation to Toolbar
• Added Page Setup: Page Size to Toolbar
• Added Page Setup: Margins to Toolbar
• Added “Drill Down” Report using Chinook database.
• Dragging an image folderitem onto the Designer automatically imports the image and adds it to the report.

• Removed LeftRight Margin and replaced with Left and Right Margins
• Removed TopBottom Margin and replaced with Top and Bottom Margins
• Reworked the Margin system in the designer
• Reworked the Margin system in the renderer
• Blank report now respects new default margins
• Added ObjectSelected event in the PreviewCC to mirror the event brought back in ctlViewer
• Added some comments in code to help direct users when they don’t have the DynaPDF plugin installed

Bug Fixes:
• Now using Realbasic.Point rather than Point from Einhugur plugin.
• Changing the size of the band also changes the End point Y of the line. Before it only changed Start Point Y.
• Changing the UID of an object now updates it in the Object List.
• Vertical Scrollbar in the Designer now works as expected.
• Can no longer drag a db field from a body/break band to Header or Footer band.
• Can now drag the footer band all the way to the bottom margin
• Web Only – ?? now works again in header/footer

Version 1.7.2 – 30 August 2016

• Added MetaData dictionary that you can pass into ReportPF. Anything Text field with % at start and end of string will be replaced with values from the meta dictionary.
Example: dictMetaDictionary.value(“Name”) = “Bob” is passed into ReportPF.
If I create a text item with the text %Name% it will be replaced with Bob.
If there is no match from the dictionary the resulting string is blank.
Note: the dictionary tag is case sensitive so “Name” and “name” are not equal. It must be an exact match.

• Added mouse coordinates into designer window.
• Added Don’t Sort Column Names preference. When set, field names are no longer sorted.
• Added FieldAddCheck event to allow developers to hide database columns from the field list.

• Warning message given if user attempts to add db field to report header or footer.

Bug Fixes:
• Added better mouse tracking on Line elements
• If a DefaultStyle can’t be found one is now created. Prevents an exception when saving.
• Changed the Priority of the ReportThread. This allows MySQL reports to run again in Xojo 2016 R2.x releases.
• Double clicking a Table/View Field in the object list will add it to the report body

Version 1.7.1 – 18 July 2016

• Removed HierarchalListSelector from project as it was no longer being used.
• Rows that have a field with CanGrow set to true no longer affect positioning of other items in row.

Bug Fixes:
• Fixed a bug in grouping when using PostgreSQL.
• Fixed bug getting field types from ODBC Databases.
• Fixed issue with Web Dynamic Date Picker
• Moving items with keyboard now updates the property list
• Items in the report object list can now be deleted when using the delete/backspace key
• Fixed issue with not being to select the 2nd half of a line after generating a report
• Fixed issue with Line formatting in generated reports
• Fixed issue with reloading manually entered table relationships
• Fixed an issue with row items stacked vertically with a Text item set to CanGrow
• Fixed issue that Text Items set to grow didn’t have its background expand accordingly

Version 1.7.0 – 01 July 2016

New Features:

  • Added SupressField property to Fields. This will keep rows with identical text to the row above it from displaying. Resets on each page.
  • Added ?? shortcut to Header/Footer bands to be able to put report parameters into the report. Feedback appreciated.
  • Added check upon opening reports in the designer to see if all fields in the report are still valid.
  • Now provide an error message to user if there were any errors while generating report.
  • Added a Version field to the report to make it easier for future file format changes. New file format is 1. Added a conversion routine to convert to version 1.
  • The Property List now has a dedicated popup menu for Date fields.
  • The Query List Dynamic queries can now be made optional to ‘select all’ for that field.


  • Now provide feedback to the user during report generation. This will give rough estimates of numbers of rows created.
  • When switching back to Design view we now make sure the thread generating the report is killed if still running.
  • Major rewrite to the DBWrapper class to make it much more effecient.
  • PAF_QueryCondition made part of the PAF_DatabaseKit and renamed to PAF_DatabaseKit.QueryCondition
  • Reports will save the DefaultStyle from the StylesList.
  • Added some Localization strings into the object list.
  • Removed the Contextual Menu from the Property List format item. Only used for Dates and it now has dedicated Date Popup.
  • Added a WaterMark to two of the Coded reports.

Bug Fixes:

  • Fixed issue where Grand Summary bands weren’t working.
  • Views are now properly vetted through the TableViewAddCheck.
  • Rescanning the schema will refresh the object list properly now.
  • Can no longer drag a report objects (from the Report section of the Object List) into the designer. Now you can only drag fields and report primitives.
  • Repeat Each Page and Page Break are now only valid and displayed for group headers.
  • Adding/Removing items from the Designer now updates the Report Objects section of the object list.
  • Fixed wording in the Band Editor.
  • Background Text Color now saved properly in Style editor.
  • Pressing Enter/Return while in the Properties List will update the object in the Editor.
  • Fixed issue with report time in Report Footer if user had never set format in preferences.
  • Fixed issue with line objects not calculating their top/right property properly.
  • Fixed a date conversion issue when formatting the dates to other than default.
  • Fixed mouse handling and drawing issues when the canvas width was smaller than the page width.
  • Fixed Report window Title not showing on initial save of report in designer.
  • Fixed odd random Nil Object Exceptions when updating from the property list.
  • Fixed the WindowMenu class to work with multiple menu bars used in the project.
  • Fixed issues with the IsFunction property when generating reports.

Version 1.6.0 – 27 March 2016

  • Dynamic Runtime Query variables. Allows the report designer to ask the user what values they want at runtime. Current paramters types::
    • Boolean value using a Checkbox
    • String value
    • Numeric (integer and double values)
    • User List (popup)
    • Query List (popup)
    • Date, DateTime, or Time
  • Moving items via the mouse will immediately update the save status on the Toolbar
  • Changing Filter Data will update the save status and undo status
  • Undo now works for changing of filter data.
  • Added Filter Data to report designer Toolbar
  • Added an ObjectSelected event on the BKS_ShortsBaseViewer that will pass back the clicked BKS_Shorts.Item and
    if there is one, the BKS_Shorts.GroupItem. This will allow you to implement a drill down report.
  • Invisible TextItems are rendered in the background color to allow the MouseHit to bring back additional information in the group
  • Added a FieldName property to BKS_Shorts.Item and reports run through the Report Designer will fill that in at generation
    time. This allows the user to query what the field (if there is one) from the selected item.
  • Added OK/Cancel generic container for all dialogs
  • Bug Fix [Windows Only]: Now respect the number of copies specified for a print. Note that this is not in Shorts classes itself but how the supporting code prints.
  • Bug Fix: Fixed another instance where it was possible to NOT have a Default Style when generating a report.
  • Improved German localizations.
  • Moved About Shorts Designer Menu Item out of winReportDesigner
  • Bands that are marked as invisible no longer get rendered on the report.

Known Limitations:

  • Dynamic Queries do not work with IN clause in where statements.

Version 1.5.4 – 11 February 2016

  • Major code changes to allow most classes to work in web apps too.
    • Simply copy BKS_Shorts_ReportDesigner folder into your existing web project.
    • Delete PAF_PrintKit.DesignCanvas (desktop ScrollCanvas subclass)
    •  Create a new PAF_PrintKit.DesignCanvas that is a WebCanvas subclass
  • Changing text values in the Properties List is now Case Sensitive
  • Added Portugese Localization
  • Added a commented out example of how to connect to MySQL without using the winDBConnection Window/
  • See winRPTViewer.Display
  • Fixed an issue that would cause the SQL statement to not be saved properly in the JSON string
  • Added a Default Style if none is in the local dictionary
  • How reports are saved so they can be viewed without first having to be in the designer
  • Cleaned up some localizations and made some more strings dynamic.
  • Made the Report Designer the default pushbutton in Demo Window
  • New Report opens a new Report Designer Window instead of copying the current connection. (this affected menu handlers in odd ways one wouldn’t expect)
  • Created a Web Example

Version 1.5.3 – 28 Jan 2016

  • Added SC_GetCount in the Band XojoScript editor. This lets you get how many times this band has been shown.
    Example of use is to have line numbers on your report without having to do it in SQL.
  • Updated German localization
  • Rearranged UI on ccPAF_Filter (Filter Data) to make it a bit more obvious
  • As a Text Item or Field Item are put on a report it will automatically use the “Default Style”
  • Fixed an issue where the Default Style wasn’t getting passed to the generated report.
  • The Styles Editor now allows you to delete multiple Styles at a time.
  • Added a new example of how to print directly to printer without having to use the viewer.
  • Reconfigured Demo window to break between Report Designer stuff and older code-only stuff.
  • Added SC_GetCount Demo
  • Fixed some items in the HTML Renderer
  • In PAF_PrintKit.PrintText.constructor if there is no DefaultStyle we create one.
  • ReportPF will now extract Styles from the report definition file.

Version 1.5.2 – 14 Jan 2016

  • Started loclalization process and made dynamic strings. Spanish, French, and German are in the project. •••NEED HELP IN LOCALIZING•••
  • Fixed issue with Bands Editor when trying to delete Grand Total Band.
  • Designer Canvas will no longer let you delete a Grand Summaries band. Must be done in the Bands editor.
  • If the report has a NULL date it will now create a blank string rather than use the field name. Changed in ReportPF.CreateItem.
  • Selected bands now highlight with background color. Color constant at PAF_PrintKit.PrintBand.kBandSelectedBackgroundColor.
  • Fixed an error in the PropertyList that would sometimes overwrite a Text value with a zero thus causing all sorts of havoc with reports.

Version 1.5.1 – 08 Jan 2016

  • Added a new demo of how to create a report from just the report definition
  • Comes with MySQL, PostgreSQL, and ODBC enabled.  CubeSQL still requires changing the constant
  • Bug fixes

Version 1.5 – Jan 2016

  • Introduction of Report Designer
  • Integration of Report Designer into the Demo
  • Added Fit to Width and Fit Document into Report Viewer
  • Fixed quite a few bugs for Text wrapping and Alignment

Version 1.1 – 06 Feb 2015

  • Text blocks now have an AutoHeightAdjust property that lets them auto wrap their text and change the text height
  • Desktop now has an RTF Block and uses Formatted Text Control to convert into Shorts reports and HTML
  • Demo project for Web and Desktop with viewers you can use in your own projects
  • Multiple demo reports with the various ways to create a report via code

Demo 07 Jan 2014

  • Updated the demo to work without modification in Windows

Version 1.0.1 – 01 May 2013

  • Removed dependency of MBS plugin for the HTML renderer class
  • Added sample database to demo project

Version 1.0 – April 2013

  • First public release