Agree, Delphi was extremely nice way to do UI development.. I've made many small GUIs for everyday tasks back when I was using it.
Unfortunately "dependency hell" was very real -- it was super-easy to download ActiveX controls, install on the system, and then depend on them in the apps. Worse, Windows had a single ActiveX database per computer, and an control installed by a completely unrelated app would appear in the Delphi's palette, ready to be placed on a form. After having a few apps that would not work on friends' computers, I've mostly gave up on ActiveX components completely.. luckily third-party Delphi components were better - at least the compiled binaries would work. Source code still required system-wide install though...
If you think that "pip install", or "npm install", or even "apt-get install" on a Linux system is bad, you haven't seen what Delphi world was like. But to be fair, it's not really Delphi's fault - all Windows development was like that, full of bespoke settings that need to be set on each PC. For a complex software, it was normal to spend a few days just setting up the system so you can do initial build.
Another Delphi-specific issue was that by default forms were specified in pixels, and were hard-coded to specific font sizes; and color pickers had hardcoded colors (as opposed to system theme colors) prominently displayed. Unless you were very careful, it was very easy to make an app that could not handle different font or screen theme. And many apps that would benefit greatly from being resizable were non-resizeable instead, just because it was easier.
FWIW ActiveX specifically was really more so that Delphi is able to use the Visual Basic stuff than something native to Delphi. Components made for Delphi specifically are (usually) compiled as part of the final executable without needing ActiveX.
In fact AFAIK ActiveX support in Delphi was implemented by generating a wrapper component that converted the ActiveX control stuff to what Delphi "naturally" speaks.
For forms, even in Delphi 2 you can use the "align" property in several controls to automatically position them inside a container using the top, bottom, left, right and client area. The areas also stack so you can, e.g., position several controls at the top area and you'd get an effect similar to what a VBox container would provide in other toolkits. Though the initial versions of Delphi did not have this available everywhere, it was added to various controls over time.
Later versions also added "anchors" so that you can drag-drop stuff visually to the form but also have them resize automatically based on the parent's size. Lazarus (sort of open source Delphi-like IDE) extended this to allow anchoring stuff related to other control (so, e.g., you could have a button's right side a few pixels from another button's left side and that button's right side be a few pixels from the container's right side, or have a label be placed at the middle of an input box, or other stuff like that).
> And many apps that would benefit greatly from being resizable were non-resizeable instead, just because it was easier.
Maybe, but Delphi had anchor fields that you could use to make everything resize nicely.
The problem with that time period was that most applications were designed to not be resizeable, including most of the ones that came with Windows itself.
We still have that - some of the Windows programs right now can't be resized (Thinking specifically of dialogs and windows for device manager->driver details, or explorer->options).
This wasn't a Delphi problem at all; it was a Windows problem because that was the convention on Windows at the time.[1]
Native VCL components (which doesn't necessarily mean Delphi - could also be C++Builder) were always much more common in Delphi apps, from what I remember.
As far as COM and ActiveX, though, the ability to package them side by side in the app install folder and describe them using XML (in the app manifest) rather than registry has been around since WinXP.
Unfortunately "dependency hell" was very real -- it was super-easy to download ActiveX controls, install on the system, and then depend on them in the apps. Worse, Windows had a single ActiveX database per computer, and an control installed by a completely unrelated app would appear in the Delphi's palette, ready to be placed on a form. After having a few apps that would not work on friends' computers, I've mostly gave up on ActiveX components completely.. luckily third-party Delphi components were better - at least the compiled binaries would work. Source code still required system-wide install though...
If you think that "pip install", or "npm install", or even "apt-get install" on a Linux system is bad, you haven't seen what Delphi world was like. But to be fair, it's not really Delphi's fault - all Windows development was like that, full of bespoke settings that need to be set on each PC. For a complex software, it was normal to spend a few days just setting up the system so you can do initial build.
Another Delphi-specific issue was that by default forms were specified in pixels, and were hard-coded to specific font sizes; and color pickers had hardcoded colors (as opposed to system theme colors) prominently displayed. Unless you were very careful, it was very easy to make an app that could not handle different font or screen theme. And many apps that would benefit greatly from being resizable were non-resizeable instead, just because it was easier.