I want Xojo to succeed. My living relies on it. This is the same for others I talk with. We all NEED Xojo to succeed. For us it needs to do more than just survive from day to day. We need it to grow. Our businesses depend on Xojo. We need it to be stable. We need it to be dependable.… Read the rest
New Attributes in 2019r2
There’s a lot of things to digest in 2019r2
One of the handy things that was added is a new Attribute you can make use of in your own custom controls – DefaultEvent
By adding this attribute to your custom class’ attributes you can make it so any one of the events your custom controls exposes is the “default event”.… Read the rest
ToHex
Converting numbers, especially ones of a specific size, to hex has long been problematic. The built in functions don’t do a very good job with it and often drop leading zeros even when the integers size is known.
Dim s1 As String
s1 = Hex(13) // here 13 is an "Integer" literal
// and should be treated as a 32 bit integer in a 32 bit build
// or a 64 bit integer in a 64 bit build
Dim i8 As Int8 = 13
Dim s2 As String
s2 = i8.ToHex
… Read the rest Game of Code
Or “write code like you immediately forget what you wrote” so it’s not a guessing game to figure out why you wrote what you wrote way back when.
What do I mean by that ?
Write code CLEARLY. Use constants liberally and give them good meaningful names.
So instead of writing a line like
If asc(key) = 16 or asc(key) = 204 then
where 16 and 204 are not obvious to everyone maybe write this as
Const ctrlP = 16
Const F5 = 204
if asc(key) = ctrlP or asc(key) = F5 then
And then even when you go back and look at this code in 6 months even you won’t have to guess what 16 and 204 mean.
Maintaining backwards compatibility in 2019r2
Subclasses, modules and compatibility flags 😛
In Xojo it never used to require a lot of hard work to work across multiple versions. If you simply avoided using the new features then a project could mostly move back and forth between versions without much effort. You could even deal with a lot of newer version changes with a few #If XojoVersion wrappers around bits of code.… Read the rest
Xojo 2019r2 & API 2.0
There’s a lot of changes in R2
There are some that are very minor. Like making VAR a synonym for DIM. You can use it or not. It functions no differently.
Some of them are very welcome like updates to URLConnection for one. The JSON Parse and Generate methods seem to work a LOT faster now.… Read the rest
Sort like Finder
Sometimes you want to be able to sort things in the same fashion as the Finder. This method when used as the comparison function for the Arry.Sort( delegate) form of sorting will do that
Public Function CompareLikeFinder(firstString as string, secondString as String) as integer
#If targetMacOS
// //
// // typedef NS_CLOSED_ENUM(NSInteger, NSComparisonResult) {
// // NSOrderedAscending = -1L,
// // NSOrderedSame,
// // NSOrderedDescending
// // };
//
// // this gives us "Finder like" comparisons
// -[NSString localizedStandardCompare:].
… Read the rest Is full keyboard access on ?
Sometimes its useful to be able to be able to tell your user if they need to enable full keyboard access
You can tell if its enabled with this method
Public Function FullKeyboardAccessEnabled() as Boolean
#If TargetMacOS
Try
Declare Function NSClassFromString Lib "Cocoa" (name As CFStringRef) As Ptr
Declare Function GetSharedApplication Lib "AppKit" Selector "sharedApplication" (target As Ptr) As Ptr
Declare Function IsFullKeyboardAccessEnabled Lib "AppKit" Selector "isFullKeyboardAccessEnabled" (target As Ptr) As Boolean
Dim AppClass As Ptr = NSClassFromString("NSApplication")
If AppClass <Nil Then
Dim AppObject As Ptr = GetSharedApplication(AppClass)
If AppObject <Nil Then
Return IsFullKeyboardAccessEnabled(AppObject)
End If
End If
Catch Err As RuntimeException
Return False
End Try
#endif
// windows & linux can tab to EVERY control anyway
return true
End Function
Opting in or out of Windows AutoTabbing
macOS adopted an interesting behaviour some time ago where when you opened a new window in an application. It would default to opening a new tab in the window instead of opening a new window.
If your application could not deal with this and the user had the preference in System Preferences > Dock > Prefer Tabs when opening documents set to Always then it could cause your app issues.… Read the rest
Switch the window type at runtime
I’ve seen this question come up a couple times recently. And while it would be nice to do you cant.
The frame type is required to be set when the window is constructed. And there’s no constructor on a window that allows you to do something like
dim w as new Window(frametype)
So how can you have something like a document window on macOS and a movable modal on Windows ?… Read the rest