MVCFramework.Functional.pas has been merged in MVCFramework.Utils.pas

This commit is contained in:
Daniele Teti 2024-09-19 19:15:57 +02:00
parent 41a6931e7f
commit 4b8b89d4da
10 changed files with 329 additions and 254 deletions

View File

@ -14,6 +14,16 @@
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base> <Base>true</Base>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Android' and '$(Base)'=='true') or '$(Base_Android)'!=''">
<Base_Android>true</Base_Android>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Android64' and '$(Base)'=='true') or '$(Base_Android64)'!=''">
<Base_Android64>true</Base_Android64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32> <Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent> <CfgParent>Base</CfgParent>
@ -58,6 +68,16 @@
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=Daniele Teti;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=Daniele Teti;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<DllSuffix>120</DllSuffix> <DllSuffix>120</DllSuffix>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Base_Android)'!=''">
<VerInfo_Keys>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=;minSdkVersion=23;targetSdkVersion=34</VerInfo_Keys>
<BT_BuildType>Debug</BT_BuildType>
<EnabledSysJars>activity-1.7.2.dex.jar;annotation-experimental-1.3.0.dex.jar;annotation-jvm-1.6.0.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-6.0.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.10.1.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.10.1.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.1.dex.jar;lifecycle-livedata-2.6.1.dex.jar;lifecycle-livedata-core-2.6.1.dex.jar;lifecycle-runtime-2.6.1.dex.jar;lifecycle-service-2.6.1.dex.jar;lifecycle-viewmodel-2.6.1.dex.jar;lifecycle-viewmodel-savedstate-2.6.1.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.1.0.dex.jar;play-services-basement-18.1.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.0.2.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar</EnabledSysJars>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Android64)'!=''">
<VerInfo_Keys>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=;minSdkVersion=23;targetSdkVersion=34</VerInfo_Keys>
<BT_BuildType>Debug</BT_BuildType>
<EnabledSysJars>activity-1.7.2.dex.jar;annotation-experimental-1.3.0.dex.jar;annotation-jvm-1.6.0.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-6.0.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.10.1.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.10.1.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.1.dex.jar;lifecycle-livedata-2.6.1.dex.jar;lifecycle-livedata-core-2.6.1.dex.jar;lifecycle-runtime-2.6.1.dex.jar;lifecycle-service-2.6.1.dex.jar;lifecycle-viewmodel-2.6.1.dex.jar;lifecycle-viewmodel-savedstate-2.6.1.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.1.0.dex.jar;play-services-basement-18.1.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.0.2.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar</EnabledSysJars>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''"> <PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<BT_BuildType>Debug</BT_BuildType> <BT_BuildType>Debug</BT_BuildType>
@ -1010,6 +1030,9 @@
<ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/>
</Deployment> </Deployment>
<Platforms> <Platforms>
<Platform value="Android">False</Platform>
<Platform value="Android64">False</Platform>
<Platform value="Linux64">False</Platform>
<Platform value="Win32">True</Platform> <Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform> <Platform value="Win64">False</Platform>
<Platform value="Win64x">False</Platform> <Platform value="Win64x">False</Platform>

View File

@ -14,6 +14,16 @@
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base> <Base>true</Base>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Android' and '$(Base)'=='true') or '$(Base_Android)'!=''">
<Base_Android>true</Base_Android>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Android64' and '$(Base)'=='true') or '$(Base_Android64)'!=''">
<Base_Android64>true</Base_Android64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32> <Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent> <CfgParent>Base</CfgParent>
@ -60,6 +70,18 @@
<RuntimeOnlyPackage>true</RuntimeOnlyPackage> <RuntimeOnlyPackage>true</RuntimeOnlyPackage>
<DCC_OutputNeverBuildDcps>true</DCC_OutputNeverBuildDcps> <DCC_OutputNeverBuildDcps>true</DCC_OutputNeverBuildDcps>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Base_Android)'!=''">
<VerInfo_Keys>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=;minSdkVersion=23;targetSdkVersion=34</VerInfo_Keys>
<BT_BuildType>Debug</BT_BuildType>
<VerInfo_IncludeVerInfo>false</VerInfo_IncludeVerInfo>
<EnabledSysJars>activity-1.7.2.dex.jar;annotation-experimental-1.3.0.dex.jar;annotation-jvm-1.6.0.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-6.0.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.10.1.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.10.1.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.1.dex.jar;lifecycle-livedata-2.6.1.dex.jar;lifecycle-livedata-core-2.6.1.dex.jar;lifecycle-runtime-2.6.1.dex.jar;lifecycle-service-2.6.1.dex.jar;lifecycle-viewmodel-2.6.1.dex.jar;lifecycle-viewmodel-savedstate-2.6.1.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.1.0.dex.jar;play-services-basement-18.1.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.0.2.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar</EnabledSysJars>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Android64)'!=''">
<VerInfo_Keys>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=;minSdkVersion=23;targetSdkVersion=34</VerInfo_Keys>
<BT_BuildType>Debug</BT_BuildType>
<VerInfo_IncludeVerInfo>false</VerInfo_IncludeVerInfo>
<EnabledSysJars>activity-1.7.2.dex.jar;annotation-experimental-1.3.0.dex.jar;annotation-jvm-1.6.0.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-6.0.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.10.1.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.10.1.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.1.dex.jar;lifecycle-livedata-2.6.1.dex.jar;lifecycle-livedata-core-2.6.1.dex.jar;lifecycle-runtime-2.6.1.dex.jar;lifecycle-service-2.6.1.dex.jar;lifecycle-viewmodel-2.6.1.dex.jar;lifecycle-viewmodel-savedstate-2.6.1.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.1.0.dex.jar;play-services-basement-18.1.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.0.2.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar</EnabledSysJars>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''"> <PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<BT_BuildType>Debug</BT_BuildType> <BT_BuildType>Debug</BT_BuildType>
@ -1020,6 +1042,9 @@
<ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/>
</Deployment> </Deployment>
<Platforms> <Platforms>
<Platform value="Android">False</Platform>
<Platform value="Android64">False</Platform>
<Platform value="Linux64">False</Platform>
<Platform value="Win32">True</Platform> <Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform> <Platform value="Win64">False</Platform>
<Platform value="Win64x">False</Platform> <Platform value="Win64x">False</Platform>

View File

@ -14,6 +14,16 @@
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base> <Base>true</Base>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Android' and '$(Base)'=='true') or '$(Base_Android)'!=''">
<Base_Android>true</Base_Android>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Android64' and '$(Base)'=='true') or '$(Base_Android64)'!=''">
<Base_Android64>true</Base_Android64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32> <Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent> <CfgParent>Base</CfgParent>
@ -69,6 +79,16 @@
<DCC_Description>DelphiMVCFramework IDE Expert</DCC_Description> <DCC_Description>DelphiMVCFramework IDE Expert</DCC_Description>
<DllSuffix>120</DllSuffix> <DllSuffix>120</DllSuffix>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Base_Android)'!=''">
<VerInfo_Keys>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=;minSdkVersion=23;targetSdkVersion=34</VerInfo_Keys>
<BT_BuildType>Debug</BT_BuildType>
<EnabledSysJars>activity-1.7.2.dex.jar;annotation-experimental-1.3.0.dex.jar;annotation-jvm-1.6.0.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-6.0.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.10.1.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.10.1.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.1.dex.jar;lifecycle-livedata-2.6.1.dex.jar;lifecycle-livedata-core-2.6.1.dex.jar;lifecycle-runtime-2.6.1.dex.jar;lifecycle-service-2.6.1.dex.jar;lifecycle-viewmodel-2.6.1.dex.jar;lifecycle-viewmodel-savedstate-2.6.1.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.1.0.dex.jar;play-services-basement-18.1.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.0.2.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar</EnabledSysJars>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Android64)'!=''">
<VerInfo_Keys>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=;minSdkVersion=23;targetSdkVersion=34</VerInfo_Keys>
<BT_BuildType>Debug</BT_BuildType>
<EnabledSysJars>activity-1.7.2.dex.jar;annotation-experimental-1.3.0.dex.jar;annotation-jvm-1.6.0.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-6.0.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.10.1.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.10.1.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.1.dex.jar;lifecycle-livedata-2.6.1.dex.jar;lifecycle-livedata-core-2.6.1.dex.jar;lifecycle-runtime-2.6.1.dex.jar;lifecycle-service-2.6.1.dex.jar;lifecycle-viewmodel-2.6.1.dex.jar;lifecycle-viewmodel-savedstate-2.6.1.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.1.0.dex.jar;play-services-basement-18.1.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.0.2.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar</EnabledSysJars>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''"> <PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<BT_BuildType>Debug</BT_BuildType> <BT_BuildType>Debug</BT_BuildType>
@ -1049,6 +1069,9 @@
<ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/>
</Deployment> </Deployment>
<Platforms> <Platforms>
<Platform value="Android">False</Platform>
<Platform value="Android64">False</Platform>
<Platform value="Linux64">False</Platform>
<Platform value="Win32">True</Platform> <Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform> <Platform value="Win64">False</Platform>
<Platform value="Win64x">False</Platform> <Platform value="Win64x">False</Platform>

View File

@ -14,6 +14,16 @@
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base> <Base>true</Base>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Android' and '$(Base)'=='true') or '$(Base_Android)'!=''">
<Base_Android>true</Base_Android>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Android64' and '$(Base)'=='true') or '$(Base_Android64)'!=''">
<Base_Android64>true</Base_Android64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32> <Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent> <CfgParent>Base</CfgParent>
@ -70,6 +80,16 @@
<DCC_Description>DMVCFramework - CopyRight (2010-2020) Daniele Teti and the DMVCFramework Team</DCC_Description> <DCC_Description>DMVCFramework - CopyRight (2010-2020) Daniele Teti and the DMVCFramework Team</DCC_Description>
<DllSuffix>120</DllSuffix> <DllSuffix>120</DllSuffix>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Base_Android)'!=''">
<VerInfo_Keys>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=;minSdkVersion=23;targetSdkVersion=34</VerInfo_Keys>
<BT_BuildType>Debug</BT_BuildType>
<EnabledSysJars>activity-1.7.2.dex.jar;annotation-experimental-1.3.0.dex.jar;annotation-jvm-1.6.0.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-6.0.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.10.1.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.10.1.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.1.dex.jar;lifecycle-livedata-2.6.1.dex.jar;lifecycle-livedata-core-2.6.1.dex.jar;lifecycle-runtime-2.6.1.dex.jar;lifecycle-service-2.6.1.dex.jar;lifecycle-viewmodel-2.6.1.dex.jar;lifecycle-viewmodel-savedstate-2.6.1.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.1.0.dex.jar;play-services-basement-18.1.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.0.2.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar</EnabledSysJars>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Android64)'!=''">
<VerInfo_Keys>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=;minSdkVersion=23;targetSdkVersion=34</VerInfo_Keys>
<BT_BuildType>Debug</BT_BuildType>
<EnabledSysJars>activity-1.7.2.dex.jar;annotation-experimental-1.3.0.dex.jar;annotation-jvm-1.6.0.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-6.0.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.10.1.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.10.1.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.1.dex.jar;lifecycle-livedata-2.6.1.dex.jar;lifecycle-livedata-core-2.6.1.dex.jar;lifecycle-runtime-2.6.1.dex.jar;lifecycle-service-2.6.1.dex.jar;lifecycle-viewmodel-2.6.1.dex.jar;lifecycle-viewmodel-savedstate-2.6.1.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.1.0.dex.jar;play-services-basement-18.1.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.0.2.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar</EnabledSysJars>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''"> <PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<BT_BuildType>Debug</BT_BuildType> <BT_BuildType>Debug</BT_BuildType>
@ -1100,6 +1120,9 @@
<ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/>
</Deployment> </Deployment>
<Platforms> <Platforms>
<Platform value="Android">False</Platform>
<Platform value="Android64">False</Platform>
<Platform value="Linux64">False</Platform>
<Platform value="Win32">True</Platform> <Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform> <Platform value="Win64">False</Platform>
<Platform value="Win64x">False</Platform> <Platform value="Win64x">False</Platform>

