I've solved the problem now, and have implemented ActiveControl anyway, just in case. Thanks!
Background:
I wrote a program in Lazarus last year that had no issues with the tab order and I didn't use or even know about ActiveControl then, but for this current case I think I know what went wrong:
My program needs a configuration file to function, so I thought until it finds a valid one, I should disable the controls like buttons, list boxes and edit boxes. However, I chose not to do it in code at first, but to change them in the properties in Object Inspector instead, then enable it in code later. Afterwards, I added the control that was in focus at startup and forgot to disable it, so that's why it was in focus. I assume if a control is disabled, it will move to the first enabled one at startup?
Anyway, I've fixed all the bugs and it's now working.