Page 1 of 2

My First Post - Hello

Posted: Wed Dec 03, 2025 6:36 pm
by MikeGreen99
Ubuntu Unity 24.04 PureBasic 6.21

Hi.

I am a retired electrical engineer who made a career designing and programming computer systems. I have 'played' with Visual Basic and QuickBasic for many years. I have dabbled in assembler, C, and the mighty Python. Now I'm toying with PureBasic, and I really like it. It will become my go to language for most of my future programming needs.

By the way, I had difficulties registering for this forum. The system would not accept my entered info. I tried multiple times. Finally, I tried disabling Privacy Badger, and it worked. Go figure.

Have a nice day,
Mike from the 1000 Islands, Ontario, Canada

Re: My First Post - Hello

Posted: Wed Dec 03, 2025 6:53 pm
by miso
Welcome, good to have you here ;)

Re: My First Post - Hello

Posted: Wed Dec 03, 2025 6:57 pm
by mk-soft
Wellcome ;)

I've been with PureBasic for over 20 years. Some programs and services have been running on various systems for a very long time.
It's worth working with it. Even if you first have to learn that a few things go differently than you were used to with VB6.

P.S.
Before you work with the FormDesigner you should write the windows and gadgets by hand.
Since every start is difficult to understand the event management of PureBasic I have put my template to test.

Code: Select all

;-TOP

#ProgramTitle = "Main Window"
#ProgramVersion = "v1.01.2"

Enumeration Windows
  #Main
EndEnumeration

Enumeration MenuBar
  #MainMenu
EndEnumeration

Enumeration MenuItems
  #MainMenuAbout
  #MainMenuExit
EndEnumeration

Enumeration Gadgets
  #MainEdit
  #MainButtonOk
  #MainButtonCancel
EndEnumeration

Enumeration StatusBar
  #MainStatusBar
EndEnumeration

