Xojo Alternatives for Cross-Platform Development

I’ve been working with C# using MS Maui
haven’t gotten too far yet
I want to learn things right so spending more time reading how to do things the right way than I have previously when dabbling in C#
So far I’m happy
Shit just works as stated

3 Likes

That’s great to hear! :+1: My teenage son has learned Python, Ruby and Lua mostly for game programming and now he wants to learn C# which is heavily used in the gaming industry as a scripting language, although there are few game-engine developers who are going 100% with C# (vs using C++ for the engine and C# as a scripting language) - Stride being one of them which is fully compatible with .NET 8 and leverages the latest enhancements in C# 12. These managed languages appear to be getting faster and faster. :rocket: :rocket: :rocket:

What DB bindings can PureBASIC handle? I would need Sql Server and Postgres.

1 Like

NVM, I see it has native support for Postgres, while Sql Server and several other common DBs would have to be via ODBC.

1 Like

Native support for MariaDB, Postgres & SQLite.
Others via ODBC.

1 Like

Keep in mind that Purebasic’s DB support has, in my opinion, a flaw… you have to maintain an open connection for each query which could be an issue if the database you are connecting to requires a license for each connection. Not a big deal of you are connecting to SQLite, but something like SQL Server could be a problem.

3 Likes
  1. Xojo has never had any testing staff. Period.
4 Likes

I am no means an expert with either PureBasic or B4J for desktop. For a one or two form or console utility I like PureBasic. If I was going to write a multi form app then I would lean towards B4J since it is more like VB6 and I feel it encapsulates the form logic and keeps it restricted to only that form compared to the PureBasic way of doing things.

My impression of the way PureBasic “puts” the source files together for compilation under the covers is that it is like the monster long Basic programs back on my TI-994A.Only that you don’t control exactly where everything gets placed in that long list of source code.

Well it is also a connection pool issue, apart from any licensing costs. Of course you can wrap DB calls so that a connection is opened and closed for each query, I’d think, no?

I’d expect it would depend on how the query results are handled
Some are fetched only a bunch at a time and so require an open connection to iterate through the entire set
But that may/may not be exposed to you

It’s quite possible to structure your PureBasic code so all the routines that pertain to a particular window are kept together:

EnableExplicit

Enumeration windows
  #frmMain
  #frmChild
EndEnumeration

Enumeration gadgets
  #frmMain_btnChild
  #frmChild_btnOK
EndEnumeration

