diff --git a/Packages/Delphi/Delphi 10.4+/Python.dproj b/Packages/Delphi/Delphi 10.4+/Python.dproj
index 664bec0d..05aea215 100644
--- a/Packages/Delphi/Delphi 10.4+/Python.dproj
+++ b/Packages/Delphi/Delphi 10.4+/Python.dproj
@@ -5,14 +5,19 @@
Release
VCL
Python.dpk
- Linux64
+ Win32
{018AAA56-F5BD-4A04-BCCA-A0043EAAA5CE}
19.4
- 168067
+ 168083
true
+
+ true
+ Base
+ true
+
true
Base
@@ -91,6 +96,11 @@
CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName=
1033
+
+ 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
+ annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.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;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar
+
Debug
annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.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;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar
@@ -190,14 +200,14 @@
- False
+ True
True
+ False
True
True
True
True
True
- False
12
diff --git a/Packages/Delphi/Delphi 10.4+/PythonCommon.dpk b/Packages/Delphi/Delphi 10.4+/PythonCommon.dpk
new file mode 100644
index 00000000..bae4e8d4
--- /dev/null
+++ b/Packages/Delphi/Delphi 10.4+/PythonCommon.dpk
@@ -0,0 +1,39 @@
+package PythonCommon;
+
+{$R *.res}
+{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION OFF}
+{$OVERFLOWCHECKS ON}
+{$RANGECHECKS ON}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DEFINE DEBUG}
+{$ENDIF IMPLICITBUILDING}
+{$LIBSUFFIX AUTO}
+{$RUNONLY}
+{$IMPLICITBUILD ON}
+
+requires
+ rtl;
+
+contains
+ ExecCmd in '..\..\..\Source\common\ExecCmd.pas',
+ ExecCmdCommon in '..\..\..\Source\common\ExecCmdCommon.pas';
+
+end.
diff --git a/Packages/Delphi/Delphi 10.4+/PythonCommon.dproj b/Packages/Delphi/Delphi 10.4+/PythonCommon.dproj
new file mode 100644
index 00000000..344e3ca1
--- /dev/null
+++ b/Packages/Delphi/Delphi 10.4+/PythonCommon.dproj
@@ -0,0 +1,962 @@
+
+
+ {8AAD598E-CB99-406B-B301-494801CA7EFB}
+ PythonCommon.dpk
+ 19.4
+ None
+ True
+ Release
+ Win32
+ 168083
+ Package
+
+
+ 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
+
+
+ ..\..\..\lib\$(Platform)\$(Config)
+ .\$(Platform)\$(Config)
+ false
+ false
+ false
+ false
+ false
+ true
+ true
+ System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)
+ All
+ 1046
+ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
+ true
+ $(Auto)
+ PythonCommon
+ ..\..\..\Source\common;$(DCC_UnitSearchPath)
+
+
+ None
+ annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.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;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar
+ 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
+
+
+ None
+ annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.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;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar
+ 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
+
+
+ None
+ 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;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;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)
+
+
+ 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
+
+
+ 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
+
+
+ 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
+
+
+ Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)
+ Debug
+ true
+ 1033
+
+
+ DEBUG;$(DCC_Define)
+ true
+ false
+ true
+ true
+ true
+ true
+ true
+
+
+ /usr/bin/xterm -e "%debuggee%"
+
+
+ false
+ true
+ 1033
+
+
+ false
+ RELEASE;$(DCC_Define)
+ 0
+ 0
+
+
+
+ MainSource
+
+
+
+
+
+ Base
+
+
+ Cfg_1
+ Base
+
+
+ Cfg_2
+ Base
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ Python4Delphi - Design-time Engine Package
+ Python4Delphi - Design-Time Engine Package for VCL
+ Python4Delphi - Design-time Engine Package for FMX
+ File C:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\dclP4DEnvironment280.bpl not found
+ File C:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\dclP4DPyPackage280.bpl not found
+ P4D AI&ML extension for Python packages - NumPy
+ P4D AI&ML extension for Python packages - Scikit-learn
+ P4D AI&ML extension for Python packages - PyTorch
+ File C:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\dclMatplotLib280.bpl not found
+ P4D AI&ML extension for Python packages - TensorFlow
+ P4D AI&ML extension for Python packages - TensorFlow
+ File C:\Users\Public\Documents\Embarcadero\Studio\22.0\dcp\Win32\Release\DUnitX_IDE_Expert_D11Alexandria.bpl not found
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+ P4D AI&ML extension for Python packages - NLTK
+
+
+ PythonCommon.dpk
+
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ PythonCommon.bpl
+ true
+
+
+
+
+ PythonCommon.bpl
+ true
+
+
+
+
+ 1
+
+
+ 0
+
+
+
+
+ classes
+ 64
+
+
+ classes
+ 64
+
+
+
+
+ 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-xxxhdpi
+ 1
+
+
+ res\drawable-xxxhdpi
+ 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
+
+
+ 1
+
+
+ 0
+
+
+
+
+ 1
+ .framework
+
+
+ 1
+ .framework
+
+
+ 1
+ .framework
+
+
+ 0
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 0
+ .dll;.bpl
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 0
+ .bpl
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 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\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 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\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+ Contents\Resources
+ 1
+
+
+ Contents\Resources
+ 1
+
+
+ Contents\Resources
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+ library\lib\arm64-v8a
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 0
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ False
+ True
+ True
+ True
+ True
+ True
+
+
+ 12
+
+
+
+
+
diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk b/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk
index 842cd73f..b25bcf38 100644
--- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk
+++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk
@@ -9,21 +9,21 @@ package PythonFmx;
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
-{$LOCALSYMBOLS OFF}
+{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
-{$OPTIMIZATION ON}
-{$OVERFLOWCHECKS OFF}
-{$RANGECHECKS OFF}
-{$REFERENCEINFO OFF}
+{$OPTIMIZATION OFF}
+{$OVERFLOWCHECKS ON}
+{$RANGECHECKS ON}
+{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
-{$STACKFRAMES OFF}
+{$STACKFRAMES ON}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
-{$DEFINE RELEASE}
+{$DEFINE DEBUG}
{$ENDIF IMPLICITBUILDING}
{$DESCRIPTION 'Python4Delphi - Run-time Engine Package for FMX'}
{$LIBSUFFIX AUTO}
@@ -33,32 +33,32 @@ package PythonFmx;
requires
rtl,
fmx,
- Python,
- bindcompfmx;
+ bindcompfmx,
+ python;
contains
FMX.PythonGUIInputOutput in '..\..\..\Source\fmx\FMX.PythonGUIInputOutput.pas',
+ WrapDelphiFmx in '..\..\..\Source\fmx\WrapDelphiFmx.pas',
WrapFmxActnList in '..\..\..\Source\fmx\WrapFmxActnList.pas',
+ WrapFmxColors in '..\..\..\Source\fmx\WrapFmxColors.pas',
WrapFmxComCtrls in '..\..\..\Source\fmx\WrapFmxComCtrls.pas',
WrapFmxControls in '..\..\..\Source\fmx\WrapFmxControls.pas',
+ WrapFmxDataBind in '..\..\..\Source\fmx\WrapFmxDataBind.pas',
WrapFmxDialogs in '..\..\..\Source\fmx\WrapFmxDialogs.pas',
+ WrapFmxEdit in '..\..\..\Source\fmx\WrapFmxEdit.pas',
WrapFmxForms in '..\..\..\Source\fmx\WrapFmxForms.pas',
WrapFmxGrids in '..\..\..\Source\fmx\WrapFmxGrids.pas',
WrapFmxLayouts in '..\..\..\Source\fmx\WrapFmxLayouts.pas',
- WrapFmxScrollBox in '..\..\..\Source\fmx\WrapFmxScrollBox.pas',
- WrapFmxShapes in '..\..\..\Source\fmx\WrapFmxShapes.pas',
- WrapFmxStdCtrls in '..\..\..\Source\fmx\WrapFmxStdCtrls.pas',
- WrapFmxTypes in '..\..\..\Source\fmx\WrapFmxTypes.pas',
- WrapDelphiFmx in '..\..\..\Source\fmx\WrapDelphiFmx.pas',
- WrapFmxEdit in '..\..\..\Source\fmx\WrapFmxEdit.pas',
WrapFmxListBox in '..\..\..\Source\fmx\WrapFmxListBox.pas',
+ WrapFmxListView in '..\..\..\Source\fmx\WrapFmxListView.pas',
WrapFmxMedia in '..\..\..\Source\fmx\WrapFmxMedia.pas',
+ WrapFmxMemo in '..\..\..\Source\fmx\WrapFmxMemo.pas',
WrapFmxMenus in '..\..\..\Source\fmx\WrapFmxMenus.pas',
+ WrapFmxScrollBox in '..\..\..\Source\fmx\WrapFmxScrollBox.pas',
+ WrapFmxShapes in '..\..\..\Source\fmx\WrapFmxShapes.pas',
+ WrapFmxStdActns in '..\..\..\Source\fmx\WrapFmxStdActns.pas',
+ WrapFmxStdCtrls in '..\..\..\Source\fmx\WrapFmxStdCtrls.pas',
WrapFmxStyles in '..\..\..\Source\fmx\WrapFmxStyles.pas',
- WrapFmxMemo in '..\..\..\Source\fmx\WrapFmxMemo.pas',
- WrapFmxColors in '..\..\..\Source\fmx\WrapFmxColors.pas',
- WrapFmxListView in '..\..\..\Source\fmx\WrapFmxListView.pas',
- WrapFmxDataBind in '..\..\..\Source\fmx\WrapFmxDataBind.pas',
- WrapFmxStdActns in '..\..\..\Source\fmx\WrapFmxStdActns.pas';
+ WrapFmxTypes in '..\..\..\Source\fmx\WrapFmxTypes.pas';
end.
diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj
index d7aeebe0..36d86082 100644
--- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj
+++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj
@@ -1,25 +1,30 @@
- True
- Package
- Release
- FMX
+ {513BF750-373D-4C95-A672-78CA8DDF3F63}
PythonFmx.dpk
- Linux64
- {6C9FBAC1-1024-4A46-96EE-2CADEFE347AA}
19.4
- 168067
+ FMX
+ True
+ Release
+ Win32
+ 167955
+ Package
true
+
+ true
+ Base
+ true
+
true
Base
true
-
- true
+
+ true
Base
true
@@ -48,131 +53,97 @@
Base
true
-
- true
- Cfg_1
- true
- true
-
true
Cfg_1
true
true
-
- true
- Cfg_1
- true
- true
-
true
Base
true
-
- true
- Cfg_2
- true
- true
-
-
- true
- Cfg_2
- true
- true
-
-
- true
- Cfg_2
- true
- true
-
-
- true
- Cfg_2
- true
- true
-
- PythonFmx
..\..\..\lib\$(Platform)\$(Config)
- Python4Delphi - Run-time Engine Package for FMX
.\$(Platform)\$(Config)
- System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)
- ..\..\..\lib\$(Platform)\$(Config);$(DCC_UnitSearchPath)
- $(Auto)
+ false
+ false
+ false
+ false
+ false
true
true
- true
+ System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)
+ All
+ PythonFmx
+ 1046
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
+ Python4Delphi - Run-time Engine Package for FMX
+ true
+ $(Auto)
-
+
+ None
+ annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.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;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar
+ 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
+
+
+ None
annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.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;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar
- 1
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
-
- /usr/bin/xterm -e "%debuggee%"
+
+ None
+ 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;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;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)
- Debug
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
- Debug
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
- Debug
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
- Debug
Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)
+ Debug
true
+ 1033
- true
- true
DEBUG;$(DCC_Define)
- true
+ true
false
+ true
+ true
true
-
-
- 1
- 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=
+ true
+ true
false
true
-
-
- true
+ 1033
- 0
- RELEASE;$(DCC_Define)
false
+ RELEASE;$(DCC_Define)
0
-
-
- 1
- 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=
-
-
- /usr/bin/xterm -e "%debuggee%"
-
-
- true
-
-
- true
+ 0
@@ -180,31 +151,31 @@
-
+
+
+
+
+
-
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
Base
@@ -225,17 +196,769 @@
PythonFmx.dpk
-
+
+ Python4Delphi - Design-time Engine Package
+ P4D AI&ML - Python environments
+ P4D AI&ML extension for Python packages
+ P4D AI&ML extension for Python packages - NumPy
+ P4D AI&ML extension for Python packages - Scikit-learn
+ P4D AI&ML extension for Python packages - PyTorch
+ File C:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\dclMatplotLib280.bpl not found
+ P4D AI&ML extension for Python packages - TensorFlow
+ P4D AI&ML extension for Python packages - TensorFlow
+ File C:\Users\Public\Documents\Embarcadero\Studio\22.0\dcp\Win32\Release\DUnitX_IDE_Expert_D11Alexandria.bpl not found
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+ P4D AI&ML extension for Python packages - TensorFlow
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ PythonFmx.bpl
+ true
+
+
+
+
+ 1
+
+
+ 0
+
+
+
+
+ classes
+ 64
+
+
+ classes
+ 64
+
+
+
+
+ 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-xxxhdpi
+ 1
+
+
+ res\drawable-xxxhdpi
+ 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
+
+
+ 1
+
+
+ 0
+
+
+
+
+ 1
+ .framework
+
+
+ 1
+ .framework
+
+
+ 1
+ .framework
+
+
+ 0
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 0
+ .dll;.bpl
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 0
+ .bpl
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 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\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 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\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+ Contents\Resources
+ 1
+
+
+ Contents\Resources
+ 1
+
+
+ Contents\Resources
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+ library\lib\arm64-v8a
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 0
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- False
+ True
True
- True
+ False
+ False
True
True
True
True
- False
12
diff --git a/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj b/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj
index ad500b3c..c86ebb4d 100644
--- a/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj
+++ b/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj
@@ -143,12 +143,12 @@
False
False
+ False
False
False
False
True
True
- False
12
diff --git a/Packages/Delphi/Delphi 10.4+/dclFmxP4DEngine.dres b/Packages/Delphi/Delphi 10.4+/dclFmxP4DEngine.dres
deleted file mode 100644
index 25d22b36..00000000
Binary files a/Packages/Delphi/Delphi 10.4+/dclFmxP4DEngine.dres and /dev/null differ
diff --git a/Packages/Delphi/Delphi 10.4+/dclP4DEngine.dres b/Packages/Delphi/Delphi 10.4+/dclP4DEngine.dres
deleted file mode 100644
index b835856a..00000000
Binary files a/Packages/Delphi/Delphi 10.4+/dclP4DEngine.dres and /dev/null differ
diff --git a/Packages/Delphi/Delphi 10.4+/dclPython.dproj b/Packages/Delphi/Delphi 10.4+/dclPython.dproj
index 7103309c..00300534 100644
--- a/Packages/Delphi/Delphi 10.4+/dclPython.dproj
+++ b/Packages/Delphi/Delphi 10.4+/dclPython.dproj
@@ -144,12 +144,12 @@
False
False
+ False
False
False
False
True
False
- False
12
diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj
index f3f94a49..5a0748e7 100644
--- a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj
+++ b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj
@@ -89,7 +89,7 @@
MainSource
-
+
BITMAP
@@ -120,13 +120,751 @@
False
False
+ False
False
False
False
True
False
- False
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ dclPythonFmx.bpl
+ true
+
+
+
+
+ 1
+
+
+ 0
+
+
+
+
+ classes
+ 64
+
+
+ classes
+ 64
+
+
+
+
+ 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-xxxhdpi
+ 1
+
+
+ res\drawable-xxxhdpi
+ 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
+
+
+ 1
+
+
+ 0
+
+
+
+
+ 1
+ .framework
+
+
+ 1
+ .framework
+
+
+ 1
+ .framework
+
+
+ 0
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 0
+ .dll;.bpl
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 0
+ .bpl
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 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\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 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\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+ Contents\Resources
+ 1
+
+
+ Contents\Resources
+ 1
+
+
+ Contents\Resources
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+ library\lib\arm64-v8a
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 0
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
12
diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj b/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj
index 05048c5e..92a13f0a 100644
--- a/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj
+++ b/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj
@@ -120,12 +120,12 @@
False
False
+ False
False
False
False
True
False
- False
12
diff --git a/Packages/Delphi/Delphi 10.4+/dclVclP4DEngine.dres b/Packages/Delphi/Delphi 10.4+/dclVclP4DEngine.dres
deleted file mode 100644
index 6cd8c1bb..00000000
Binary files a/Packages/Delphi/Delphi 10.4+/dclVclP4DEngine.dres and /dev/null differ
diff --git a/Packages/Delphi/P4DComponentSuite.groupproj b/Packages/Delphi/P4DComponentSuite.groupproj
index e48d956d..8b045d11 100644
--- a/Packages/Delphi/P4DComponentSuite.groupproj
+++ b/Packages/Delphi/P4DComponentSuite.groupproj
@@ -16,10 +16,13 @@
Delphi 10.4+\PythonVcl.dproj
- Delphi 10.4+\PythonVcl.dproj
+
- Delphi 10.4+\PythonFmx.dproj
+
+
+
+
@@ -65,32 +68,41 @@
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
diff --git a/Source/common/ExecCmd.Posix.pas b/Source/common/ExecCmd.Posix.pas
new file mode 100644
index 00000000..8d79da54
--- /dev/null
+++ b/Source/common/ExecCmd.Posix.pas
@@ -0,0 +1,285 @@
+unit ExecCmd.Posix;
+
+{$WEAKPACKAGEUNIT}
+
+interface
+
+uses
+ Posix.Base, Posix.Fcntl, Posix.Unistd, Posix.SysWait, Posix.Stdlib,
+ Posix.Stdio, Posix.SysTypes, Posix.Signal, Posix.Errno, Posix.SysStat,
+ Posix.String_,
+ ExecCmd;
+
+type
+ TStreamHandle = pointer;
+
+ TExecCmdPosix = class(TInterfacedObject, IExecCmd)
+ private
+ FCmd: string;
+ FArg: TArray;
+ FEnv: TArray;
+ FPid: Integer;
+ FRead: TPipeDescriptors;
+ FWrite: TPipeDescriptors;
+ FExitCode: integer;
+ procedure Redirect(out AReader: TReader; out AWriter: TWriter);
+ function PeekMessage(): string;
+ protected
+ function GetIsAlive: boolean;
+ function GetExitCode: Integer;
+ public
+ constructor Create(const ACmd: string; AArg, AEnv: TArray);
+ destructor Destroy(); override;
+
+ function Run(): IExecCmd; overload;
+ function Run(out AOutput: string): IExecCmd; overload;
+ function Run(out AReader: TReader; out AWriter: TWriter; const ARedirections: TRedirections): IExecCmd; overload;
+ procedure Kill();
+ function Wait(): Integer;
+
+ property IsAlive: boolean read GetIsAlive;
+ property ExitCode: Integer read GetExitCode;
+ end;
+
+ EForkFailed = class(EExecCmd);
+ EPipeFailed = class(EExecCmd);
+ EInvalidArgument = class(EExecCmd);
+ EOperationNotPermitted = class(EExecCmd);
+ ENoSuchProcess = class(EExecCmd);
+ EWaitFailed = class(EExecCmd);
+
+implementation
+
+uses
+ System.SysUtils, System.IOUtils;
+
+const
+ INITIAL_EXIT_CODE = -999;
+
+{ TExecCmdPosix }
+
+constructor TExecCmdPosix.Create(const ACmd: string; AArg, AEnv: TArray);
+begin
+ inherited Create();
+ FCmd := ACmd;
+ FArg := AArg;
+ FEnv := AEnv;
+ FExitCode := INITIAL_EXIT_CODE;
+end;
+
+destructor TExecCmdPosix.Destroy;
+begin
+ if IsAlive then
+ Kill();
+
+ __close(FRead.ReadDes);
+ __close(FWrite.WriteDes);
+ inherited;
+end;
+
+function TExecCmdPosix.GetExitCode: Integer;
+begin
+ Result := Wait();
+end;
+
+function TExecCmdPosix.GetIsAlive: boolean;
+var
+ LWaitedPid: integer;
+ LStatus: integer;
+begin
+ if (FExitCode <> INITIAL_EXIT_CODE) then
+ Exit(false);
+
+ LWaitedPid := waitpid(FPid, @LStatus, WNOHANG);
+ if (LWaitedPid = -1) then
+ raise EWaitFailed.Create('Failed waiting for proess.')
+ else if (LWaitedPid = 0) then
+ Exit(true)
+ else begin
+ if WIFEXITED(LStatus) then begin
+ FExitCode := WEXITSTATUS(LStatus);
+ end else if WIFSIGNALED(LStatus) then begin
+ FExitCode := WTERMSIG(LStatus);
+ end else if WIFSTOPPED(LStatus) then begin
+ FExitCode := WSTOPSIG(LStatus);
+ end else begin
+ FExitCode := EXIT_FAILURE;
+ end;
+ end;
+ Result := false;
+end;
+
+procedure TExecCmdPosix.Kill;
+begin
+ if (Posix.Signal.kill(FPid, Posix.Signal.SIGKILL) <> 0) then
+ if (errno = EINVAL) then //Invalid signal
+ raise EInvalidArgument.Create('Invalid argument.')
+ else if (errno = EPERM) then //The process does not have permission to send the signal to any of the target processes.
+ raise EOperationNotPermitted.Create('Operation not permitted.')
+ else if (errno = ESRCH) then //The pid or process group does not exist. Note that an existing process might be a zombie, a process which already committed termination, but has not yet been wait(2)ed for.
+ raise ENoSuchProcess.Create('No such process.')
+end;
+
+function TExecCmdPosix.PeekMessage: string;
+var
+ LBuffer: array[0..511] of UInt8;
+ LCount: integer;
+begin
+ while True do begin
+ LCount := __read(FRead.ReadDes, @LBuffer[0], SizeOf(LBuffer));
+ if (LCount = -1) then begin
+ if (errno = EINTR) then
+ Continue
+ else
+ Exit(String.Empty);
+ end else if (LCount = 0) then
+ Exit(String.Empty)
+ else begin
+ Exit(Copy(UTF8ToString(@LBuffer[0]), 1, UTF8ToString(@LBuffer[0]).Length -1));
+ end;
+ end;
+end;
+
+procedure TExecCmdPosix.Redirect(out AReader: ExecCmd.TReader;
+ out AWriter: ExecCmd.TWriter);
+var
+ LBuffer: string;
+ M: TMarshaller;
+begin
+ AReader := function(): string
+ begin
+ Result := String.Empty;
+
+ while GetIsAlive() and Result.IsEmpty() do begin
+ Result := Result + PeekMessage();
+ end;
+
+ if not Result.IsEmpty() then
+ Exit;
+
+ //Preventing race condition...
+ repeat
+ LBuffer := PeekMessage();
+ if not LBuffer.IsEmpty() then
+ Result := Result + LBuffer;
+ until (LBuffer.IsEmpty());
+ end;
+
+ AWriter := procedure(AIn: string) begin
+ __write(FWrite.WriteDes, M.AsUtf8(PWideChar(AIn)).ToPointer(), AIn.Length);
+ end;
+end;
+
+function TExecCmdPosix.Run(out AOutput: string): IExecCmd;
+var
+ LReader: TReader;
+ LWriter: TWriter;
+ LOutput: string;
+begin
+ AOutput := String.Empty;
+ Result := Run(LReader, LWriter, [TRedirect.stdout]);
+ repeat
+ LOutput := LReader();
+ if not LOutput.IsEmpty() then
+ AOutput := AOutput + LOutput;
+ until LOutput.IsEmpty();
+end;
+
+function TExecCmdPosix.Run(out AReader: ExecCmd.TReader;
+ out AWriter: ExecCmd.TWriter;
+ const ARedirections: TRedirections): IExecCmd;
+var
+ M: TMarshaller;
+ LArg, LEnv: array of PAnsiChar;
+ I: Integer;
+begin
+ //#define PARENT_READ read_pipe[0]
+ //#define PARENT_WRITE write_pipe[1]
+ //#define CHILD_WRITE read_pipe[1]
+ //#define CHILD_READ write_pipe[0]
+
+ if (pipe(FRead) = -1) or (pipe(FWrite) = -1) then
+ raise EPipeFailed.Create('Failed to create pipe.');
+
+ FPid := fork();
+ if (FPid < 0) then
+ raise EForkFailed.Create('Failed to fork process.')
+ else if (FPid = 0) then begin
+ while ((dup2(FRead.WriteDes, STDOUT_FILENO) = -1) and (errno = EINTR)) do begin end;
+ while ((dup2(FRead.WriteDes, STDERR_FILENO) = -1) and (errno = EINTR)) do begin end;
+ while ((dup2(FWrite.ReadDes, STDIN_FILENO) = -1) and (errno = EINTR)) do begin end;
+ __close(FRead.WriteDes);
+ __close(FRead.ReadDes);
+ __close(FWrite.ReadDes);
+
+ //https://man7.org/linux/man-pages/man2/execve.2.html
+
+ //argv is an array of pointers to strings passed to the new program
+ //as its command-line arguments. By convention, THE FIRST OF THESE
+ //STRINGS (i.e., argv[0]) SHOULD CONTAIN THE FILENAME ASSOCIATED
+ //WITH THE FILE BEING EXECUTED. The argv array must be terminated
+ //by a NULL pointer. (Thus, in the new program, argv[argc] will be
+ //NULL.)
+
+ SetLength(LArg, Length(FArg) + 1);
+ for I := Low(FArg) to High(FArg) do
+ LArg[I] := M.AsAnsi(PWideChar(FArg[I]) + #0).ToPointer();
+ LArg[High(LArg)] := PAnsiChar(nil);
+
+ SetLength(LEnv, Length(FEnv) + 1);
+ for I := Low(FEnv) to High(FEnv) do
+ LEnv[I] := M.AsAnsi(PWideChar(FEnv[I]) + #0).ToPointer();
+ LEnv[High(LEnv)] := PAnsiChar(nil);
+
+ if execve(M.AsAnsi(PWideChar(FCmd)).ToPointer(), PPAnsiChar(LArg), PPAnsiChar(LEnv)) = -1 then begin
+ Halt(errno);
+ end else
+ Halt(EXIT_FAILURE);
+ end else if (FPid > 0) then begin
+ __close(FRead.WriteDes);
+ __close(FWrite.ReadDes);
+ __close(FWrite.WriteDes);
+ Redirect(AReader, AWriter);
+ end;
+ Result := Self;
+end;
+
+function TExecCmdPosix.Run: IExecCmd;
+var
+ LReader: TReader;
+ LWriter: TWriter;
+begin
+ Result := Run(LReader, LWriter, []);
+end;
+
+function TExecCmdPosix.Wait: Integer;
+var
+ LWaitedPid: integer;
+ LStatus: integer;
+begin
+ if (FExitCode <> INITIAL_EXIT_CODE) then
+ Exit(FExitCode);
+
+ LWaitedPid := waitpid(FPid, @LStatus, WNOHANG);
+ repeat
+ if (LWaitedPid = -1) then
+ raise EWaitFailed.Create('Failed waiting for process.')
+ else if (LWaitedPid = 0) then
+ LWaitedPid := waitpid(FPid, @LStatus, WNOHANG)
+ else begin
+ if WIFEXITED(LStatus) then begin
+ FExitCode := WEXITSTATUS(LStatus);
+ end else if WIFSIGNALED(LStatus) then begin
+ FExitCode := WTERMSIG(LStatus);
+ end else if WIFSTOPPED(LStatus) then begin
+ FExitCode := WSTOPSIG(LStatus);
+ end else begin
+ FExitCode := EXIT_FAILURE;
+ end;
+ end;
+ until (FExitCode <> INITIAL_EXIT_CODE);
+
+ Result := FExitCode;
+end;
+
+end.
diff --git a/Source/common/ExecCmd.Win.pas b/Source/common/ExecCmd.Win.pas
new file mode 100644
index 00000000..f2b0b61d
--- /dev/null
+++ b/Source/common/ExecCmd.Win.pas
@@ -0,0 +1,274 @@
+unit ExecCmd.Win;
+
+{$WEAKPACKAGEUNIT}
+
+interface
+
+uses
+ System.SysUtils, System.Classes, Winapi.Windows, ExecCmd;
+
+//Ref: https://docs.microsoft.com/en-us/windows/win32/procthread/creating-a-child-process-with-redirected-input-and-output
+
+type
+ TExecCmdWin = class(TInterfacedObject, IExecCmd)
+ private
+ FCmd: string;
+ FArg: TArray;
+ FEnv: TArray;
+ FSecurityAttributes: TSecurityAttributes;
+ FStartupInfo: TStartupInfo;
+ FProcessInfo: TProcessInformation;
+ //Pipes
+ //StdOut
+ FStdOutPipeRead: THandle;
+ FStdOutPipeWrite: THandle;
+ //StdIn
+ FStdInPipeRead: THandle;
+ FStdInPipeWrite: THandle;
+ //Job
+ FJob: THandle;
+ private
+ function GetStatus: cardinal;
+ procedure Execute();
+ //IO
+ function PeekMessage(const ACheckPipe: boolean = true): string;
+ protected
+ function GetIsAlive: boolean;
+ function GetExitCode: Integer;
+ public
+ constructor Create(const ACmd: string; const AArg, AEnv: TArray);
+ destructor Destroy(); override;
+
+ procedure Redirect(out AReader: TReader; out AWriter: TWriter);
+ function Run(): IExecCmd; overload;
+ function Run(out AOutput: string): IExecCmd; overload;
+ function Run(out AReader: TReader; out AWriter: TWriter; const ARedirections: TRedirections): IExecCmd; overload;
+ procedure Kill();
+ function Wait(): Integer;
+
+ property Status: cardinal read GetStatus;
+ property IsAlive: boolean read GetIsAlive;
+ property ExitCode: Integer read GetExitCode;
+ end;
+
+const
+ cCANCELATION_SIGNAL_EXIT_CODE = $001A;
+
+implementation
+
+uses
+ Math;
+
+{ TExecCmdWin }
+
+constructor TExecCmdWin.Create(const ACmd: string; const AArg, AEnv: TArray);
+begin
+ FCmd := ACmd;
+ FArg := AArg;
+ FEnv := AEnv;
+ //Set the bInheritedHandle to true so pipe handles are inherited
+ FSecurityAttributes := Default(TSecurityAttributes);
+ with FSecurityAttributes do begin
+ nLength := SizeOf(FSecurityAttributes);
+ bInheritHandle := True;
+ lpSecurityDescriptor := nil;
+ end;
+
+ //Create the startup information to the process
+ FStartupInfo := Default(TStartupInfo);
+ with FStartupInfo do
+ begin
+ cb := SizeOf(TStartupInfo);
+ dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
+ wShowWindow := SW_HIDE;
+ end;
+
+ //Create a job that kills the subprocess when parent dies
+ FJob := CreateJobObject(nil, nil);
+ if (FJob <> 0) then begin
+ var LExInfo: TJobObjectExtendedLimitInformation;
+ LExInfo.BasicLimitInformation.LimitFlags := JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
+ if not SetInformationJobObject(FJob, JobObjectExtendedLimitInformation,
+ @LExInfo, SizeOf(TJobObjectExtendedLimitInformation)) then
+ RaiseLastOSError();
+ end;
+
+ // Close handles to the stdin and stdout pipes no longer needed by the child process.
+ // If they are not explicitly closed, there is no way to recognize that the child process has ended.
+ CloseHandle(FStdOutPipeWrite);
+ CloseHandle(FStdInPipeRead);
+end;
+
+destructor TExecCmdWin.Destroy;
+begin
+ if IsAlive then
+ Kill();
+
+ CloseHandle(FProcessInfo.hThread);
+ CloseHandle(FProcessInfo.hProcess);
+ inherited;
+end;
+
+function TExecCmdWin.GetExitCode: Integer;
+begin
+ if not GetExitCodeProcess(FProcessInfo.hProcess, Cardinal(Result)) then
+ RaiseLastOSError();
+end;
+
+function TExecCmdWin.GetIsAlive: boolean;
+var
+ LExitCode: cardinal;
+begin
+ GetExitCodeProcess(FProcessInfo.hProcess, LExitCode);
+ Result := (LExitCode = STILL_ACTIVE);
+end;
+
+function TExecCmdWin.GetStatus: cardinal;
+begin
+ Result := WaitForSingleObject(FProcessInfo.hProcess, 0);
+end;
+
+procedure TExecCmdWin.Execute;
+begin
+ //Create the process
+ var LCmd := FCmd + ' ' + String.Join(' ', FArg);
+ UniqueString(LCmd);
+ if not CreateProcess(nil, PWideChar(LCmd), nil, nil, True, 0, nil, nil,
+ FStartupInfo, FProcessInfo) then
+ RaiseLastOSError();
+
+ //Assign the process to the job. It takes the proc. down when parent is killed.
+ AssignProcessToJobObject(FJob, FProcessInfo.hProcess);
+end;
+
+procedure TExecCmdWin.Redirect(out AReader: TReader; out AWriter: TWriter);
+var
+ LBytesWritten: cardinal;
+ LBuffer: string;
+begin
+ AReader := function(): string begin
+ Result := String.Empty;
+
+ while GetIsAlive() and Result.IsEmpty() do begin
+ Result := Result + PeekMessage();
+ end;
+
+ if not Result.IsEmpty() then
+ Exit;
+
+ //Preventing race condition...
+ repeat
+ LBuffer := PeekMessage();
+ if not LBuffer.IsEmpty() then
+ Result := Result + LBuffer;
+ until (LBuffer.IsEmpty());
+ end;
+
+ AWriter := procedure(AIn: string) begin
+ var LIn := AnsiString(AIn);
+ WriteFile(FStdInPipeWrite, LIn[1], Length(LIn), LBytesWritten, nil);
+ end;
+end;
+
+function TExecCmdWin.Run: IExecCmd;
+var
+ LReader: TReader;
+ LWriter: TWriter;
+begin
+ Result := Run(LReader, LWriter, []);
+end;
+
+function TExecCmdWin.Run(out AOutput: string): IExecCmd;
+var
+ LReader: TReader;
+ LWriter: TWriter;
+ LOutput: string;
+begin
+ AOutput := String.Empty;
+ Result := Run(LReader, LWriter, [TRedirect.stdout]);
+ repeat
+ LOutput := LReader();
+ if not LOutput.IsEmpty() then
+ AOutput := AOutput + LOutput;
+ until LOutput.IsEmpty();
+end;
+
+function TExecCmdWin.Run(out AReader: TReader; out AWriter: TWriter; const ARedirections: TRedirections): IExecCmd;
+begin
+ //STD OUT REDIRECTION
+ if (TRedirect.stdout in ARedirections) then begin
+ if not CreatePipe(FStdOutPipeRead, FStdOutPipeWrite, @FSecurityAttributes, 0) then
+ RaiseLastOSError();
+
+ //Ensure the read handle to the pipe for STDOUT is not inherited
+ //if not SetHandleInformation(FStdOutPipeRead, HANDLE_FLAG_INHERIT, 0) then
+ // RaiseLastOSError();
+
+ //Redirect to our pipe
+ FStartupInfo.hStdOutput := FStdOutPipeWrite;
+ FStartupInfo.hStdError := FStdOutPipeWrite;
+ end else begin
+ FStartupInfo.hStdOutput := GetStdHandle(STD_OUTPUT_HANDLE);
+ FStartupInfo.hStdError := GetStdHandle(STD_ERROR_HANDLE);
+ end;
+
+ //STD IN REDIRECTION
+ if (TRedirect.stdin in ARedirections) then begin
+ //Create a pipe for the child process's STDIN
+ if not CreatePipe(FStdInPipeRead, FStdInPipeWrite, @FSecurityAttributes, 0) then
+ RaiseLastOSError();
+
+ //Ensure the write handle to the pipe for STDIN is not inherited
+ //if not SetHandleInformation(FStdInPipeWrite, HANDLE_FLAG_INHERIT, 0) then
+ // RaiseLastOSError();
+
+ //Redirect to our pipe
+ FStartupInfo.hStdInput := FStdInPipeRead;
+ end else begin
+ FStartupInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
+ end;
+
+ Redirect(AReader, AWriter);
+
+ Execute();
+
+ Result := Self;
+end;
+
+function TExecCmdWin.Wait: Integer;
+begin
+ while GetIsAlive do
+ Sleep(100);
+ Result := GetExitCode;
+end;
+
+procedure TExecCmdWin.Kill;
+begin
+ if (Status = WAIT_TIMEOUT) then
+ if not TerminateProcess(FProcessInfo.hProcess, cCANCELATION_SIGNAL_EXIT_CODE) then
+ RaiseLastOSError();
+end;
+
+function TExecCmdWin.PeekMessage(const ACheckPipe: boolean): string;
+const
+ BUFFSIZE = 4096;
+type
+ TBuffArr = array[0..BUFFSIZE - 1] of AnsiChar;
+var
+ LBytesRead: cardinal;
+ LBuffer: TBuffArr;
+begin
+ Result := String.Empty;
+
+ if ACheckPipe and not PeekNamedPipe(FStdOutPipeRead, nil, 0, nil, @LBytesRead, nil) then
+ Exit;
+
+ if (LBytesRead > 0) then
+ if ReadFile(FStdOutPipeRead, LBuffer, BUFFSIZE, LBytesRead, nil) then
+ if (LBytesRead > 0) then begin
+ LBuffer[LBytesRead] := #0;
+ Result := Result + String(LBuffer);
+ end;
+end;
+
+end.
diff --git a/Source/common/ExecCmd.pas b/Source/common/ExecCmd.pas
new file mode 100644
index 00000000..4b7f6fc3
--- /dev/null
+++ b/Source/common/ExecCmd.pas
@@ -0,0 +1,97 @@
+(**************************************************************************)
+(* *)
+(* Module: Unit 'ExecCmd' *)
+(* *)
+(* Copyright (c) 2021 *)
+(* Lucas Moura Belo - lmbelo *)
+(* lucas.belo@live.com *)
+(* Brazil *)
+(* *)
+(* Project page: https://github.com/Embarcadero/python4delphi *)
+(**************************************************************************)
+(* Functionality: Execute Shell Commands and/or Subprocess *)
+(* *)
+(* *)
+(**************************************************************************)
+(* This source code is distributed with no WARRANTY, for no reason or use.*)
+(* Everyone is allowed to use and change this code free for his own tasks *)
+(* and projects, as long as this header and its copyright text is intact. *)
+(* For changed versions of this code, which are public distributed the *)
+(* following additional conditions have to be fullfilled: *)
+(* 1) The header has to contain a comment on the change and the author of *)
+(* it. *)
+(* 2) A copy of the changed source has to be sent to the above E-Mail *)
+(* address or my then valid address, if this is possible to the *)
+(* author. *)
+(* The second condition has the target to maintain an up to date central *)
+(* version of the component. If this condition is not acceptable for *)
+(* confidential or legal reasons, everyone is free to derive a component *)
+(* or to generate a diff file to my or other original sources. *)
+(**************************************************************************)
+unit ExecCmd;
+
+interface
+
+uses
+ System.SysUtils;
+
+type
+ TRedirect = (stdin, stdout);
+ TRedirections = set of TRedirect;
+ TReader = TFunc;
+ TWriter = TProc;
+
+ IExecCmd = interface
+ ['{FDCA9BAA-D412-4B48-96C2-0F08057FD6ED}']
+ function GetExitCode: Integer;
+ function GetIsAlive: boolean;
+
+ function Run(): IExecCmd; overload;
+ function Run(out AOutput: string): IExecCmd; overload;
+ function Run(out AReader: TReader; out AWriter: TWriter; const ARedirections: TRedirections): IExecCmd; overload;
+ procedure Kill();
+ function Wait(): Integer;
+
+ property IsAlive: boolean read GetIsAlive;
+ property ExitCode: Integer read GetExitCode;
+ end;
+
+ TExecCmdService = class
+ public
+ class function Cmd(const ACmd: string; const AArg, AEnv: TArray): IExecCmd; overload;
+ class function Cmd(const ACmd: string; const AArg: TArray): IExecCmd; overload;
+ end;
+
+ EExecCmd = class(Exception);
+
+const
+ EXIT_SUCCESS = 0;
+ EXIT_FAILURE = 1;
+
+implementation
+
+uses
+ {$IFDEF MSWINDOWS}
+ ExecCmd.Win;
+ {$ELSE}
+ ExecCmd.Posix;
+ {$ENDIF}
+
+{ TExecCmdService }
+
+class function TExecCmdService.Cmd(const ACmd: string; const AArg, AEnv: TArray): IExecCmd;
+begin
+ {$IFDEF MSWINDOWS}
+ Result := TExecCmdWin.Create(ACmd, AArg, AEnv);
+ {$ELSE}
+ Result := TExecCmdPosix.Create(ACmd, AArg, AEnv);
+ {$ENDIF}
+end;
+
+class function TExecCmdService.Cmd(const ACmd: string;
+ const AArg: TArray): IExecCmd;
+begin
+ Result := Cmd(ACmd, AArg, []);
+end;
+
+end.
diff --git a/Source/common/ExecCmdCommon.pas b/Source/common/ExecCmdCommon.pas
new file mode 100644
index 00000000..4e261685
--- /dev/null
+++ b/Source/common/ExecCmdCommon.pas
@@ -0,0 +1,80 @@
+(**************************************************************************)
+(* *)
+(* Module: Unit 'ExecCmdCommon' *)
+(* *)
+(* Copyright (c) 2021 *)
+(* Lucas Moura Belo - lmbelo *)
+(* lucas.belo@live.com *)
+(* Brazil *)
+(* *)
+(* Project page: https://github.com/Embarcadero/python4delphi *)
+(**************************************************************************)
+(* Functionality: Supplier for Execute Commands *)
+(* *)
+(* *)
+(**************************************************************************)
+(* This source code is distributed with no WARRANTY, for no reason or use.*)
+(* Everyone is allowed to use and change this code free for his own tasks *)
+(* and projects, as long as this header and its copyright text is intact. *)
+(* For changed versions of this code, which are public distributed the *)
+(* following additional conditions have to be fullfilled: *)
+(* 1) The header has to contain a comment on the change and the author of *)
+(* it. *)
+(* 2) A copy of the changed source has to be sent to the above E-Mail *)
+(* address or my then valid address, if this is possible to the *)
+(* author. *)
+(* The second condition has the target to maintain an up to date central *)
+(* version of the component. If this condition is not acceptable for *)
+(* confidential or legal reasons, everyone is free to derive a component *)
+(* or to generate a diff file to my or other original sources. *)
+(**************************************************************************)
+unit ExecCmdCommon;
+
+interface
+
+type
+ TExecCmdCommon = class
+ public
+ class function BuildArgv(const AExecutable: string;
+ const AInput: TArray): TArray;
+ class function BuildEnvp(const AHome, AExecutable,
+ ASharedLibrary: string): TArray;
+ end;
+
+implementation
+
+uses
+ System.IOUtils, System.SysUtils;
+
+{ TPathHandler }
+
+class function TExecCmdCommon.BuildArgv(const AExecutable: string;
+ const AInput: TArray): TArray;
+begin
+ {$IFDEF MSWINDOWS}
+ Result := AInput;
+ {$ELSE}
+ Result := [AExecutable] + AInput;
+ {$ENDIF MSWINDOWS}
+end;
+
+class function TExecCmdCommon.BuildEnvp(const AHome, AExecutable,
+ ASharedLibrary: string): TArray;
+begin
+ {$IFDEF MSWINDOWS}
+ Result := [];
+ {$ELSEIF DEFINED(OSX)}
+ Result := ['DYLD_LIBRARY_PATH='
+ + ExtractFileDir(ASharedLibrary)
+ + ':'
+ + ExtractFileDir(AExecutable),
+ 'LD_LIBRARY_PATH=' + ExtractFileDir(ASharedLibrary),
+ 'PATH=' + ExtractFileDir(AExecutable)];
+ {$ELSEIF DEFINED(POSIX)}
+ Result := ['LD_LIBRARY_PATH=' + ExtractFileDir(ASharedLibrary),
+ 'PYTHONHOME=' + AHome,
+ 'PATH=' + ExtractFileDir(AExecutable)];
+ {$ENDIF MSWINDOWS}
+end;
+
+end.
diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas
index 955d521d..8dfec06b 100644
--- a/Source/vcl/WrapVclComCtrls.pas
+++ b/Source/vcl/WrapVclComCtrls.pas
@@ -177,6 +177,24 @@ TPyDelphiCustomTabControl = class (TPyDelphiCustomCustomTabControl)
property DelphiObject: TTabControl read GetDelphiObject write SetDelphiObject;
end;
+ TPyDelphiCustomStatusBar = class (TPyDelphiWinControl)
+ private
+ function GetDelphiObject: TCustomStatusBar;
+ procedure SetDelphiObject(const Value: TCustomStatusBar);
+ public
+ class function DelphiObjectClass : TClass; override;
+ property DelphiObject: TCustomStatusBar read GetDelphiObject write SetDelphiObject;
+ end;
+
+ TPyDelphiStatusBar = class (TPyDelphiCustomStatusBar)
+ private
+ function GetDelphiObject: TStatusBar;
+ procedure SetDelphiObject(const Value: TStatusBar);
+ public
+ class function DelphiObjectClass : TClass; override;
+ property DelphiObject: TStatusBar read GetDelphiObject write SetDelphiObject;
+ end;
+
implementation
uses
@@ -217,6 +235,8 @@ procedure TComCtrlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap
APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolbar);
APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCustomTabControl);
APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTabControl);
+ APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomStatusBar);
+ APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStatusBar);
APyDelphiWrapper.EventHandlers.RegisterHandler(TTabChangingEventHandler);
end;
@@ -864,6 +884,41 @@ procedure TPyDelphiCustomTabControl.SetDelphiObject(const Value: TTabControl);
inherited DelphiObject := Value;
end;
+{ TPyDelphiCustomStatusBar }
+
+class function TPyDelphiCustomStatusBar.DelphiObjectClass: TClass;
+begin
+ Result := TCustomStatusBar;
+end;
+
+function TPyDelphiCustomStatusBar.GetDelphiObject: TCustomStatusBar;
+begin
+ Result := TCustomStatusBar(inherited DelphiObject);
+end;
+
+procedure TPyDelphiCustomStatusBar.SetDelphiObject(
+ const Value: TCustomStatusBar);
+begin
+ inherited DelphiObject := Value;
+end;
+
+{ TPyDelphiStatusBar }
+
+class function TPyDelphiStatusBar.DelphiObjectClass: TClass;
+begin
+ Result := TStatusBar;
+end;
+
+function TPyDelphiStatusBar.GetDelphiObject: TStatusBar;
+begin
+ Result := TStatusBar(inherited DelphiObject);
+end;
+
+procedure TPyDelphiStatusBar.SetDelphiObject(const Value: TStatusBar);
+begin
+ inherited DelphiObject := Value;
+end;
+
initialization
RegisteredUnits.Add( TComCtrlsRegistration.Create );
{$IFNDEF FPC}
diff --git a/Source/vcl/WrapVclDialogs.pas b/Source/vcl/WrapVclDialogs.pas
index a24f11f1..cfedc8dd 100644
--- a/Source/vcl/WrapVclDialogs.pas
+++ b/Source/vcl/WrapVclDialogs.pas
@@ -45,6 +45,17 @@ TPyDelphiFileOpenDialog = class(TPyDelphiComponent)
write SetDelphiObject;
end;
+ TPyDelphiSaveDialog = class(TPyDelphiOpenDialog)
+ private
+ function GetDelphiObject: TSaveDialog;
+ procedure SetDelphiObject(const Value: TSaveDialog);
+ public
+ class function DelphiObjectClass: TClass; override;
+ // Properties
+ property DelphiObject: TSaveDialog read GetDelphiObject
+ write SetDelphiObject;
+ end;
+
implementation
uses
@@ -102,6 +113,7 @@ procedure TDialogRegistration.RegisterWrappers(APyDelphiWrapper
inherited;
APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiOpenDialog);
APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileOpenDialog);
+ APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSaveDialog);
end;
{ TPyDelphiOpenDialog }
@@ -206,6 +218,23 @@ procedure TPyDelphiFileOpenDialog.SetDelphiObject(const Value: TFileOpenDialog);
inherited DelphiObject := Value;
end;
+{ TPyDelphiSaveDialog }
+
+class function TPyDelphiSaveDialog.DelphiObjectClass: TClass;
+begin
+ Result := TSaveDialog;
+end;
+
+function TPyDelphiSaveDialog.GetDelphiObject: TSaveDialog;
+begin
+ Result := TSaveDialog(inherited DelphiObject);
+end;
+
+procedure TPyDelphiSaveDialog.SetDelphiObject(const Value: TSaveDialog);
+begin
+ inherited DelphiObject := Value;
+end;
+
initialization
RegisteredUnits.Add(TDialogRegistration.Create);
CoInitialize(nil);