I was looking at the Stackoverflow question - Program both as Console and GUI and noted that there wasn't an example for Delphi, so I created the following.
program TestConsoleGUI; {$APPTYPE GUI} {$R *.res} uses System.SysUtils, VCL.Forms, Winapi.Windows, TestUnit in 'TestUnit.pas' {Form1}; function AttachConsole(const dwProcessId: THandle): BOOL; stdcall; external kernel32 name 'AttachConsole'; var bFreeConsole: Boolean; begin if ParamCount = 0 then try { TODO -oUser -cConsole Main : Insert code here } Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); Application.Run; except on E: Exception do ; // Handle exception here end else begin bFreeConsole := False; if ParamStr(1) = '/CONSOLE' then bFreeConsole := AttachConsole(THandle(-1)) or AllocConsole; try WriteLn('Hello world'); finally if bFreeConsole then FreeConsole; end; end; end.
In 2017, with the release of Delphi 10.2 Tokyo, Embarcadero introduced a specialized implementation of the Observer pattern into the System.Classes unit. While it has been in the wild for 9 years, it remains a "hidden" architecture for many, primarily because it serves as the invisible engine behind LiveBindings. Other than live bindings, you can also use the Observer pattern as a way to update component settings to the Windows registry, an .ini file, or persist it elsewhere.
System.Classes