View File

@ -1,4 +1,4 @@
program FunctionalProgramming; program HigherOrderFunctions;
uses uses
Vcl.Forms, Vcl.Forms,

View File

@ -1,14 +1,15 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<ProjectGuid>{2443E8EE-CE91-4279-B049-8119378EB494}</ProjectGuid> <ProjectGuid>{2443E8EE-CE91-4279-B049-8119378EB494}</ProjectGuid>
<ProjectVersion>20.1</ProjectVersion> <ProjectVersion>20.2</ProjectVersion>
<FrameworkType>VCL</FrameworkType> <FrameworkType>VCL</FrameworkType>
<MainSource>FunctionalProgramming.dpr</MainSource> <MainSource>HigherOrderFunctions.dpr</MainSource>
<Base>True</Base> <Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config> <Config Condition="'$(Config)'==''">Debug</Config>
<Platform Condition="'$(Platform)'==''">Win32</Platform> <Platform Condition="'$(Platform)'==''">Win32</Platform>
<TargetedPlatforms>1</TargetedPlatforms> <TargetedPlatforms>1</TargetedPlatforms>
<AppType>Application</AppType> <AppType>Application</AppType>
<ProjectName Condition="'$(ProjectName)'==''">HigherOrderFunctions</ProjectName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base> <Base>true</Base>
@ -40,7 +41,7 @@
<Base>true</Base> <Base>true</Base>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''"> <PropertyGroup Condition="'$(Base)'!=''">
<SanitizedProjectName>FunctionalProgramming</SanitizedProjectName> <SanitizedProjectName>HigherOrderFunctions</SanitizedProjectName>
<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon> <Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace> <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput> <DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
@ -160,13 +161,14 @@
<VersionInfoKeys Name="theme"/> <VersionInfoKeys Name="theme"/>
</VersionInfoKeys> </VersionInfoKeys>
<Source> <Source>
<Source Name="MainSource">FunctionalProgramming.dpr</Source> <Source Name="MainSource">HigherOrderFunctions.dpr</Source>
</Source> </Source>
</Delphi.Personality> </Delphi.Personality>
<Deployment Version="4"> <Deployment Version="5">
<DeployFile LocalName="Win32\Debug\FunctionalProgramming.exe" Configuration="Debug" Class="ProjectOutput"> <DeployFile LocalName="Win32\Debug\HigherOrderFunctions.exe" Configuration="Debug" Class="ProjectOutput"/>
<DeployFile LocalName="Win32\Debug\HigherOrderFunctions.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win32"> <Platform Name="Win32">
<RemoteName>FunctionalProgramming.exe</RemoteName> <RemoteName>HigherOrderFunctions.exe</RemoteName>
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </DeployFile>
@ -182,16 +184,6 @@
<Operation>0</Operation> <Operation>0</Operation>
</Platform> </Platform>
</DeployClass> </DeployClass>
<DeployClass Name="AndroidClasses">
<Platform Name="Android">
<RemoteDir>classes</RemoteDir>
<Operation>64</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>classes</RemoteDir>
<Operation>64</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidFileProvider"> <DeployClass Name="AndroidFileProvider">
<Platform Name="Android"> <Platform Name="Android">
<RemoteDir>res\xml</RemoteDir> <RemoteDir>res\xml</RemoteDir>
@ -824,6 +816,9 @@
<Platform Name="Win64"> <Platform Name="Win64">
<Operation>1</Operation> <Operation>1</Operation>
</Platform> </Platform>
<Platform Name="Win64x">
<Operation>1</Operation>
</Platform>
</DeployClass> </DeployClass>
<DeployClass Name="ProjectiOSDeviceDebug"> <DeployClass Name="ProjectiOSDeviceDebug">
<Platform Name="iOSDevice32"> <Platform Name="iOSDevice32">
@ -1116,11 +1111,13 @@
<ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/> <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/>
</Deployment> </Deployment>
<Platforms> <Platforms>
<Platform value="Win32">True</Platform> <Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform> <Platform value="Win64">False</Platform>
</Platforms> </Platforms>
<ModelSupport>False</ModelSupport>
</BorlandProject> </BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion> <ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions> </ProjectExtensions>

View File

