From 3dc4f4bb1c8a8828f9ce89ac9073df78f59b79c8 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Fri, 7 Aug 2020 01:35:28 +0100 Subject: [PATCH 01/20] * project files --- Examples/AnimatedAlign/AnimatedAlign.dproj | 201 ++++++++++- .../AnimatedAlignFMX/AnimatedAlignFMX.dproj | 320 +++++++++++++---- Examples/CustomPlugin/CustomPlugin.dproj | 4 +- Examples/EasingSuite/EasingSuite.dproj | 4 +- Examples/Examples.groupproj | 18 +- Examples/MethodTests/MethodTests.dproj | 4 +- Examples/PulsateEdits/PulsateEdits.dproj | 2 +- .../SlidingButtonsFMX/SlidingButtonsFMX.dproj | 331 ++++++++++++++---- Examples/SlidingForm/SlidingForm.dproj | 201 ++++++++++- Examples/StickyTools/StickyTools.dproj | 4 +- Examples/SyncScroll/SyncScroll.dproj | 4 +- 11 files changed, 924 insertions(+), 169 deletions(-) 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/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/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/Examples.groupproj b/Examples/Examples.groupproj index 5c2cb17..f81c330 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/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/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/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/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) From 23c690ef619992bccce7fa151daf87679e382013 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Fri, 7 Aug 2020 01:46:07 +0100 Subject: [PATCH 02/20] + Notification.Base Form (VCL only) This replaces NotificationWindows unit --- NotificationFramework/Notifications.Base.dfm | 24 +++ NotificationFramework/Notifications.Base.pas | 151 +++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 NotificationFramework/Notifications.Base.dfm create mode 100644 NotificationFramework/Notifications.Base.pas diff --git a/NotificationFramework/Notifications.Base.dfm b/NotificationFramework/Notifications.Base.dfm new file mode 100644 index 0000000..b1d31e3 --- /dev/null +++ b/NotificationFramework/Notifications.Base.dfm @@ -0,0 +1,24 @@ +object NotificationWindow: TNotificationWindow + Left = 0 + Top = 0 + AlphaBlendValue = 0 + BorderStyle = bsToolWindow + Caption = 'NotificationWindow' + 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.pas b/NotificationFramework/Notifications.Base.pas new file mode 100644 index 0000000..be70768 --- /dev/null +++ b/NotificationFramework/Notifications.Base.pas @@ -0,0 +1,151 @@ +unit Notifications.Base; + +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 + TNotificationWindow = class; + TCloseProcedure= procedure (const NotificationWindows: TNotificationWindow) of object; + 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; + FClosed: Boolean; + FCloseProc:TCloseProcedure; + + 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; + 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; + if assigned(FCloseProc) then + FCloseProc(Self) + else + raise Exception.Create('Close Procedure in not set in Manager'); +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; + +end. From 37669d9750b4dace6305ebac4554f40181107b80 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Fri, 7 Aug 2020 01:46:37 +0100 Subject: [PATCH 03/20] + Notifications Manager (VCL only) --- .../Notifications.Manager.pas | 194 ++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 NotificationFramework/Notifications.Manager.pas diff --git a/NotificationFramework/Notifications.Manager.pas b/NotificationFramework/Notifications.Manager.pas new file mode 100644 index 0000000..0344a5e --- /dev/null +++ b/NotificationFramework/Notifications.Manager.pas @@ -0,0 +1,194 @@ +unit Notifications.Manager; + +interface + +uses + System.Generics.Collections + {$IFDEF FMX} + {$ELSE} + , Vcl.Forms + , Vcl.Controls + , Winapi.Windows + , Winapi.Messages + , Notifications.Base; + {$ENDIF} + +type + TNotificationManager = 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(const NotificationWindow: TNotificationWindow); + procedure Close(const NotificationWindow: TNotificationWindow); + procedure CloseAll(const 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 + +uses + AQPControlAnimations, AnyiQuack, System.Math; + +{ TNotificationManager } + +type + TInnerWindow = class (TForm) + + end; + +procedure TNotificationManager.Add(const NotificationWindow: TNotificationWindow); +begin + NotificationWindow.CloseProc:=Close; + List.Add(NotificationWindow); + + NotificationWindow.Left := Screen.WorkAreaRect.Right - NotificationWindow.Width; + NotificationWindow.Top := Screen.PrimaryMonitor.BoundsRect.Bottom; + {$IFDEF FMX} + {$ELSE} + ShowWindow(TInnerWindow(NotificationWindow).WindowHandle, SW_SHOWNOACTIVATE); + NotificationWindow.AlphaBlend := True; + {$ENDIF} + NotificationWindow.Visible := True; + UpdatePositions; +end; + +procedure TNotificationManager.Close(const 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 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 + List[cc].Release; + List.Delete(cc); + end; +end; + +constructor TNotificationManager.Create; +begin + inherited; + FList := TNotificationList.Create(False); + + FInPositionAnimationDuration := 1000; + FInAlphaAnimationDuration := 800; + FOutPositionAnimationDuration := 500; + FOutAlphaAnimationDuration := 300; +end; + +destructor TNotificationManager.Destroy; +begin + FList.OwnsObjects := True; + FList.Free; + inherited; +end; + +procedure TNotificationManager.UpdatePositions; +var + Stack: TAQ; + WindowIndex, TopPosition: 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; + + 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; + +end. From 280c9921759f23ba60d6e822a9ca549d4f6fd3a4 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Fri, 7 Aug 2020 01:47:04 +0100 Subject: [PATCH 04/20] * gitignore --- .gitignore | 1 + Examples/AnimatedAlign/AnimatedAlign.res | Bin 59328 -> 0 bytes Examples/CustomPlugin/CustomPlugin.res | Bin 5280 -> 0 bytes Examples/EasingSuite/EasingSuite.res | Bin 5280 -> 0 bytes Examples/MethodTests/MethodTests.res | Bin 5280 -> 0 bytes .../NotificationWindows/NotificationExample.res | Bin 59220 -> 0 bytes Examples/PulsateEdits/PulsateEdits.res | Bin 59212 -> 0 bytes Examples/SlidingForm/SlidingForm.res | Bin 6744 -> 0 bytes Examples/StickyTools/StickyTools.res | Bin 5280 -> 0 bytes Examples/SyncScroll/SyncScroll.res | Bin 5280 -> 0 bytes 10 files changed, 1 insertion(+) delete mode 100644 Examples/AnimatedAlign/AnimatedAlign.res delete mode 100644 Examples/CustomPlugin/CustomPlugin.res delete mode 100644 Examples/EasingSuite/EasingSuite.res delete mode 100644 Examples/MethodTests/MethodTests.res delete mode 100644 Examples/NotificationWindows/NotificationExample.res delete mode 100644 Examples/PulsateEdits/PulsateEdits.res delete mode 100644 Examples/SlidingForm/SlidingForm.res delete mode 100644 Examples/StickyTools/StickyTools.res delete mode 100644 Examples/SyncScroll/SyncScroll.res diff --git a/.gitignore b/.gitignore index 0845947..a8f6ada 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ Examples/SlidingButtonsFMX/Android/ Examples/SlidingButtonsFMX/OSX32/ Examples/AnimatedAlignFMX/Android/ Examples/AnimatedAlignFMX/OSX32/ +*.res diff --git a/Examples/AnimatedAlign/AnimatedAlign.res b/Examples/AnimatedAlign/AnimatedAlign.res deleted file mode 100644 index f1bbbfc680cee39450f3fdba3fc809c13116eac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59328 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 diff --git a/Examples/CustomPlugin/CustomPlugin.res b/Examples/CustomPlugin/CustomPlugin.res deleted file mode 100644 index 2448e2776408ecec4fe998c77de53f1158ad8d6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5280 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 diff --git a/Examples/SlidingForm/SlidingForm.res b/Examples/SlidingForm/SlidingForm.res deleted file mode 100644 index 4ec15735bf2d36a5272e1fb52855ad8daf56333e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6744 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 G Date: Fri, 7 Aug 2020 01:47:38 +0100 Subject: [PATCH 05/20] * Notification Example (VCL only) --- Examples/NotificationWindows/Main.pas | 21 +- .../MyNotificationWindow.dfm | 5 +- .../MyNotificationWindow.pas | 2 +- .../NotificationExample.dpr | 7 +- .../NotificationExample.dproj | 669 +++++++++++++++++- 5 files changed, 678 insertions(+), 26 deletions(-) diff --git a/Examples/NotificationWindows/Main.pas b/Examples/NotificationWindows/Main.pas index ff025df..108ad2f 100644 --- a/Examples/NotificationWindows/Main.pas +++ b/Examples/NotificationWindows/Main.pas @@ -12,8 +12,9 @@ interface Vcl.StdCtrls, Vcl.ExtCtrls, - NotificationWindows, - MyNotificationWindow; + Notifications.Base, + MyNotificationWindow, + Notifications.Manager; type TMainForm = class(TForm) @@ -31,7 +32,7 @@ TMainForm = class(TForm) procedure CloseAllButtonClick(Sender: TObject); procedure CloseLastButtonClick(Sender: TObject); private - FStack: TNotificationStack; + FManager: TNotificationManager; FLastNotificationWindow: TNotificationWindow; end; @@ -50,12 +51,12 @@ procedure TMainForm.AddButtonClick(Sender: TObject); if AutoCloseCheckBox.Checked then MNW.CloseTimeout := 5000; FLastNotificationWindow := MNW; - FStack.Add(MNW); + FManager.Add(MNW); end; procedure TMainForm.CloseAllButtonClick(Sender: TObject); begin - FStack.CloseAll; + FManager.CloseAll; end; procedure TMainForm.CloseLastButtonClick(Sender: TObject); @@ -63,10 +64,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 +77,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..a72269c 100644 --- a/Examples/NotificationWindows/MyNotificationWindow.dfm +++ b/Examples/NotificationWindows/MyNotificationWindow.dfm @@ -1,8 +1,9 @@ inherited MyNotificationWindow: TMyNotificationWindow 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..65f2905 100644 --- a/Examples/NotificationWindows/MyNotificationWindow.pas +++ b/Examples/NotificationWindows/MyNotificationWindow.pas @@ -15,7 +15,7 @@ interface Vcl.StdCtrls, Vcl.ComCtrls, - NotificationWindows, + Notifications.Base, AnyiQuack; type diff --git a/Examples/NotificationWindows/NotificationExample.dpr b/Examples/NotificationWindows/NotificationExample.dpr index 2f0fc28..0516fd5 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 in '..\..\NotificationFramework\Notifications.Base.pas' {NotificationWindow}, + Notifications.Manager in '..\..\NotificationFramework\Notifications.Manager.pas', + Main in 'Main.pas' {MainForm}, + MyNotificationWindow in 'MyNotificationWindow.pas' {MyNotificationWindow}; {$R *.res} diff --git a/Examples/NotificationWindows/NotificationExample.dproj b/Examples/NotificationWindows/NotificationExample.dproj index 4e03c80..2d7b670 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,9 @@ true PerMonitor + true + 1033 + $(BDS)\bin\delphi_PROJECTICON.ico false @@ -103,16 +109,20 @@ MainSource - -
MainForm
-
- +
NotificationWindow
+ dfm +
+ + +
MainForm
+ dfm
-
NotificationWindow1
+
MyNotificationWindow
+ dfm
Cfg_2 @@ -164,15 +174,656 @@ 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 + + + + + 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 + From bf921b303ecaefd334a56da24338b23e285571ef Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Fri, 7 Aug 2020 01:57:58 +0100 Subject: [PATCH 06/20] Rename Notifications.Base to Notifications.Base.Win --- .../{Notifications.Base.dfm => Notifications.Base.Win.dfm} | 0 .../{Notifications.Base.pas => Notifications.Base.Win.pas} | 2 +- NotificationFramework/Notifications.Manager.pas | 4 +++- 3 files changed, 4 insertions(+), 2 deletions(-) rename NotificationFramework/{Notifications.Base.dfm => Notifications.Base.Win.dfm} (100%) rename NotificationFramework/{Notifications.Base.pas => Notifications.Base.Win.pas} (99%) diff --git a/NotificationFramework/Notifications.Base.dfm b/NotificationFramework/Notifications.Base.Win.dfm similarity index 100% rename from NotificationFramework/Notifications.Base.dfm rename to NotificationFramework/Notifications.Base.Win.dfm diff --git a/NotificationFramework/Notifications.Base.pas b/NotificationFramework/Notifications.Base.Win.pas similarity index 99% rename from NotificationFramework/Notifications.Base.pas rename to NotificationFramework/Notifications.Base.Win.pas index be70768..934c6b9 100644 --- a/NotificationFramework/Notifications.Base.pas +++ b/NotificationFramework/Notifications.Base.Win.pas @@ -1,4 +1,4 @@ -unit Notifications.Base; +unit Notifications.Base.Win; interface diff --git a/NotificationFramework/Notifications.Manager.pas b/NotificationFramework/Notifications.Manager.pas index 0344a5e..1324714 100644 --- a/NotificationFramework/Notifications.Manager.pas +++ b/NotificationFramework/Notifications.Manager.pas @@ -5,13 +5,15 @@ interface uses System.Generics.Collections {$IFDEF FMX} + , FMX.Forms {$ELSE} , Vcl.Forms , Vcl.Controls , Winapi.Windows , Winapi.Messages - , Notifications.Base; + , Notifications.Base.Win {$ENDIF} + ; type TNotificationManager = class From 14dbc8fdf363d32dd56b810a01b9486095d0cddc Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Fri, 7 Aug 2020 01:58:16 +0100 Subject: [PATCH 07/20] * VCL Notifications Example --- Examples/NotificationWindows/Main.pas | 2 +- Examples/NotificationWindows/MyNotificationWindow.pas | 2 +- Examples/NotificationWindows/NotificationExample.dpr | 2 +- Examples/NotificationWindows/NotificationExample.dproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Examples/NotificationWindows/Main.pas b/Examples/NotificationWindows/Main.pas index 108ad2f..f9ffcc6 100644 --- a/Examples/NotificationWindows/Main.pas +++ b/Examples/NotificationWindows/Main.pas @@ -12,7 +12,7 @@ interface Vcl.StdCtrls, Vcl.ExtCtrls, - Notifications.Base, + Notifications.Base.Win, MyNotificationWindow, Notifications.Manager; diff --git a/Examples/NotificationWindows/MyNotificationWindow.pas b/Examples/NotificationWindows/MyNotificationWindow.pas index 65f2905..70a42df 100644 --- a/Examples/NotificationWindows/MyNotificationWindow.pas +++ b/Examples/NotificationWindows/MyNotificationWindow.pas @@ -15,7 +15,7 @@ interface Vcl.StdCtrls, Vcl.ComCtrls, - Notifications.Base, + Notifications.Base.Win, AnyiQuack; type diff --git a/Examples/NotificationWindows/NotificationExample.dpr b/Examples/NotificationWindows/NotificationExample.dpr index 0516fd5..e5a8063 100644 --- a/Examples/NotificationWindows/NotificationExample.dpr +++ b/Examples/NotificationWindows/NotificationExample.dpr @@ -4,7 +4,7 @@ uses Forms, AnyiQuack in '..\..\AnyiQuack.pas', AQPControlAnimations in '..\..\AQPControlAnimations.pas', - Notifications.Base in '..\..\NotificationFramework\Notifications.Base.pas' {NotificationWindow}, + Notifications.Base.Win in '..\..\NotificationFramework\Notifications.Base.Win.pas' {NotificationWindow}, Notifications.Manager in '..\..\NotificationFramework\Notifications.Manager.pas', Main in 'Main.pas' {MainForm}, MyNotificationWindow in 'MyNotificationWindow.pas' {MyNotificationWindow}; diff --git a/Examples/NotificationWindows/NotificationExample.dproj b/Examples/NotificationWindows/NotificationExample.dproj index 2d7b670..aba167e 100644 --- a/Examples/NotificationWindows/NotificationExample.dproj +++ b/Examples/NotificationWindows/NotificationExample.dproj @@ -111,7 +111,7 @@ - +
NotificationWindow
dfm
From 27a478e0105dafc6c2eef2cacf7c9421112a3064 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Fri, 7 Aug 2020 02:02:07 +0100 Subject: [PATCH 08/20] Rename Notifications.Base.VCL to Notifications.Base.VCL --- Examples/NotificationWindows/Main.pas | 2 +- Examples/NotificationWindows/MyNotificationWindow.pas | 2 +- Examples/NotificationWindows/NotificationExample.dpr | 2 +- Examples/NotificationWindows/NotificationExample.dproj | 2 +- .../{Notifications.Base.Win.dfm => Notifications.Base.VCL.dfm} | 0 .../{Notifications.Base.Win.pas => Notifications.Base.VCL.pas} | 2 +- NotificationFramework/Notifications.Manager.pas | 2 +- 7 files changed, 6 insertions(+), 6 deletions(-) rename NotificationFramework/{Notifications.Base.Win.dfm => Notifications.Base.VCL.dfm} (100%) rename NotificationFramework/{Notifications.Base.Win.pas => Notifications.Base.VCL.pas} (99%) diff --git a/Examples/NotificationWindows/Main.pas b/Examples/NotificationWindows/Main.pas index f9ffcc6..677e86c 100644 --- a/Examples/NotificationWindows/Main.pas +++ b/Examples/NotificationWindows/Main.pas @@ -12,7 +12,7 @@ interface Vcl.StdCtrls, Vcl.ExtCtrls, - Notifications.Base.Win, + Notifications.Base.VCL, MyNotificationWindow, Notifications.Manager; diff --git a/Examples/NotificationWindows/MyNotificationWindow.pas b/Examples/NotificationWindows/MyNotificationWindow.pas index 70a42df..53d0c9f 100644 --- a/Examples/NotificationWindows/MyNotificationWindow.pas +++ b/Examples/NotificationWindows/MyNotificationWindow.pas @@ -15,7 +15,7 @@ interface Vcl.StdCtrls, Vcl.ComCtrls, - Notifications.Base.Win, + Notifications.Base.VCL, AnyiQuack; type diff --git a/Examples/NotificationWindows/NotificationExample.dpr b/Examples/NotificationWindows/NotificationExample.dpr index e5a8063..4b89af4 100644 --- a/Examples/NotificationWindows/NotificationExample.dpr +++ b/Examples/NotificationWindows/NotificationExample.dpr @@ -4,7 +4,7 @@ uses Forms, AnyiQuack in '..\..\AnyiQuack.pas', AQPControlAnimations in '..\..\AQPControlAnimations.pas', - Notifications.Base.Win in '..\..\NotificationFramework\Notifications.Base.Win.pas' {NotificationWindow}, + Notifications.Base.VCL in '..\..\NotificationFramework\Notifications.Base.VCL.pas' {NotificationWindow}, Notifications.Manager in '..\..\NotificationFramework\Notifications.Manager.pas', Main in 'Main.pas' {MainForm}, MyNotificationWindow in 'MyNotificationWindow.pas' {MyNotificationWindow}; diff --git a/Examples/NotificationWindows/NotificationExample.dproj b/Examples/NotificationWindows/NotificationExample.dproj index aba167e..db6e495 100644 --- a/Examples/NotificationWindows/NotificationExample.dproj +++ b/Examples/NotificationWindows/NotificationExample.dproj @@ -111,7 +111,7 @@ - +
NotificationWindow
dfm
diff --git a/NotificationFramework/Notifications.Base.Win.dfm b/NotificationFramework/Notifications.Base.VCL.dfm similarity index 100% rename from NotificationFramework/Notifications.Base.Win.dfm rename to NotificationFramework/Notifications.Base.VCL.dfm diff --git a/NotificationFramework/Notifications.Base.Win.pas b/NotificationFramework/Notifications.Base.VCL.pas similarity index 99% rename from NotificationFramework/Notifications.Base.Win.pas rename to NotificationFramework/Notifications.Base.VCL.pas index 934c6b9..e787593 100644 --- a/NotificationFramework/Notifications.Base.Win.pas +++ b/NotificationFramework/Notifications.Base.VCL.pas @@ -1,4 +1,4 @@ -unit Notifications.Base.Win; +unit Notifications.Base.VCL; interface diff --git a/NotificationFramework/Notifications.Manager.pas b/NotificationFramework/Notifications.Manager.pas index 1324714..8337d33 100644 --- a/NotificationFramework/Notifications.Manager.pas +++ b/NotificationFramework/Notifications.Manager.pas @@ -11,7 +11,7 @@ interface , Vcl.Controls , Winapi.Windows , Winapi.Messages - , Notifications.Base.Win + , Notifications.Base.VCL {$ENDIF} ; From c1414087cc342c7589c05cccec69774647f8132c Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Sat, 8 Aug 2020 01:45:21 +0100 Subject: [PATCH 09/20] Fix bug in FMX In FMX, TForm does not inherit from TControl --- AQPControlAnimations.pas | 61 ++++++++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 9 deletions(-) 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 From 0cc13f22bf610f9912c4ee4a4d9b73870d084c9a Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Sat, 8 Aug 2020 01:47:55 +0100 Subject: [PATCH 10/20] + Notification Manager and separate base forms for notifications (VCL, FMX) --- .../Notifications.Base.VCL.dfm | 4 +- .../Notifications.Base.VCL.pas | 22 +-- .../Notifications.FMX.Base.fmx | 13 ++ .../Notifications.FMX.Base.pas | 131 ++++++++++++++++++ .../Notifications.Manager.pas | 41 +++++- 5 files changed, 194 insertions(+), 17 deletions(-) create mode 100644 NotificationFramework/Notifications.FMX.Base.fmx create mode 100644 NotificationFramework/Notifications.FMX.Base.pas diff --git a/NotificationFramework/Notifications.Base.VCL.dfm b/NotificationFramework/Notifications.Base.VCL.dfm index b1d31e3..66be5cf 100644 --- a/NotificationFramework/Notifications.Base.VCL.dfm +++ b/NotificationFramework/Notifications.Base.VCL.dfm @@ -1,9 +1,9 @@ -object NotificationWindow: TNotificationWindow +object NotificationWindowVCL: TNotificationWindowVCL Left = 0 Top = 0 AlphaBlendValue = 0 BorderStyle = bsToolWindow - Caption = 'NotificationWindow' + Caption = 'NotificationWindowVCL' ClientHeight = 66 ClientWidth = 350 Color = clBtnFace diff --git a/NotificationFramework/Notifications.Base.VCL.pas b/NotificationFramework/Notifications.Base.VCL.pas index e787593..5d22279 100644 --- a/NotificationFramework/Notifications.Base.VCL.pas +++ b/NotificationFramework/Notifications.Base.VCL.pas @@ -20,9 +20,9 @@ interface AQPControlAnimations; type - TNotificationWindow = class; - TCloseProcedure= procedure (const NotificationWindows: TNotificationWindow) of object; - TNotificationWindow = class(TForm) + TNotificationWindowVCL = class; + TCloseProcedure= procedure (const NotificationWindows: TNotificationWindowVCL) of object; + TNotificationWindowVCL = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private @@ -59,7 +59,7 @@ TNotificationWindow = class(TForm) * * 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 SET IT IN THIS CLASS *} property CloseProc: TCloseProcedure read FCloseProc write FCloseProc; @@ -72,7 +72,7 @@ implementation {** TNotificationWindow **} -constructor TNotificationWindow.Create(AOwner: TComponent); +constructor TNotificationWindowVCL.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -82,12 +82,12 @@ constructor TNotificationWindow.Create(AOwner: TComponent); AlphaBlend := True; end; -function TNotificationWindow.AutoClosePossible: Boolean; +function TNotificationWindowVCL.AutoClosePossible: Boolean; begin Result := (Screen.ActiveForm <> Self) and not PtInRect(BoundsRect, Mouse.CursorPos); end; -procedure TNotificationWindow.Close; +procedure TNotificationWindowVCL.Close; begin FClosed := True; if assigned(FCloseProc) then @@ -96,19 +96,19 @@ procedure TNotificationWindow.Close; raise Exception.Create('Close Procedure in not set in Manager'); end; -procedure TNotificationWindow.FormClose(Sender: TObject; var Action: TCloseAction); +procedure TNotificationWindowVCL.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caNone; Close; end; -procedure TNotificationWindow.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +procedure TNotificationWindowVCL.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_ESCAPE then Close; end; -procedure TNotificationWindow.SetCloseTimeout(CloseTimeout: Integer); +procedure TNotificationWindowVCL.SetCloseTimeout(CloseTimeout: Integer); begin if CloseTimeout = FCloseTimeout then Exit; @@ -116,7 +116,7 @@ procedure TNotificationWindow.SetCloseTimeout(CloseTimeout: Integer); UpdateCloseTimeout; end; -procedure TNotificationWindow.UpdateCloseTimeout; +procedure TNotificationWindowVCL.UpdateCloseTimeout; begin Take(Self) .CancelDelays(CloseDelayID) diff --git a/NotificationFramework/Notifications.FMX.Base.fmx b/NotificationFramework/Notifications.FMX.Base.fmx new file mode 100644 index 0000000..c49d996 --- /dev/null +++ b/NotificationFramework/Notifications.FMX.Base.fmx @@ -0,0 +1,13 @@ +object NotificationWindowFMX: TNotificationWindowFMX + Left = 0 + Top = 0 + 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..e746f3e --- /dev/null +++ b/NotificationFramework/Notifications.FMX.Base.pas @@ -0,0 +1,131 @@ +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; + 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; + + procedure UpdateCloseTimeout; + + procedure SetCloseTimeout(CloseTimeout: Integer); + protected + 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 + *} + property CloseProc: TCloseProcedure read FCloseProc write FCloseProc; + + property Closed: Boolean read FClosed write FClosed; + end; + +implementation + +uses + AnyiQuack; + +{$R *.fmx} + +procedure TNotificationWindowFMX.FormCreate(Sender: TObject); +begin + FCloseTimeout:=0; + FClosed:=false; + FCloseProc:=nil; +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 + FCloseProc(Self) + 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) + .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 index 8337d33..2d09479 100644 --- a/NotificationFramework/Notifications.Manager.pas +++ b/NotificationFramework/Notifications.Manager.pas @@ -6,6 +6,8 @@ interface System.Generics.Collections {$IFDEF FMX} , FMX.Forms + , FMX.Platform + , Notifications.FMX.Base {$ELSE} , Vcl.Forms , Vcl.Controls @@ -16,6 +18,11 @@ interface ; type + {$IFDEF FMX} + TNotificationWindow = TNotificationWindowFMX; + {$ELSE} + TNotificationWindow = TNotificationWindowVCL; + {$ENDIF} TNotificationManager = class private const @@ -67,14 +74,22 @@ TInnerWindow = class (TForm) end; procedure TNotificationManager.Add(const NotificationWindow: TNotificationWindow); +{$IFDEF FMX} +var + winService: IFMXWindowService; +{$ENDIF} begin + NotificationWindow.Visible:=false; NotificationWindow.CloseProc:=Close; List.Add(NotificationWindow); NotificationWindow.Left := Screen.WorkAreaRect.Right - NotificationWindow.Width; - NotificationWindow.Top := Screen.PrimaryMonitor.BoundsRect.Bottom; {$IFDEF FMX} + NotificationWindow.Top := Screen.Displays[0].BoundsRect.Bottom; + if TPlatformServices.Current.SupportsPlatformService(IFMXWindowService, winService) then + winService.ShowWindow(NotificationWindow); {$ELSE} + NotificationWindow.Top := Screen.PrimaryMonitor.BoundsRect.Bottom; ShowWindow(TInnerWindow(NotificationWindow).WindowHandle, SW_SHOWNOACTIVATE); NotificationWindow.AlphaBlend := True; {$ENDIF} @@ -87,6 +102,9 @@ procedure TNotificationManager.Close(const NotificationWindow: var NextFocusedWindowIndex: Integer; AniPlugin: TAQPControlAnimations; +{$IFDEF FMX} + winService: IFMXWindowService; +{$ENDIF} begin if not List.Contains(NotificationWindow) then Exit; @@ -103,7 +121,13 @@ procedure TNotificationManager.Close(const NotificationWindow: *} 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); @@ -113,7 +137,12 @@ procedure TNotificationManager.Close(const NotificationWindow: Dec(NextFocusedWindowIndex); if NextFocusedWindowIndex < 0 then NextFocusedWindowIndex:=0; - List[NextFocusedWindowIndex].SetFocus; + List[NextFocusedWindowIndex]. + {$IFDEF FMX} + Active:=true; + {$ELSE} + SetFocus; + {$ENDIF} end; UpdatePositions; @@ -181,11 +210,15 @@ procedure TNotificationManager.UpdatePositions; AniPlugin := Take(O).Plugin; AniPlugin.BoundsAnimation( - Screen.WorkAreaRect.Right - TargetNotf.Width, + {$IFDEF FMX} + Screen.Displays[0].WorkareaRect.Right + {$ELSE} + Screen.WorkAreaRect.Right + {$ENDIF} - TargetNotf.Width, TopPosition, -1, -1, IfThen(WindowIndex = 0, InPositionAnimationDuration div 2, InPositionAnimationDuration), PositionAnimationID, TAQ.Ease(etBack, emInInverted)); - AniPlugin.AlphaBlendAnimation(MAXBYTE, InAlphaAnimationDuration, + AniPlugin.AlphaBlendAnimation(high(Byte), InAlphaAnimationDuration, AlphaAnimationID, TAQ.Ease(etSinus)); Inc(WindowIndex); From d825dd068177f37f520290d3cbb0b949b2a684d1 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Sat, 8 Aug 2020 01:50:07 +0100 Subject: [PATCH 11/20] + Notification FMX example and update the VCL example --- Examples/Examples.groupproj | 20 +- Examples/NotificationWindows/Main.pas | 4 +- .../MyNotificationWindow.dfm | 2 +- .../MyNotificationWindow.pas | 36 +- .../NotificationExample.dpr | 4 +- .../NotificationExample.dproj | 11 +- Examples/NotificationWindowsFMX/Main.fmx | 114 ++ Examples/NotificationWindowsFMX/Main.pas | 91 ++ .../MyNotificationWindow.fmx | 36 + .../MyNotificationWindow.pas | 72 ++ .../NotificationExampleFMX.dpr | 19 + .../NotificationExampleFMX.dproj | 996 ++++++++++++++++++ 12 files changed, 1367 insertions(+), 38 deletions(-) create mode 100644 Examples/NotificationWindowsFMX/Main.fmx create mode 100644 Examples/NotificationWindowsFMX/Main.pas create mode 100644 Examples/NotificationWindowsFMX/MyNotificationWindow.fmx create mode 100644 Examples/NotificationWindowsFMX/MyNotificationWindow.pas create mode 100644 Examples/NotificationWindowsFMX/NotificationExampleFMX.dpr create mode 100644 Examples/NotificationWindowsFMX/NotificationExampleFMX.dproj diff --git a/Examples/Examples.groupproj b/Examples/Examples.groupproj index f81c330..b52c9d6 100644 --- a/Examples/Examples.groupproj +++ b/Examples/Examples.groupproj @@ -33,7 +33,7 @@ - + @@ -137,14 +137,14 @@ - - + + - - + + - - + + @@ -156,13 +156,13 @@ - + - + - + diff --git a/Examples/NotificationWindows/Main.pas b/Examples/NotificationWindows/Main.pas index 677e86c..f3c8da9 100644 --- a/Examples/NotificationWindows/Main.pas +++ b/Examples/NotificationWindows/Main.pas @@ -45,9 +45,9 @@ 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; diff --git a/Examples/NotificationWindows/MyNotificationWindow.dfm b/Examples/NotificationWindows/MyNotificationWindow.dfm index a72269c..a52d553 100644 --- a/Examples/NotificationWindows/MyNotificationWindow.dfm +++ b/Examples/NotificationWindows/MyNotificationWindow.dfm @@ -1,4 +1,4 @@ -inherited MyNotificationWindow: TMyNotificationWindow +inherited MyNotificationWindowVCL: TMyNotificationWindowVCL Caption = 'My custom derived notification window' ClientHeight = 119 CustomTitleBar.Height = 0 diff --git a/Examples/NotificationWindows/MyNotificationWindow.pas b/Examples/NotificationWindows/MyNotificationWindow.pas index 53d0c9f..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, - - Notifications.Base.VCL, - 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 4b89af4..0bf4b4b 100644 --- a/Examples/NotificationWindows/NotificationExample.dpr +++ b/Examples/NotificationWindows/NotificationExample.dpr @@ -4,10 +4,10 @@ uses Forms, AnyiQuack in '..\..\AnyiQuack.pas', AQPControlAnimations in '..\..\AQPControlAnimations.pas', - Notifications.Base.VCL in '..\..\NotificationFramework\Notifications.Base.VCL.pas' {NotificationWindow}, + 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' {MyNotificationWindow}; + MyNotificationWindow in 'MyNotificationWindow.pas' {MyNotificationWindowVCL}; {$R *.res} diff --git a/Examples/NotificationWindows/NotificationExample.dproj b/Examples/NotificationWindows/NotificationExample.dproj index db6e495..31daf57 100644 --- a/Examples/NotificationWindows/NotificationExample.dproj +++ b/Examples/NotificationWindows/NotificationExample.dproj @@ -90,6 +90,7 @@ true 1033 $(BDS)\bin\delphi_PROJECTICON.ico + Debug
false @@ -112,7 +113,7 @@ -
NotificationWindow
+
NotificationWindowVCL
dfm
@@ -121,7 +122,7 @@ dfm -
MyNotificationWindow
+
MyNotificationWindowVCL
dfm
@@ -183,6 +184,12 @@ False + + + NotificationExample.exe + true + + NotificationExample.exe diff --git a/Examples/NotificationWindowsFMX/Main.fmx b/Examples/NotificationWindowsFMX/Main.fmx new file mode 100644 index 0000000..f725d3b --- /dev/null +++ b/Examples/NotificationWindowsFMX/Main.fmx @@ -0,0 +1,114 @@ +object FormMain: TFormMain + Left = 0 + Top = 0 + Caption = 'Main' + ClientHeight = 246 + ClientWidth = 291 + 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 = 251.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 + Align = Top + 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 = 251.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + Text = 'Auto close after 5 sec.' + TextSettings.Font.Size = 14.000000000000000000 + end + object cbAutoCreateEverySec: TCheckBox + Align = Top + 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 = 251.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + Text = 'Auto create each second' + TextSettings.Font.Size = 14.000000000000000000 + OnClick = cbAutoCreateEverySecClick + end + object btnAdd: TButton + Align = Top + StyledSettings = [Family, Style, FontColor] + Margins.Left = 20.000000000000000000 + Margins.Right = 20.000000000000000000 + Position.X = 20.000000000000000000 + Position.Y = 101.000000000000000000 + Size.Width = 251.000000000000000000 + Size.Height = 57.000000000000000000 + Size.PlatformDefault = False + Text = 'Add Notification Window' + TextSettings.Font.Size = 14.000000000000000000 + OnClick = btnAddClick + end + object Layout1: TLayout + Align = Top + Margins.Left = 20.000000000000000000 + Margins.Top = 10.000000000000000000 + Margins.Right = 20.000000000000000000 + Position.X = 20.000000000000000000 + Position.Y = 168.000000000000000000 + Size.Width = 251.000000000000000000 + Size.Height = 50.000000000000000000 + Size.PlatformDefault = False + object btnCloseLast: TButton + Align = Left + StyledSettings = [Family, Style, FontColor] + Margins.Right = 20.000000000000000000 + Size.Width = 120.000000000000000000 + Size.Height = 50.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 = 131.000000000000000000 + Size.Width = 120.000000000000000000 + Size.Height = 50.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 +end diff --git a/Examples/NotificationWindowsFMX/Main.pas b/Examples/NotificationWindowsFMX/Main.pas new file mode 100644 index 0000000..e033545 --- /dev/null +++ b/Examples/NotificationWindowsFMX/Main.pas @@ -0,0 +1,91 @@ +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; + 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; + 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 := 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..bcc41d3 --- /dev/null +++ b/Examples/NotificationWindowsFMX/MyNotificationWindow.fmx @@ -0,0 +1,36 @@ +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 +end diff --git a/Examples/NotificationWindowsFMX/MyNotificationWindow.pas b/Examples/NotificationWindowsFMX/MyNotificationWindow.pas new file mode 100644 index 0000000..749f4b4 --- /dev/null +++ b/Examples/NotificationWindowsFMX/MyNotificationWindow.pas @@ -0,0 +1,72 @@ +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; + procedure btnActionClick(Sender: TObject); + private + { Private declarations } + protected + function AutoClosePossible: Boolean; override; + public + { Public declarations } + end; + +implementation + +uses + AnyiQuack; + +{$R *.fmx} + +{ 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 + + + + +
From 26652db70b6aac26ba0b6f1dba0358867ded2f74 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Sat, 8 Aug 2020 02:03:45 +0100 Subject: [PATCH 12/20] * gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a8f6ada..5c5b468 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ Examples/SlidingButtonsFMX/OSX32/ Examples/AnimatedAlignFMX/Android/ Examples/AnimatedAlignFMX/OSX32/ *.res +DevResources From 496bcc36b7bce5b4735f932ef27f9139e2f41f3b Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Sat, 8 Aug 2020 02:04:05 +0100 Subject: [PATCH 13/20] Clean up code --- AnyiQuack.pas | 8 +- .../NotificationWindows.dfm | 23 -- .../NotificationWindows.pas | 300 ------------------ 3 files changed, 5 insertions(+), 326 deletions(-) delete mode 100644 NotificationWindowsFramework/NotificationWindows.dfm delete mode 100644 NotificationWindowsFramework/NotificationWindows.pas 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/NotificationWindowsFramework/NotificationWindows.dfm b/NotificationWindowsFramework/NotificationWindows.dfm deleted file mode 100644 index 9a14b52..0000000 --- a/NotificationWindowsFramework/NotificationWindows.dfm +++ /dev/null @@ -1,23 +0,0 @@ -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 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. From a750d3c0321aa5dd934b3cebd3aafcd04a7d06ee Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Sat, 8 Aug 2020 02:36:06 +0100 Subject: [PATCH 14/20] * code The service showed the window in random place before repositioning it --- NotificationFramework/Notifications.Manager.pas | 2 -- 1 file changed, 2 deletions(-) diff --git a/NotificationFramework/Notifications.Manager.pas b/NotificationFramework/Notifications.Manager.pas index 2d09479..b512f89 100644 --- a/NotificationFramework/Notifications.Manager.pas +++ b/NotificationFramework/Notifications.Manager.pas @@ -86,8 +86,6 @@ procedure TNotificationManager.Add(const NotificationWindow: TNotificationWindow NotificationWindow.Left := Screen.WorkAreaRect.Right - NotificationWindow.Width; {$IFDEF FMX} NotificationWindow.Top := Screen.Displays[0].BoundsRect.Bottom; - if TPlatformServices.Current.SupportsPlatformService(IFMXWindowService, winService) then - winService.ShowWindow(NotificationWindow); {$ELSE} NotificationWindow.Top := Screen.PrimaryMonitor.BoundsRect.Bottom; ShowWindow(TInnerWindow(NotificationWindow).WindowHandle, SW_SHOWNOACTIVATE); From 5303d9efad6bf6b2547c4cab3e59990481a2f47a Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Sat, 8 Aug 2020 02:36:32 +0100 Subject: [PATCH 15/20] * example to allow auto close of the notification --- Examples/NotificationWindowsFMX/MyNotificationWindow.pas | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Examples/NotificationWindowsFMX/MyNotificationWindow.pas b/Examples/NotificationWindowsFMX/MyNotificationWindow.pas index 749f4b4..02a2008 100644 --- a/Examples/NotificationWindowsFMX/MyNotificationWindow.pas +++ b/Examples/NotificationWindowsFMX/MyNotificationWindow.pas @@ -12,6 +12,7 @@ TMyNotificationWindowFMX = class(TNotificationWindowFMX) lbTitle: TLabel; btnAction: TButton; pbrAction: TProgressBar; + procedure FormCreate(Sender: TObject); procedure btnActionClick(Sender: TObject); private { Private declarations } @@ -28,6 +29,12 @@ implementation {$R *.fmx} +procedure TMyNotificationWindowFMX.FormCreate(Sender: TObject); +begin + inherited; + pbrAction.Visible:=false; +end; + { TMyNotificationWindowFMX } function TMyNotificationWindowFMX.AutoClosePossible: Boolean; From a744613e88eb758314e73539b5ce69b456905c45 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Sat, 8 Aug 2020 04:21:35 +0100 Subject: [PATCH 16/20] - Object.Release (deprecated) --- NotificationFramework/Notifications.Manager.pas | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NotificationFramework/Notifications.Manager.pas b/NotificationFramework/Notifications.Manager.pas index b512f89..414dbd5 100644 --- a/NotificationFramework/Notifications.Manager.pas +++ b/NotificationFramework/Notifications.Manager.pas @@ -155,7 +155,11 @@ procedure TNotificationManager.CloseAll(const Animate: Boolean = True); List[cc].Close else begin - List[cc].Release; + TThread.ForceQueue(nil, + procedure + begin + List[cc].DisposeOf; + end); List.Delete(cc); end; end; From 54d4a216d69ae0c1a1b1bf966521a57c5d205030 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Sat, 8 Aug 2020 04:22:19 +0100 Subject: [PATCH 17/20] + option to show the notification window in the application --- Examples/NotificationWindows/Main.dfm | 22 +++-- Examples/NotificationWindows/Main.pas | 5 ++ Examples/NotificationWindowsFMX/Main.fmx | 47 ++++++----- Examples/NotificationWindowsFMX/Main.pas | 8 +- .../Notifications.Manager.pas | 80 +++++++++++++++---- 5 files changed, 121 insertions(+), 41 deletions(-) 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 f3c8da9..99c6321 100644 --- a/Examples/NotificationWindows/Main.pas +++ b/Examples/NotificationWindows/Main.pas @@ -24,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); @@ -51,6 +52,10 @@ procedure TMainForm.AddButtonClick(Sender: TObject); if AutoCloseCheckBox.Checked then MNW.CloseTimeout := 5000; FLastNotificationWindow := MNW; + if RadioGroup1.ItemIndex = 0 then + FManager.Parent:=npMainScreen; + if RadioGroup1.ItemIndex = 1 then + FManager.Parent:=npApplication; FManager.Add(MNW); end; diff --git a/Examples/NotificationWindowsFMX/Main.fmx b/Examples/NotificationWindowsFMX/Main.fmx index f725d3b..8dcd0c7 100644 --- a/Examples/NotificationWindowsFMX/Main.fmx +++ b/Examples/NotificationWindowsFMX/Main.fmx @@ -2,8 +2,8 @@ object FormMain: TFormMain Left = 0 Top = 0 Caption = 'Main' - ClientHeight = 246 - ClientWidth = 291 + ClientHeight = 589 + ClientWidth = 926 Position = DesktopCenter FormFactor.Width = 320 FormFactor.Height = 480 @@ -20,7 +20,7 @@ object FormMain: TFormMain Margins.Bottom = 5.000000000000000000 Position.X = 20.000000000000000000 Position.Y = 5.000000000000000000 - Size.Width = 251.000000000000000000 + Size.Width = 886.000000000000000000 Size.Height = 33.000000000000000000 Size.PlatformDefault = False TextSettings.Font.Size = 16.000000000000000000 @@ -29,7 +29,6 @@ object FormMain: TFormMain Text = 'Notification Windows' end object cbAutoCloseAfter5: TCheckBox - Align = Top StyledSettings = [Family, Style, FontColor] IsChecked = True Margins.Left = 20.000000000000000000 @@ -37,21 +36,20 @@ object FormMain: TFormMain Margins.Bottom = 10.000000000000000000 Position.X = 20.000000000000000000 Position.Y = 43.000000000000000000 - Size.Width = 251.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 - Align = Top 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 = 251.000000000000000000 + Size.Width = 254.000000000000000000 Size.Height = 19.000000000000000000 Size.PlatformDefault = False Text = 'Auto create each second' @@ -59,35 +57,33 @@ object FormMain: TFormMain OnClick = cbAutoCreateEverySecClick end object btnAdd: TButton - Align = Top StyledSettings = [Family, Style, FontColor] Margins.Left = 20.000000000000000000 Margins.Right = 20.000000000000000000 Position.X = 20.000000000000000000 - Position.Y = 101.000000000000000000 - Size.Width = 251.000000000000000000 - Size.Height = 57.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 - Align = Top Margins.Left = 20.000000000000000000 Margins.Top = 10.000000000000000000 Margins.Right = 20.000000000000000000 Position.X = 20.000000000000000000 - Position.Y = 168.000000000000000000 - Size.Width = 251.000000000000000000 - Size.Height = 50.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 = 50.000000000000000000 + Size.Height = 52.000000000000000000 Size.PlatformDefault = False Text = 'Close Last' TextSettings.Font.Size = 14.000000000000000000 @@ -96,9 +92,9 @@ object FormMain: TFormMain object btnCloseAll: TButton Align = Right StyledSettings = [Family, Style, FontColor] - Position.X = 131.000000000000000000 + Position.X = 134.000000000000000000 Size.Width = 120.000000000000000000 - Size.Height = 50.000000000000000000 + Size.Height = 52.000000000000000000 Size.PlatformDefault = False Text = 'Close All' TextSettings.Font.Size = 14.000000000000000000 @@ -111,4 +107,19 @@ object FormMain: TFormMain 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 index e033545..e21a75c 100644 --- a/Examples/NotificationWindowsFMX/Main.pas +++ b/Examples/NotificationWindowsFMX/Main.pas @@ -17,6 +17,8 @@ TFormMain = class(TForm) btnCloseLast: TButton; btnCloseAll: TButton; Timer1: TTimer; + rbMainScreen: TRadioButton; + rbApplication: TRadioButton; procedure btnAddClick(Sender: TObject); procedure btnCloseAllClick(Sender: TObject); procedure btnCloseLastClick(Sender: TObject); @@ -49,6 +51,10 @@ procedure TFormMain.btnAddClick(Sender: TObject); 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; @@ -70,7 +76,7 @@ procedure TFormMain.btnCloseLastClick(Sender: TObject); procedure TFormMain.cbAutoCreateEverySecClick(Sender: TObject); begin - Timer1.Enabled := cbAutoCreateEverySec.IsChecked; + Timer1.Enabled := not cbAutoCreateEverySec.IsChecked; end; procedure TFormMain.FormDestroy(Sender: TObject); diff --git a/NotificationFramework/Notifications.Manager.pas b/NotificationFramework/Notifications.Manager.pas index 414dbd5..942c2c4 100644 --- a/NotificationFramework/Notifications.Manager.pas +++ b/NotificationFramework/Notifications.Manager.pas @@ -18,6 +18,7 @@ interface ; type + TNotificationParent = (npMainScreen, npApplication); {$IFDEF FMX} TNotificationWindow = TNotificationWindowFMX; {$ELSE} @@ -38,6 +39,7 @@ TNotificationManager = class FInAlphaAnimationDuration: Integer; FOutPositionAnimationDuration: Integer; FOutAlphaAnimationDuration: Integer; + fParent: TNotificationParent; procedure UpdatePositions; @@ -59,12 +61,14 @@ TNotificationManager = class 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; + AQPControlAnimations, AnyiQuack, System.Math, System.Types, System.Classes; { TNotificationManager } @@ -74,21 +78,41 @@ TInnerWindow = class (TForm) end; procedure TNotificationManager.Add(const NotificationWindow: TNotificationWindow); -{$IFDEF FMX} -var - winService: IFMXWindowService; -{$ENDIF} begin NotificationWindow.Visible:=false; NotificationWindow.CloseProc:=Close; List.Add(NotificationWindow); - NotificationWindow.Left := Screen.WorkAreaRect.Right - NotificationWindow.Width; {$IFDEF FMX} - NotificationWindow.Top := Screen.Displays[0].BoundsRect.Bottom; + 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} - NotificationWindow.Top := Screen.PrimaryMonitor.BoundsRect.Bottom; - ShowWindow(TInnerWindow(NotificationWindow).WindowHandle, SW_SHOWNOACTIVATE); + 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; @@ -186,6 +210,7 @@ procedure TNotificationManager.UpdatePositions; var Stack: TAQ; WindowIndex, TopPosition: Integer; + RightPosition: integer; begin Stack := TAQ.Managed; for WindowIndex := List.Count - 1 downto 0 do @@ -197,7 +222,17 @@ procedure TNotificationManager.UpdatePositions; Exit; end; - TopPosition := Screen.WorkAreaRect.Bottom; + 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 @@ -211,13 +246,24 @@ procedure TNotificationManager.UpdatePositions; Dec(TopPosition, TargetNotf.Height); AniPlugin := Take(O).Plugin; - AniPlugin.BoundsAnimation( - {$IFDEF FMX} - Screen.Displays[0].WorkareaRect.Right - {$ELSE} - Screen.WorkAreaRect.Right - {$ENDIF} - TargetNotf.Width, - TopPosition, -1, -1, + 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, From 9be610baadf90057a4f3c9dc6ca458526a23fab9 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Mon, 10 Aug 2020 23:24:59 +0100 Subject: [PATCH 18/20] + Notification ID and OnClose event --- .../Notifications.Base.VCL.pas | 18 ++++++++++- .../Notifications.FMX.Base.fmx | 1 + .../Notifications.FMX.Base.pas | 31 +++++++++++++++++-- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/NotificationFramework/Notifications.Base.VCL.pas b/NotificationFramework/Notifications.Base.VCL.pas index 5d22279..101183f 100644 --- a/NotificationFramework/Notifications.Base.VCL.pas +++ b/NotificationFramework/Notifications.Base.VCL.pas @@ -22,6 +22,7 @@ interface 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); @@ -33,6 +34,8 @@ TNotificationWindowVCL = class(TForm) FCloseTimeout: Integer; FClosed: Boolean; FCloseProc:TCloseProcedure; + FID: TGUID; + FOnClose: TOnClose; procedure UpdateCloseTimeout; @@ -64,6 +67,8 @@ TNotificationWindowVCL = class(TForm) property CloseProc: TCloseProcedure read FCloseProc write FCloseProc; property Closed: Boolean read FClosed write FClosed; + published + property OnClose: TOnClose read FOnClose write FOnClose; end; implementation @@ -80,6 +85,13 @@ constructor TNotificationWindowVCL.Create(AOwner: TComponent); // 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; @@ -91,7 +103,11 @@ procedure TNotificationWindowVCL.Close; begin FClosed := True; if assigned(FCloseProc) then - FCloseProc(Self) + begin + FCloseProc(Self); + if assigned(FOnClose) then + FOnClose(fID); + end else raise Exception.Create('Close Procedure in not set in Manager'); end; diff --git a/NotificationFramework/Notifications.FMX.Base.fmx b/NotificationFramework/Notifications.FMX.Base.fmx index c49d996..7c2cc61 100644 --- a/NotificationFramework/Notifications.FMX.Base.fmx +++ b/NotificationFramework/Notifications.FMX.Base.fmx @@ -1,6 +1,7 @@ object NotificationWindowFMX: TNotificationWindowFMX Left = 0 Top = 0 + BorderStyle = SizeToolWin Caption = 'Form3' ClientHeight = 138 ClientWidth = 506 diff --git a/NotificationFramework/Notifications.FMX.Base.pas b/NotificationFramework/Notifications.FMX.Base.pas index e746f3e..697696b 100644 --- a/NotificationFramework/Notifications.FMX.Base.pas +++ b/NotificationFramework/Notifications.FMX.Base.pas @@ -10,6 +10,7 @@ interface 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); @@ -21,11 +22,13 @@ TNotificationWindowFMX = class(TForm) 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; @@ -45,10 +48,15 @@ TNotificationWindowFMX = class(TForm) * 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 @@ -63,6 +71,15 @@ procedure TNotificationWindowFMX.FormCreate(Sender: TObject); 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 } @@ -76,7 +93,11 @@ procedure TNotificationWindowFMX.Close; begin FClosed := True; if assigned(FCloseProc) then - FCloseProc(Self) + begin + FCloseProc(Self); + if assigned(FOnClose) then + FOnClose(fID); + end else raise Exception.Create('Close Procedure in not set in Manager'); end; @@ -99,6 +120,12 @@ procedure TNotificationWindowFMX.SetCloseTimeout(CloseTimeout: Integer); procedure TNotificationWindowFMX.UpdateCloseTimeout; begin Take(Self) +// .Each(function(AQ:TAQ; O: TObject): boolean +// begin +// +// OnAutoCloseCountdown(AQ.CurrentInterval.Progress); +// +// end) .CancelDelays(CloseDelayID) .IfThen(CloseTimeout > 0) {** From af00136b42431dd8ad456d4a4cd524759f884fcd Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Mon, 10 Aug 2020 23:25:22 +0100 Subject: [PATCH 19/20] + Time elapsed label in FMX --- .../MyNotificationWindow.fmx | 9 +++++++++ .../MyNotificationWindow.pas | 15 +++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Examples/NotificationWindowsFMX/MyNotificationWindow.fmx b/Examples/NotificationWindowsFMX/MyNotificationWindow.fmx index bcc41d3..0c5ccdb 100644 --- a/Examples/NotificationWindowsFMX/MyNotificationWindow.fmx +++ b/Examples/NotificationWindowsFMX/MyNotificationWindow.fmx @@ -33,4 +33,13 @@ inherited MyNotificationWindowFMX: TMyNotificationWindowFMX 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 index 02a2008..f144e6e 100644 --- a/Examples/NotificationWindowsFMX/MyNotificationWindow.pas +++ b/Examples/NotificationWindowsFMX/MyNotificationWindow.pas @@ -3,7 +3,7 @@ interface uses - System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, + 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; @@ -12,11 +12,13 @@ TMyNotificationWindowFMX = class(TNotificationWindowFMX) lbTitle: TLabel; btnAction: TButton; pbrAction: TProgressBar; + Label1: TLabel; procedure FormCreate(Sender: TObject); procedure btnActionClick(Sender: TObject); private - { Private declarations } + protected + procedure OnAutoCloseCountDown(const ElapsedTimeMs: Real); override; function AutoClosePossible: Boolean; override; public { Public declarations } @@ -27,6 +29,9 @@ implementation uses AnyiQuack; +const + TIME_ELAPSED_STR = 'Time to Close: %5f'; + {$R *.fmx} procedure TMyNotificationWindowFMX.FormCreate(Sender: TObject); @@ -35,6 +40,12 @@ procedure TMyNotificationWindowFMX.FormCreate(Sender: TObject); pbrAction.Visible:=false; end; +procedure TMyNotificationWindowFMX.OnAutoCloseCountDown( + const ElapsedTimeMs: Real); +begin + Label1.Text:=format(TIME_ELAPSED_STR, [ElapsedTimeMs]); +end; + { TMyNotificationWindowFMX } function TMyNotificationWindowFMX.AutoClosePossible: Boolean; From d9515ce922d710e61fbda58ec2beb916d82e20e9 Mon Sep 17 00:00:00 2001 From: John Kouraklis Date: Tue, 11 Aug 2020 23:49:19 +0100 Subject: [PATCH 20/20] + ActivateNotification option The notification form can be optionally activated; otherwise the main form has the focus --- .../Notifications.FMX.Base.pas | 1 + .../Notifications.Manager.pas | 23 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/NotificationFramework/Notifications.FMX.Base.pas b/NotificationFramework/Notifications.FMX.Base.pas index 697696b..824a78e 100644 --- a/NotificationFramework/Notifications.FMX.Base.pas +++ b/NotificationFramework/Notifications.FMX.Base.pas @@ -68,6 +68,7 @@ implementation procedure TNotificationWindowFMX.FormCreate(Sender: TObject); begin + inherited; FCloseTimeout:=0; FClosed:=false; FCloseProc:=nil; diff --git a/NotificationFramework/Notifications.Manager.pas b/NotificationFramework/Notifications.Manager.pas index 942c2c4..3cb61fd 100644 --- a/NotificationFramework/Notifications.Manager.pas +++ b/NotificationFramework/Notifications.Manager.pas @@ -34,12 +34,13 @@ TNotificationManager = class TNotificationList = TObjectList; var + FActivateNotification: boolean; FList: TNotificationList; FInPositionAnimationDuration: Integer; FInAlphaAnimationDuration: Integer; FOutPositionAnimationDuration: Integer; FOutAlphaAnimationDuration: Integer; - fParent: TNotificationParent; + FParent: TNotificationParent; procedure UpdatePositions; @@ -51,6 +52,8 @@ TNotificationManager = class 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 @@ -61,7 +64,7 @@ TNotificationManager = class write FOutPositionAnimationDuration; property OutAlphaAnimationDuration: Integer read FOutAlphaAnimationDuration write FOutAlphaAnimationDuration; - property Parent: TNotificationParent read fParent write fParent default + property Parent: TNotificationParent read FParent write FParent default npMainScreen; end; @@ -197,6 +200,9 @@ constructor TNotificationManager.Create; FInAlphaAnimationDuration := 800; FOutPositionAnimationDuration := 500; FOutAlphaAnimationDuration := 300; + + FActivateNotification:=false; + FParent:=npApplication; end; destructor TNotificationManager.Destroy; @@ -270,6 +276,19 @@ procedure TNotificationManager.UpdatePositions; 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;

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 diff --git a/Examples/PulsateEdits/PulsateEdits.res b/Examples/PulsateEdits/PulsateEdits.res deleted file mode 100644 index 2b29b132002c76612751ae8189a1b0b8a548790f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59212 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