;-child window layout
Procedure frmChild_Open()
  If OpenWindow(#frmChild, 250, 50, 200, 250, "Form 2", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
    ButtonGadget(#frmChild_btnOK, 10, 10, 180, 30, "Click Me!")
  EndIf
EndProcedure

;-child window gadget event handlers
Procedure frmChild_onGadget(nGadget, nEventType, nX, nY)
  Select nGadget
    Case #frmChild_btnOK
      MessageRequester("Message", "Hello, World!", 0)
  EndSelect
EndProcedure

;-child window resize event handler
Procedure frmChild_onResize(nW, nH)
  ResizeGadget(#frmChild_btnOK, #PB_Ignore, #PB_Ignore, nW-20, #PB_Ignore)
EndProcedure


;-main window layout
Procedure frmMain_Open()
  If OpenWindow(#frmMain, 50, 50, 400, 150, "Form 1", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
    ButtonGadget(#frmMain_btnChild, 10, 10, 380, 30, "Show Form 2")
  EndIf  
EndProcedure

;-main window gadget event handlers
Procedure frmMain_onGadget(nGadget, nEventType, nX, nY)
  Select nGadget
    Case #frmMain_btnChild
      frmChild_Open()
  EndSelect
EndProcedure

;-main window resize event handler
Procedure frmMain_onResize(nW, nH)
  ResizeGadget(#frmMain_btnChild, #PB_Ignore, #PB_Ignore, nW-20, #PB_Ignore)
EndProcedure

;-routing of gadget events
Procedure Events_Gadget()
  Define.i nGadget = EventGadget(), 
        nEventType = EventType(),
        nX = 0, 
        nY = 0
  Select GadgetType(nGadget)
    Case #PB_GadgetType_Canvas
      nX = GetGadgetAttribute(nGadget, #PB_Canvas_MouseX)
      nY = GetGadgetAttribute(nGadget, #PB_Canvas_MouseY)
    Case #PB_GadgetType_ListIcon
      nY = GetGadgetState(nGadget)
      nX = GetGadgetAttribute(nGadget, #PB_ListIcon_ClickedColumn)
    ; etc...
  EndSelect
  Select EventWindow()
    Case #frmMain
      frmMain_onGadget(nGadget, nEventType, nX, nY)
    Case #frmChild
      frmChild_onGadget(nGadget, nEventType, nX, nY)
  EndSelect
EndProcedure

;-handle window close events
Procedure Events_CloseWindow()
  Define.i nWin = EventWindow()
  Select nWin
    Case #frmMain
      End
    Default
      CloseWindow(nWin)
  EndSelect
EndProcedure

;-routing of window resize events
Procedure Events_ResizeWindow()
  Define.i nWin = EventWindow(), 
        nW = WindowWidth(nWin), 
        nH = WindowHeight(nWin)
  Select nWin
    Case #frmMain
      frmMain_onResize(nW, nH)
    Case #frmChild
      frmChild_onResize(nW, nH)
  EndSelect  
EndProcedure

; -bind events to handlers
BindEvent(#PB_Event_Gadget, @Events_Gadget())
BindEvent(#PB_Event_CloseWindow, @Events_CloseWindow())
BindEvent(#PB_Event_SizeWindow, @Events_ResizeWindow())

;-execution begins here
frmMain_Open()
Repeat
  Define.i nWait = WaitWindowEvent()
ForEver
1 Like

Just to clarify, that’s only if you want to run multiple Select statements simultaneously, it is a shortcoming but I’ve never found it that hard to work around.

Yes, I used to do that way back in the old days with a Visual Basic app for 100+ users and only a 10 user SQL Server license. You open the connection, run the query, grab the info and then close it.

1 Like

For real?

That’s insanely scary.

Well, they have 1 QA person on staff that I think might be part time who also seems to do some tech support. They’ve had more in the past but those folks are gone (IIRC one was fired and another one died suddenly).

Regardless, they don’t have a real QA staff and they don’t do any regression testing that I’m aware of. I don’t think they take advantage of unit testing for the frameworks, and AFAIK there’s no real way to do UI testing for all the platforms that they support.

The pre-release program is the only real ‘testing’ that gets done but since there’s no real incentive for users to spend their time testing (other than having, perhaps, a less buggy feature), not a lot gets tested in real world usage.

The unfortunate thing about the pre-release program is that real issues that are reported often get ignored because to fix them would mean starting over. When I was super involved with the program I wrote many pages of detailed notes on what and why something was wrong. Things that come to mind are the RealBasic to Xojo conversion, and the API2 fiasco. To this day some of the worst Xojo IDE decisions have not been corrected because to fix them requires a rewrite. And API2. Oof. Talk about killing off your existing user base with existing apps not to mention the 20 years of forum/blog posts, examples, etc that are confusing to new users and the LLM’s.

7 Likes

I don’t mind confusing the LLM’s, but a platform like this is unstable for anything critical.
A game, sure.
Healthcare software? Ha!

That said, being in an ambulance last night and watching the shortcuts the paramedics took around the software given to them to get their job done made me depressed. And that seems related to this too. The state of software has always teetered on poor, but it’s been exceptionally bad lately.

1 Like

I recall the discussion about API 2 on their beta testing forum and how all the complaints got heard as

OK so you dont like it like this we’ll go back to the drawing board

Only for it to reappear in nearly the exact same form sometime later
Quite obviously the feedback from that group was largely ignored

But since that group isnt their target market, as the CEO claimed once upon a time, it makes you wonder why they bother with that program at all and dont just close it to just themselves & the MVPs or something narrow like that

Indeed they really dont have QA staff
The BEST tested parts are those that dont require UI since automated unit testing is fairly easy to do
Like the compiler, and other portions like that

But the IDE ?
Without accessibility support on all targets its nearly impossible to do any automated testing since all the controls are opaque to any tool you could use to do that sort of testing
AppleScript would be super nice on macOS to be able to write automated tests
Eggplant or other tools would be useful since you might be able to script screen grab comparisons

Alas I dont think they use anything like that so coverage is whatever gets poked at

:frowning:

1 Like

Sometimes I’m happy to use java. Automated testing on all platforms. Stability and reliability. All I need.

Do you know the open source app MediathekView?

It’s the ONLY Java app that I use and hangs pretty much every third time I use it. Maybe you could give them a hand in figuring out why it is so atrocious …

Source on Github: GitHub - mediathekview/MediathekView: Das Programm MediathekView durchsucht die Online-Mediatheken verschiedener Sender

1 Like

Okay, we’ll do a review and look how we can help them.

1 Like