@ -1,49 +1,51 @@
object MainForm: TMainForm object MainForm: TMainForm
Left = 0 Left = 0
Top = 0 Top = 0
Caption = 'DMVCFramework | Map, Filter, Reduce sample' BorderStyle = bsDialog
ClientHeight = 326 Caption = 'DMVCFramework | Map, Filter, Reduce | Sample'
ClientWidth = 800 ClientHeight = 383
ClientWidth = 754
Color = clBtnFace Color = clBtnFace
Font.Charset = DEFAULT_CHARSET Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText Font.Color = clWindowText
Font.Height = -11 Font.Height = -11
Font.Name = 'Tahoma' Font.Name = 'Tahoma'
Font.Style = [] Font.Style = []
Position = poScreenCenter
DesignSize = ( DesignSize = (
800 754
326) 383)
TextHeight = 13 TextHeight = 13
object Label1: TLabel object Label1: TLabel
Left = 18 Left = 8
Top = 8 Top = 8
Width = 20 Width = 20
Height = 13 Height = 13
Caption = 'Map' Caption = 'Map'
end end
object Label2: TLabel object Label2: TLabel
Left = 204 Left = 194
Top = 8 Top = 8
Width = 36 Width = 36
Height = 13 Height = 13
Caption = 'Reduce' Caption = 'Reduce'
end end
object Label3: TLabel object Label3: TLabel
Left = 390 Left = 380
Top = 8 Top = 8
Width = 24 Width = 24
Height = 13 Height = 13
Caption = 'Filter' Caption = 'Filter'
end end
object btnForEach: TLabel object btnForEach: TLabel
Left = 576 Left = 566
Top = 8 Top = 8
Width = 39 Width = 39
Height = 13 Height = 13
Caption = 'ForEach' Caption = 'ForEach'
end end
object btnMapAddStars: TButton object btnMapAddStars: TButton
Left = 18 Left = 8
Top = 27 Top = 27
Width = 95 Width = 95
Height = 30 Height = 30
@ -52,16 +54,17 @@ object MainForm: TMainForm
OnClick = btnMapAddStarsClick OnClick = btnMapAddStarsClick
end end
object lbMap: TListBox object lbMap: TListBox
Left = 18 Left = 8
Top = 99 Top = 99
Width = 180 Width = 180
Height = 219 Height = 276
Anchors = [akLeft, akTop, akBottom] Anchors = [akLeft, akTop, akBottom]
ItemHeight = 13 ItemHeight = 13
TabOrder = 1 TabOrder = 1
ExplicitHeight = 219
end end
object btnFilterBetween: TButton object btnFilterBetween: TButton
Left = 390 Left = 380
Top = 63 Top = 63
Width = 75 Width = 75
Height = 30 Height = 30
@ -71,16 +74,17 @@ object MainForm: TMainForm
OnClick = btnFilterBetwenClick OnClick = btnFilterBetwenClick
end end
object lbFilter: TListBox object lbFilter: TListBox
Left = 390 Left = 380
Top = 99 Top = 99
Width = 180 Width = 180
Height = 219 Height = 276
Anchors = [akLeft, akTop, akBottom] Anchors = [akLeft, akTop, akBottom]
ItemHeight = 13 ItemHeight = 13
TabOrder = 3 TabOrder = 3
ExplicitHeight = 219
end end
object btnReduceSum: TButton object btnReduceSum: TButton
Left = 204 Left = 194
Top = 27 Top = 27
Width = 77 Width = 77
Height = 30 Height = 30
@ -89,16 +93,17 @@ object MainForm: TMainForm
OnClick = btnReduceSumClick OnClick = btnReduceSumClick
end end
object lbReduce: TListBox object lbReduce: TListBox
Left = 204 Left = 194
Top = 99 Top = 99
Width = 180 Width = 180
Height = 219 Height = 276
Anchors = [akLeft, akTop, akBottom] Anchors = [akLeft, akTop, akBottom]
ItemHeight = 13 ItemHeight = 13
TabOrder = 5 TabOrder = 5
ExplicitHeight = 219
end end
object btnReduceMin: TButton object btnReduceMin: TButton
Left = 204 Left = 194
Top = 63 Top = 63
Width = 77 Width = 77
Height = 30 Height = 30
@ -107,7 +112,7 @@ object MainForm: TMainForm
OnClick = btnReduceMinClick OnClick = btnReduceMinClick
end end
object btnReduceMul: TButton object btnReduceMul: TButton
Left = 287 Left = 277
Top = 27 Top = 27
Width = 77 Width = 77
Height = 30 Height = 30
@ -116,7 +121,7 @@ object MainForm: TMainForm
OnClick = btnReduceMulClick OnClick = btnReduceMulClick
end end
object btnReduceMax: TButton object btnReduceMax: TButton
Left = 287 Left = 277
Top = 63 Top = 63
Width = 77 Width = 77
Height = 30 Height = 30
@ -125,7 +130,7 @@ object MainForm: TMainForm
OnClick = btnReduceMaxClick OnClick = btnReduceMaxClick
end end
object btnFilterOdd: TButton object btnFilterOdd: TButton
Left = 390 Left = 380
Top = 27 Top = 27
Width = 75 Width = 75
Height = 30 Height = 30
@ -135,7 +140,7 @@ object MainForm: TMainForm
OnClick = btnFilterOddClick OnClick = btnFilterOddClick
end end
object btnFilterEven: TButton object btnFilterEven: TButton
Left = 471 Left = 461
Top = 27 Top = 27
Width = 82 Width = 82
Height = 30 Height = 30
@ -145,7 +150,7 @@ object MainForm: TMainForm
OnClick = btnFilterEvenClick OnClick = btnFilterEvenClick
end end
object btnMapCapitalize: TButton object btnMapCapitalize: TButton
Left = 18 Left = 8
Top = 63 Top = 63
Width = 95 Width = 95
Height = 30 Height = 30
@ -154,7 +159,7 @@ object MainForm: TMainForm
OnClick = btnMapCapitalizeClick OnClick = btnMapCapitalizeClick
end end
object btnJustLoop: TButton object btnJustLoop: TButton
Left = 576 Left = 566
Top = 27 Top = 27
Width = 180 Width = 180
Height = 30 Height = 30
@ -163,16 +168,17 @@ object MainForm: TMainForm
OnClick = btnJustLoopClick OnClick = btnJustLoopClick
end end
object lbForEach: TListBox object lbForEach: TListBox
Left = 576 Left = 566
Top = 99 Top = 99
Width = 180 Width = 180
Height = 219 Height = 276
Anchors = [akLeft, akTop, akBottom] Anchors = [akLeft, akTop, akBottom]
ItemHeight = 13 ItemHeight = 13
TabOrder = 13 TabOrder = 13
ExplicitHeight = 219
end end
object btnForEachWithException: TButton object btnForEachWithException: TButton
Left = 576 Left = 566
Top = 63 Top = 63
Width = 180 Width = 180
Height = 30 Height = 30

View File

@ -28,7 +28,7 @@ interface
uses uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, MVCFramework.Functional; Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, MVCFramework.Utils;
type type
TMainForm = class(TForm) TMainForm = class(TForm)
@ -107,18 +107,17 @@ begin
Result[9] := 'mary'; Result[9] := 'mary';
end; end;
procedure TMainForm.btnFilterBetwenClick(Sender: TObject); procedure TMainForm.btnFilterBetwenClick(Sender: TObject);
var var
InputData, OutputData: TArray<Integer>; InputData, OutputData: TArray<Integer>;
FilterFunc: TPredicate<Integer>; FilterFunc: TPredicateClosure<Integer>;
begin begin
InputData := GetIntArrayOfData; InputData := GetIntArrayOfData;
FilterFunc := function(const Item: Integer): boolean FilterFunc := function(const Item: Integer): boolean
begin begin
Result := (Item > 2) and (Item < 8) Result := (Item > 2) and (Item < 8)
end; end;
OutputData := Functional.Filter<Integer>(InputData, FilterFunc); OutputData := HigherOrder.Filter<Integer>(InputData, FilterFunc);
FillList(OutputData, lbFilter.Items); FillList(OutputData, lbFilter.Items);
end; end;
@ -127,7 +126,7 @@ var
InputData, OutputData: TArray<Integer>; InputData, OutputData: TArray<Integer>;
begin begin
InputData := GetIntArrayOfData; InputData := GetIntArrayOfData;
OutputData := Functional.Filter<Integer>(InputData, OutputData := HigherOrder.Filter<Integer>(InputData,
function(const Item: Integer): boolean function(const Item: Integer): boolean
begin begin
Result := Item mod 2 = 0; Result := Item mod 2 = 0;
@ -140,7 +139,7 @@ var
InputData, OutputData: TArray<Integer>; InputData, OutputData: TArray<Integer>;
begin begin
InputData := GetIntArrayOfData; InputData := GetIntArrayOfData;
OutputData := Functional.Filter<Integer>(InputData, OutputData := HigherOrder.Filter<Integer>(InputData,
function(const Item: Integer): boolean function(const Item: Integer): boolean
begin begin
Result := Item mod 2 > 0; Result := Item mod 2 > 0;
@ -151,7 +150,7 @@ end;
procedure TMainForm.btnForEachWithExceptionClick(Sender: TObject); procedure TMainForm.btnForEachWithExceptionClick(Sender: TObject);
begin begin
lbForEach.Clear; lbForEach.Clear;
Functional.ForEach<Integer>(GetIntArrayOfData, HigherOrder.ForEach<Integer>(GetIntArrayOfData,
procedure(const Item: Integer) procedure(const Item: Integer)
begin begin
if Item = 5 then if Item = 5 then
@ -164,7 +163,7 @@ end;
procedure TMainForm.btnJustLoopClick(Sender: TObject); procedure TMainForm.btnJustLoopClick(Sender: TObject);
begin begin
lbForEach.Clear; lbForEach.Clear;
Functional.ForEach<String>(GetStringArrayOfData, HigherOrder.ForEach<String>(GetStringArrayOfData,
procedure(const Item: String) procedure(const Item: String)
begin begin
lbForEach.Items.Add(Item); lbForEach.Items.Add(Item);
@ -176,7 +175,7 @@ var
InputData, OutputData: TArray<string>; InputData, OutputData: TArray<string>;
begin begin
InputData := GetStringArrayOfData; InputData := GetStringArrayOfData;
OutputData := Functional.Map<String>(InputData, OutputData := HigherOrder.Map<String>(InputData,
function(const Item: String): String function(const Item: String): String
begin begin
Result := '*' + Item + '*'; Result := '*' + Item + '*';
@ -189,7 +188,7 @@ var
InputData, OutputData: TArray<string>; InputData, OutputData: TArray<string>;
begin begin
InputData := GetStringArrayOfData; InputData := GetStringArrayOfData;
OutputData := Functional.Map<string>(InputData, OutputData := HigherOrder.Map<string>(InputData,
function(const Item: String): String function(const Item: String): String
begin begin
Result := String(Item.Chars[0]).ToUpper + Item.Substring(1); Result := String(Item.Chars[0]).ToUpper + Item.Substring(1);
@ -203,7 +202,7 @@ var
OutputData: Integer; OutputData: Integer;
begin begin
InputData := GetIntArrayOfData; InputData := GetIntArrayOfData;
OutputData := Functional.Reduce<Integer>(InputData, OutputData := HigherOrder.Reduce<Integer>(InputData,
function(const Item1, Item2: Integer): Integer function(const Item1, Item2: Integer): Integer
begin begin
if Item1 > Item2 then if Item1 > Item2 then
@ -220,7 +219,7 @@ var
OutputData: Integer; OutputData: Integer;
begin begin
InputData := GetIntArrayOfData; InputData := GetIntArrayOfData;
OutputData := Functional.Reduce<Integer>(InputData, OutputData := HigherOrder.Reduce<Integer>(InputData,
function(const Item1, Item2: Integer): Integer function(const Item1, Item2: Integer): Integer
begin begin
if Item1 < Item2 then if Item1 < Item2 then
@ -237,7 +236,7 @@ var
OutputData: Integer; OutputData: Integer;
begin begin
InputData := GetIntArrayOfData; InputData := GetIntArrayOfData;
OutputData := Functional.Reduce<Integer>(InputData, OutputData := HigherOrder.Reduce<Integer>(InputData,
function(const Item1, Item2: Integer): Integer function(const Item1, Item2: Integer): Integer
begin begin
Result := Item1 * Item2; Result := Item1 * Item2;
@ -251,7 +250,7 @@ var
OutputData: Integer; OutputData: Integer;
begin begin
InputData := GetIntArrayOfData; InputData := GetIntArrayOfData;
OutputData := Functional.Reduce<Integer>(InputData, OutputData := HigherOrder.Reduce<Integer>(InputData,
function(const Item1, Item2: Integer): Integer function(const Item1, Item2: Integer): Integer
begin begin
Result := Item1 + Item2; Result := Item1 + Item2;
@ -261,21 +260,21 @@ end;
procedure TMainForm.FillList(Data: TArray<Integer>; AStrings: TStrings); procedure TMainForm.FillList(Data: TArray<Integer>; AStrings: TStrings);
var var
I: Integer; lItem: Integer;
begin begin
AStrings.Clear; AStrings.Clear;
for I in Data do for lItem in Data do
AStrings.Add(I.ToString); AStrings.Add(lItem.ToString);
end; end;
procedure TMainForm.FillList(Data: TArray<String>; AStrings: TStrings); procedure TMainForm.FillList(Data: TArray<String>; AStrings: TStrings);
var var
s: string; lItem: string;
begin begin
AStrings.Clear; AStrings.Clear;
for s in Data do for lItem in Data do
AStrings.Add(s); AStrings.Add(lItem);
end; end;
end. end.

View File

@ -1,160 +0,0 @@
// ***************************************************************************
//
// Delphi MVC Framework
//
// Copyright (c) 2010-2024 Daniele Teti and the DMVCFramework Team
//
// https://github.com/danieleteti/delphimvcframework
//
// ***************************************************************************
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// *************************************************************************** }
unit MVCFramework.Functional;
interface
uses
System.SysUtils, System.Classes;
type
EFunctionalError = class(Exception)
end;
EFunctionalMapError = class(EFunctionalError)
end;
EFunctionalFilterError = class(EFunctionalError)
end;
EFunctionalForEachError = class(EFunctionalError)
end;
EFunctionalReduceError = class(EFunctionalError)
end;
TMapClosure<T> = reference to function(const Item: T): T;
TForEachClosure<T> = reference to procedure(const Item: T);
TMapReduce<T> = reference to function(const Left: T; const Right: T): T;
TPredicate<T> = reference to function(const Item: T): Boolean;
Functional = class sealed
class function Map<T>(InputArray: TArray<T>; MapClosure: TMapClosure<T>): TArray<T>;
class function Reduce<T: record >(InputArray: TArray<T>; ReduceFunction: TMapReduce<T>; InitValue: T): T;
class function Filter<T>(InputArray: TArray<T>; FilterFunction: TPredicate<T>): TArray<T>;
class procedure ForEach<T>(InputArray: TArray<T>; ForEachClosure: TForEachClosure<T>);
end;
implementation
uses
System.Generics.Collections;
{ Functional }
class function Functional.Filter<T>(InputArray: TArray<T>; FilterFunction: TPredicate<T>): TArray<T>;
var
lIdx, I: Integer;
List: TList<T>;
begin
lIdx := -1;
try
List := TList<T>.Create;
try
for I := 0 to length(InputArray) - 1 do
begin
lIdx := I;
if FilterFunction(InputArray[I]) then
begin
List.add(InputArray[I]);
end;
end;
Result := List.ToArray;
finally
List.Free;
end;
except
on E: Exception do
begin
raise EFunctionalFilterError.CreateFmt('Filter error at index %d - [Class: %s][Message: %s]', [lIdx, E.ClassName, E.Message]);
end;
end;
end;
class procedure Functional.ForEach<T>(InputArray: TArray<T>; ForEachClosure: TForEachClosure<T>);
var
I, lIdx: Integer;
begin
lIdx := 0;
try
for I := Low(InputArray) to High(InputArray) do
begin
lIdx := I;
ForEachClosure(InputArray[I]);
end;
except
on E: Exception do
begin
raise EFunctionalForEachError.CreateFmt('ForEach error at index %d - [Class: %s][Message: %s]', [lIdx, E.ClassName, E.Message]);
end;
end;
end;
class function Functional.Map<T>(InputArray: TArray<T>; MapClosure: TMapClosure<T>): TArray<T>;
var
lIdx, I: Integer;
begin
lIdx := 0;
try
SetLength(Result, Length(InputArray));
for I := 0 to length(InputArray) - 1 do
begin
lIdx := I;
Result[I] := MapClosure(InputArray[I]);
end;
except
on E: Exception do
begin
raise EFunctionalMapError.CreateFmt('Map error at index %d - [Class: %s][Message: %s]', [lIdx, E.ClassName, E.Message]);
end;
end;
end;
class function Functional.Reduce<T>(InputArray: TArray<T>; ReduceFunction: TMapReduce<T>; InitValue: T): T;
var
I: T;
lIdx: Integer;
begin
lIdx := 0;
Result := InitValue;
try
for I in InputArray do
begin
Result := ReduceFunction(Result, I);
Inc(lIdx);
end;
except
on E: Exception do
begin
raise EFunctionalReduceError.CreateFmt('Reduce error at index %d - [Class: %s][Message: %s]', [lIdx, E.ClassName, E.Message]);
end;
end;
end;
end.

View File

@ -29,18 +29,54 @@ unit MVCFramework.Utils;
interface interface
uses uses
MVCFramework.Serializer.Commons, JsonDataObjects, MVCFramework.DuckTyping, MVCFramework.Serializer.Commons, JsonDataObjects,
System.Classes; MVCFramework.DuckTyping, System.Classes, System.SysUtils;
type
EHOError = class(Exception)
end;
EHOMapError = class(EHOError)
end;
EHOFilterError = class(EHOError)
end;
EHOForEachError = class(EHOError)
end;
EHOReduceError = class(EHOError)
end;
TMapClosure<T> = reference to function(const Item: T): T;
TForEachClosure<T> = reference to procedure(const Item: T);
TMapReduceClosure<T> = reference to function(const Left: T; const Right: T): T;
TPredicateClosure<T> = reference to function(const Item: T): Boolean;
HigherOrder = class sealed
class function Map<T>(const InputArray: TArray<T>;
const MapClosure: TMapClosure<T>): TArray<T>;
class function Reduce<T>(const InputArray: TArray<T>;
const ReduceFunction: TMapReduceClosure<T>; InitValue: T): T;
class function Filter<T>(const InputArray: TArray<T>;
const FilterFunction: TPredicateClosure<T>): TArray<T>;
class procedure ForEach<T>(const InputArray: TArray<T>;
const ForEachClosure: TForEachClosure<T>);
end;
function NewJSONSerializer: IMVCJSONSerializer; function NewJSONSerializer: IMVCJSONSerializer;
function StrToJSONObject(const aString: String; ARaiseExceptionOnError: Boolean = False): TJsonObject; function StrToJSONObject(const aString: String; aRaiseExceptionOnError: Boolean = False): TJsonObject;
function StrToJSONArray(const aString: String; ARaiseExceptionOnError: Boolean = False): TJsonArray; function StrToJSONArray(const aString: String; aRaiseExceptionOnError: Boolean = False): TJsonArray;
function WrapAsList(const AObject: TObject; AOwnsObject: Boolean = False): IMVCList; function WrapAsList(const aObject: TObject; const aOwnsObject: Boolean = False): IMVCList;
function GetMD5HashFromStream(AStream: TStream): string; function GetMD5HashFromStream(const aStream: TStream): string;
function GetMD5HashFromString(const AString: String): string; function GetMD5HashFromString(const aString: String): string;
function GetSHA1HashFromString(const AString: String): string; function GetSHA1HashFromString(const aString: String): string;
function GetSHA1HashFromStream(AStream: TStream): string; function GetSHA1HashFromStream(const aStream: TStream): string;
implementation implementation
@ -51,77 +87,77 @@ uses
IdHashMessageDigest, IdHashMessageDigest,
IdHashSHA, IdHashSHA,
{$ENDIF} {$ENDIF}
System.Generics.Collections,
MVCFramework.Serializer.JsonDataObjects, MVCFramework.Serializer.JsonDataObjects,
MVCFramework.Commons, MVCFramework.Commons,
System.SysUtils,
System.TypInfo; System.TypInfo;
function GetMD5HashFromStream(AStream: TStream): string; function GetMD5HashFromStream(const aStream: TStream): string;
{$IF not defined(TOKYOORBETTER)} {$IF not defined(TOKYOORBETTER)}
var var
lMD5Hash: TIdHashMessageDigest5; lMD5Hash: TIdHashMessageDigest5;
{$ENDIF} {$ENDIF}
begin begin
{$IF defined(TOKYOORBETTER)} {$IF defined(TOKYOORBETTER)}
Result := THashMD5.GetHashString(AStream); Result := THashMD5.GetHashString(aStream);
{$ELSE} {$ELSE}
lMD5Hash := TIdHashMessageDigest5.Create; lMD5Hash := TIdHashMessageDigest5.Create;
try try
Result := lMD5Hash.HashStreamAsHex(AStream); Result := lMD5Hash.HashStreamAsHex(aStream);
finally finally
lMD5Hash.Free; lMD5Hash.Free;
end; end;
{$ENDIF} {$ENDIF}
end; end;
function GetSHA1HashFromStream(AStream: TStream): string; function GetSHA1HashFromStream(const aStream: TStream): string;
{$IF not defined(TOKYOORBETTER)} {$IF not defined(TOKYOORBETTER)}
var var
lSHA1Hash: TIdHashSHA1; lSHA1Hash: TIdHashSHA1;
{$ENDIF} {$ENDIF}
begin begin
{$IF defined(TOKYOORBETTER)} {$IF defined(TOKYOORBETTER)}
Result := THashSHA1.GetHashString(AStream); Result := THashSHA1.GetHashString(aStream);
{$ELSE} {$ELSE}
lSHA1Hash := TIdHashSHA1.Create; lSHA1Hash := TIdHashSHA1.Create;
try try
Result := lSHA1Hash.HashStreamAsHex(AStream); Result := lSHA1Hash.HashStreamAsHex(aStream);
finally finally
lSHA1Hash.Free; lSHA1Hash.Free;
end; end;
{$ENDIF} {$ENDIF}
end; end;
function GetMD5HashFromString(const AString: String): string; function GetMD5HashFromString(const aString: String): string;
{$IF not defined(TOKYOORBETTER)} {$IF not defined(TOKYOORBETTER)}
var var
lMD5Hash: TIdHashMessageDigest5; lMD5Hash: TIdHashMessageDigest5;
{$ENDIF} {$ENDIF}
begin begin
{$IF defined(TOKYOORBETTER)} {$IF defined(TOKYOORBETTER)}
Result := THashMD5.GetHashString(AString); Result := THashMD5.GetHashString(aString);
{$ELSE} {$ELSE}
lMD5Hash := TIdHashMessageDigest5.Create; lMD5Hash := TIdHashMessageDigest5.Create;
try try
Result := lMD5Hash.HashStringAsHex(AString); Result := lMD5Hash.HashStringAsHex(aString);
finally finally
lMD5Hash.Free; lMD5Hash.Free;
end; end;
{$ENDIF} {$ENDIF}
end; end;
function GetSHA1HashFromString(const AString: String): string; function GetSHA1HashFromString(const aString: String): string;
{$IF not defined(TOKYOORBETTER)} {$IF not defined(TOKYOORBETTER)}
var var
lSHA1Hash: TIdHashSHA1; lSHA1Hash: TIdHashSHA1;
{$ENDIF} {$ENDIF}
begin begin
{$IF defined(TOKYOORBETTER)} {$IF defined(TOKYOORBETTER)}
Result := THashSHA1.GetHashString(AString); Result := THashSHA1.GetHashString(aString);
{$ELSE} {$ELSE}
lSHA1Hash := TIdHashSHA1.Create; lSHA1Hash := TIdHashSHA1.Create;
try try
Result := lSHA1Hash.HashStringAsHex(AString); Result := lSHA1Hash.HashStringAsHex(aString);
finally finally
lSHA1Hash.Free; lSHA1Hash.Free;
end; end;
@ -134,19 +170,122 @@ begin
Result := TMVCJsonDataObjectsSerializer.Create; Result := TMVCJsonDataObjectsSerializer.Create;
end; end;
function StrToJSONObject(const aString: String; ARaiseExceptionOnError: Boolean = False): TJsonObject; function StrToJSONObject(const aString: String; aRaiseExceptionOnError: Boolean = False): TJsonObject;
begin begin
Result := MVCFramework.Serializer.JSONDataObjects.StrToJSONObject(aString, ARaiseExceptionOnError); Result := MVCFramework.Serializer.JSONDataObjects.StrToJSONObject(aString, aRaiseExceptionOnError);
end; end;
function StrToJSONArray(const aString: String; ARaiseExceptionOnError: Boolean = False): TJsonArray; function StrToJSONArray(const aString: String; aRaiseExceptionOnError: Boolean = False): TJsonArray;
begin begin
Result := MVCFramework.Serializer.JSONDataObjects.StrToJSONArray(aString, ARaiseExceptionOnError); Result := MVCFramework.Serializer.JSONDataObjects.StrToJSONArray(aString, aRaiseExceptionOnError);
end; end;
function WrapAsList(const AObject: TObject; AOwnsObject: Boolean = False): IMVCList; function WrapAsList(const aObject: TObject; const aOwnsObject: Boolean = False): IMVCList;
begin begin
Result := MVCFramework.DuckTyping.WrapAsList(AObject, AOwnsObject); Result := MVCFramework.DuckTyping.WrapAsList(aObject, aOwnsObject);
end;
{ HigherOrder }
class function HigherOrder.Filter<T>(const InputArray: TArray<T>;
const FilterFunction: TPredicateClosure<T>): TArray<T>;
var
lIdx, I: Integer;
lList: TList<T>;
begin
lIdx := -1;
try
lList := TList<T>.Create;
try
for I := 0 to Length(InputArray) - 1 do
begin
lIdx := I;
if FilterFunction(InputArray[I]) then
begin
lList.add(InputArray[I]);
end;
end;
Result := lList.ToArray;
finally
lList.Free;
end;
except
on E: Exception do
begin
raise EHOFilterError.CreateFmt
('Filter error at index %d - [Class: %s][Message: %s]',
[lIdx, E.ClassName, E.Message]);
end;
end;
end;
class procedure HigherOrder.ForEach<T>(const InputArray: TArray<T>;
const ForEachClosure: TForEachClosure<T>);
var
I, lIdx: Integer;
begin
lIdx := 0;
try
for I := Low(InputArray) to High(InputArray) do
begin
lIdx := I;
ForEachClosure(InputArray[I]);
end;
except
on E: Exception do
begin
raise EHOForEachError.CreateFmt
('ForEach error at index %d - [Class: %s][Message: %s]',
[lIdx, E.ClassName, E.Message]);
end;
end;
end;
class function HigherOrder.Map<T>(const InputArray: TArray<T>;
const MapClosure: TMapClosure<T>): TArray<T>;
var
lIdx, I: Integer;
begin
lIdx := 0;
try
SetLength(Result, Length(InputArray));
for I := 0 to Length(InputArray) - 1 do
begin
lIdx := I;
Result[I] := MapClosure(InputArray[I]);
end;
except
on E: Exception do
begin
raise EHOMapError.CreateFmt
('Map error at index %d - [Class: %s][Message: %s]',
[lIdx, E.ClassName, E.Message]);
end;
end;
end;
class function HigherOrder.Reduce<T>(const InputArray: TArray<T>;
const ReduceFunction: TMapReduceClosure<T>; InitValue: T): T;
var
I: T;
lIdx: Integer;
begin
lIdx := 0;
Result := InitValue;
try
for I in InputArray do
begin
Result := ReduceFunction(Result, I);
Inc(lIdx);
end;
except
on E: Exception do
begin
raise EHOReduceError.CreateFmt
('Reduce error at index %d - [Class: %s][Message: %s]',
[lIdx, E.ClassName, E.Message]);
end;
end;
end; end;
end. end.