Release Notes
Releases are published on GitHub and on GetIt.
v.2.4 — October 2026
Bug fix release: interactive gestures of frames and forms shown by a stand work on Android. Existing code works as before.
Runtime
- Interactive gestures (
Touch.InteractiveGestures: Zoom, Pan, Rotate, DoubleTap, LongTap...) of the controls of frames and forms shown by a stand now work on Android. FMX registers them with the form reached through theOwnerchain, which a frame created by the stand (Create(nil)) does not have: the stand now registers them with the form that hosts it, every time the subject is shown, and gives them back when the subject is closed. Workarounds that callAddRecognizeron the form can be removed.
Tests
Tests.Gestures.pas: the gestures of frames and forms are registered with the hosting form once and given back exactly (New, Show, Hide, Close, HideAndClose, several frames, a host form freed before the subject).
Docs
FrameInfosandFormInfosdo not own the infos:ClearorRemoveon them drop the infos without freeing them. Migration tip in the v.2.1 notes: removeFrameInfos.ClearfromOnDestroy, the component frees the infos by itself. Same note in the components reference and in the agent skill.
AI
- Agent skill (plugin 1.0.2):
TAnimationis declared inFMX.Ani, notFMX.Types;FrameInfos.Clearis not needed.
v.2.3 — October 2026
Feature release: dialogs that return a result, Back/Esc, navigation stack, a gallery of ready-made stands, live responsive frames, an AI agent skill. Existing code works as before: nothing is removed, the new behaviors are opt-in.
Dialogs
- Dialog results:
ShowModal(AResultProc, AClose = True)on frame and form infos, with a result procedure that receives the result (and the frame or the form), and aModalResultproperty that dismisses the dialog. Dialogs hidden or closed without a result reportmrCancel. The Dialog demo uses them. - Back and Esc: with
CatchBackKeythe Back button of Android and the Esc key cancel the topmost dialog; other subjects opt in withBackKeyAction(baHide,baHideAndClose).HandleBackKeydoes the same from your ownOnKeyDown. The Dialog and ViewAndDialogs demos use it.
Navigation
- Navigation stack:
Push<T>,Pop,PopToRoot,StackCount,StackToponTFrameStandandTFormStand.PushModesays what happens to the page below (pmHide: hidden and kept, the default;pmKeepVisible;pmClose: created again byPop).StackOperationtellsOnBeforeStartAnimationwhether pages move forward or back. Back and Esc pop the stack. The Wizard demo uses it.
Responsive
- Live responsive: with
ResponsiveMode = rmLive, subjects created withNew/Pushare replaced when their parent moves to another breakpoint (resize, rotation), in the same info: references, the navigation stack and dialogs in progress keep working.OnResponsiveChangelets you copy the state to the new subject. The Responsive demo uses it. ShowModalwith a procedure that receives the frame or the form passes the one at the time of the result.
Stands
- Stand Gallery:
stands\Stands.Light.styleandstands\Stands.Dark.stylewith six ready-made stands (dialog,lightbox,bottomsheet,drawer,snackbar,page), and the Gallery demo. - Animation values from the size of the stand: a
TStyleTagin aTFloatAnimationsets its start and stop values from the size of the stand or of the animated element, and from the direction of the navigation stack (PopStartValue,PopStopValue). HideAndCloseAfter(ADelayMS)on the infos, for snackbars and toasts.
Setup
- The uninstaller also removes
stands,tmsbuild.yamlandversion.txt.
AI
- AI Agent Skill for TFrameStand and TFormStand in
Skills\tframestand-development, installable as a Claude Code plugin (/plugin marketplace add andrea-magni/TFrameStand) or withnpx skills add andrea-magni/TFrameStand.
Deprecations (nothing removed: existing code and forms work as before)
Show(ABackgroundTask, ...): the compiler warning now says what to use instead.StyleBookandDefaultStyleName(old names ofStandBookandDefaultStandName) are no longer shown in the Object Inspector. They still load from old forms, which the IDE saves with the new names. The demos use the new names.
Demos
- HelloWorld and Dialog find the units in
..\..\source, like the other demos, instead of relying on the library path of the IDE.
v.2.2 — October 2026
Packaging release: setup, TMS Smart Setup, one package folder per Delphi version, TFrameStand in the About box and splash screen of the IDE. No changes to the runtime units.
Installation
- Setup (
TFrameStand_2.2_Setup.exe, Inno Setup): builds and installs the packages in the RAD Studio versions you choose (10.4 to 13), definesTFRAMESTANDDIRand adds the source folder to the library path of every platform of the IDE. The setup attached to v.2.1 did not install anything (see below). - TMS Smart Setup support (
tmsbuild.yaml,version.txt). - TMS Smart Setup builds the runtime package for Linux64 too, when FMXLinux is installed (suggested by the Smart Setup maintainers).
IDE
- TFrameStand is listed in the About box of RAD Studio and on its splash screen, with its version and license (as MARS-Curiosity).
- The components are in the TFrameStand - Andrea Magni page of the Tool Palette (it was Andrea Magni).
- The design-time package is built for Win64 too and installed in the 64-bit IDE of RAD Studio 12.3 and later, by the setup and by TMS Smart Setup. The design-time units use fully qualified unit names (
System.Classes,Winapi.Windows).
Packages
- One folder per Delphi version (
packages\104Sydney,11Alexandria,12Athens,13Florence) with the same package names in all of them:FrameStandPackageanddclFrameStandPackage(before:FrameStandPackage_13,dclFrameStandPackage_13, ...). Remove the old design-time package before installing the new one; projects built with runtime packages must listFrameStandPackage. - The packages for Delphi 11.0 are removed:
11Alexandrianeeds 11.1 or later. - Compiled units go to
lib\<folder>\dcu\<platform>\<config>, BPL and DCP files to the default folders of the IDE: the packages of different Delphi versions and platforms, built by hand or by the setup, no longer overwrite each other (before, every version sharedlib\dcu, and Win32 and Win64 sharedlib\bplandlib\dcp). The C++ headers once committed inlib\cppare removed (they are generated by the build). - The package groups have a build group (Release; runtime package for Win32 and Win64, design-time package for Win32): the setup builds what it lists. The v.2.1 setup stopped at the start with "no RAD Studio version available" because the groups had none.
v.2.1 — October 2026
Delphi 10.4 Sydney is now the minimum version. The packages for XE8 to 10.3 are removed, together with the code for the ARC compilers (Android and iOS up to 10.3), which could no longer be tested. Delphi 10.3 users can stay on v.2.0.1.
Quality
TFrameStandandTFormStandshare their implementation through a generic base class,TSubjectStandBase<S, I>(about 140 duplicated lines removed). Public API unchanged; for descendants, the protected fieldsFFrameInfos/FFormInfosare nowFInfos, andCloseAll,CloseAllExcept,HideAndCloseAll,HideAndCloseAllExceptare implemented once inTSubjectStand.- A DUnitX test suite (
tests\, 54 tests) and a build script (build.cmd) that builds packages, demos and tests for a Delphi version and runs the tests. See Building & Testing.
Runtime
- Hide and close delays use the FMX platform timer instead of a background thread per call; pending hides and closes are cancelled when the subject is closed or the component is destroyed, so their callbacks never run on freed objects.
TDelayedAction.Schedulereturns a cancellableIDelayedAction. HideAndClosecalled while aHide(or anotherHideAndClose) is in progress now closes the subject when it completes; before, the close was silently dropped.- Lifecycle methods (
[BeforeShow],[Show],[AfterShow],[Hide]) accept[FrameInfo],[FrameStand],[FormInfo]and[FormStand]parameters, like fields. Injection problems raise anESubjectStandErrornaming the field or parameter, when the subject is created (before: "Parameter count mismatch" or "Invalid class typecast", atShow). - Freeing a form, or a parent, with subjects still on screen no longer crashes: the components watch their stands and subjects (
FreeNotification) and forget those destroyed by FMX or by the application. The same for adopted frames or forms freed while shown. Forms created withNeware now freed with their owner (they leaked), and a component destroyed while its stands live on another form removes them. - Common Actions: the actions matching a control run in registration order (it was the random order of a dictionary);
CommonActions.Addwith a pattern already registered replaces its action instead of raising "Duplicates not allowed"; when an action closes the subject, the following ones are not run on the freed info. StandBook,CommonActionListandDefaultParentcan live on another form or a data module: they are cleared when that component is freed (before, the nextNewused a freed object).- 3D parents (
TLayer3D,TForm3D) and owners that are not FMX objects:Newno longer fails with "cannot determine parent Width" when there are no responsive definitions; responsive lookups on 3D layers use the pixel width of their 2D content; a missing parent raises a clearESubjectStandError(before:EInvalidCast, or a stand silently left without parent byUse). TFormStand: closing an adopted form without controls no longer raises an assertion, and an adopted form gets back all its controls (about half of them were freed with the stand).
Migrating to 2.1
Code written for v.1.x may call FrameInfos.Clear (FormInfos.Clear) in the OnDestroy of its forms: remove it. Since v.2.1 the component forgets the subjects destroyed by FMX and frees their infos by itself. FrameInfos does not own the infos: Clear only drops them from the dictionary, and they leak (ReportMemoryLeaksOnShutdown lists TFrameInfo<...>, TLifeGuard and some lists for each subject).
v.2.0.1 — October 2026
Maintenance release: packages, demos and a few runtime fixes. No API changes.
Packages
- Runtime packages build again for every platform: the
-LUDesignIDEswitch is gone from them, it made Android, iOS and macOS builds fail with "Required package 'DesignIDE' not found" (#90). - Design-time packages:
{$DESIGNONLY ON}(the #92 fix had been lost for Delphi 13),designidein therequiresclause, each project references only the runtime package of its own version (#91, #92, #94). - Consistent CRLF line endings in the source archives (#88).
Runtime
- Responsive: the stand name and the parent of a matching definition are applied even when it is not the last definition.
- Responsive: breakpoints no longer depend on the order of the list (
SetBreakpointused to breakCurrentBreakpoint). TBreakpointtext format is locale-independent ('xs (768.00)').VisibleFrames/VisibleFormskeep the Show/Hide history correctly:Hidetakes back the most recentShowof the subject (it used to remove the oldest entry, soLastShownFrame/LastShownFormcould return a hidden subject) andCloseremoves every entry of the subject.- The deprecated
StyleBookandDefaultStyleNameproperties are no longer written to the.fmxfiles (still read). DeviceAndPlatformInforeturns zeroed fields when the device information is not available.
Demos
Dialogcompiles again (#84);HelloWorldcalls its[BeforeShow]method; both are now inAllDemosProjectGroup.
Documentation
- New documentation site: https://andrea-magni.github.io/TFrameStand/.
v.2.0 — March 2026
- Delphi 13 Florence support (
packages\FrameStand_13.groupproj).
v.1.9 — November 2023
- Delphi 12 Athens support.
- Non-generic overloads
TFrameStand.New(AFrameClassName)andTFrameStand.Use(AFrame)(#71), useful when the frame class is known only at runtime.
v.1.8 — March 2022
- Delphi 11.1 Alexandria support.
- Reworked
Responsivedemo.
v.1.7 — November 2021
- Delphi 11 Alexandria support; all the demos upgraded.
- Gaussian blur in the
lightboxdemo.
v.1.6 — May 2020
- Delphi 10.4 Sydney support.
v.1.5 — October 2019
- TFormStand: the twin of TFrameStand that uses
TFormdescendants as subjects, sharing the engine through the newSubjectStandunit. - New methods:
CloseAll,CloseAllExcept,HideAndClose,HideAndCloseAll,HideAndCloseAllExcept,FrameInfooverloads. Show(ABackgroundTask, ...)deprecated: background work is now left to the application (see Background Work).- Separate runtime and design-time packages for 10.3 Rio.
Migrating to 1.5
Some attributes moved to the SubjectStand unit: add it to the uses clause wherever you use FrameStand.
v.1.4 — November 2018
OnAfterShowevent.VisibleFramesproperty.- Responsive capabilities (breakpoints and frame substitution).
- Packages for 10.3 Rio.
v.1.3 — April 2017
OnAfterHideevent.- Common Actions bound to every
TControldescendant. - Packages for 10.2 Tokyo.
v.1.2 — October 2016
Statusproperty.- Workaround for an FMX alignment issue in 10.1 Berlin (#12).
- Packages for Seattle, Berlin and XE8.
v.1.1 — November 2015
- Improved component editor.
Hidingproperty; multipleHidecalls ignored while hiding.- Hide delay computed automatically from the
OnHide*animations. TActionListsupport for Common Actions.DefaultParentproperty.- Fix: the search of the controls to bind to Common Actions was not recursive.
v.1.0 — November 2015
First release, presented at CodeRage X.