Procedure UpdateWindow()
  Protected dx, dy
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
  ; Resize gadgets
  ResizeGadget(#MainEdit, 5, 5, dx - 10, dy - 45)
  ResizeGadget(#MainButtonok, 10, dy - 35, 120, 30)
  ResizeGadget(#MainButtonCancel, dx - 130, dy - 35, 120, 30)
EndProcedure

Procedure Main()
  Protected dx, dy
  
  #MainStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, 800, 600, #ProgramTitle , #MainStyle)
    ; Menu
    CreateMenu(#MainMenu, WindowID(#Main))
    MenuTitle("&File")
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      MenuItem(#PB_Menu_About, "")
    CompilerElse
      MenuItem(#MainMenuAbout, "About")
    CompilerEndIf
    ; Menu File Items
    
    CompilerIf Not #PB_Compiler_OS = #PB_OS_MacOS
      MenuBar()
      MenuItem(#MainMenuExit, "E&xit")
    CompilerEndIf
    
    ; StatusBar
    CreateStatusBar(#MainStatusBar, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; Gadgets
    dx = WindowWidth(#Main)
    dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
    EditorGadget(#MainEdit, 5, 5, dx -10, dy - 45)
    ButtonGadget(#MainButtonok, 10, dy - 35, 120, 30, "Ok")
    ButtonGadget(#MainButtonCancel, dx - 130, dy - 35, 120, 30, "Abbruch")
    
    ; Bind Events
    BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), #Main)
    
    ; Event Loop
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              Break
              
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                PostEvent(#PB_Event_Menu, #Main, #MainMenuAbout)
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                PostEvent(#PB_Event_CloseWindow, #Main, #Null)
                
            CompilerEndIf
            
          Case #MainMenuAbout
            MessageRequester("About", #ProgramTitle + #LF$ + #ProgramVersion, #PB_MessageRequester_Info)
              
          Case #MainMenuExit
            PostEvent(#PB_Event_CloseWindow, #Main, #Null)
            
          EndSelect
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #MainEdit
              Select EventType()
                Case #PB_EventType_Change
                  ;
                  
              EndSelect
              
            Case #MainButtonOk
              ;
            Case #MainButtonCancel
              ;
              
          EndSelect
          
      EndSelect
    ForEver
    
  EndIf
  
EndProcedure : Main()

Re: My First Post - Hello

Posted: Wed Dec 03, 2025 9:17 pm
by MikeGreen99
Thanks for the responses.

Writing the windows and gadgets by hand looks pretty formidable to me. I will delve into it shortly.

However, yesterday I was playing with the built in FormDesigner and got an error.

I will discuss this on another post entitled: "Not a function, Array, List, Map Or Macro"

Thanks,
M....

Re: My First Post - Hello

Posted: Thu Dec 04, 2025 10:28 pm
by Piero
MikeGreen99 wrote: Wed Dec 03, 2025 9:17 pmyesterday I was playing with the built in FormDesigner and got an error.
Oh? No errors with runprogram? You must be running windows… WELCOME ANYWAY! :mrgreen:

Re: My First Post - Hello

Posted: Thu Dec 04, 2025 10:59 pm
by MikeGreen99
I use ubuntu unity.

I haven't used Windows for the past 15 years, and proud of it :D .

Thanks,
M...

Re: My First Post - Hello

Posted: Fri Dec 05, 2025 1:03 am
by skywalk
Yes, roll your own guis until you have a better understanding of the event loop and callbacks or bindgadgetevents.
So much easier than VB6.
You can see it all in your source text instead of miles of property boxes and trees.

Also have a look at threading examples early to avoid your gui appearing hung.
There is no magic DoEvents() like VB6, as if that really worked anyway.

Always use EnableExplicit.
Arrays start at 0.
Strings are slower than VB6, but only if you have medium to large counts.

Happy coding!

Re: My First Post - Hello

Posted: Fri Dec 05, 2025 6:02 am
by susan
MikeGreen99 wrote: Wed Dec 03, 2025 9:17 pm Writing the windows and gadgets by hand looks pretty formidable to me.
From one newish PureBasic user to another, I have been using the built-in Form Designer with success and think it is better than having to figure out the position and size of on screen stuff by hand. The way the Form Designer sets up events seems to be disliked by some, who are much, much more experienced than me, so I won't argue, but it has worked just fine for me.

Re: My First Post - Hello

Posted: Fri Dec 05, 2025 9:20 am
by mk-soft
I would also disable the #PB_Any setting in FormDesigner. I think it's better to use constants with enumerations for the GUI instead of lots of variables.

I'm one of those who don't like FormDesigner's event handling either.
Otherwise, I also like to use FormDesigner (without #PB_Any) to create multiple windows.
Since I am actually lazy when it comes to writing, I use my EventDesigner to get all windows into one programme
and create all the necessary event procedures and management.
See signature.

;)

Re: My First Post - Hello

Posted: Fri Dec 05, 2025 3:22 pm
by TI-994A
mk-soft wrote: Fri Dec 05, 2025 9:20 am...disable the #PB_Any setting in FormDesigner. I think it's better to use constants with enumerations for the GUI instead of lots of variables.
I'm sure that coding styles are personal choices, but PureBasic's humble #PB_Any directive hides a very powerful dynamic object numbering system, which prevents inadvertent overlappings, especially in larger projects with multiple included files.

Re: My First Post - Hello

Posted: Fri Dec 05, 2025 6:06 pm
by mk-soft
For constants, FormDesigner uses Named Enumeration. For different form files, you also have to use different names for constants and variables to avoid conflicts. With constants, however, you can use virtual function tables for event management and indirectly call up the event procedures. In the case of variables, you have to query each one individually.

With my EventDesigner, the constants are extended with a prefix. Thus, there are no conflicts with the constants and event procedure are called to the virtual table.

Re: My First Post - Hello

Posted: Fri Dec 05, 2025 7:42 pm
by TI-994A
mk-soft wrote: Fri Dec 05, 2025 6:06 pmFor constants, FormDesigner uses Named Enumeration. For different form files, you also have to use different names for constants and variables to avoid conflicts.
For large multi-codebase projects, even named enumerations could pose a problem if the various enumerator labels don't align. And with #PB_Any, the uniqueness of the variable names cannot be guaranteed either, prefixed or not.

So, modules were born. :lol:

Re: My First Post - Hello

Posted: Fri Dec 05, 2025 9:59 pm
by chikega
Welcome - I've been playing with PureBasic on and off for the last 5 years but finally wrote a "real" application with it this year! 8)

Re: My First Post - Hello

Posted: Fri Dec 05, 2025 11:42 pm
by ChrisR
Welcome Mike, with your background, you'll quickly learn PureBasic and it's just amazing, and the more you use it, the more you'll like it.
As PureForm has been discussed, it's probably not the best tool to start with and unlock the full potential of PureBasic, it's a bit outdated, but with practice, it can do the job and it is multi-platform.
Apologies for this little ad but If you wish, you can try the demo version of my Designer (full-featured but limited to 16 Gadgets in demo). It is developed for Windows only but should work using Wine on Linux.

Re: My First Post - Hello

Posted: Sat Dec 06, 2025 1:06 pm
by Piero
MikeGreen99 wrote: Thu Dec 04, 2025 10:59 pm I use ubuntu unity.
I haven't used Windows for the past 15 years, and proud of it :D .
Maybe that's a bit too much… anyway: 👍👍👍 :mrgreen: