diff --git a/.gitignore b/.gitignore index 0845947..5c5b468 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ Examples/SlidingButtonsFMX/Android/ Examples/SlidingButtonsFMX/OSX32/ Examples/AnimatedAlignFMX/Android/ Examples/AnimatedAlignFMX/OSX32/ +*.res +DevResources diff --git a/AQPControlAnimations.pas b/AQPControlAnimations.pas index f9d7984..7e19c27 100644 --- a/AQPControlAnimations.pas +++ b/AQPControlAnimations.pas @@ -195,19 +195,41 @@ function TAQPControlAnimations.BoundsAnimation( EachF: TEachFunction; PrevLeft, PrevTop, PrevWidth, PrevHeight: Integer; OC: TControl absolute O; + OFM: TForm absolute O; begin Result := True; - PrevLeft := {$IFDEF FMX}Round(OC.Position.X){$ELSE}OC.Left{$ENDIF}; - PrevTop := {$IFDEF FMX}Round(OC.Position.Y){$ELSE}OC.Top{$ENDIF}; - PrevWidth := {$IFDEF FMX}Round(OC.Width){$ELSE}OC.Width{$ENDIF}; - PrevHeight := {$IFDEF FMX}Round(OC.Height){$ELSE}OC.Height{$ENDIF}; + {$IFDEF FMX} + if O is TControl then + begin + PrevLeft:=Round(OC.Position.X); + PrevTop:=Round(OC.Position.Y); + PrevWidth:=Round(OC.Width); + PrevHeight:=Round(OC.Height); + end; + if O is TForm then + begin + PrevLeft:=Round(OFM.Left); + PrevTop:=Round(OFM.Top); + PrevWidth:=Round(OFM.Width); + PrevHeight:=Round(OFM.Height); + end; + {$ELSE} + PrevLeft:=OC.Left; + PrevTop:=OC.Top; + PrevWidth:=OC.Width; + PrevHeight:=OC.Height; + {$ENDIF} // Check, whether the bounds would be changed and quickly exit, if they don't if not ( - (O is TControl) and + {$IFDEF FMX} + ((O is TControl) or (O is TForm)) + {$ELSE} + (O is TControl) + {$ENDIF} and ( (NewLeft <> PrevLeft) or (NewTop <> PrevTop) or @@ -222,6 +244,7 @@ function TAQPControlAnimations.BoundsAnimation( Progress: Real; AniLeft, AniTop, AniWidth, AniHeight: Integer; OOC: TControl absolute O; + OOF: TForm absolute O; begin Result := True; Progress := AQ.CurrentInterval.Progress; @@ -231,13 +254,33 @@ function TAQPControlAnimations.BoundsAnimation( if NewWidth >= 0 then AniWidth := TAQ.EaseInteger(PrevWidth, NewWidth, Progress, EaseFunction) else - AniWidth := {$IFDEF FMX}Round({$ENDIF}OOC.Width{$IFDEF FMX}){$ENDIF}; + begin + {$IFDEF FMX} + if (O is TControl) then + AniWidth:=Round(OOC.Width); + if (O is TForm) then + AniWidth:=Round(OOF.Width); + {$ELSE} + AniWidth:=OOC.Width; + {$ENDIF} + end; if NewHeight >= 0 then AniHeight := TAQ.EaseInteger(PrevHeight, NewHeight, Progress, EaseFunction) else - AniHeight := {$IFDEF FMX}Round({$ENDIF}OOC.Height{$IFDEF FMX}){$ENDIF}; - - OOC.SetBounds(AniLeft, AniTop, AniWidth, AniHeight); + begin + {$IFDEF FMX} + if (O is TControl) then + AniHeight:=Round(OOC.Height); + if (O is TForm) then + AniHeight:=Round(OOF.Height); + {$ELSE} + AniHeight:=OOC.Height; + {$ENDIF} + end; + if (O is TControl) then + OOC.SetBounds(AniLeft, AniTop, AniWidth, AniHeight); + if (O is TForm) then + OOF.SetBounds(AniLeft, AniTop, AniWidth, AniHeight); if Progress = 1 then begin diff --git a/AnyiQuack.pas b/AnyiQuack.pas index 18e806d..c9dfafd 100644 --- a/AnyiQuack.pas +++ b/AnyiQuack.pas @@ -393,7 +393,8 @@ TAQ = class sealed (TAQBase) function SliceChain(StartIndex: Integer; Count: Integer = 0): TAQ; - function DebugMessage(HeadMessage: String = ''; Caption: String = ''): TAQ; + function DebugMessage(const HeadMessage: String = ''; Caption: String = ''): + TAQ; function Plugin: T; @@ -1086,7 +1087,8 @@ function TAQ.CustomFiller(const Filler: TEachFunction; Append, Recurse: Boolean) Result := TargetAQ; end; -function TAQ.DebugMessage(HeadMessage: String = ''; Caption: String = ''): TAQ; +function TAQ.DebugMessage(const HeadMessage: String = ''; Caption: String + = ''): TAQ; {$IFDEF DEBUG} var ChainPath: TStringList; @@ -2470,7 +2472,7 @@ class function TAQ.Take(Objects: TObjectList): TAQ; class function TAQ.Take(Objects: TObjectList): TAQ; var - cc: Integer; + cc: integer; {$IFDEF RetakeFromGC} AQMatch: TAQ; ObjectsCount: Integer; diff --git a/Examples/AnimatedAlign/AnimatedAlign.dproj b/Examples/AnimatedAlign/AnimatedAlign.dproj index b9ca8c2..9034fd6 100644 --- a/Examples/AnimatedAlign/AnimatedAlign.dproj +++ b/Examples/AnimatedAlign/AnimatedAlign.dproj @@ -1,7 +1,7 @@  {BFC45E17-ABB7-4875-B30A-D3C77CBC0C2D} - 18.7 + 19.0 AnimatedAlign.dpr Release DCC32 @@ -187,12 +187,20 @@ classes 1 + + classes + 1 + res\xml 1 + + res\xml + 1 + @@ -205,138 +213,242 @@ library\lib\armeabi 1 + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + library\lib\mips 1 + + library\lib\mips + 1 + library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + res\drawable 1 + + res\drawable + 1 + res\values 1 + + res\values + 1 + res\values-v21 1 + + res\values-v21 + 1 + res\values 1 + + res\values + 1 + res\drawable 1 + + res\drawable + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-ldpi 1 + + res\drawable-ldpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-xxxhdpi 1 + + res\drawable-xxxhdpi + 1 + res\drawable-small 1 + + res\drawable-small + 1 + res\drawable-normal 1 + + res\drawable-normal + 1 + res\drawable-large 1 + + res\drawable-large + 1 + res\drawable-xlarge 1 + + res\drawable-xlarge + 1 + res\values 1 + + res\values + 1 + @@ -425,6 +537,9 @@ 0 + + 0 + 0 @@ -578,6 +693,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -600,6 +725,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -699,6 +834,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -710,6 +855,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -754,10 +909,33 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 + + 1 + @@ -798,6 +976,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + 1 @@ -850,6 +1038,10 @@ library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + 1 @@ -874,6 +1066,12 @@ 0 + + + library\lib\armeabi-v7a + 1 + + 1 @@ -911,6 +1109,7 @@ + 12 diff --git a/Examples/AnimatedAlign/AnimatedAlign.res b/Examples/AnimatedAlign/AnimatedAlign.res deleted file mode 100644 index f1bbbfc..0000000 Binary files a/Examples/AnimatedAlign/AnimatedAlign.res and /dev/null differ diff --git a/Examples/AnimatedAlignFMX/AnimatedAlignFMX.dproj b/Examples/AnimatedAlignFMX/AnimatedAlignFMX.dproj index 391ad83..49152d8 100644 --- a/Examples/AnimatedAlignFMX/AnimatedAlignFMX.dproj +++ b/Examples/AnimatedAlignFMX/AnimatedAlignFMX.dproj @@ -1,13 +1,13 @@  {404E4C8B-78FE-49F1-8DB3-502D51C5EAF9} - 18.7 + 19.0 FMX AnimatedAlignFMX.dpr True Debug Android - 5215 + 37915 Application @@ -18,8 +18,8 @@ Base true - - true + + true Base true @@ -33,11 +33,6 @@ Base true - - true - Base - true - true Base @@ -88,7 +83,7 @@ true - FMX;$(DCC_Define) + FMX;$(DCC_Define) .\$(Platform)\$(Config) .\$(Platform)\$(Config) false @@ -130,67 +125,33 @@ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;TMSScripter;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;fmx;FireDACIBDriver;RDesignUX;dbexpress;IndyCore;xdata;RDesignChart;dsnap;FireDACCommon;RESTBackendComponents;soapserver;TMSLoggingPkgFMXDXE12;bindengine;CloudService;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;sparkle;tmsbcl;IndySystem;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;TMSLoggingPkgCoreDXE12;dbxcds;aurelius;dsnapxml;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE12;fmxase;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false - iPhoneAndiPad - true + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_320x480.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x960.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x1136.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_750x1334.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_828x1792.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1125x2436.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1136x640.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2208.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2688.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1334x750.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1792x828.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2208x1242.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2436x1125.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2688x1242.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1004.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x748.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2008.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1668x2224.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1668x2388.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1496.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_2048x2732.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2224x1668.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2388x1668.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2732x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + true + true + Base + true + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;TMSScripter;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;fmx;FireDACIBDriver;RDesignUX;dbexpress;IndyCore;xdata;RDesignChart;dsnap;FireDACCommon;RESTBackendComponents;soapserver;TMSLoggingPkgFMXDXE12;bindengine;CloudService;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;sparkle;tmsbcl;IndySystem;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;TMSLoggingPkgCoreDXE12;dbxcds;aurelius;dsnapxml;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE12;$(DCC_UsePackage);$(DCC_UsePackage) + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;TMSScripter;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;fmx;FireDACIBDriver;RDesignUX;dbexpress;IndyCore;xdata;RDesignChart;dsnap;FireDACCommon;RESTBackendComponents;soapserver;TMSLoggingPkgFMXDXE12;bindengine;CloudService;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;sparkle;tmsbcl;IndySystem;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;TMSLoggingPkgCoreDXE12;dbxcds;TMSFMXPackPkgDXE12;aurelius;dsnapxml;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE12;fmxase;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true Debug @@ -245,10 +206,16 @@ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;TMSScripter;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;fmx;FireDACIBDriver;dbexpress;IndyCore;xdata;dsnap;FireDACCommon;RESTBackendComponents;soapserver;TMSLoggingPkgFMXDXE12;bindengine;CloudService;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;sparkle;tmsbcl;IndySystem;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;TMSLoggingPkgCoreDXE12;dbxcds;aurelius;dsnapxml;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE12;fmxase;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png @@ -301,16 +268,17 @@ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png - - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;TMSScripter;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;inetdb;fmx;FireDACIBDriver;fmxdae;RDesignUX;dbexpress;IndyCore;xdata;RDesignChart;dsnap;FireDACCommon;RESTBackendComponents;soapserver;TMSLoggingPkgFMXDXE12;bindengine;DBXMySQLDriver;CloudService;FireDACMySQLDriver;FireDACCommonODBC;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;sparkle;tmsbcl;IndySystem;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;fmxobj;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;TMSLoggingPkgCoreDXE12;dbxcds;aurelius;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;FMXTMSFNCChartPkgDXE12;fmxase;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts - Debug - true + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png + 10.0 DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;bindcompfmx;inetdb;fmx;FireDACIBDriver;fmxdae;dbexpress;IndyCore;dsnap;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACMySQLDriver;FireDACCommonODBC;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;fmxobj;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;fmxase;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers Debug true @@ -630,12 +598,20 @@ classes 1 + + classes + 1 + res\xml 1 + + res\xml + 1 + @@ -648,138 +624,242 @@ library\lib\armeabi 1 + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + library\lib\mips 1 + + library\lib\mips + 1 + library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + res\drawable 1 + + res\drawable + 1 + res\values 1 + + res\values + 1 + res\values-v21 1 + + res\values-v21 + 1 + res\values 1 + + res\values + 1 + res\drawable 1 + + res\drawable + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-ldpi 1 + + res\drawable-ldpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-xxxhdpi 1 + + res\drawable-xxxhdpi + 1 + res\drawable-small 1 + + res\drawable-small + 1 + res\drawable-normal 1 + + res\drawable-normal + 1 + res\drawable-large 1 + + res\drawable-large + 1 + res\drawable-xlarge 1 + + res\drawable-xlarge + 1 + res\values 1 + + res\values + 1 + @@ -868,6 +948,9 @@ 0 + + 0 + 0 @@ -988,6 +1071,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -999,6 +1092,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -1098,6 +1201,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -1109,6 +1222,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -1153,10 +1276,33 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 + + 1 + @@ -1197,6 +1343,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + 1 @@ -1249,6 +1405,10 @@ library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + 1 @@ -1273,6 +1433,12 @@ 0 + + + library\lib\armeabi-v7a + 1 + + 1 @@ -1310,13 +1476,13 @@ + True - True + True True True - True True True True diff --git a/Examples/CustomPlugin/CustomPlugin.dproj b/Examples/CustomPlugin/CustomPlugin.dproj index b3efafd..6fd20dd 100644 --- a/Examples/CustomPlugin/CustomPlugin.dproj +++ b/Examples/CustomPlugin/CustomPlugin.dproj @@ -1,7 +1,7 @@  {037C823E-E913-459C-BBE0-F29EA35721C3} - 18.7 + 19.0 CustomPlugin.dpr Release DCC32 @@ -57,7 +57,7 @@ CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) diff --git a/Examples/CustomPlugin/CustomPlugin.res b/Examples/CustomPlugin/CustomPlugin.res deleted file mode 100644 index 2448e27..0000000 Binary files a/Examples/CustomPlugin/CustomPlugin.res and /dev/null differ diff --git a/Examples/EasingSuite/EasingSuite.dproj b/Examples/EasingSuite/EasingSuite.dproj index 9b24d22..8324e7e 100644 --- a/Examples/EasingSuite/EasingSuite.dproj +++ b/Examples/EasingSuite/EasingSuite.dproj @@ -1,7 +1,7 @@  {1F86A073-B563-48C5-834B-483E4772D426} - 18.7 + 19.0 EasingSuite.dpr Release DCC32 @@ -57,7 +57,7 @@ CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) diff --git a/Examples/EasingSuite/EasingSuite.res b/Examples/EasingSuite/EasingSuite.res deleted file mode 100644 index 2448e27..0000000 Binary files a/Examples/EasingSuite/EasingSuite.res and /dev/null differ diff --git a/Examples/Examples.groupproj b/Examples/Examples.groupproj index 5c2cb17..b52c9d6 100644 --- a/Examples/Examples.groupproj +++ b/Examples/Examples.groupproj @@ -33,6 +33,9 @@ + + + @@ -134,6 +137,15 @@ + + + + + + + + + @@ -144,13 +156,13 @@ - + - + - + diff --git a/Examples/MethodTests/MethodTests.dproj b/Examples/MethodTests/MethodTests.dproj index b4ccdbd..163edad 100644 --- a/Examples/MethodTests/MethodTests.dproj +++ b/Examples/MethodTests/MethodTests.dproj @@ -1,7 +1,7 @@  {90334759-5D7D-4227-89A7-3D506A42C2A6} - 18.7 + 19.0 MethodTests.dpr Debug DCC32 @@ -57,7 +57,7 @@ CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) diff --git a/Examples/MethodTests/MethodTests.res b/Examples/MethodTests/MethodTests.res deleted file mode 100644 index 2448e27..0000000 Binary files a/Examples/MethodTests/MethodTests.res and /dev/null differ diff --git a/Examples/NotificationWindows/Main.dfm b/Examples/NotificationWindows/Main.dfm index 8733ebf..888204d 100644 --- a/Examples/NotificationWindows/Main.dfm +++ b/Examples/NotificationWindows/Main.dfm @@ -2,8 +2,8 @@ object MainForm: TMainForm Left = 0 Top = 0 Caption = 'NotificationWindows test' - ClientHeight = 148 - ClientWidth = 169 + ClientHeight = 530 + ClientWidth = 683 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -18,7 +18,7 @@ object MainForm: TMainForm TextHeight = 13 object AddButton: TButton Left = 8 - Top = 54 + Top = 206 Width = 153 Height = 49 Caption = 'Add notify window' @@ -47,7 +47,7 @@ object MainForm: TMainForm end object CloseAllButton: TButton Left = 86 - Top = 109 + Top = 261 Width = 75 Height = 25 Cancel = True @@ -57,13 +57,25 @@ object MainForm: TMainForm end object CloseLastButton: TButton Left = 8 - Top = 109 + Top = 261 Width = 75 Height = 25 Caption = 'Close last' TabOrder = 4 OnClick = CloseLastButtonClick end + object RadioGroup1: TRadioGroup + Left = 8 + Top = 72 + Width = 153 + Height = 105 + Caption = 'Positioning' + ItemIndex = 0 + Items.Strings = ( + 'Main Screen' + 'Application') + TabOrder = 5 + end object Timer1: TTimer Enabled = False OnTimer = Timer1Timer diff --git a/Examples/NotificationWindows/Main.pas b/Examples/NotificationWindows/Main.pas index ff025df..99c6321 100644 --- a/Examples/NotificationWindows/Main.pas +++ b/Examples/NotificationWindows/Main.pas @@ -12,8 +12,9 @@ interface Vcl.StdCtrls, Vcl.ExtCtrls, - NotificationWindows, - MyNotificationWindow; + Notifications.Base.VCL, + MyNotificationWindow, + Notifications.Manager; type TMainForm = class(TForm) @@ -23,6 +24,7 @@ TMainForm = class(TForm) Timer1: TTimer; CloseAllButton: TButton; CloseLastButton: TButton; + RadioGroup1: TRadioGroup; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure AddButtonClick(Sender: TObject); @@ -31,7 +33,7 @@ TMainForm = class(TForm) procedure CloseAllButtonClick(Sender: TObject); procedure CloseLastButtonClick(Sender: TObject); private - FStack: TNotificationStack; + FManager: TNotificationManager; FLastNotificationWindow: TNotificationWindow; end; @@ -44,18 +46,22 @@ implementation procedure TMainForm.AddButtonClick(Sender: TObject); var - MNW: TMyNotificationWindow; + MNW: TMyNotificationWindowVCL; begin - MNW := TMyNotificationWindow.Create(nil); + MNW := TMyNotificationWindowVCL.Create(nil); if AutoCloseCheckBox.Checked then MNW.CloseTimeout := 5000; FLastNotificationWindow := MNW; - FStack.Add(MNW); + if RadioGroup1.ItemIndex = 0 then + FManager.Parent:=npMainScreen; + if RadioGroup1.ItemIndex = 1 then + FManager.Parent:=npApplication; + FManager.Add(MNW); end; procedure TMainForm.CloseAllButtonClick(Sender: TObject); begin - FStack.CloseAll; + FManager.CloseAll; end; procedure TMainForm.CloseLastButtonClick(Sender: TObject); @@ -63,10 +69,10 @@ procedure TMainForm.CloseLastButtonClick(Sender: TObject); Target: TNotificationWindow; begin Target := FLastNotificationWindow; - if (FStack.List.Count > 0) and not FStack.List.Contains(Target) then - Target := FStack.List.Last; + if (FManager.List.Count > 0) and not FManager.List.Contains(Target) then + Target := FManager.List.Last; - FStack.Close(Target); + FManager.Close(Target); end; procedure TMainForm.AutoCreateCheckBoxClick(Sender: TObject); @@ -76,12 +82,12 @@ procedure TMainForm.AutoCreateCheckBoxClick(Sender: TObject); procedure TMainForm.FormCreate(Sender:TObject); begin - FStack := TNotificationStack.Create; + FManager := TNotificationManager.Create; end; procedure TMainForm.FormDestroy(Sender: TObject); begin - FStack.Free; + FManager.Free; end; procedure TMainForm.Timer1Timer(Sender: TObject); diff --git a/Examples/NotificationWindows/MyNotificationWindow.dfm b/Examples/NotificationWindows/MyNotificationWindow.dfm index 8d26cc1..a52d553 100644 --- a/Examples/NotificationWindows/MyNotificationWindow.dfm +++ b/Examples/NotificationWindows/MyNotificationWindow.dfm @@ -1,8 +1,9 @@ -inherited MyNotificationWindow: TMyNotificationWindow +inherited MyNotificationWindowVCL: TMyNotificationWindowVCL Caption = 'My custom derived notification window' ClientHeight = 119 + CustomTitleBar.Height = 0 GlassFrame.Top = 0 - ExplicitHeight = 143 + ExplicitHeight = 148 PixelsPerInch = 96 TextHeight = 13 object MainLabel: TLabel @@ -23,8 +24,6 @@ inherited MyNotificationWindow: TMyNotificationWindow ParentFont = False ShowAccelChar = False Layout = tlCenter - ExplicitLeft = 0 - ExplicitTop = 0 ExplicitWidth = 216 ExplicitHeight = 16 end diff --git a/Examples/NotificationWindows/MyNotificationWindow.pas b/Examples/NotificationWindows/MyNotificationWindow.pas index 8603728..c9b68cd 100644 --- a/Examples/NotificationWindows/MyNotificationWindow.pas +++ b/Examples/NotificationWindows/MyNotificationWindow.pas @@ -3,37 +3,32 @@ interface uses - Winapi.Windows, - Winapi.Messages, - System.SysUtils, - System.Variants, - System.Classes, - Vcl.Graphics, - Vcl.Controls, - Vcl.Forms, - Vcl.Dialogs, - Vcl.StdCtrls, - Vcl.ComCtrls, - - NotificationWindows, - AnyiQuack; + Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, + System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, + Notifications.Base.VCL, Vcl.ComCtrls, Vcl.StdCtrls; type - TMyNotificationWindow = class(TNotificationWindow) - MainLabel: TLabel; - MainActionButton: TButton; + TMyNotificationWindowVCL = class(TNotificationWindowVCL) ProgressBar: TProgressBar; + MainActionButton: TButton; + MainLabel: TLabel; procedure MainActionButtonClick(Sender: TObject); - + private + { Private declarations } protected function AutoClosePossible: Boolean; override; + public + { Public declarations } end; implementation +uses + AnyiQuack; + {$R *.dfm} -function TMyNotificationWindow.AutoClosePossible: Boolean; +function TMyNotificationWindowVCL.AutoClosePossible: Boolean; begin if ProgressBar.Visible and (ProgressBar.Position < ProgressBar.Max) then Result := False @@ -41,7 +36,7 @@ function TMyNotificationWindow.AutoClosePossible: Boolean; Result := inherited AutoClosePossible; end; -procedure TMyNotificationWindow.MainActionButtonClick(Sender: TObject); +procedure TMyNotificationWindowVCL.MainActionButtonClick(Sender: TObject); begin MainActionButton.Enabled := False; ProgressBar.Visible := True; @@ -69,7 +64,6 @@ procedure TMyNotificationWindow.MainActionButtonClick(Sender: TObject); end; Result := True; end); - end; end. diff --git a/Examples/NotificationWindows/NotificationExample.dpr b/Examples/NotificationWindows/NotificationExample.dpr index 2f0fc28..0bf4b4b 100644 --- a/Examples/NotificationWindows/NotificationExample.dpr +++ b/Examples/NotificationWindows/NotificationExample.dpr @@ -2,11 +2,12 @@ program NotificationExample; uses Forms, - Main in 'Main.pas' {MainForm}, AnyiQuack in '..\..\AnyiQuack.pas', AQPControlAnimations in '..\..\AQPControlAnimations.pas', - NotificationWindows in '..\..\NotificationWindowsFramework\NotificationWindows.pas' {NotificationWindow}, - MyNotificationWindow in 'MyNotificationWindow.pas' {NotificationWindow1}; + Notifications.Base.VCL in '..\..\NotificationFramework\Notifications.Base.VCL.pas' {NotificationWindowVCL}, + Notifications.Manager in '..\..\NotificationFramework\Notifications.Manager.pas', + Main in 'Main.pas' {MainForm}, + MyNotificationWindow in 'MyNotificationWindow.pas' {MyNotificationWindowVCL}; {$R *.res} diff --git a/Examples/NotificationWindows/NotificationExample.dproj b/Examples/NotificationWindows/NotificationExample.dproj index 4e03c80..31daf57 100644 --- a/Examples/NotificationWindows/NotificationExample.dproj +++ b/Examples/NotificationWindows/NotificationExample.dproj @@ -2,9 +2,9 @@ {F00B9248-0ED4-4BFA-BFCE-D1A4BB8CECEF} NotificationExample.dpr - 18.7 + 19.0 True - Release + Debug Application VCL DCC32 @@ -58,6 +58,9 @@ false false false + ..\..\Builds\NotificationExample\$(Platform).$(Config)\dcp + ..\..\Builds\NotificationExample\$(Platform).$(Config)\dcu + ..\..\Builds\NotificationExample\$(Platform).$(Config) true @@ -84,6 +87,10 @@ true PerMonitor + true + 1033 + $(BDS)\bin\delphi_PROJECTICON.ico + Debug false @@ -103,16 +110,20 @@ MainSource - -
MainForm
-
- -
NotificationWindow
+ +
NotificationWindowVCL
+ dfm +
+ + +
MainForm
+ dfm
-
NotificationWindow1
+
MyNotificationWindowVCL
+ dfm
Cfg_2 @@ -164,15 +175,662 @@ NotificationExample.dpr - Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver - Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components True False + + + + NotificationExample.exe + true + + + + + NotificationExample.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + 12 +
diff --git a/Examples/NotificationWindows/NotificationExample.res b/Examples/NotificationWindows/NotificationExample.res deleted file mode 100644 index 5b80890..0000000 Binary files a/Examples/NotificationWindows/NotificationExample.res and /dev/null differ diff --git a/Examples/NotificationWindowsFMX/Main.fmx b/Examples/NotificationWindowsFMX/Main.fmx new file mode 100644 index 0000000..8dcd0c7 --- /dev/null +++ b/Examples/NotificationWindowsFMX/Main.fmx @@ -0,0 +1,125 @@ +object FormMain: TFormMain + Left = 0 + Top = 0 + Caption = 'Main' + ClientHeight = 589 + ClientWidth = 926 + Position = DesktopCenter + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + OnCreate = FormCreate + OnDestroy = FormDestroy + DesignerMasterStyle = 0 + object Label1: TLabel + Align = Top + StyledSettings = [Family, FontColor] + Margins.Left = 20.000000000000000000 + Margins.Top = 5.000000000000000000 + Margins.Right = 20.000000000000000000 + Margins.Bottom = 5.000000000000000000 + Position.X = 20.000000000000000000 + Position.Y = 5.000000000000000000 + Size.Width = 886.000000000000000000 + Size.Height = 33.000000000000000000 + Size.PlatformDefault = False + TextSettings.Font.Size = 16.000000000000000000 + TextSettings.Font.StyleExt = {00070000000000000004000000} + TextSettings.HorzAlign = Center + Text = 'Notification Windows' + end + object cbAutoCloseAfter5: TCheckBox + StyledSettings = [Family, Style, FontColor] + IsChecked = True + Margins.Left = 20.000000000000000000 + Margins.Right = 20.000000000000000000 + Margins.Bottom = 10.000000000000000000 + Position.X = 20.000000000000000000 + Position.Y = 43.000000000000000000 + Size.Width = 254.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + Text = 'Auto close after 5 sec.' + TextSettings.Font.Size = 14.000000000000000000 + end + object cbAutoCreateEverySec: TCheckBox + StyledSettings = [Family, Style, FontColor] + Margins.Left = 20.000000000000000000 + Margins.Right = 20.000000000000000000 + Margins.Bottom = 10.000000000000000000 + Position.X = 20.000000000000000000 + Position.Y = 72.000000000000000000 + Size.Width = 254.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + Text = 'Auto create each second' + TextSettings.Font.Size = 14.000000000000000000 + OnClick = cbAutoCreateEverySecClick + end + object btnAdd: TButton + StyledSettings = [Family, Style, FontColor] + Margins.Left = 20.000000000000000000 + Margins.Right = 20.000000000000000000 + Position.X = 20.000000000000000000 + Position.Y = 181.000000000000000000 + Size.Width = 254.000000000000000000 + Size.Height = 76.000000000000000000 + Size.PlatformDefault = False + Text = 'Add Notification Window' + TextSettings.Font.Size = 14.000000000000000000 + OnClick = btnAddClick + end + object Layout1: TLayout + Margins.Left = 20.000000000000000000 + Margins.Top = 10.000000000000000000 + Margins.Right = 20.000000000000000000 + Position.X = 20.000000000000000000 + Position.Y = 272.000000000000000000 + Size.Width = 254.000000000000000000 + Size.Height = 52.000000000000000000 + Size.PlatformDefault = False + object btnCloseLast: TButton + Align = Left + StyledSettings = [Family, Style, FontColor] + Margins.Right = 20.000000000000000000 + Size.Width = 120.000000000000000000 + Size.Height = 52.000000000000000000 + Size.PlatformDefault = False + Text = 'Close Last' + TextSettings.Font.Size = 14.000000000000000000 + OnClick = btnCloseLastClick + end + object btnCloseAll: TButton + Align = Right + StyledSettings = [Family, Style, FontColor] + Position.X = 134.000000000000000000 + Size.Width = 120.000000000000000000 + Size.Height = 52.000000000000000000 + Size.PlatformDefault = False + Text = 'Close All' + TextSettings.Font.Size = 14.000000000000000000 + OnClick = btnCloseAllClick + end + end + object Timer1: TTimer + Enabled = False + OnTimer = Timer1Timer + Left = 232 + Top = 48 + end + object rbMainScreen: TRadioButton + StyledSettings = [Family, Style, FontColor] + IsChecked = True + Position.X = 24.000000000000000000 + Position.Y = 112.000000000000000000 + Text = 'Main Screen' + TextSettings.Font.Size = 14.000000000000000000 + end + object rbApplication: TRadioButton + StyledSettings = [Family, Style, FontColor] + Position.X = 24.000000000000000000 + Position.Y = 144.000000000000000000 + Text = 'Application' + TextSettings.Font.Size = 14.000000000000000000 + end +end diff --git a/Examples/NotificationWindowsFMX/Main.pas b/Examples/NotificationWindowsFMX/Main.pas new file mode 100644 index 0000000..e21a75c --- /dev/null +++ b/Examples/NotificationWindowsFMX/Main.pas @@ -0,0 +1,97 @@ +unit Main; + +interface + +uses + System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, + FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, + FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, Notifications.Manager; + +type + TFormMain = class(TForm) + Label1: TLabel; + cbAutoCloseAfter5: TCheckBox; + cbAutoCreateEverySec: TCheckBox; + btnAdd: TButton; + Layout1: TLayout; + btnCloseLast: TButton; + btnCloseAll: TButton; + Timer1: TTimer; + rbMainScreen: TRadioButton; + rbApplication: TRadioButton; + procedure btnAddClick(Sender: TObject); + procedure btnCloseAllClick(Sender: TObject); + procedure btnCloseLastClick(Sender: TObject); + procedure cbAutoCreateEverySecClick(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure Timer1Timer(Sender: TObject); + private + fManager: TNotificationManager; + fLastNotificationWindow: TNotificationWindow; + public + { Public declarations } + end; + +var + FormMain: TFormMain; + +implementation + +uses + MyNotificationWindow; + +{$R *.fmx} + +procedure TFormMain.btnAddClick(Sender: TObject); +var + notif: TMyNotificationWindowFMX; +begin + notif:=TMyNotificationWindowFMX.Create(nil); + if cbAutoCloseAfter5.IsChecked then + notif.CloseTimeout := 5000; + fLastNotificationWindow := notif; + if rbMainScreen.IsChecked then + fManager.Parent:=npMainScreen; + if rbApplication.IsChecked then + fManager.Parent:=npApplication; + fManager.Add(notif); +end; + +procedure TFormMain.btnCloseAllClick(Sender: TObject); +begin + fManager.CloseAll; +end; + +procedure TFormMain.btnCloseLastClick(Sender: TObject); +var + Target: TNotificationWindow; +begin + Target := fLastNotificationWindow; + if (fManager.List.Count > 0) and not fManager.List.Contains(Target) then + Target := fManager.List.Last; + + fManager.Close(Target); +end; + +procedure TFormMain.cbAutoCreateEverySecClick(Sender: TObject); +begin + Timer1.Enabled := not cbAutoCreateEverySec.IsChecked; +end; + +procedure TFormMain.FormDestroy(Sender: TObject); +begin + fManager.Free; +end; + +procedure TFormMain.FormCreate(Sender: TObject); +begin + fManager:=TNotificationManager.Create; +end; + +procedure TFormMain.Timer1Timer(Sender: TObject); +begin + btnAdd.OnClick(nil); +end; + +end. diff --git a/Examples/NotificationWindowsFMX/MyNotificationWindow.fmx b/Examples/NotificationWindowsFMX/MyNotificationWindow.fmx new file mode 100644 index 0000000..0c5ccdb --- /dev/null +++ b/Examples/NotificationWindowsFMX/MyNotificationWindow.fmx @@ -0,0 +1,45 @@ +inherited MyNotificationWindowFMX: TMyNotificationWindowFMX + Caption = 'NotificationWindowFMX1' + ClientHeight = 115 + ClientWidth = 453 + DesignerMasterStyle = 0 + object lbTitle: TLabel + Align = Top + StyledSettings = [Family, Style, FontColor] + Margins.Left = 20.000000000000000000 + Margins.Top = 10.000000000000000000 + Margins.Right = 20.000000000000000000 + Margins.Bottom = 10.000000000000000000 + Position.X = 20.000000000000000000 + Position.Y = 10.000000000000000000 + Size.Width = 413.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Font.Size = 14.000000000000000000 + TextSettings.HorzAlign = Center + Text = 'Here comes the important message...' + end + object btnAction: TButton + Position.X = 352.000000000000000000 + Position.Y = 72.000000000000000000 + Text = 'Action!' + OnClick = btnActionClick + end + object pbrAction: TProgressBar + Orientation = Horizontal + Position.X = 16.000000000000000000 + Position.Y = 72.000000000000000000 + Size.Width = 313.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object Label1: TLabel + Position.X = 32.000000000000000000 + Position.Y = 40.000000000000000000 + Size.Width = 401.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.HorzAlign = Center + Text = 'Time to Close: 0 sec' + end +end diff --git a/Examples/NotificationWindowsFMX/MyNotificationWindow.pas b/Examples/NotificationWindowsFMX/MyNotificationWindow.pas new file mode 100644 index 0000000..f144e6e --- /dev/null +++ b/Examples/NotificationWindowsFMX/MyNotificationWindow.pas @@ -0,0 +1,90 @@ +unit MyNotificationWindow; + +interface + +uses + System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, + FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, + Notifications.FMX.Base, FMX.Controls.Presentation; + +type + TMyNotificationWindowFMX = class(TNotificationWindowFMX) + lbTitle: TLabel; + btnAction: TButton; + pbrAction: TProgressBar; + Label1: TLabel; + procedure FormCreate(Sender: TObject); + procedure btnActionClick(Sender: TObject); + private + + protected + procedure OnAutoCloseCountDown(const ElapsedTimeMs: Real); override; + function AutoClosePossible: Boolean; override; + public + { Public declarations } + end; + +implementation + +uses + AnyiQuack; + +const + TIME_ELAPSED_STR = 'Time to Close: %5f'; + +{$R *.fmx} + +procedure TMyNotificationWindowFMX.FormCreate(Sender: TObject); +begin + inherited; + pbrAction.Visible:=false; +end; + +procedure TMyNotificationWindowFMX.OnAutoCloseCountDown( + const ElapsedTimeMs: Real); +begin + Label1.Text:=format(TIME_ELAPSED_STR, [ElapsedTimeMs]); +end; + +{ TMyNotificationWindowFMX } + +function TMyNotificationWindowFMX.AutoClosePossible: Boolean; +begin + if pbrAction.Visible and (pbrAction.Value < pbrAction.Max) then + Result := False + else + Result := inherited AutoClosePossible; +end; + +procedure TMyNotificationWindowFMX.btnActionClick(Sender: TObject); +begin + inherited; + btnAction.Enabled := False; + pbrAction.Visible := True; + + Take(pbrAction) + .EachInterval(60, + function(AQ: TAQ; O: TObject): Boolean + var + PB: TProgressBar absolute O; + begin + if PB.Value < PB.Max then + PB.Value := PB.Value + 1 + else + begin + AQ.CancelIntervals; + lbTitle.Text:= 'Done!'; + + Take(Self) + .EachDelay(1000, + function(AQ: TAQ; O: TObject): Boolean + begin + Close; + Result := True; + end); + end; + Result := True; + end); +end; + +end. diff --git a/Examples/NotificationWindowsFMX/NotificationExampleFMX.dpr b/Examples/NotificationWindowsFMX/NotificationExampleFMX.dpr new file mode 100644 index 0000000..89cbdb6 --- /dev/null +++ b/Examples/NotificationWindowsFMX/NotificationExampleFMX.dpr @@ -0,0 +1,19 @@ +program NotificationExampleFMX; + +uses + System.StartUpCopy, + FMX.Forms, + Main in 'Main.pas' {FormMain}, + AQPControlAnimations in '..\..\AQPControlAnimations.pas', + AnyiQuack in '..\..\AnyiQuack.pas', + Notifications.Manager in '..\..\NotificationFramework\Notifications.Manager.pas', + Notifications.FMX.Base in '..\..\NotificationFramework\Notifications.FMX.Base.pas' {NotificationWindowFMX}, + MyNotificationWindow in 'MyNotificationWindow.pas' {MyNotificationWindowFMX}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TFormMain, FormMain); + Application.Run; +end. diff --git a/Examples/NotificationWindowsFMX/NotificationExampleFMX.dproj b/Examples/NotificationWindowsFMX/NotificationExampleFMX.dproj new file mode 100644 index 0000000..ca69fc9 --- /dev/null +++ b/Examples/NotificationWindowsFMX/NotificationExampleFMX.dproj @@ -0,0 +1,996 @@ + + + {184E0A4C-28EC-4F27-9734-67C9BA8A995E} + 19.0 + FMX + True + Debug + Win32 + 37915 + Application + NotificationExampleFMX.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + ..\..\Builds\NotificationExampleFMX\$(Platform).$(Config)\dcu + ..\..\Builds\NotificationExampleFMX\$(Platform).$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + true + true + true + true + true + true + true + true + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\delphi_PROJECTICNS.icns + NotificationExampleFMX + FMX;$(DCC_Define) + ..\..\Builds\NotificationExampleFMX\$(Platform).$(Config)\dcp + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;TMSLogging;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FMXTMSFNCCloudPackPkgDXE13;FireDACDBXDriver;dbexpress;IndyCore;xdata;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;FMXTMSFNCUIPackPkgDXE13;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;sparkle;tmsbcl;IndySystem;fmxFireDAC;FMXTMSFNCCorePkgDXE13;FireDAC;FireDACSqliteDriver;ibmonitor;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;ibxbindings;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;aurelius;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE13;$(DCC_UsePackage) + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + true + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;TMSLogging;htmlcompfm_xe104;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FMXTMSFNCCloudPackPkgDXE13;FireDACDBXDriver;dbexpress;IndyCore;xdata;htmlcomp_xe104;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;FMXTMSFNCUIPackPkgDXE13;bindengine;CloudService;htmlreports_xe104;FireDACCommonDriver;DataSnapClient;inet;htmleditcore_xe104;IndyIPCommon;bindcompdbx;IndyIPServer;sparkle;tmsbcl;IndySystem;fmxFireDAC;FMXTMSFNCCorePkgDXE13;FireDAC;FireDACSqliteDriver;ibmonitor;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;ibxbindings;CustomIPTransport;htmledit_xe104;bindcomp;IndyIPClient;dbxcds;htmleditfm_xe104;aurelius;hclcore_xe104;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE13;$(DCC_UsePackage) + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + true + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar + + + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;TMSLogging;htmlcompfm_xe104;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;TMSFMXPackPkgDXE13;fmx;FireDACIBDriver;FMXTMSFNCCloudPackPkgDXE13;FireDACDBXDriver;dbexpress;IndyCore;xdata;htmlcomp_xe104;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;FMXTMSFNCUIPackPkgDXE13;bindengine;CloudService;htmlreports_xe104;FireDACCommonDriver;DataSnapClient;inet;htmleditcore_xe104;IndyIPCommon;bindcompdbx;IndyIPServer;sparkle;tmsbcl;IndySystem;fmxFireDAC;FMXTMSFNCCorePkgDXE13;FireDAC;FireDACSqliteDriver;ibmonitor;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;ibxbindings;CustomIPTransport;TMSFMXCloudPackPkgDXE13;htmledit_xe104;bindcomp;IndyIPClient;dbxcds;htmleditfm_xe104;aurelius;hclcore_xe104;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE13;$(DCC_UsePackage) + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + Debug + $(MSBuildProjectName) + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;TMSLogging;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FMXTMSFNCCloudPackPkgDXE13;FireDACDBXDriver;dbexpress;IndyCore;xdata;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;FMXTMSFNCUIPackPkgDXE13;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;sparkle;tmsbcl;IndySystem;fmxFireDAC;FMXTMSFNCCorePkgDXE13;FireDAC;FireDACSqliteDriver;ibmonitor;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;ibxbindings;CustomIPTransport;TMSFMXCloudPackPkgDXE13;bindcomp;IndyIPClient;dbxcds;aurelius;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE13;$(DCC_UsePackage) + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + 10.0 + + + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;TMSLogging;htmlcompfm_xe104;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;FMXTMSFNCCloudPackPkgDXE13;FireDACDBXDriver;dbexpress;IndyCore;xdata;htmlcomp_xe104;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;FMXTMSFNCUIPackPkgDXE13;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;htmlreports_xe104;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;htmleditcore_xe104;IndyIPCommon;bindcompdbx;IndyIPServer;sparkle;tmsbcl;IndySystem;fmxFireDAC;FMXTMSFNCCorePkgDXE13;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;ibxpress;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;ibxbindings;DBXSybaseASADriver;CustomIPTransport;htmledit_xe104;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;htmleditfm_xe104;DataSnapIndy10ServerTransport;aurelius;hclcore_xe104;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;FMXTMSFNCChartPkgDXE13;DataSnapServerMidas;$(DCC_UsePackage) + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + Debug + true + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;TMSLogging;vclactnband;VCLTMSFNCDashboardPackPkgDXE13;vclFireDAC;TMSFMXCloudPackPkgDEDXE13;htmlcompfm_xe104;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;PngComponentsD;vcltouch;FMXTMSFNCDashboardPackPkgDXE13;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;TMSFMXPackPkgDXE13;VCLTMSFNCCloudPackPkgDXE13;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;vclib;FMXTMSFNCCloudPackPkgDXE13;VCLTMSFNCChartPkgDXE13;FireDACDBXDriver;dbexpress;IndyCore;xdata;vclx;htmlcomp_xe104;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLTMSFNCCorePkgDXE13;VCLRESTComponents;soapserver;FMXTMSFNCUIPackPkgDXE13;VCLTMSFNCUIPackPkgDXE13;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;htmlreports_xe104;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;htmleditcore_xe104;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;sparkle;tmsbcl;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FMXTMSFNCCorePkgDXE13;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;secureblackbox20;ibxpress;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;ibxbindings;DBXSybaseASADriver;RFindUnit;CustomIPTransport;vcldsnap;TMSFMXCloudPackPkgDXE13;htmledit_xe104;TBCParser_D10_4;DIHtmlParser_D10_4;bindcomp;appanalytics;DBXInformixDriver;OrangeUIDesign_FMX_D10_4;IndyIPClient;bindcompvcl;dbxcds;VclSmp;FixInsight_10_4;adortl;FireDACODBCDriver;htmleditfm_xe104;DataSnapIndy10ServerTransport;aurelius;hclcore_xe104;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;FMXTMSFNCChartPkgDXE13;HGMComponents;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;TMSLogging;vclactnband;VCLTMSFNCDashboardPackPkgDXE13;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;PngComponentsD;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;VCLTMSFNCCloudPackPkgDXE13;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;vclib;FMXTMSFNCCloudPackPkgDXE13;VCLTMSFNCChartPkgDXE13;FireDACDBXDriver;dbexpress;IndyCore;xdata;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLTMSFNCCorePkgDXE13;VCLRESTComponents;soapserver;FMXTMSFNCUIPackPkgDXE13;VCLTMSFNCUIPackPkgDXE13;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;sparkle;tmsbcl;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FMXTMSFNCCorePkgDXE13;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;ibxpress;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;ibxbindings;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;aurelius;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;FMXTMSFNCChartPkgDXE13;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + true + PerMonitorV2 + true + 1033 + + + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + + MainSource + + +
FormMain
+ fmx +
+ + + + +
NotificationWindowFMX
+ fmx +
+ +
MyNotificationWindowFMX
+ fmx +
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Application + + + + NotificationExampleFMX.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + True + True + True + True + True + True + True + + + + + true + + + + + true + + + + + true + + + + + NotificationExampleFMX.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + 12 + + + + +
diff --git a/Examples/PulsateEdits/PulsateEdits.dproj b/Examples/PulsateEdits/PulsateEdits.dproj index 6b418bf..9dedc06 100644 --- a/Examples/PulsateEdits/PulsateEdits.dproj +++ b/Examples/PulsateEdits/PulsateEdits.dproj @@ -1,7 +1,7 @@  {B68F6AFB-2D1E-4640-862B-D4AF3F2075ED} - 18.7 + 19.0 PulsateEdits.dpr Release DCC32 diff --git a/Examples/PulsateEdits/PulsateEdits.res b/Examples/PulsateEdits/PulsateEdits.res deleted file mode 100644 index 2b29b13..0000000 Binary files a/Examples/PulsateEdits/PulsateEdits.res and /dev/null differ diff --git a/Examples/SlidingButtonsFMX/SlidingButtonsFMX.dproj b/Examples/SlidingButtonsFMX/SlidingButtonsFMX.dproj index d6cd5d0..5816393 100644 --- a/Examples/SlidingButtonsFMX/SlidingButtonsFMX.dproj +++ b/Examples/SlidingButtonsFMX/SlidingButtonsFMX.dproj @@ -1,13 +1,13 @@  {E80AA459-CAD9-40B1-B179-7187D061F246} - 18.7 + 19.0 FMX SlidingButtonsFMX.dpr True Debug Win32 - 5215 + 37915 Application @@ -18,8 +18,8 @@ Base true - - true + + true Base true @@ -33,11 +33,6 @@ Base true - - true - Base - true - true Base @@ -64,6 +59,12 @@ true true + + true + Cfg_1 + true + true + true Cfg_1 @@ -135,67 +136,33 @@ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;TMSScripter;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;fmx;FireDACIBDriver;RDesignUX;dbexpress;IndyCore;xdata;RDesignChart;dsnap;FireDACCommon;RESTBackendComponents;soapserver;TMSLoggingPkgFMXDXE12;bindengine;CloudService;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;sparkle;tmsbcl;IndySystem;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;TMSLoggingPkgCoreDXE12;dbxcds;aurelius;dsnapxml;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE12;fmxase;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false - iPhoneAndiPad - true + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_320x480.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x960.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x1136.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_750x1334.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_828x1792.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1125x2436.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1136x640.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2208.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2688.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1334x750.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1792x828.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2208x1242.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2436x1125.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2688x1242.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1004.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x748.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2008.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1668x2224.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1668x2388.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1496.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_2048x2732.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2224x1668.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2388x1668.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2732x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + true + true + Base + true + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;TMSScripter;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;fmx;FireDACIBDriver;RDesignUX;dbexpress;IndyCore;xdata;RDesignChart;dsnap;FireDACCommon;RESTBackendComponents;soapserver;TMSLoggingPkgFMXDXE12;bindengine;CloudService;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;sparkle;tmsbcl;IndySystem;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;TMSLoggingPkgCoreDXE12;dbxcds;aurelius;dsnapxml;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE12;$(DCC_UsePackage);$(DCC_UsePackage) + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;TMSScripter;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;fmx;FireDACIBDriver;RDesignUX;dbexpress;IndyCore;xdata;RDesignChart;dsnap;FireDACCommon;RESTBackendComponents;soapserver;TMSLoggingPkgFMXDXE12;bindengine;CloudService;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;sparkle;tmsbcl;IndySystem;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;TMSLoggingPkgCoreDXE12;dbxcds;TMSFMXPackPkgDXE12;aurelius;dsnapxml;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE12;fmxase;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true Debug @@ -250,10 +217,16 @@ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;TMSScripter;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;fmx;FireDACIBDriver;dbexpress;IndyCore;xdata;dsnap;FireDACCommon;RESTBackendComponents;soapserver;TMSLoggingPkgFMXDXE12;bindengine;CloudService;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;sparkle;tmsbcl;IndySystem;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;TMSLoggingPkgCoreDXE12;dbxcds;aurelius;dsnapxml;dbrtl;IndyProtocols;FMXTMSFNCChartPkgDXE12;fmxase;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers iPhoneAndiPad true $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png @@ -306,16 +279,17 @@ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png - - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;TMSScripter;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;inetdb;fmx;FireDACIBDriver;fmxdae;RDesignUX;dbexpress;IndyCore;xdata;RDesignChart;dsnap;FireDACCommon;RESTBackendComponents;soapserver;TMSLoggingPkgFMXDXE12;bindengine;DBXMySQLDriver;CloudService;FireDACMySQLDriver;FireDACCommonODBC;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;sparkle;tmsbcl;IndySystem;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;fmxobj;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;TMSLoggingPkgCoreDXE12;dbxcds;aurelius;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;FMXTMSFNCChartPkgDXE12;fmxase;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts - Debug - true + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png + 10.0 DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;bindcompfmx;inetdb;fmx;FireDACIBDriver;fmxdae;dbexpress;IndyCore;dsnap;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACMySQLDriver;FireDACCommonODBC;FireDACCommonDriver;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;fmxobj;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;fmxase;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers Debug true @@ -353,6 +327,13 @@ 1 #000000 + + true + Cfg_1 + true + 1 + #000000 + false true @@ -630,12 +611,20 @@ classes 1
+ + classes + 1 +
res\xml 1 + + res\xml + 1 + @@ -648,138 +637,242 @@ library\lib\armeabi 1 + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + library\lib\mips 1 + + library\lib\mips + 1 + library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + res\drawable 1 + + res\drawable + 1 + res\values 1 + + res\values + 1 + res\values-v21 1 + + res\values-v21 + 1 + res\values 1 + + res\values + 1 + res\drawable 1 + + res\drawable + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-ldpi 1 + + res\drawable-ldpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-xxxhdpi 1 + + res\drawable-xxxhdpi + 1 + res\drawable-small 1 + + res\drawable-small + 1 + res\drawable-normal 1 + + res\drawable-normal + 1 + res\drawable-large 1 + + res\drawable-large + 1 + res\drawable-xlarge 1 + + res\drawable-xlarge + 1 + res\values 1 + + res\values + 1 + @@ -868,6 +961,9 @@ 0 + + 0 + 0 @@ -988,6 +1084,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -999,6 +1105,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -1098,6 +1214,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -1109,6 +1235,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -1153,10 +1289,33 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 + + 1 + @@ -1197,6 +1356,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + 1 @@ -1249,6 +1418,10 @@ library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + 1 @@ -1273,6 +1446,12 @@ 0 + + + library\lib\armeabi-v7a + 1 + + 1 @@ -1310,13 +1489,13 @@ + True - True + True True True - True True True True diff --git a/Examples/SlidingForm/SlidingForm.dproj b/Examples/SlidingForm/SlidingForm.dproj index c889002..02dd456 100644 --- a/Examples/SlidingForm/SlidingForm.dproj +++ b/Examples/SlidingForm/SlidingForm.dproj @@ -1,7 +1,7 @@  {94F1581B-D98E-425F-B345-E592FE2B7343} - 18.7 + 19.0 SlidingForm.dpr Debug DCC32 @@ -188,12 +188,20 @@ classes 1 + + classes + 1 + res\xml 1 + + res\xml + 1 + @@ -206,138 +214,242 @@ library\lib\armeabi 1 + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + library\lib\mips 1 + + library\lib\mips + 1 + library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + res\drawable 1 + + res\drawable + 1 + res\values 1 + + res\values + 1 + res\values-v21 1 + + res\values-v21 + 1 + res\values 1 + + res\values + 1 + res\drawable 1 + + res\drawable + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-ldpi 1 + + res\drawable-ldpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-xxxhdpi 1 + + res\drawable-xxxhdpi + 1 + res\drawable-small 1 + + res\drawable-small + 1 + res\drawable-normal 1 + + res\drawable-normal + 1 + res\drawable-large 1 + + res\drawable-large + 1 + res\drawable-xlarge 1 + + res\drawable-xlarge + 1 + res\values 1 + + res\values + 1 + @@ -426,6 +538,9 @@ 0 + + 0 + 0 @@ -579,6 +694,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -601,6 +726,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -700,6 +835,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -711,6 +856,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -755,10 +910,33 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 + + 1 + @@ -799,6 +977,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + 1 @@ -851,6 +1039,10 @@ library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + 1 @@ -875,6 +1067,12 @@ 0 + + + library\lib\armeabi-v7a + 1 + + 1 @@ -912,6 +1110,7 @@ + 12 diff --git a/Examples/SlidingForm/SlidingForm.res b/Examples/SlidingForm/SlidingForm.res deleted file mode 100644 index 4ec1573..0000000 Binary files a/Examples/SlidingForm/SlidingForm.res and /dev/null differ diff --git a/Examples/StickyTools/StickyTools.dproj b/Examples/StickyTools/StickyTools.dproj index 90b4ac7..872a063 100644 --- a/Examples/StickyTools/StickyTools.dproj +++ b/Examples/StickyTools/StickyTools.dproj @@ -1,7 +1,7 @@  {6D8B1345-5AA2-48F0-B518-E4F5C15F0783} - 18.7 + 19.0 StickyTools.dpr Release DCC32 @@ -57,7 +57,7 @@ CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) diff --git a/Examples/StickyTools/StickyTools.res b/Examples/StickyTools/StickyTools.res deleted file mode 100644 index 2448e27..0000000 Binary files a/Examples/StickyTools/StickyTools.res and /dev/null differ diff --git a/Examples/SyncScroll/SyncScroll.dproj b/Examples/SyncScroll/SyncScroll.dproj index b3e7a74..5c14726 100644 --- a/Examples/SyncScroll/SyncScroll.dproj +++ b/Examples/SyncScroll/SyncScroll.dproj @@ -1,7 +1,7 @@  {55201FD5-B822-4E18-8909-80A39442DA28} - 18.7 + 19.0 SyncScroll.dpr Release DCC32 @@ -57,7 +57,7 @@ CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) diff --git a/Examples/SyncScroll/SyncScroll.res b/Examples/SyncScroll/SyncScroll.res deleted file mode 100644 index 2448e27..0000000 Binary files a/Examples/SyncScroll/SyncScroll.res and /dev/null differ diff --git a/NotificationWindowsFramework/NotificationWindows.dfm b/NotificationFramework/Notifications.Base.VCL.dfm similarity index 78% rename from NotificationWindowsFramework/NotificationWindows.dfm rename to NotificationFramework/Notifications.Base.VCL.dfm index 9a14b52..66be5cf 100644 --- a/NotificationWindowsFramework/NotificationWindows.dfm +++ b/NotificationFramework/Notifications.Base.VCL.dfm @@ -1,23 +1,24 @@ -object NotificationWindow: TNotificationWindow - Left = 0 - Top = 0 - AlphaBlendValue = 0 - BorderStyle = bsToolWindow - Caption = 'NotificationWindow' - ClientHeight = 66 - ClientWidth = 350 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Tahoma' - Font.Style = [] - FormStyle = fsStayOnTop - GlassFrame.Top = 35 - KeyPreview = True - OldCreateOrder = False - OnClose = FormClose - OnKeyDown = FormKeyDown - PixelsPerInch = 96 - TextHeight = 13 -end +object NotificationWindowVCL: TNotificationWindowVCL + Left = 0 + Top = 0 + AlphaBlendValue = 0 + BorderStyle = bsToolWindow + Caption = 'NotificationWindowVCL' + ClientHeight = 66 + ClientWidth = 350 + Color = clBtnFace + CustomTitleBar.Height = 35 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + FormStyle = fsStayOnTop + GlassFrame.Top = 35 + KeyPreview = True + OldCreateOrder = False + OnClose = FormClose + OnKeyDown = FormKeyDown + PixelsPerInch = 96 + TextHeight = 13 +end diff --git a/NotificationFramework/Notifications.Base.VCL.pas b/NotificationFramework/Notifications.Base.VCL.pas new file mode 100644 index 0000000..101183f --- /dev/null +++ b/NotificationFramework/Notifications.Base.VCL.pas @@ -0,0 +1,167 @@ +unit Notifications.Base.VCL; + +interface + +uses + Winapi.Windows, + Winapi.Messages, + System.SysUtils, + System.Contnrs, + System.Variants, + System.Classes, + System.Math, + Vcl.Graphics, + Vcl.Controls, + Vcl.Forms, + Vcl.Dialogs, + Generics.Collections, + + AnyiQuack, + AQPControlAnimations; + +type + TNotificationWindowVCL = class; + TCloseProcedure= procedure (const NotificationWindows: TNotificationWindowVCL) of object; + TOnClose = procedure (const ID: TGUID) of object; + TNotificationWindowVCL = class(TForm) + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + private + const + CloseDelayID = 779; + + var + FCloseTimeout: Integer; + FClosed: Boolean; + FCloseProc:TCloseProcedure; + FID: TGUID; + FOnClose: TOnClose; + + procedure UpdateCloseTimeout; + + procedure SetCloseTimeout(CloseTimeout: Integer); + protected + function AutoClosePossible: Boolean; virtual; + public + constructor Create(AOwner: TComponent); override; + + procedure Close; reintroduce; + + {** + * Auto close feature + * + * Assign a value > 0 to enable the feature or 0 to disable it. + * The timeout is in milliseconds. The notification window is getting closed + * automatically, after the defined timeout is expired and until the method + * AutoClosePossible returns True. + *} + property CloseTimeout: Integer read FCloseTimeout write SetCloseTimeout; + + {** + * Close procedure + * + * This is used to trigger the Close event in the Notification Manager + * It is set by the Notification Manager + * DO NOT SET IT IN THIS CLASS + *} + property CloseProc: TCloseProcedure read FCloseProc write FCloseProc; + + property Closed: Boolean read FClosed write FClosed; + published + property OnClose: TOnClose read FOnClose write FOnClose; + end; + +implementation + +{$R *.dfm} + +{** TNotificationWindow **} + +constructor TNotificationWindowVCL.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + + // Win 10 bugfix: TWinControl descendants are sometimes not rendered, but + // the switch AlphaBlend off and on again solve the issue. + AlphaBlend := False; + AlphaBlend := True; + + FCloseTimeout:=0; + FClosed:=false; + FCloseProc:=nil; + FOnClose:=nil; + if CreateGUID(FID) <> 0 then + FID:=StringToGUID('{00099900-0000-0000-Z999-000000000099}'); +end; + +function TNotificationWindowVCL.AutoClosePossible: Boolean; +begin + Result := (Screen.ActiveForm <> Self) and not PtInRect(BoundsRect, Mouse.CursorPos); +end; + +procedure TNotificationWindowVCL.Close; +begin + FClosed := True; + if assigned(FCloseProc) then + begin + FCloseProc(Self); + if assigned(FOnClose) then + FOnClose(fID); + end + else + raise Exception.Create('Close Procedure in not set in Manager'); +end; + +procedure TNotificationWindowVCL.FormClose(Sender: TObject; var Action: TCloseAction); +begin + Action := caNone; + Close; +end; + +procedure TNotificationWindowVCL.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +begin + if Key = VK_ESCAPE then + Close; +end; + +procedure TNotificationWindowVCL.SetCloseTimeout(CloseTimeout: Integer); +begin + if CloseTimeout = FCloseTimeout then + Exit; + FCloseTimeout := CloseTimeout; + UpdateCloseTimeout; +end; + +procedure TNotificationWindowVCL.UpdateCloseTimeout; +begin + Take(Self) + .CancelDelays(CloseDelayID) + .IfThen(CloseTimeout > 0) + {** + * Wait "long", if the auto close feature is possible + *} + .IfThen(AutoClosePossible) + .EachDelay(CloseTimeout, + function(AQ: TAQ; O: TObject): Boolean + begin + if AutoClosePossible then + Close + else + UpdateCloseTimeout; + Result := True; + end, CloseDelayID) + {** + * Wait "short" (polling), if the auto close feature isn't possible + *} + .IfElse + .EachDelay(100, + function(AQ: TAQ; O: TObject): Boolean + begin + UpdateCloseTimeout; + Result := True; + end) + .IfEnd + .IfEnd; +end; + +end. diff --git a/NotificationFramework/Notifications.FMX.Base.fmx b/NotificationFramework/Notifications.FMX.Base.fmx new file mode 100644 index 0000000..7c2cc61 --- /dev/null +++ b/NotificationFramework/Notifications.FMX.Base.fmx @@ -0,0 +1,14 @@ +object NotificationWindowFMX: TNotificationWindowFMX + Left = 0 + Top = 0 + BorderStyle = SizeToolWin + Caption = 'Form3' + ClientHeight = 138 + ClientWidth = 506 + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + OnCreate = FormCreate + OnClose = FormClose + DesignerMasterStyle = 0 +end diff --git a/NotificationFramework/Notifications.FMX.Base.pas b/NotificationFramework/Notifications.FMX.Base.pas new file mode 100644 index 0000000..824a78e --- /dev/null +++ b/NotificationFramework/Notifications.FMX.Base.pas @@ -0,0 +1,159 @@ +unit Notifications.FMX.Base; + +interface + +uses + System.SysUtils, System.Types, System.Classes, + System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, + FMX.Dialogs, System.UITypes; + +type + TNotificationWindowFMX = class; + TCloseProcedure= procedure (const NotificationWindows: TNotificationWindowFMX) of object; + TOnClose = procedure (const ID: TGUID) of object; + TNotificationWindowFMX = class(TForm) + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormCreate(Sender: TObject); + private + const + CloseDelayID = 779; + + var + FCloseTimeout: Integer; + FClosed: Boolean; + FCloseProc:TCloseProcedure; + FID: TGUID; + FOnClose: TOnClose; + procedure UpdateCloseTimeout; + + procedure SetCloseTimeout(CloseTimeout: Integer); + protected + procedure OnAutoCloseCountDown(const ElapsedTimeMs: Real); virtual; + function AutoClosePossible: Boolean; virtual; + public + procedure Close; reintroduce; + {** + * Auto close feature + * + * Assign a value > 0 to enable the feature or 0 to disable it. + * The timeout is in milliseconds. The notification window is getting closed + * automatically, after the defined timeout is expired and until the method + * AutoClosePossible returns True. + *} + property CloseTimeout: Integer read FCloseTimeout write SetCloseTimeout; + + {** + * Close procedure + * + * This is used to trigger the Close event in the Notification Manager + * It is set by the Notification Manager + * DO NOT SET IT IN THIS CLASS + * DO NOT USE IT - USE OnClose Event + *} + property CloseProc: TCloseProcedure read FCloseProc write FCloseProc; + + property Closed: Boolean read FClosed write FClosed; + property ID: TGUID read FID; + + published + property OnClose: TOnClose read FOnClose write FOnClose; + end; + +implementation + +uses + AnyiQuack; + +{$R *.fmx} + +procedure TNotificationWindowFMX.FormCreate(Sender: TObject); +begin + inherited; + FCloseTimeout:=0; + FClosed:=false; + FCloseProc:=nil; + fOnClose:=nil; + if CreateGUID(FID) <> 0 then + fID:=StringToGUID('{00099900-0000-0000-Z999-000000000099}'); +end; + +procedure TNotificationWindowFMX.OnAutoCloseCountDown( + const ElapsedTimeMs: Real); +begin +// DO NOT DELETE - OVERRIDE IN DESCENDENTS +end; + +{ TNotificationWindow } + +function TNotificationWindowFMX.AutoClosePossible: Boolean; +begin + Result := (Screen.ActiveForm <> Self) and not PtInRect(ClientRect, Screen.MousePos); +end; + +procedure TNotificationWindowFMX.Close; +begin + FClosed := True; + if assigned(FCloseProc) then + begin + FCloseProc(Self); + if assigned(FOnClose) then + FOnClose(fID); + end + else + raise Exception.Create('Close Procedure in not set in Manager'); +end; + +procedure TNotificationWindowFMX.FormClose(Sender: TObject; var Action: + TCloseAction); +begin + Action:=TCloseAction.caNone; + Close; +end; + +procedure TNotificationWindowFMX.SetCloseTimeout(CloseTimeout: Integer); +begin + if CloseTimeout = FCloseTimeout then + Exit; + FCloseTimeout := CloseTimeout; + UpdateCloseTimeout; +end; + +procedure TNotificationWindowFMX.UpdateCloseTimeout; +begin + Take(Self) +// .Each(function(AQ:TAQ; O: TObject): boolean +// begin +// +// OnAutoCloseCountdown(AQ.CurrentInterval.Progress); +// +// end) + .CancelDelays(CloseDelayID) + .IfThen(CloseTimeout > 0) + {** + * Wait "long", if the auto close feature is possible + *} + .IfThen(AutoClosePossible) + .EachDelay(CloseTimeout, + function(AQ: TAQ; O: TObject): Boolean + begin + if AutoClosePossible then + Close + else + UpdateCloseTimeout; + Result := True; + end, CloseDelayID) + {** + * Wait "short" (polling), if the auto close feature isn't possible + *} + .IfElse + .EachDelay(100, + function(AQ: TAQ; O: TObject): Boolean + begin + UpdateCloseTimeout; + Result := True; + end) + .IfEnd + .IfEnd; +end; + +end. diff --git a/NotificationFramework/Notifications.Manager.pas b/NotificationFramework/Notifications.Manager.pas new file mode 100644 index 0000000..3cb61fd --- /dev/null +++ b/NotificationFramework/Notifications.Manager.pas @@ -0,0 +1,296 @@ +unit Notifications.Manager; + +interface + +uses + System.Generics.Collections + {$IFDEF FMX} + , FMX.Forms + , FMX.Platform + , Notifications.FMX.Base + {$ELSE} + , Vcl.Forms + , Vcl.Controls + , Winapi.Windows + , Winapi.Messages + , Notifications.Base.VCL + {$ENDIF} + ; + +type + TNotificationParent = (npMainScreen, npApplication); + {$IFDEF FMX} + TNotificationWindow = TNotificationWindowFMX; + {$ELSE} + TNotificationWindow = TNotificationWindowVCL; + {$ENDIF} + TNotificationManager = class + private + const + PositionAnimationID = 123; + AlphaAnimationID = 456; + + type + TNotificationList = TObjectList; + + var + FActivateNotification: boolean; + FList: TNotificationList; + FInPositionAnimationDuration: Integer; + FInAlphaAnimationDuration: Integer; + FOutPositionAnimationDuration: Integer; + FOutAlphaAnimationDuration: Integer; + FParent: TNotificationParent; + + procedure UpdatePositions; + + public + constructor Create; + destructor Destroy; override; + + procedure Add(const NotificationWindow: TNotificationWindow); + procedure Close(const NotificationWindow: TNotificationWindow); + procedure CloseAll(const Animate: Boolean = True); + + property ActivateNotification: boolean read FActivateNotification write + FActivateNotification default false; + property List: TNotificationList read FList; + + property InPositionAnimationDuration: Integer read FInPositionAnimationDuration + write FInPositionAnimationDuration; + property InAlphaAnimationDuration: Integer read FInAlphaAnimationDuration + write FInAlphaAnimationDuration; + property OutPositionAnimationDuration: Integer read FOutPositionAnimationDuration + write FOutPositionAnimationDuration; + property OutAlphaAnimationDuration: Integer read FOutAlphaAnimationDuration + write FOutAlphaAnimationDuration; + property Parent: TNotificationParent read FParent write FParent default + npMainScreen; + end; + +implementation + +uses + AQPControlAnimations, AnyiQuack, System.Math, System.Types, System.Classes; + +{ TNotificationManager } + +type + TInnerWindow = class (TForm) + + end; + +procedure TNotificationManager.Add(const NotificationWindow: TNotificationWindow); +begin + NotificationWindow.Visible:=false; + NotificationWindow.CloseProc:=Close; + List.Add(NotificationWindow); + + {$IFDEF FMX} + case fParent of + npMainScreen: begin + NotificationWindow.Left := Screen.Displays[0].BoundsRect.Right - NotificationWindow.Width; + NotificationWindow.Top := Screen.Displays[0].BoundsRect.Bottom; + end; + npApplication: begin + NotificationWindow.Parent:=Application.MainForm; + NotificationWindow.Left := round( + Application.MainForm.ClientToScreen(TPointF.Create( + Application.MainForm.Width - NotificationWindow.Width, 0)).X); + NotificationWindow.Top := round( + Application.MainForm.ClientToScreen(TPointF.Create(0, + Application.MainForm.Height)).Y); + + end; + end; + {$ELSE} + case fParent of + npMainScreen: begin + NotificationWindow.Left := Screen.WorkAreaRect.Right - NotificationWindow.Width; + NotificationWindow.Top := Screen.PrimaryMonitor.BoundsRect.Bottom; + ShowWindow(TInnerWindow(NotificationWindow).WindowHandle, SW_SHOWNOACTIVATE) + end; + npApplication: begin + NotificationWindow.Left := Application.MainForm.Width + - NotificationWindow.Width; + NotificationWindow.Parent:=Application.MainForm; + end; + end; + NotificationWindow.AlphaBlend := True; + {$ENDIF} + NotificationWindow.Visible := True; + UpdatePositions; +end; + +procedure TNotificationManager.Close(const NotificationWindow: + TNotificationWindow); +var + NextFocusedWindowIndex: Integer; + AniPlugin: TAQPControlAnimations; +{$IFDEF FMX} + winService: IFMXWindowService; +{$ENDIF} +begin + if not List.Contains(NotificationWindow) then + Exit; + + AniPlugin := Take(NotificationWindow) + .CancelAnimations + .Plugin; + AniPlugin.BoundsAnimation(Screen.WorkAreaRect.Right, NotificationWindow.Top, -1, -1, + OutPositionAnimationDuration, 0, + TAQ.Ease(etCubic, emInInverted)); + AniPlugin.AlphaBlendAnimation(0, OutAlphaAnimationDuration, 0, TAQ.Ease(etSinus), + {** + * Handler for the OnComplete event + *} + procedure(Sender: TObject) + begin + {$IFDEF FMX} + if TPlatformServices.Current. + SupportsPlatformService(IFMXWindowService, winService) then + winService.ReleaseWindow(NotificationWindow); + {$ELSE} + NotificationWindow.Release; + {$ENDIF} + end); + + NextFocusedWindowIndex := List.Remove(NotificationWindow); + + if (Screen.ActiveForm = NotificationWindow) and (List.Count > 0) then + begin + Dec(NextFocusedWindowIndex); + if NextFocusedWindowIndex < 0 then + NextFocusedWindowIndex:=0; + List[NextFocusedWindowIndex]. + {$IFDEF FMX} + Active:=true; + {$ELSE} + SetFocus; + {$ENDIF} + end; + + UpdatePositions; +end; + +procedure TNotificationManager.CloseAll(const Animate: Boolean = True); +var + cc: Integer; +begin + for cc := List.Count - 1 downto 0 do + if Animate then + List[cc].Close + else + begin + TThread.ForceQueue(nil, + procedure + begin + List[cc].DisposeOf; + end); + List.Delete(cc); + end; +end; + +constructor TNotificationManager.Create; +begin + inherited; + FList := TNotificationList.Create(False); + + FInPositionAnimationDuration := 1000; + FInAlphaAnimationDuration := 800; + FOutPositionAnimationDuration := 500; + FOutAlphaAnimationDuration := 300; + + FActivateNotification:=false; + FParent:=npApplication; +end; + +destructor TNotificationManager.Destroy; +begin + FList.OwnsObjects := True; + FList.Free; + inherited; +end; + +procedure TNotificationManager.UpdatePositions; +var + Stack: TAQ; + WindowIndex, TopPosition: Integer; + RightPosition: integer; +begin + Stack := TAQ.Managed; + for WindowIndex := List.Count - 1 downto 0 do + if not List[WindowIndex].Closed then + Stack.Add(List[WindowIndex]); + if Stack.Count = 0 then + begin + Stack.Die; + Exit; + end; + + case fParent of + npMainScreen: TopPosition := Screen.WorkAreaRect.Bottom; + npApplication: TopPosition := {$IFDEF FMX} + round( + Application.MainForm.ClientToScreen(TPointF.Create(0, + Application.MainForm.Height - 40)).Y); + {$ELSE} + Application.MainForm.Height - 40; + {$ENDIF} + end; + + WindowIndex := 0; + + Stack + .CancelAnimations(PositionAnimationID) + .Each( + function(AQ: TAQ; O: TObject):Boolean + var + TargetNotf: TNotificationWindow absolute O; + AniPlugin: TAQPControlAnimations; + begin + Dec(TopPosition, TargetNotf.Height); + + AniPlugin := Take(O).Plugin; + case fParent of + npMainScreen: RightPosition:={$IFDEF FMX} + Screen.Displays[0].WorkareaRect.Right; + {$ELSE} + Screen.WorkAreaRect.Right; + {$ENDIF} + npApplication: RightPosition:= {$IFDEF FMX} + round( + Application.MainForm.ClientToScreen(TPointF.Create( + Application.MainForm.Width - 20, 0)).X); + {$ELSE} + Application.MainForm.Width - 20; + {$ENDIF} + end; + RightPosition:=RightPosition - TargetNotf.Width; + + AniPlugin.BoundsAnimation(RightPosition, + TopPosition - 10, -1, -1, + IfThen(WindowIndex = 0, InPositionAnimationDuration div 2, InPositionAnimationDuration), + PositionAnimationID, TAQ.Ease(etBack, emInInverted)); + AniPlugin.AlphaBlendAnimation(high(Byte), InAlphaAnimationDuration, + AlphaAnimationID, TAQ.Ease(etSinus)); + + Inc(WindowIndex); + + if FActivateNotification then + {$IFDEF FMX} + TargetNotf.Active:=true + {$ELSE} + TargetNotf.SetFocus + {$ENDIF} + else + {$IFDEF FMX} + Application.MainForm.Active:=true; + {$ELSE} + Application.MainForm.SetFocus; + {$ENDIF} + Result := True; + end); +end; + +end. diff --git a/NotificationWindowsFramework/NotificationWindows.pas b/NotificationWindowsFramework/NotificationWindows.pas deleted file mode 100644 index 8761a45..0000000 --- a/NotificationWindowsFramework/NotificationWindows.pas +++ /dev/null @@ -1,300 +0,0 @@ -unit NotificationWindows; - -interface - -uses - Winapi.Windows, - Winapi.Messages, - System.SysUtils, - System.Contnrs, - System.Variants, - System.Classes, - System.Math, - Vcl.Graphics, - Vcl.Controls, - Vcl.Forms, - Vcl.Dialogs, - Generics.Collections, - - AnyiQuack, - AQPControlAnimations; - -type - TNotificationStack = class; - - TNotificationWindow = class(TForm) - procedure FormClose(Sender: TObject; var Action: TCloseAction); - procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); - private - const - CloseDelayID = 779; - - var - FCloseTimeout: Integer; - FStack: TNotificationStack; - FClosed: Boolean; - - procedure UpdateCloseTimeout; - - procedure SetCloseTimeout(CloseTimeout: Integer); - protected - function AutoClosePossible: Boolean; virtual; - public - constructor Create(AOwner: TComponent); override; - - procedure Close; reintroduce; - - property Stack: TNotificationStack read FStack; - {** - * Auto close feature - * - * Assign a value > 0 to enable the feature or 0 to disable it. - * The timeout is in milliseconds. The notification window is getting closed - * automatically, after the defined timeout is expired and until the method - * AutoClosePossible returns True. - *} - property CloseTimeout: Integer read FCloseTimeout write SetCloseTimeout; - end; - - TNotificationStack = class - private - const - PositionAnimationID = 123; - AlphaAnimationID = 456; - - type - TNotificationList = TObjectList; - - var - FList: TNotificationList; - FInPositionAnimationDuration: Integer; - FInAlphaAnimationDuration: Integer; - FOutPositionAnimationDuration: Integer; - FOutAlphaAnimationDuration: Integer; - - procedure UpdatePositions; - - public - constructor Create; - destructor Destroy; override; - - procedure Add(NotificationWindow: TNotificationWindow); - procedure Close(NotificationWindow: TNotificationWindow); - procedure CloseAll(Animate: Boolean = True); - - property List: TNotificationList read FList; - - property InPositionAnimationDuration: Integer read FInPositionAnimationDuration - write FInPositionAnimationDuration; - property InAlphaAnimationDuration: Integer read FInAlphaAnimationDuration - write FInAlphaAnimationDuration; - property OutPositionAnimationDuration: Integer read FOutPositionAnimationDuration - write FOutPositionAnimationDuration; - property OutAlphaAnimationDuration: Integer read FOutAlphaAnimationDuration - write FOutAlphaAnimationDuration; - end; - -implementation - -{$R *.dfm} - -{** TNotificationWindow **} - -constructor TNotificationWindow.Create(AOwner: TComponent); -begin - inherited Create(AOwner); - - // Win 10 bugfix: TWinControl descendants are sometimes not rendered, but - // the switch AlphaBlend off and on again solve the issue. - AlphaBlend := False; - AlphaBlend := True; -end; - -function TNotificationWindow.AutoClosePossible: Boolean; -begin - Result := (Screen.ActiveForm <> Self) and not PtInRect(BoundsRect, Mouse.CursorPos); -end; - -procedure TNotificationWindow.Close; -begin - FClosed := True; - Stack.Close(Self); -end; - -procedure TNotificationWindow.FormClose(Sender: TObject; var Action: TCloseAction); -begin - Action := caNone; - Close; -end; - -procedure TNotificationWindow.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); -begin - if Key = VK_ESCAPE then - Close; -end; - -procedure TNotificationWindow.SetCloseTimeout(CloseTimeout: Integer); -begin - if CloseTimeout = FCloseTimeout then - Exit; - FCloseTimeout := CloseTimeout; - UpdateCloseTimeout; -end; - -procedure TNotificationWindow.UpdateCloseTimeout; -begin - Take(Self) - .CancelDelays(CloseDelayID) - .IfThen(CloseTimeout > 0) - {** - * Wait "long", if the auto close feature is possible - *} - .IfThen(AutoClosePossible) - .EachDelay(CloseTimeout, - function(AQ: TAQ; O: TObject): Boolean - begin - if AutoClosePossible then - Close - else - UpdateCloseTimeout; - Result := True; - end, CloseDelayID) - {** - * Wait "short" (polling), if the auto close feature isn't possible - *} - .IfElse - .EachDelay(100, - function(AQ: TAQ; O: TObject): Boolean - begin - UpdateCloseTimeout; - Result := True; - end) - .IfEnd - .IfEnd; -end; - -{** TNotificationStack **} - -constructor TNotificationStack.Create; -begin - FList := TNotificationList.Create(False); - - FInPositionAnimationDuration := 1000; - FInAlphaAnimationDuration := 800; - FOutPositionAnimationDuration := 500; - FOutAlphaAnimationDuration := 300; -end; - -destructor TNotificationStack.Destroy; -begin - FList.OwnsObjects := True; - FList.Free; - inherited Destroy; -end; - -procedure TNotificationStack.UpdatePositions; -var - Stack: TAQ; - WindowIndex, TopPosition: Integer; -begin - Stack := TAQ.Managed; - for WindowIndex := List.Count - 1 downto 0 do - if not List[WindowIndex].FClosed then - Stack.Add(List[WindowIndex]); - if Stack.Count = 0 then - begin - Stack.Die; - Exit; - end; - - TopPosition := Screen.WorkAreaRect.Bottom; - WindowIndex := 0; - - Stack - .CancelAnimations(PositionAnimationID) - .Each( - function(AQ: TAQ; O: TObject):Boolean - var - TargetNotf: TNotificationWindow absolute O; - AniPlugin: TAQPControlAnimations; - begin - Dec(TopPosition, TargetNotf.Height); - - AniPlugin := Take(O).Plugin; - AniPlugin.BoundsAnimation( - Screen.WorkAreaRect.Right - TargetNotf.Width, - TopPosition, -1, -1, - IfThen(WindowIndex = 0, InPositionAnimationDuration div 2, InPositionAnimationDuration), - PositionAnimationID, TAQ.Ease(etBack, emInInverted)); - AniPlugin.AlphaBlendAnimation(MAXBYTE, InAlphaAnimationDuration, - AlphaAnimationID, TAQ.Ease(etSinus)); - - Inc(WindowIndex); - Result := True; - end); -end; - -procedure TNotificationStack.Add(NotificationWindow: TNotificationWindow); -begin - NotificationWindow.FStack := Self; - List.Add(NotificationWindow); - - NotificationWindow.Left := Screen.WorkAreaRect.Right - NotificationWindow.Width; - NotificationWindow.Top := Screen.PrimaryMonitor.BoundsRect.Bottom; - ShowWindow(NotificationWindow.WindowHandle, SW_SHOWNOACTIVATE); - NotificationWindow.Visible := True; - NotificationWindow.AlphaBlend := True; - UpdatePositions; -end; - -procedure TNotificationStack.Close(NotificationWindow: TNotificationWindow); -var - NextFocusedWindowIndex: Integer; - AniPlugin: TAQPControlAnimations; -begin - if not List.Contains(NotificationWindow) then - Exit; - - AniPlugin := Take(NotificationWindow) - .CancelAnimations - .Plugin; - AniPlugin.BoundsAnimation(Screen.WorkAreaRect.Right, NotificationWindow.Top, -1, -1, - OutPositionAnimationDuration, 0, - TAQ.Ease(etCubic, emInInverted)); - AniPlugin.AlphaBlendAnimation(0, OutAlphaAnimationDuration, 0, TAQ.Ease(etSinus), - {** - * Handler for the OnComplete event - *} - procedure(Sender: TObject) - begin - NotificationWindow.Release; - end); - - NextFocusedWindowIndex := List.Remove(NotificationWindow); - - if (Screen.ActiveForm = NotificationWindow) and (List.Count > 0) then - begin - Dec(NextFocusedWindowIndex); - if NextFocusedWindowIndex < 0 then - NextFocusedWindowIndex:=0; - List[NextFocusedWindowIndex].SetFocus; - end; - - UpdatePositions; -end; - -procedure TNotificationStack.CloseAll(Animate: Boolean); -var - cc: Integer; -begin - for cc := List.Count - 1 downto 0 do - if Animate then - List[cc].Close - else - begin - List[cc].Release; - List.Delete(cc); - end; -end; - -end.