diff --git a/Modules/DelphiFMX/DelphiFMX.dpr b/Modules/DelphiFMX/DelphiFMX.dpr index 262b73f0..5a20b6ef 100644 --- a/Modules/DelphiFMX/DelphiFMX.dpr +++ b/Modules/DelphiFMX/DelphiFMX.dpr @@ -4,6 +4,11 @@ uses System.StartUpCopy, SysUtils, Classes, + FMX.Forms, + FMX.Types, + {$IFDEF OSX} + FMX.Context.Metal, + {$ENDIF OSX} uMain in 'uMain.pas'; {$I ..\..\Source\Definition.Inc} @@ -16,11 +21,15 @@ exports {$IFDEF MSWINDOWS} {$E pyd} {$ENDIF} +{$WARN SYMBOL_PLATFORM OFF} {$IFDEF LINUX} {$SONAME 'DelphiFMX'} - {$ENDIF} +{$WARN SYMBOL_PLATFORM ON} begin + {$IFDEF OSX} + GlobalUseMetal := TCustomContextMetal.IsMetalSupported(); + {$ENDIF OSX} end. diff --git a/Modules/DelphiFMX/DelphiFMX.dproj b/Modules/DelphiFMX/DelphiFMX.dproj index a23bc18c..94c14f41 100644 --- a/Modules/DelphiFMX/DelphiFMX.dproj +++ b/Modules/DelphiFMX/DelphiFMX.dproj @@ -7,8 +7,8 @@ DelphiFMX.dpr Linux64 {0C4154A5-D276-4D62-BA30-564FACD77917} - 19.2 - 37011 + 19.3 + 168083 true @@ -28,6 +28,11 @@ Base true + + true + Base + true + true Base @@ -66,6 +71,12 @@ true true + + true + Cfg_2 + true + true + true Cfg_2 @@ -99,6 +110,13 @@ 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 + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + Debug + true + Base + true + Debug Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) @@ -129,6 +147,12 @@ true + + true + true + Cfg_2 + true + (None) @@ -137,7 +161,6 @@ MainSource - Base @@ -163,12 +186,12 @@ True True + False True True + True True True - False - False 12 diff --git a/Modules/DelphiFMX/PythonVersionIndex.inc b/Modules/DelphiFMX/PythonVersionIndex.inc deleted file mode 100644 index 3169c05c..00000000 --- a/Modules/DelphiFMX/PythonVersionIndex.inc +++ /dev/null @@ -1 +0,0 @@ -7 diff --git a/Modules/DelphiFMX/uMain.pas b/Modules/DelphiFMX/uMain.pas index 022ff255..471bdb51 100644 --- a/Modules/DelphiFMX/uMain.pas +++ b/Modules/DelphiFMX/uMain.pas @@ -8,7 +8,8 @@ function PyInit_DelphiFMX: PPyObject; cdecl; implementation -uses WrapDelphi, WrapDelphiFMX; +uses + System.SysUtils, WrapDelphi, WrapDelphiFMX; var gEngine : TPythonEngine; @@ -23,11 +24,7 @@ function PyInit_DelphiFMX: PPyObject; try gEngine := TPythonEngine.Create(nil); gEngine.AutoFinalize := False; - gEngine.UseLastKnownVersion := False; - // Adapt to the desired python version - Will only work with this version - var PythonVersionIndex := {$I PythonVersionIndex.inc}; // 7 = 3.9 - gEngine.RegVersion := PYTHON_KNOWN_VERSIONS[PythonVersionIndex].RegVersion; - gEngine.DllName := PYTHON_KNOWN_VERSIONS[PythonVersionIndex].DllName; + gEngine.UseLastKnownVersion := true; gModule := TPythonModule.Create(nil); gModule.Engine := gEngine; @@ -38,8 +35,11 @@ function PyInit_DelphiFMX: PPyObject; gDelphiWrapper.Engine := gEngine; gDelphiWrapper.Module := gModule; - gEngine.LoadDll; + gEngine.LoadDllInExtensionModule(); except + on E: Exception do begin + WriteLn('An error has occurred: ' + E.Message); + end; end; Result := gModule.Module; end; @@ -48,10 +48,12 @@ initialization gEngine := nil; gModule := nil; gDelphiWrapper := nil; + finalization gEngine.Free; gModule.Free; gDelphiWrapper.Free; + end. diff --git a/Modules/DelphiVCL/DelphiVCL.dpr b/Modules/DelphiVCL/DelphiVCL.dpr index 857e5b83..0275789e 100644 --- a/Modules/DelphiVCL/DelphiVCL.dpr +++ b/Modules/DelphiVCL/DelphiVCL.dpr @@ -5,7 +5,7 @@ uses Classes, uMain in 'uMain.pas'; -{$I Definition.Inc} +{$I ..\..\Source\Definition.Inc} exports // This must match the pattern "PyInit_[ProjectName]" diff --git a/Modules/DelphiVCL/PythonVersionIndex.inc b/Modules/DelphiVCL/PythonVersionIndex.inc deleted file mode 100644 index 3169c05c..00000000 --- a/Modules/DelphiVCL/PythonVersionIndex.inc +++ /dev/null @@ -1 +0,0 @@ -7 diff --git a/Modules/DelphiVCL/uMain.pas b/Modules/DelphiVCL/uMain.pas index b8d63e9d..5d64287b 100644 --- a/Modules/DelphiVCL/uMain.pas +++ b/Modules/DelphiVCL/uMain.pas @@ -8,7 +8,8 @@ function PyInit_DelphiVCL: PPyObject; cdecl; implementation -uses WrapDelphi, WrapDelphiVCL; +uses + System.SysUtils, WrapDelphi, WrapDelphiVCL; var gEngine : TPythonEngine; @@ -23,11 +24,7 @@ function PyInit_DelphiVCL: PPyObject; try gEngine := TPythonEngine.Create(nil); gEngine.AutoFinalize := False; - gEngine.UseLastKnownVersion := False; - // Adapt to the desired python version - Will only work with this version - var PythonVersionIndex := {$I PythonVersionIndex.inc}; // 7 = 3.9 - gEngine.RegVersion := PYTHON_KNOWN_VERSIONS[PythonVersionIndex].RegVersion; - gEngine.DllName := PYTHON_KNOWN_VERSIONS[PythonVersionIndex].DllName; + gEngine.UseLastKnownVersion := true; gModule := TPythonModule.Create(nil); gModule.Engine := gEngine; @@ -38,8 +35,11 @@ function PyInit_DelphiVCL: PPyObject; gDelphiWrapper.Engine := gEngine; gDelphiWrapper.Module := gModule; - gEngine.LoadDll; + gEngine.LoadDllInExtensionModule(); except + on E: Exception do begin + WriteLn('An error has occurred: ' + E.Message); + end; end; Result := gModule.Module; end; @@ -48,10 +48,12 @@ initialization gEngine := nil; gModule := nil; gDelphiWrapper := nil; + finalization gEngine.Free; gModule.Free; gDelphiWrapper.Free; + end. diff --git a/Packages/Delphi/Delphi 10.4+/Python.dproj b/Packages/Delphi/Delphi 10.4+/Python.dproj index 38e62cca..05aea215 100644 --- a/Packages/Delphi/Delphi 10.4+/Python.dproj +++ b/Packages/Delphi/Delphi 10.4+/Python.dproj @@ -2,17 +2,37 @@ True Package - Debug + Release VCL Python.dpk Win32 {018AAA56-F5BD-4A04-BCCA-A0043EAAA5CE} - 19.1 - 3 + 19.4 + 168083 true + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + true Base @@ -28,31 +48,80 @@ Base true + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + true Base true + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + Python + ..\..\..\lib\$(Platform)\$(Config) Python4Delphi - Run-time Engine Package 00400000 Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;DUnitX.Loggers.GUI;Winapi;System.Win;$(DCC_Namespace) $(Auto) true true + true CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= 1033 - true - .\$(Platform)\$(Config) + + + 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 + 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 + 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 Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) Debug + Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 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= @@ -62,11 +131,30 @@ false 0 + + ..\..\..\lib\$(Platform)\$(Config) + 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 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + DEBUG;$(DCC_Define) true false + + 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 + MainSource @@ -76,6 +164,8 @@ + + @@ -85,10 +175,8 @@ - - Cfg_2 - Base - + + Base @@ -96,6 +184,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 @@ -105,709 +197,18 @@ Python.dpk - - File C:\Users\Public\Documents\Embarcadero\Studio\21.0\Bpl\Python_D270.bpl not found - File C:\Users\Public\Documents\Embarcadero\Studio\21.0\BPL\Python4Delphi270.bpl not found - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - + + True + True + False + True + True + True True True - - - - Python.bpl - true - - - - - 1 - - - 0 - - - - - classes - 1 - - - classes - 1 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 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 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 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+/PythonFmx.dpk b/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk index 6b4a1606..b25bcf38 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk +++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk @@ -13,8 +13,8 @@ package PythonFmx; {$LONGSTRINGS ON} {$OPENSTRINGS ON} {$OPTIMIZATION OFF} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} {$STACKFRAMES ON} @@ -33,30 +33,32 @@ package PythonFmx; requires rtl, fmx, - Python; + 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'; + 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 3fb0f1d2..36d86082 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj +++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj @@ -1,18 +1,43 @@  - {6C9FBAC1-1024-4A46-96EE-2CADEFE347AA} + {513BF750-373D-4C95-A672-78CA8DDF3F63} PythonFmx.dpk - 19.1 + 19.4 FMX True - Debug + Release Win32 - 3 + 167955 Package true + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + true Base @@ -40,7 +65,7 @@ true - .\$(Platform)\$(Config) + ..\..\..\lib\$(Platform)\$(Config) .\$(Platform)\$(Config) false false @@ -52,12 +77,40 @@ System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) All PythonFmx - 1033 + 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= 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 + 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 @@ -69,6 +122,7 @@ Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) Debug true + 1033 DEBUG;$(DCC_Define) @@ -77,6 +131,8 @@ true true true + true + true false @@ -95,24 +151,31 @@ - + + + + + + + + + + + + + - - - Cfg_2 - Base - Base @@ -120,6 +183,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 @@ -130,31 +197,40 @@ PythonFmx.dpk - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + 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 - - - PythonFmx.bpl + + true - - + + true - - + + + PythonFmx.bpl true @@ -166,14 +242,14 @@ 0 - + classes - 1 + 64 classes - 1 + 64 @@ -294,6 +370,16 @@ 1 + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + res\drawable-ldpi @@ -454,6 +540,10 @@ 1 .framework + + 1 + .framework + 0 @@ -467,6 +557,10 @@ 1 .dylib + + 1 + .dylib + 0 .dll;.bpl @@ -493,6 +587,10 @@ 1 .dylib + + 1 + .dylib + 0 .bpl @@ -520,6 +618,9 @@ 0 + + 0 + 0 @@ -764,6 +865,10 @@ Contents\Resources 1 + + Contents\Resources + 1 + @@ -792,6 +897,9 @@ 1 + + 1 + 0 @@ -830,18 +938,25 @@ 1 - - + + + + - - - - + + + + True + True + False + False + True + True True True diff --git a/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk b/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk index 80698db8..383bb4fb 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk +++ b/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk @@ -54,6 +54,7 @@ contains WrapVclSamplesSpin in '..\..\..\Source\vcl\WrapVclSamplesSpin.pas', WrapVclStdCtrls in '..\..\..\Source\vcl\WrapVclStdCtrls.pas', WrapVclWinXCtrls in '..\..\..\Source\vcl\WrapVclWinXCtrls.pas', - WrapVclThemes in '..\..\..\Source\vcl\WrapVclThemes.pas'; + WrapVclThemes in '..\..\..\Source\vcl\WrapVclThemes.pas', + WrapVclMedia in '..\..\..\Source\vcl\WrapVclMedia.pas'; end. diff --git a/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj b/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj index c6efc0e9..c86ebb4d 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj +++ b/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj @@ -1,14 +1,14 @@  - {D8908301-393C-4CFA-8842-4948A9935E21} - PythonVcl.dpk - 19.1 - VCL True - Debug + Package + Release + VCL + PythonVcl.dpk Win32 + {D8908301-393C-4CFA-8842-4948A9935E21} + 19.4 3 - Package true @@ -39,55 +39,57 @@ Base true + + true + Cfg_2 + true + true + - .\$(Platform)\$(Config) + PythonVcl + ..\..\..\lib\$(Platform)\$(Config) + Python4Delphi - Run-time Engine Package for VCL .\$(Platform)\$(Config) - false - false - false - false - false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(Auto) true true - System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - All - PythonVcl - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - Python4Delphi - Run-time Engine Package for VCL true - $(Auto) + 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;Bde;$(DCC_Namespace) Debug + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 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 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) true - DEBUG;$(DCC_Define) true - false - true true + DEBUG;$(DCC_Define) + true + false true false true - 1033 - false + 0 RELEASE;$(DCC_Define) + false 0 - 0 + + + true @@ -97,9 +99,12 @@ + + + @@ -110,10 +115,9 @@ - - Cfg_2 - Base - + + + Base @@ -121,6 +125,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 @@ -130,725 +138,15 @@ PythonVcl.dpk - - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - + - - - - true - - - - - true - - - - - true - - - - - PythonVcl.bpl - true - - - - - PythonVcl.bpl - true - - - - - 1 - - - 0 - - - - - classes - 1 - - - classes - 1 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 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 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - + False + False + False + False + False + False True True 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 ef9f508c..00300534 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPython.dproj +++ b/Packages/Delphi/Delphi 10.4+/dclPython.dproj @@ -1,14 +1,14 @@  - {D9AB994C-54A3-4E76-81C8-6D0BB035A091} - dclPython.dpk - 19.1 - None True - Debug - Win32 - 3 Package + Release + None + dclPython.dpk + Win32 + {D9AB994C-54A3-4E76-81C8-6D0BB035A091} + 19.4 + 1 true @@ -18,11 +18,6 @@ Base true - - true - Base - true - true Base @@ -39,57 +34,55 @@ Base true + + true + Cfg_2 + true + true + - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - true - true - System;Xml;Data;Datasnap;Web;Soap;Vcl;$(DCC_Namespace) - All dclPython - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + All + ..\..\..\lib\$(Platform)\$(Config) Python4Delphi - Design-time Engine Package + .\$(Platform)\$(Config) + System;Xml;Data;Datasnap;Web;Soap;Vcl;$(DCC_Namespace) true $(Auto) + true + 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;Bde;$(DCC_Namespace) Debug + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + rtl;Python;$(DCC_UsePackage) 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 - rtl;Python;$(DCC_UsePackage) - - - rtl;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - DEBUG;$(DCC_Define) true - false - true true + DEBUG;$(DCC_Define) + true + false true + 3 false true - 3 - false + 0 RELEASE;$(DCC_Define) + false 0 - 0 + + + true @@ -126,10 +119,6 @@ BITMAP TPythonType - - Cfg_2 - Base - Base @@ -137,730 +126,30 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 Package - - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - dclPython.dpk + - - - - true - - - - - true - - - - - true - - - - - dclPython.bpl - true - - - - - 1 - - - 0 - - - - - classes - 1 - - - classes - 1 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 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 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - + False + False + False + False + False + False True - True + False 12 diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dpk b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dpk index 1092117e..10d59d5e 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dpk +++ b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dpk @@ -10,21 +10,21 @@ package dclPythonFmx; {$EXTENDEDSYNTAX ON} {$IMPORTEDDATA ON} {$IOCHECKS ON} -{$LOCALSYMBOLS ON} +{$LOCALSYMBOLS OFF} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION OFF} +{$OPTIMIZATION ON} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} -{$REFERENCEINFO ON} +{$REFERENCEINFO OFF} {$SAFEDIVIDE OFF} -{$STACKFRAMES ON} +{$STACKFRAMES OFF} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} -{$DEFINE DEBUG} +{$DEFINE RELEASE} {$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'Python4Delphi - Design-time Engine Package for FMX'} {$LIBSUFFIX AUTO} diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj index c527bf9a..5a0748e7 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj +++ b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj @@ -1,14 +1,14 @@  - {E057921E-25DB-426E-8090-FE3F428894FF} - dclPythonFmx.dpk - 19.1 - None True - Debug - Win32 - 3 Package + Release + None + dclPythonFmx.dpk + Win32 + {E057921E-25DB-426E-8090-FE3F428894FF} + 19.4 + 1 true @@ -18,11 +18,6 @@ Base true - - true - Base - true - true Base @@ -39,73 +34,67 @@ Base true + + true + Cfg_2 + true + true + - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - true - true - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - All dclPythonFmx - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + All + ..\..\..\lib\$(Platform)\$(Config) Python4Delphi - Design-time Engine Package for FMX + .\$(Platform)\$(Config) + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + ..\..\..\lib\$(Platform)\$(Config);$(DCC_UnitSearchPath) true $(Auto) + true + 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;Bde;$(DCC_Namespace) Debug + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + rtl;PythonFmx;$(DCC_UsePackage) 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 - rtl;PythonFmx;$(DCC_UsePackage) - - - rtl;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - DEBUG;$(DCC_Define) true - false - true true + DEBUG;$(DCC_Define) + true + false true false true - 1033 - false + 0 RELEASE;$(DCC_Define) + false 0 - 0 + + + true MainSource - + BITMAP TPythonGUIInputOutput - - Cfg_2 - Base - Base @@ -113,6 +102,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 @@ -122,19 +115,19 @@ dclPythonFmx.dpk - - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - + + + False + False + False + False + False + False + True + False + - - - true - - true @@ -145,7 +138,12 @@ true - + + + true + + + dclPythonFmx.bpl true @@ -159,14 +157,14 @@ 0 - + classes - 1 + 64 classes - 1 + 64 @@ -287,6 +285,16 @@ 1 + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + res\drawable-ldpi @@ -447,6 +455,10 @@ 1 .framework + + 1 + .framework + 0 @@ -460,6 +472,10 @@ 1 .dylib + + 1 + .dylib + 0 .dll;.bpl @@ -486,6 +502,10 @@ 1 .dylib + + 1 + .dylib + 0 .bpl @@ -513,6 +533,9 @@ 0 + + 0 + 0 @@ -757,6 +780,10 @@ Contents\Resources 1 + + Contents\Resources + 1 + @@ -785,6 +812,9 @@ 1 + + 1 + 0 @@ -823,21 +853,18 @@ 1 - - + + + + - - - - + + + - - True - True - 12 diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj b/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj index a168bee0..92a13f0a 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj +++ b/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj @@ -1,14 +1,14 @@  - {48DDC28A-E154-4CA0-864A-30EB8C4CCBB3} - dclPythonVcl.dpk - 19.1 - None True - Debug - Win32 - 3 Package + Release + None + dclPythonVcl.dpk + Win32 + {48DDC28A-E154-4CA0-864A-30EB8C4CCBB3} + 19.4 + 1 true @@ -18,11 +18,6 @@ Base true - - true - Base - true - true Base @@ -39,58 +34,54 @@ Base true + + true + Cfg_2 + true + true + - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - true - true - System;Xml;Data;Datasnap;Web;Soap;Vcl;$(DCC_Namespace) - All dclPythonVcl - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + All + ..\..\..\lib\$(Platform)\$(Config) Python4Delphi - Design-Time Engine Package for VCL + .\$(Platform)\$(Config) + System;Xml;Data;Datasnap;Web;Soap;Vcl;$(DCC_Namespace) true $(Auto) - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true + true + 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 - rtl;vcl;PythonVcl;$(DCC_UsePackage) - - rtl;vcl;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + rtl;vcl;PythonVcl;$(DCC_UsePackage) true - DEBUG;$(DCC_Define) true - false - true true + DEBUG;$(DCC_Define) + true + false true + 3 false true - 1033 - 3 - false + 0 RELEASE;$(DCC_Define) + false 0 - 0 + + + ..\..\..\lib\$(Platform)\$(Config) + true @@ -104,10 +95,6 @@ BITMAP TPythonGUIInputOutput - - Cfg_2 - Base - Base @@ -115,6 +102,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 @@ -124,721 +115,17 @@ dclPythonVcl.dpk - - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - + - - - - dclPythonVcl.bpl - true - - - - - true - - - - - true - - - - - true - - - - - 1 - - - 0 - - - - - classes - 1 - - - classes - 1 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 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 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - + False + False + False + False + False + False True - True + 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/README.md b/README.md index 15caeffb..f9d1a890 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![P4D Logo](https://github.com/pyscripter/python4delphi/wiki/Images/Python4Delphi(wide-transparent).png) +drawing [Python](https://www.python.org) for [Delphi](https://www.embarcadero.com/products/delphi) (P4D) is a set of free components that wrap up the Python DLL into Delphi and Lazarus (FPC). They let you easily execute Python scripts, create new Python modules and new Python types. You can create Python extensions as DLLs and much more. P4D provides different levels of functionality: diff --git a/Source/Definition.Inc b/Source/Definition.Inc index 6b5f731a..e60baccc 100644 --- a/Source/Definition.Inc +++ b/Source/Definition.Inc @@ -171,6 +171,9 @@ {$DEFINE DELPHI10_2_OR_HIGHER} {$DEFINE DELPHI10_3_OR_HIGHER} {$DEFINE DELPHI10_4_OR_HIGHER} + {$IF RTLVERSION1042} + {$DEFINE DELPHI10_4_2} //Delphi 10.4.2 + {$ENDIF RTLVERSION1042} {$ENDIF} {$IFDEF VER350} // Delphi 11 {$DEFINE DELPHI11} @@ -202,9 +205,9 @@ {$IFDEF FPC} {$MODE DELPHI} {$IFDEF CPU64} - {$DEFINE CPUX64} + {$DEFINE CPU64BITS} {$ENDIF CPU64} - {$IFDEF CPU32} + {$IFDEF CPU386} {$DEFINE CPUX86} {$ENDIF CPU32} {$IFDEF DARWIN} diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 65949d1f..7856ea0c 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2278,7 +2278,6 @@ TPythonModule = class(TMethodsContainer) procedure SetErrors( val : TErrors ); procedure SetModuleName( const val : AnsiString ); procedure SetDocString( value : TStringList ); - public // Constructors & destructors constructor Create( AOwner : TComponent ); override; @@ -2306,7 +2305,6 @@ TPythonModule = class(TMethodsContainer) property Module : PPyObject read FModule; property Clients[ idx : Integer ] : TEngineClient read GetClients; property ClientCount : Integer read GetClientCount; - published property DocString : TStringList read FDocString write SetDocString; property ModuleName : AnsiString read FModuleName write SetModuleName; @@ -6876,6 +6874,7 @@ procedure TError.Assign(Source: TPersistent); begin Name := TError(Source).Name; Text := TError(Source).Text; + ErrorType := TError(Source).ErrorType; Exit; end; inherited Assign(Source); @@ -7103,7 +7102,6 @@ destructor TPythonModule.Destroy; inherited; end; - procedure TPythonModule.SetDocString( value : TStringList ); begin FDocString.Assign( value ); diff --git a/Source/PythonVersions.pas b/Source/PythonVersions.pas index 03dc7f9d..9eb3708c 100644 --- a/Source/PythonVersions.pas +++ b/Source/PythonVersions.pas @@ -104,13 +104,7 @@ function TPythonVersion.GetDLLName: string; function TPythonVersion.ExpectedArchitecture: string; begin Result := ''; - {$IFDEF CPUX64} - Result := '64bit'; - {$ENDIF} - {$IFDEF CPU64} - Result := '64bit'; - {$ENDIF} - {$IFDEF CPU64bits} + {$IF Defined(CPUX64) or Defined(CPU64) or Defined(CPU64bits)} Result := '64bit'; {$ENDIF} if Result = '' then diff --git a/Source/VarPyth.pas b/Source/VarPyth.pas index 2297d30e..67c18ba8 100644 --- a/Source/VarPyth.pas +++ b/Source/VarPyth.pas @@ -40,7 +40,7 @@ interface uses - Variants, PythonEngine; + Variants, PythonEngine, Classes; type TSequenceType = (stTuple, stList); @@ -108,6 +108,7 @@ function BuiltinModule: Variant; // return the builtin module function SysModule: Variant; // return the builtin module 'sys' function DatetimeModule: Variant; // return the builtin module 'datetime' function Import(const AModule: string): Variant; // import a Python module and return the module object. +function Reload(const AModule: Variant): Variant; //reload a Python imported module and return the module object. function len(const AValue : Variant ): NativeInt; // return the length of a Python collection. function _type(const AValue : Variant ): Variant; // return the type object of a Python object. function iter(const AValue : Variant ): Variant; // return an iterator for the container AValue. You can call the 'next' method of the iterator until you catch the EPyStopIteration exception. @@ -134,10 +135,13 @@ TVarPyEnumerateHelper = record function VarPyIterate(const AValue: Variant): TVarPyEnumerateHelper; +// Adds a python iterable items to a TStrings +procedure VarPyToStrings(const AValue : Variant; const AStrings: TStrings); + implementation uses - VarUtils, SysUtils, TypInfo, Classes; + VarUtils, SysUtils, TypInfo; type TNamedParamDesc = record @@ -275,9 +279,9 @@ TPythonData = class(TObject) Reserved1, Reserved2, Reserved3: Word; VPython: TPythonData; Reserved4: Integer; - {$IFDEF CPUX64} + {$IFDEF CPU64BITS} Reserved5: Integer; // size is 24 bytes in 64bit - {$ENDIF CPUX64} + {$ENDIF CPU64BITS} end; @@ -727,6 +731,22 @@ function Import(const AModule: string): Variant; end; // of with end; +function Reload(const AModule: Variant): Variant; +var + LModule: PPyObject; +begin + with GetPythonEngine() do begin + LModule := PyImport_ReloadModule(ExtractPythonObjectFrom(AModule)); + CheckError(); + Assert(Assigned(LModule)); + try + Result := VarPythonCreate(LModule); + finally + Py_XDecRef(LModule); + end; // of try + end; // of with +end; + function GetObjectLength(AObject: PPyObject): NativeInt; begin with GetPythonEngine do @@ -2434,6 +2454,14 @@ function TVarPyEnumerateHelper.GetEnumerator: TVarPyEnumerator; Result.Create(FIterable); end; +procedure VarPyToStrings(const AValue : Variant; const AStrings: TStrings); +var + V: Variant; +begin + for V in VarPyIterate(AValue) do + AStrings.Add(V) +end; + initialization PythonVariantType := TPythonVariantType.Create; finalization diff --git a/Source/WrapDelphiWindows.pas b/Source/WrapDelphiWindows.pas index cea6ca34..9601f057 100644 --- a/Source/WrapDelphiWindows.pas +++ b/Source/WrapDelphiWindows.pas @@ -9,17 +9,35 @@ interface implementation +{$IFDEF DELPHI11_OR_HIGHER} +uses + System.Win.HighDpi, Winapi.ShellScaling; +{$ENDIF DELPHI11_OR_HIGHER} + { Register the wrappers, the globals and the constants } type TWindowsRegistration = class(TRegisteredUnit) + private + {$IFDEF DELPHI11_OR_HIGHER} + class function IsDpiAware_Wrapper(PySelf, AArgs: PPyObject): PPyObject; cdecl; static; + class function SetHighDpiAware_Wrapper(PySelf, AArgs: PPyObject): PPyObject; cdecl; static; + class function GetProcessDpiAwareness_Wrapper(PySelf, AArgs: PPyObject): PPyObject; cdecl; static; + class function SetProcessDpiAwareness_Wrapper(PySelf, AArgs: PPyObject): PPyObject; cdecl; static; + {$ENDIF DELPHI11_OR_HIGHER} public function Name : string; override; procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineFunctions(APyDelphiWrapper : TPyDelphiWrapper); override; end; { TWindowsRegistration } +function TWindowsRegistration.Name: string; +begin + Result := 'Windows'; +end; + procedure TWindowsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); begin inherited; @@ -64,9 +82,31 @@ procedure TWindowsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); {$ENDIF FPC} end; -function TWindowsRegistration.Name: string; +procedure TWindowsRegistration.DefineFunctions( + APyDelphiWrapper: TPyDelphiWrapper); begin - Result := 'Windows'; + inherited; + {$IFDEF DELPHI11_OR_HIGHER} + APyDelphiWrapper.RegisterFunction(PAnsiChar('IsDpiAware'), + TWindowsRegistration.IsDpiAware_Wrapper, + PAnsiChar('IsDPIAware()'#10 + + 'Check for process DPI awareness.')); + + APyDelphiWrapper.RegisterFunction(PAnsiChar('SetHighDpiAware'), + TWindowsRegistration.SetHighDpiAware_Wrapper, + PAnsiChar('SetHighDpiAware()'#10 + + 'Automatically set the DPI awareness that best fits to the process.')); + + APyDelphiWrapper.RegisterFunction(PAnsiChar('GetProcessDpiAwareness'), + TWindowsRegistration.GetProcessDpiAwareness_Wrapper, + PAnsiChar('GetProcessDpiAwareness()'#10 + + 'Get the DPI awareness of the process.')); + + APyDelphiWrapper.RegisterFunction(PAnsiChar('SetProcessDpiAwareness'), + TWindowsRegistration.SetProcessDpiAwareness_Wrapper, + PAnsiChar('SetProcessDpiAwareness()'#10 + + 'Set the DPI awareness to the process.')); + {$ENDIF DELPHI11_OR_HIGHER} end; procedure TWindowsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); @@ -74,7 +114,84 @@ procedure TWindowsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapp inherited; end; +{$IFDEF DELPHI11_OR_HIGHER} +class function TWindowsRegistration.IsDpiAware_Wrapper(PySelf, AArgs: PPyObject): PPyObject; +begin + with GetPythonEngine() do + begin + if IsDpiAware() then + Result := GetPythonEngine().ReturnTrue() + else + Result := GetPythonEngine().ReturnFalse(); + end; +end; + +class function TWindowsRegistration.SetHighDpiAware_Wrapper(PySelf, AArgs: PPyObject): PPyObject; +begin + with GetPythonEngine() do + begin + if SetHighDpiAware() then + Result := GetPythonEngine().ReturnTrue() + else + Result := GetPythonEngine().ReturnFalse(); + end; +end; + +class function TWindowsRegistration.GetProcessDpiAwareness_Wrapper(PySelf, + AArgs: PPyObject): PPyObject; +var + LErrorCode: HResult; + LDpiAwareness: TProcessDpiAwareness; +begin + with GetPythonEngine() do + begin + if (PyArg_ParseTuple(AArgs, ':GetProcessDpiAwareness') <> 0) then + begin + LErrorCode := WinAPI.ShellScaling.GetProcessDpiAwareness(GetCurrentProcess(), LDpiAwareness); + + Result := PyList_New(0); + PyList_Append(Result, PyLong_FromLong(LErrorCode)); + PyList_Append(Result, PyLong_FromLong(Ord(LDpiAwareness))); + end else + Result := nil; + end; +end; + +class function TWindowsRegistration.SetProcessDpiAwareness_Wrapper(PySelf, + AArgs: PPyObject): PPyObject; +var + LErrorCode: HResult; + LDpiAwareness: integer; +begin + with GetPythonEngine() do + begin + if (PyArg_ParseTuple(AArgs, 'i:SetProcessDpiAwareness', @LDpiAwareness) <> 0) then + begin + if not (LDpiAwareness in [ + Ord(Low(TProcessDpiAwareness)) + .. + Ord(High(TProcessDpiAwareness))]) then + begin + PyErr_SetString(PyExc_ValueError^, 'DPI awareness value out of range'); + Result := nil; + end else begin + LErrorCode := WinAPI.ShellScaling.SetProcessDpiAwareness(TProcessDpiAwareness(LDpiAwareness)); + Result := PyLong_FromLong(LErrorCode); + end; + end else + Result := nil; + end; +end; +{$ENDIF DELPHI11_OR_HIGHER} + initialization RegisteredUnits.Add( TWindowsRegistration.Create ); + + {$IFDEF MSWINDOWS} + {$IFDEF DELPHI11_OR_HIGHER} + SetHighDpiAware(); + {$ENDIF DELPHI11_OR_HIGHER} + {$ENDIF MSWINDOWS} + end. diff --git a/Source/fmx/WrapDelphiFmx.pas b/Source/fmx/WrapDelphiFmx.pas index f8a60252..c77c8957 100644 --- a/Source/fmx/WrapDelphiFmx.pas +++ b/Source/fmx/WrapDelphiFmx.pas @@ -7,16 +7,18 @@ implementation uses WrapDelphiTypes, WrapDelphiClasses, - {$IFDEF Windows} + {$IFDEF MSWINDOWS} WrapDelphiWindows, - {$ENDIF Windows} + {$ENDIF MSWINDOWS} WrapDelphiDataBind, WrapFmxTypes, + WrapFmxControls, WrapFmxStdCtrls, WrapFmxEdit, WrapFmxListBox, WrapFmxListView, WrapFmxActnList, + WrapFmxStdActns, WrapFmxComCtrls, WrapFmxDialogs, WrapFmxForms, diff --git a/Source/fmx/WrapFmxActnList.pas b/Source/fmx/WrapFmxActnList.pas index 05ebc253..3fc5c32b 100644 --- a/Source/fmx/WrapFmxActnList.pas +++ b/Source/fmx/WrapFmxActnList.pas @@ -49,6 +49,15 @@ TPyDelphiAction = class(TPyDelphiContainedAction) property DelphiObject: TAction read GetDelphiObject write SetDelphiObject; end; + TPyDelphiCustomViewAction = class(TPyDelphiCustomAction) + private + function GetDelphiObject: TCustomViewAction; + procedure SetDelphiObject(const Value: TCustomViewAction); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomViewAction read GetDelphiObject write SetDelphiObject; + end; + implementation { Register the wrappers, the globals and the constants } @@ -79,6 +88,7 @@ procedure TActnListRegistration.RegisterWrappers(APyDelphiWrapper APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiActionList); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomAction); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomViewAction); end; { TPyDelphiCustomActionList } @@ -149,6 +159,24 @@ procedure TPyDelphiAction.SetDelphiObject(const Value: TAction); inherited DelphiObject := Value; end; +{ TPyDelphiCustomViewAction } + +class function TPyDelphiCustomViewAction.DelphiObjectClass: TClass; +begin + Result := TCustomViewAction; +end; + +function TPyDelphiCustomViewAction.GetDelphiObject: TCustomViewAction; +begin + Result := TCustomViewAction(inherited DelphiObject); +end; + +procedure TPyDelphiCustomViewAction.SetDelphiObject( + const Value: TCustomViewAction); +begin + inherited DelphiObject := Value; +end; + initialization RegisteredUnits.Add(TActnListRegistration.Create()); diff --git a/Source/fmx/WrapFmxColors.pas b/Source/fmx/WrapFmxColors.pas index e5f5060f..1289d3a6 100644 --- a/Source/fmx/WrapFmxColors.pas +++ b/Source/fmx/WrapFmxColors.pas @@ -4,7 +4,7 @@ interface uses FMX.Colors, - WrapFmxControls, WrapFmxStdCtrls, WrapFmxListBox; + PythonEngine, WrapFmxControls, WrapFmxStdCtrls, WrapFmxListBox; type TPyDelphiColorBox = class(TPyDelphiControl) @@ -13,6 +13,7 @@ TPyDelphiColorBox = class(TPyDelphiControl) procedure SetDelphiObject(const Value: TColorBox); public class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; // Properties property DelphiObject: TColorBox read GetDelphiObject write SetDelphiObject; @@ -35,6 +36,7 @@ TPyDelphiColorPicker = class(TPyDelphiControl) procedure SetDelphiObject(const Value: TColorPicker); public class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; // Properties property DelphiObject: TColorPicker read GetDelphiObject write SetDelphiObject; @@ -57,6 +59,7 @@ TPyDelphiColorPanel = class(TPyDelphiControl) procedure SetDelphiObject(const Value: TColorPanel); public class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; // Properties property DelphiObject: TColorPanel read GetDelphiObject write SetDelphiObject; @@ -68,6 +71,7 @@ TPyDelphiComboColorBox = class(TPyDelphiStyledControl) procedure SetDelphiObject(const Value: TComboColorBox); public class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; // Properties property DelphiObject: TComboColorBox read GetDelphiObject write SetDelphiObject; @@ -79,6 +83,7 @@ TPyDelphiColorButton = class(TPyDelphiCustomButton) procedure SetDelphiObject(const Value: TColorButton); public class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; // Properties property DelphiObject: TColorButton read GetDelphiObject write SetDelphiObject; @@ -90,6 +95,7 @@ TPyDelphiColorListBox = class(TPyDelphiCustomListBox) procedure SetDelphiObject(const Value: TColorListBox); public class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; // Properties property DelphiObject: TColorListBox read GetDelphiObject write SetDelphiObject; @@ -101,6 +107,7 @@ TPyDelphiCustomColorComboBox = class(TPyDelphiCustomComboBox) procedure SetDelphiObject(const Value: TCustomColorComboBox); public class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; // Properties property DelphiObject: TCustomColorComboBox read GetDelphiObject write SetDelphiObject; @@ -112,6 +119,7 @@ TPyDelphiColorComboBox = class(TPyDelphiCustomColorComboBox) procedure SetDelphiObject(const Value: TColorComboBox); public class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; // Properties property DelphiObject: TColorComboBox read GetDelphiObject write SetDelphiObject; @@ -120,10 +128,21 @@ TPyDelphiColorComboBox = class(TPyDelphiCustomColorComboBox) implementation uses - WrapDelphi; + System.Rtti, WrapDelphi; -{ Register the wrappers, the globals and the constants } type + { Type extension } + TPyDelphiCommonColorEx = class + protected + // Property Getters + class function Get_Color(AContext: Pointer): PPyObject; cdecl; + // Property Setters + class function Set_Color(AValue: PPyObject; AContext: Pointer): integer; cdecl; + protected + class procedure RegisterGetSets(const APythonType: TPythonType); + end; + + { Register the wrappers, the globals and the constants } TColorsRegistration = class(TRegisteredUnit) public function Name: string; override; @@ -171,6 +190,12 @@ function TPyDelphiColorBox.GetDelphiObject: TColorBox; Result := TColorBox(inherited DelphiObject); end; +class procedure TPyDelphiColorBox.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + procedure TPyDelphiColorBox.SetDelphiObject(const Value: TColorBox); begin inherited DelphiObject := Value; @@ -205,6 +230,12 @@ function TPyDelphiColorPicker.GetDelphiObject: TColorPicker; Result := TColorPicker(inherited DelphiObject); end; +class procedure TPyDelphiColorPicker.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + procedure TPyDelphiColorPicker.SetDelphiObject(const Value: TColorPicker); begin inherited DelphiObject := Value; @@ -240,6 +271,12 @@ function TPyDelphiColorPanel.GetDelphiObject: TColorPanel; Result := TColorPanel(inherited DelphiObject); end; +class procedure TPyDelphiColorPanel.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + procedure TPyDelphiColorPanel.SetDelphiObject(const Value: TColorPanel); begin inherited DelphiObject := Value; @@ -257,6 +294,12 @@ function TPyDelphiComboColorBox.GetDelphiObject: TComboColorBox; Result := TComboColorBox(inherited DelphiObject); end; +class procedure TPyDelphiComboColorBox.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + procedure TPyDelphiComboColorBox.SetDelphiObject(const Value: TComboColorBox); begin inherited DelphiObject := Value; @@ -274,6 +317,12 @@ function TPyDelphiColorButton.GetDelphiObject: TColorButton; Result := TColorButton(inherited DelphiObject); end; +class procedure TPyDelphiColorButton.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + procedure TPyDelphiColorButton.SetDelphiObject(const Value: TColorButton); begin inherited DelphiObject := Value; @@ -291,6 +340,12 @@ function TPyDelphiColorListBox.GetDelphiObject: TColorListBox; Result := TColorListBox(inherited DelphiObject); end; +class procedure TPyDelphiColorListBox.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + procedure TPyDelphiColorListBox.SetDelphiObject(const Value: TColorListBox); begin inherited DelphiObject := Value; @@ -308,6 +363,13 @@ function TPyDelphiCustomColorComboBox.GetDelphiObject: TCustomColorComboBox; Result := TCustomColorComboBox(inherited DelphiObject); end; +class procedure TPyDelphiCustomColorComboBox.RegisterGetSets( + PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + procedure TPyDelphiCustomColorComboBox.SetDelphiObject( const Value: TCustomColorComboBox); begin @@ -321,6 +383,12 @@ class function TPyDelphiColorComboBox.DelphiObjectClass: TClass; Result := TColorComboBox; end; +class procedure TPyDelphiColorComboBox.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + function TPyDelphiColorComboBox.GetDelphiObject: TColorComboBox; begin Result := TColorComboBox(inherited DelphiObject); @@ -331,6 +399,71 @@ procedure TPyDelphiColorComboBox.SetDelphiObject(const Value: TColorComboBox); inherited DelphiObject := Value; end; +{ TPyDelphiCommonColorEx } + +class procedure TPyDelphiCommonColorEx.RegisterGetSets( + const APythonType: TPythonType); +begin + with APythonType do begin + //Fixing the cardinal->variant/variant->cardinal conversion error + AddGetSet('Color', + @TPyDelphiCommonColorEx.Get_Color, + @TPyDelphiCommonColorEx.Set_Color, + 'Returns a integer with the color value', nil); + end; +end; + +class function TPyDelphiCommonColorEx.Get_Color(AContext: Pointer): PPyObject; +var + LSelf: TPyDelphiControl; + LRttiCtx: TRttiContext; + LRttiType: TRttiType; + LRttiProp: TRttiProperty; +begin + LSelf := PythonToDelphi(PPyObject(Self)) as TPyDelphiControl; + LRttiCtx := TRttiContext.Create(); + try + LRttiType := LRttiCtx.GetType(LSelf.DelphiObject.ClassInfo); + LRttiProp := LRttiType.GetProperty('Color'); + if not Assigned(LRttiProp) then + Exit(GetPythonEngine().Py_None); + + Result := GetPythonEngine().PyLong_FromLong( + LRttiProp.GetValue(LSelf.DelphiObject).AsInteger); + finally + LRttiCtx.Free(); + end; +end; + +class function TPyDelphiCommonColorEx.Set_Color(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: integer; + LSelf: TPyDelphiControl; + LRttiCtx: TRttiContext; + LRttiType: TRttiType; + LRttiProp: TRttiProperty; +begin + if CheckIntAttribute(AValue, 'Color', LValue) then begin + with GetPythonEngine() do begin + LSelf := PythonToDelphi(PPyObject(Self)) as TPyDelphiControl; + LRttiCtx := TRttiContext.Create(); + try + LRttiType := LRttiCtx.GetType(LSelf.DelphiObject.ClassInfo); + LRttiProp := LRttiType.GetProperty('Color'); + if not Assigned(LRttiProp) then + Exit(-1); + + LRttiProp.SetValue(LSelf.DelphiObject, LValue); + finally + LRttiCtx.Free(); + end; + Result := 0; + end; + end else + Result := -1; +end; + initialization RegisteredUnits.Add(TColorsRegistration.Create()); diff --git a/Source/fmx/WrapFmxControls.pas b/Source/fmx/WrapFmxControls.pas index 9ea954d3..89a6ab9c 100644 --- a/Source/fmx/WrapFmxControls.pas +++ b/Source/fmx/WrapFmxControls.pas @@ -6,9 +6,8 @@ interface uses Classes, SysUtils, TypInfo, Types, - FMX.Types, FMX.Controls, - PythonEngine, WrapDelphi, WrapDelphiClasses, WrapFmxTypes, - FMX.Controls.Presentation; + FMX.Types, FMX.Controls, FMX.Controls.Presentation, + PythonEngine, WrapDelphi, WrapDelphiClasses, WrapFmxTypes, WrapFmxActnList; type { @@ -17,6 +16,17 @@ interface SetBounds and Repaint Exposes properties Parent and Visible } + + { TKeyEvent wrapper } + TKeyEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState); + public + constructor Create(APyDelphiWrapper: TPyDelphiWrapper; AComponent: TObject; + APropertyInfo: PPropInfo; ACallable: PPyObject); override; + class function GetTypeInfo: PTypeInfo; override; + end; + TPyDelphiControl = class (TPyDelphiFmxObject) private function GetDelphiObject: TControl; @@ -136,6 +146,17 @@ TPyDelphiPresentedControl = class(TPyDelphiStyledControl) property DelphiObject: TPresentedControl read GetDelphiObject write SetDelphiObject; end; + TPyDelphiCustomControlAction = class(TPyDelphiCustomAction) + private + function GetDelphiObject: TCustomControlAction; + procedure SetDelphiObject(const Value: TCustomControlAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TCustomControlAction read GetDelphiObject + write SetDelphiObject; + end; + implementation type @@ -147,6 +168,32 @@ TControlsRegistration = class(TRegisteredUnit) procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; end; +{ TControlsRegistration } + +procedure TControlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TControlsRegistration.Name: string; +begin + Result := 'Controls'; +end; + +procedure TControlsRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyledControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTextControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleBook); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPopup); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomControlAction); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); +end; + { TPyDelphiControl } function TPyDelphiControl.BringToFront_Wrapper(args: PPyObject): PPyObject; @@ -425,29 +472,6 @@ function TPyDelphiControl.Set_Visible(AValue: PPyObject; Result := -1; end; -{ TControlsRegistration } - -procedure TControlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TControlsRegistration.Name: string; -begin - Result := 'Controls'; -end; - -procedure TControlsRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyledControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTextControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleBook); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPopup); -end; - { TControlsAccess } class function TControlsAccess.ExpectedContainerClass: TClass; @@ -740,6 +764,93 @@ procedure TPyDelphiPresentedControl.SetDelphiObject( inherited DelphiObject := Value; end; +{ TPyDelphiCustomControlAction } + +class function TPyDelphiCustomControlAction.DelphiObjectClass: TClass; +begin + Result := TCustomControlAction; +end; + +function TPyDelphiCustomControlAction.GetDelphiObject: TCustomControlAction; +begin + Result := TCustomControlAction(inherited DelphiObject); +end; + +procedure TPyDelphiCustomControlAction.SetDelphiObject( + const Value: TCustomControlAction); +begin + inherited DelphiObject := Value; +end; + +{ TKeyEventHandler } + +constructor TKeyEventHandler.Create(APyDelphiWrapper: TPyDelphiWrapper; + AComponent: TObject; APropertyInfo: PPropInfo; ACallable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TKeyEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(AComponent, APropertyInfo, LMethod); +end; + +class function TKeyEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TKeyEvent); +end; + +procedure TKeyEventHandler.DoEvent(Sender: TObject; var Key: Word; + var KeyChar: WideChar; Shift: TShiftState); +var + LPyObject: PPyObject; + LPyTuple: PPyObject; + LPyResult: PPyObject; + LPyKey: PPyObject; + LVarKeyParam: TPyDelphiVarParameter; + LPyKeyChar: PPyObject; + LVarKeyCharParam: TPyDelphiVarParameter; + LKeyCharStr: string; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + //var parameters + LPyKey := CreateVarParam(PyDelphiWrapper, Key); + LVarKeyParam := PythonToDelphi(LPyKey) as TPyDelphiVarParameter; + LPyKeyChar := CreateVarParam(PyDelphiWrapper, KeyChar); + LVarKeyCharParam := PythonToDelphi(LPyKeyChar) as TPyDelphiVarParameter; + + LPyTuple := PyTuple_New(4); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyKey); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyKeyChar); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 3, ShiftToPython(Shift)); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + if PyLong_Check(LVarKeyParam.Value) then + Key := PyLong_AsLong(LVarKeyParam.Value); + + if (LVarKeyCharParam.Value = Py_None) then + KeyChar := #0 + else if PyUnicode_Check(LVarKeyCharParam.Value) then + begin + LKeyCharStr := PyUnicodeAsString(LVarKeyCharParam.Value); + if Length(LKeyCharStr) > 0 then + KeyChar := LKeyCharStr[1]; + end; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + initialization RegisteredUnits.Add(TControlsRegistration.Create); diff --git a/Source/fmx/WrapFmxForms.pas b/Source/fmx/WrapFmxForms.pas index 439d89a9..f89ca34a 100644 --- a/Source/fmx/WrapFmxForms.pas +++ b/Source/fmx/WrapFmxForms.pas @@ -14,9 +14,15 @@ TPyDelphiApplication = class(TPyDelphiComponent) private function GetDelphiObject: TApplication; procedure SetDelphiObject(const Value: TApplication); + protected + // Class methods + function Initialize_Wrapper(AArgs: PPyObject): PPyObject; cdecl; + function Run_Wrapper(AArgs: PPyObject): PPyObject; cdecl; public + constructor Create( APythonType : TPythonType ); override; // Class methods class function DelphiObjectClass: TClass; override; + class procedure RegisterMethods(APythonType: TPythonType); override; // Properties property DelphiObject: TApplication read GetDelphiObject write SetDelphiObject; end; @@ -116,7 +122,14 @@ EInvalidFormClass = class(Exception); implementation uses - System.Types, System.IOUtils, System.Rtti; + System.Types, System.IOUtils, System.Rtti, System.Messaging; + +{$IFDEF OSX} +var + gDelphiMainForm: TCommonCustomForm; + gPythonMainForm: TCommonCustomForm; + gFormsCreatedSubscription: integer; +{$ENDIF OSX} { Register the wrappers, the globals and the constants } type @@ -128,6 +141,13 @@ TFormsRegistration = class(TRegisteredUnit) procedure DefineFunctions(APyDelphiWrapper : TPyDelphiWrapper); override; end; +{$IFDEF OSX} + TInternalMainForm = class(TForm) + public + constructor Create(AOwner: TComponent); override; + end; +{$ENDIF} + { TFormsRegistration } procedure TFormsRegistration.DefineFunctions( @@ -167,6 +187,28 @@ procedure TFormsRegistration.RegisterWrappers( { TPyDelphiApplication } +constructor TPyDelphiApplication.Create(APythonType: TPythonType); +begin + inherited; + {$IFDEF OSX} + gFormsCreatedSubscription := TMessageManager.DefaultManager.SubscribeToMessage( + TFormsCreatedMessage, + procedure(const Sender: TObject; const M: TMessage) begin + if (Sender = Application) and Assigned(gDelphiMainForm) then begin + if Assigned(gPythonMainForm) then begin + Application.MainForm := gPythonMainForm; + gPythonMainForm.Hide(); + gPythonMainForm.Show(); + end; + FreeAndNil(gDelphiMainForm); + gPythonMainForm := nil; + TMessageManager.DefaultManager.Unsubscribe(TFormsCreatedMessage, + gFormsCreatedSubscription); + end; + end); + {$ENDIF OSX} +end; + class function TPyDelphiApplication.DelphiObjectClass: TClass; begin Result := TApplication; @@ -182,6 +224,41 @@ procedure TPyDelphiApplication.SetDelphiObject(const Value: TApplication); inherited DelphiObject := Value; end; +function TPyDelphiApplication.Initialize_Wrapper(AArgs: PPyObject): PPyObject; +begin + Application.Initialize(); + {$IFDEF OSX} + //The application initialization routine in macOS requires + //the main form standard creation way, + //due to MainMenu creation and others. + Application.CreateForm(TInternalMainForm, gDelphiMainForm); + {$ENDIF OSX} + Result := GetPythonEngine().ReturnNone(); +end; + +function TPyDelphiApplication.Run_Wrapper(AArgs: PPyObject): PPyObject; +begin + {$IFDEF OSX} + gPythonMainForm := Application.MainForm; + Application.MainForm := nil; + {$ENDIF OSX} + Application.Run(); + Result := GetPythonEngine().ReturnNone(); +end; + +class procedure TPyDelphiApplication.RegisterMethods(APythonType: TPythonType); +begin + inherited; + with APythonType do begin + AddMethod('Initialize', @TPyDelphiApplication.Initialize_Wrapper, + 'TApplication.Initialize()'#10 + + 'Initialize the application'); + AddMethod('Run', @TPyDelphiApplication.Run_Wrapper, + 'TApplication.Run()'#10 + + 'Run the application'); + end; +end; + { TCloseQueryEventHandler } constructor TCloseQueryEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; @@ -358,10 +435,15 @@ function TPyDelphiCommonCustomForm.LoadProps_Wrapper( begin Adjust(@Self); - if InternalReadComponent(FindResource(), DelphiObject) then - Result := GetPythonEngine().ReturnTrue - else - Result := GetPythonEngine().ReturnFalse; + try + if InternalReadComponent(FindResource(), DelphiObject) then + Exit(GetPythonEngine().ReturnTrue); + except + on E: Exception do + with GetPythonEngine do + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(AnsiString(E.Message))); + end; + Result := nil; end; class procedure TPyDelphiCommonCustomForm.RegisterMethods( @@ -465,6 +547,21 @@ procedure TPyDelphiScreen.SetDelphiObject(const Value: TScreen); inherited DelphiObject := Value; end; +{$IFDEF OSX} + +{ TInternalMainForm } + +constructor TInternalMainForm.Create(AOwner: TComponent); +begin + CreateNew(AOwner); + Name := '_InternalDelphiMainForm'; + Left := -10; + ClientHeight := 1; + ClientWidth := 1; +end; + +{$ENDIF OSX} + Initialization RegisteredUnits.Add(TFormsRegistration.Create); diff --git a/Source/fmx/WrapFmxMedia.pas b/Source/fmx/WrapFmxMedia.pas index f63e19d8..19b7f556 100644 --- a/Source/fmx/WrapFmxMedia.pas +++ b/Source/fmx/WrapFmxMedia.pas @@ -4,7 +4,9 @@ interface uses - PythonEngine, WrapFmxTypes, FMX.Media, WrapDelphi, System.TypInfo; + System.TypInfo, FMX.Media, + PythonEngine, WrapDelphi, + WrapFmxTypes, WrapFmxControls, WrapFmxActnList, WrapFmxStdActns; type TSampleBufferReadyEventHandler = class(TEventHandler) @@ -29,6 +31,128 @@ TPyDelphiCameraComponent = class(TPyDelphiFmxObject) write SetDelphiObject; end; + //Media player wrappers + TPyDelphiCustomMediaCodec = class(TPyDelphiObject) + private + function GetDelphiObject: TCustomMediaCodec; + procedure SetDelphiObject(const Value: TCustomMediaCodec); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TCustomMediaCodec read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMedia = class(TPyDelphiObject) + private + function GetDelphiObject: TMedia; + procedure SetDelphiObject(const Value: TMedia); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMedia read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerControl = class(TPyDelphiControl) + private + function GetDelphiObject: TMediaPlayerControl; + procedure SetDelphiObject(const Value: TMediaPlayerControl); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerControl read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayer = class(TPyDelphiFmxObject) + private + function GetDelphiObject: TMediaPlayer; + procedure SetDelphiObject(const Value: TMediaPlayer); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayer read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomMediaPlayerAction = class(TPyDelphiCustomAction) + private + function GetDelphiObject: TCustomMediaPlayerAction; + procedure SetDelphiObject(const Value: TCustomMediaPlayerAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TCustomMediaPlayerAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerStart = class(TPyDelphiCustomMediaPlayerAction) + private + function GetDelphiObject: TMediaPlayerStart; + procedure SetDelphiObject(const Value: TMediaPlayerStart); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerStart read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerStop = class(TPyDelphiCustomMediaPlayerAction) + private + function GetDelphiObject: TMediaPlayerStop; + procedure SetDelphiObject(const Value: TMediaPlayerStop); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerStop read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerPause = class(TPyDelphiCustomMediaPlayerAction) + private + function GetDelphiObject: TMediaPlayerPlayPause; + procedure SetDelphiObject(const Value: TMediaPlayerPlayPause); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerPlayPause read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerValue = class(TPyDelphiCustomValueRangeAction) + private + function GetDelphiObject: TMediaPlayerValue; + procedure SetDelphiObject(const Value: TMediaPlayerValue); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerValue read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerCurrentTime = class(TPyDelphiMediaPlayerValue) + private + function GetDelphiObject: TMediaPlayerCurrentTime; + procedure SetDelphiObject(const Value: TMediaPlayerCurrentTime); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerCurrentTime read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerVolume = class(TPyDelphiMediaPlayerValue) + private + function GetDelphiObject: TMediaPlayerVolume; + procedure SetDelphiObject(const Value: TMediaPlayerVolume); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerVolume read GetDelphiObject + write SetDelphiObject; + end; + implementation type @@ -56,6 +180,17 @@ procedure TFMXMediaRegistration.RegisterWrappers(APyDelphiWrapper begin inherited; APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCameraComponent); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMediaCodec); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayer); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMedia); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMediaPlayerAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerStart); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerStop); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerPause); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerValue); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerCurrentTime); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerVolume); APyDelphiWrapper.EventHandlers.RegisterHandler(TSampleBufferReadyEventHandler); end; @@ -132,6 +267,202 @@ procedure TPyDelphiCameraComponent.SetDelphiObject inherited DelphiObject := Value; end; +{ TPyDelphiCustomMediaCodec } + +class function TPyDelphiCustomMediaCodec.DelphiObjectClass: TClass; +begin + Result := TCustomMediaCodec; +end; + +function TPyDelphiCustomMediaCodec.GetDelphiObject: TCustomMediaCodec; +begin + Result := TCustomMediaCodec(inherited DelphiObject); +end; + +procedure TPyDelphiCustomMediaCodec.SetDelphiObject( + const Value: TCustomMediaCodec); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMedia } + +class function TPyDelphiMedia.DelphiObjectClass: TClass; +begin + Result := TMedia; +end; + +function TPyDelphiMedia.GetDelphiObject: TMedia; +begin + Result := TMedia(inherited DelphiObject); +end; + +procedure TPyDelphiMedia.SetDelphiObject(const Value: TMedia); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerControl } + +class function TPyDelphiMediaPlayerControl.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerControl; +end; + +function TPyDelphiMediaPlayerControl.GetDelphiObject: TMediaPlayerControl; +begin + Result := TMediaPlayerControl(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerControl.SetDelphiObject( + const Value: TMediaPlayerControl); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayer } + +class function TPyDelphiMediaPlayer.DelphiObjectClass: TClass; +begin + Result := TMediaPlayer; +end; + +function TPyDelphiMediaPlayer.GetDelphiObject: TMediaPlayer; +begin + Result := TMediaPlayer(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayer.SetDelphiObject(const Value: TMediaPlayer); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomMediaPlayerAction } + +class function TPyDelphiCustomMediaPlayerAction.DelphiObjectClass: TClass; +begin + Result := TCustomMediaPlayerAction; +end; + +function TPyDelphiCustomMediaPlayerAction.GetDelphiObject: TCustomMediaPlayerAction; +begin + Result := TCustomMediaPlayerAction(inherited DelphiObject); +end; + +procedure TPyDelphiCustomMediaPlayerAction.SetDelphiObject( + const Value: TCustomMediaPlayerAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerStart } + +class function TPyDelphiMediaPlayerStart.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerStart; +end; + +function TPyDelphiMediaPlayerStart.GetDelphiObject: TMediaPlayerStart; +begin + Result := TMediaPlayerStart(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerStart.SetDelphiObject( + const Value: TMediaPlayerStart); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerStop } + +class function TPyDelphiMediaPlayerStop.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerStop; +end; + +function TPyDelphiMediaPlayerStop.GetDelphiObject: TMediaPlayerStop; +begin + Result := TMediaPlayerStop(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerStop.SetDelphiObject( + const Value: TMediaPlayerStop); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerPause } + +class function TPyDelphiMediaPlayerPause.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerPlayPause; +end; + +function TPyDelphiMediaPlayerPause.GetDelphiObject: TMediaPlayerPlayPause; +begin + Result := TMediaPlayerPlayPause(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerPause.SetDelphiObject( + const Value: TMediaPlayerPlayPause); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerValue } + +class function TPyDelphiMediaPlayerValue.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerValue; +end; + +function TPyDelphiMediaPlayerValue.GetDelphiObject: TMediaPlayerValue; +begin + Result := TMediaPlayerValue(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerValue.SetDelphiObject( + const Value: TMediaPlayerValue); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerCurrentTime } + +class function TPyDelphiMediaPlayerCurrentTime.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerCurrentTime; +end; + +function TPyDelphiMediaPlayerCurrentTime.GetDelphiObject: TMediaPlayerCurrentTime; +begin + Result := TMediaPlayerCurrentTime(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerCurrentTime.SetDelphiObject( + const Value: TMediaPlayerCurrentTime); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerVolume } + +class function TPyDelphiMediaPlayerVolume.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerVolume; +end; + +function TPyDelphiMediaPlayerVolume.GetDelphiObject: TMediaPlayerVolume; +begin + Result := TMediaPlayerVolume(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerVolume.SetDelphiObject( + const Value: TMediaPlayerVolume); +begin + inherited DelphiObject := Value; +end; + initialization RegisteredUnits.Add(TFMXMediaRegistration.Create()); diff --git a/Source/fmx/WrapFmxStdActns.pas b/Source/fmx/WrapFmxStdActns.pas new file mode 100644 index 00000000..0c96ebe1 --- /dev/null +++ b/Source/fmx/WrapFmxStdActns.pas @@ -0,0 +1,454 @@ +{$I ..\Definition.Inc} +unit WrapFmxStdActns; + +interface + +uses + FMX.StdActns, + PythonEngine, WrapDelphi, WrapFmxControls, WrapFmxActnList, WrapDelphiClasses; + +type + TPyDelphiHintAction = class(TPyDelphiCustomAction) + private + function GetDelphiObject: THintAction; + procedure SetDelphiObject(const Value: THintAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: THintAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiSysCommonAction = class(TPyDelphiCustomAction) + private + function GetDelphiObject: TSysCommonAction; + procedure SetDelphiObject(const Value: TSysCommonAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TSysCommonAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFileExit = class(TPyDelphiSysCommonAction) + private + function GetDelphiObject: TFileExit; + procedure SetDelphiObject(const Value: TFileExit); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TFileExit read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiWindowClose = class(TPyDelphiSysCommonAction) + private + function GetDelphiObject: TWindowClose; + procedure SetDelphiObject(const Value: TWindowClose); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TWindowClose read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFileHideApp = class(TPyDelphiSysCommonAction) + private + function GetDelphiObject: TFileHideApp; + procedure SetDelphiObject(const Value: TFileHideApp); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TFileHideApp read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFileHideAppOthers = class(TPyDelphiFileHideApp) + private + function GetDelphiObject: TFileHideAppOthers; + procedure SetDelphiObject(const Value: TFileHideAppOthers); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TFileHideAppOthers read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiObjectViewAction = class(TPyDelphiCustomViewAction) + private + function GetDelphiObject: TObjectViewAction; + procedure SetDelphiObject(const Value: TObjectViewAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TObjectViewAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiVirtualKeyboard = class(TPyDelphiObjectViewAction) + private + function GetDelphiObject: TVirtualKeyboard; + procedure SetDelphiObject(const Value: TVirtualKeyboard); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TVirtualKeyboard read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiViewAction = class(TPyDelphiObjectViewAction) + private + function GetDelphiObject: TViewAction; + procedure SetDelphiObject(const Value: TViewAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TViewAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiBaseValueRange = class(TPyDelphiPersistent) + private + function GetDelphiObject: TBaseValueRange; + procedure SetDelphiObject(const Value: TBaseValueRange); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TBaseValueRange read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomValueRange = class(TPyDelphiBaseValueRange) + private + function GetDelphiObject: TCustomValueRange; + procedure SetDelphiObject(const Value: TCustomValueRange); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TCustomValueRange read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiValueRange = class(TPyDelphiCustomValueRange) + private + function GetDelphiObject: TValueRange; + procedure SetDelphiObject(const Value: TValueRange); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TValueRange read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomValueRangeAction = class(TPyDelphiCustomControlAction) + private + function GetDelphiObject: TCustomValueRangeAction; + procedure SetDelphiObject(const Value: TCustomValueRangeAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TCustomValueRangeAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiValueRangeAction = class(TPyDelphiCustomValueRangeAction) + private + function GetDelphiObject: TValueRangeAction; + procedure SetDelphiObject(const Value: TValueRangeAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TValueRangeAction read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +type + TStdActnsRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TFMXStdActns } + +function TStdActnsRegistration.Name: string; +begin + Result := 'StdActns'; +end; + +procedure TStdActnsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +procedure TStdActnsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiHintAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSysCommonAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileExit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiWindowClose); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileHideApp); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileHideAppOthers); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiObjectViewAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiVirtualKeyboard); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiViewAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBaseValueRange); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomValueRange); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiValueRange); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomValueRangeAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiValueRangeAction); +end; + +{ TPyDelphiHintAction } + +class function TPyDelphiHintAction.DelphiObjectClass: TClass; +begin + Result := THintAction; +end; + +function TPyDelphiHintAction.GetDelphiObject: THintAction; +begin + Result := THintAction(inherited DelphiObject); +end; + +procedure TPyDelphiHintAction.SetDelphiObject(const Value: THintAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSysCommonAction } + +class function TPyDelphiSysCommonAction.DelphiObjectClass: TClass; +begin + Result := TSysCommonAction; +end; + +function TPyDelphiSysCommonAction.GetDelphiObject: TSysCommonAction; +begin + Result := TSysCommonAction(inherited DelphiObject); +end; + +procedure TPyDelphiSysCommonAction.SetDelphiObject( + const Value: TSysCommonAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFileExit } + +class function TPyDelphiFileExit.DelphiObjectClass: TClass; +begin + Result := TFileExit; +end; + +function TPyDelphiFileExit.GetDelphiObject: TFileExit; +begin + Result := TFileExit(inherited DelphiObject); +end; + +procedure TPyDelphiFileExit.SetDelphiObject(const Value: TFileExit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiWindowClose } + +class function TPyDelphiWindowClose.DelphiObjectClass: TClass; +begin + Result := TWindowClose; +end; + +function TPyDelphiWindowClose.GetDelphiObject: TWindowClose; +begin + Result := TWindowClose(inherited DelphiObject); +end; + +procedure TPyDelphiWindowClose.SetDelphiObject(const Value: TWindowClose); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFileHideApp } + +class function TPyDelphiFileHideApp.DelphiObjectClass: TClass; +begin + Result := TFileHideApp; +end; + +function TPyDelphiFileHideApp.GetDelphiObject: TFileHideApp; +begin + Result := TFileHideApp(inherited DelphiObject); +end; + +procedure TPyDelphiFileHideApp.SetDelphiObject(const Value: TFileHideApp); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFileHideAppOthers } + +class function TPyDelphiFileHideAppOthers.DelphiObjectClass: TClass; +begin + Result := TFileHideAppOthers; +end; + +function TPyDelphiFileHideAppOthers.GetDelphiObject: TFileHideAppOthers; +begin + Result := TFileHideAppOthers(inherited DelphiObject); +end; + +procedure TPyDelphiFileHideAppOthers.SetDelphiObject( + const Value: TFileHideAppOthers); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiObjectViewAction } + +class function TPyDelphiObjectViewAction.DelphiObjectClass: TClass; +begin + Result := TObjectViewAction; +end; + +function TPyDelphiObjectViewAction.GetDelphiObject: TObjectViewAction; +begin + Result := TObjectViewAction(inherited DelphiObject); +end; + +procedure TPyDelphiObjectViewAction.SetDelphiObject( + const Value: TObjectViewAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiVirtualKeyboard } + +class function TPyDelphiVirtualKeyboard.DelphiObjectClass: TClass; +begin + Result := TVirtualKeyboard; +end; + +function TPyDelphiVirtualKeyboard.GetDelphiObject: TVirtualKeyboard; +begin + Result := TVirtualKeyboard(inherited DelphiObject); +end; + +procedure TPyDelphiVirtualKeyboard.SetDelphiObject( + const Value: TVirtualKeyboard); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiViewAction } + +class function TPyDelphiViewAction.DelphiObjectClass: TClass; +begin + Result := TViewAction; +end; + +function TPyDelphiViewAction.GetDelphiObject: TViewAction; +begin + Result := TViewAction(inherited DelphiObject); +end; + +procedure TPyDelphiViewAction.SetDelphiObject(const Value: TViewAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBaseValueRange } + +class function TPyDelphiBaseValueRange.DelphiObjectClass: TClass; +begin + Result := TBaseValueRange; +end; + +function TPyDelphiBaseValueRange.GetDelphiObject: TBaseValueRange; +begin + Result := TBaseValueRange(inherited DelphiObject); +end; + +procedure TPyDelphiBaseValueRange.SetDelphiObject(const Value: TBaseValueRange); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomValueRange } + +class function TPyDelphiCustomValueRange.DelphiObjectClass: TClass; +begin + Result := TCustomValueRange; +end; + +function TPyDelphiCustomValueRange.GetDelphiObject: TCustomValueRange; +begin + Result := TCustomValueRange(inherited DelphiObject); +end; + +procedure TPyDelphiCustomValueRange.SetDelphiObject( + const Value: TCustomValueRange); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiValueRange } + +class function TPyDelphiValueRange.DelphiObjectClass: TClass; +begin + Result := TValueRange; +end; + +function TPyDelphiValueRange.GetDelphiObject: TValueRange; +begin + Result := TValueRange(inherited DelphiObject); +end; + +procedure TPyDelphiValueRange.SetDelphiObject(const Value: TValueRange); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomValueRangeAction } + +class function TPyDelphiCustomValueRangeAction.DelphiObjectClass: TClass; +begin + Result := TCustomValueRangeAction; +end; + +function TPyDelphiCustomValueRangeAction.GetDelphiObject: TCustomValueRangeAction; +begin + Result := TCustomValueRangeAction(inherited DelphiObject); +end; + +procedure TPyDelphiCustomValueRangeAction.SetDelphiObject( + const Value: TCustomValueRangeAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiValueRangeAction } + +class function TPyDelphiValueRangeAction.DelphiObjectClass: TClass; +begin + Result := TValueRangeAction; +end; + +function TPyDelphiValueRangeAction.GetDelphiObject: TValueRangeAction; +begin + Result := TValueRangeAction(inherited DelphiObject); +end; + +procedure TPyDelphiValueRangeAction.SetDelphiObject( + const Value: TValueRangeAction); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TStdActnsRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxStdCtrls.pas b/Source/fmx/WrapFmxStdCtrls.pas index 3daeacc0..aba27274 100644 --- a/Source/fmx/WrapFmxStdCtrls.pas +++ b/Source/fmx/WrapFmxStdCtrls.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, FMX.StdCtrls, - PythonEngine, WrapDelphi, WrapDelphiClasses, WrapFmxControls; + PythonEngine, WrapDelphi, WrapDelphiClasses, WrapFmxControls, WrapFmxActnList; type TPyDelphiPresentedTextControl = class(TPyDelphiStyledControl) diff --git a/Source/vcl/WrapDelphiVCL.pas b/Source/vcl/WrapDelphiVCL.pas index 339b3456..ea9f5392 100644 --- a/Source/vcl/WrapDelphiVCL.pas +++ b/Source/vcl/WrapDelphiVCL.pas @@ -28,6 +28,7 @@ implementation WrapVclSamplesSpin, WrapVclWinXCtrls, WrapVclThemes, - WrapVclDialogs; + WrapVclDialogs, + WrapVclMedia; 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/WrapVclControls.pas b/Source/vcl/WrapVclControls.pas index cc4e9b1b..21310b5d 100644 --- a/Source/vcl/WrapVclControls.pas +++ b/Source/vcl/WrapVclControls.pas @@ -144,6 +144,26 @@ TKeyEventHandler = class(TEventHandler) PropertyInfo : PPropInfo; Callable : PPyObject); override; class function GetTypeInfo : PTypeInfo; override; end; + + { TMouseEvent wrapper } + TMouseEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + { TMouseMoveEvent wrapper } + TMouseMoveEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Shift: TShiftState; X: Integer; Y: Integer); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; implementation @@ -192,6 +212,9 @@ procedure TControlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyPressEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseMoveEventHandler); end; { TPyDelphiControl } @@ -754,6 +777,100 @@ class function TKeyEventHandler.GetTypeInfo: PTypeInfo; Result := System.TypeInfo(TKeyEvent); end; +{ TMouseEventHandler } + +constructor TMouseEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + Method : TMethod; +begin + inherited; + Method.Code := @TMouseEventHandler.DoEvent; + Method.Data := Self; + SetMethodProp(Component, PropertyInfo, Method); +end; + +procedure TMouseEventHandler.DoEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); +var + PyObject, PyTuple, PyButton, PyX, PyY, PyResult : PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + PyObject := PyDelphiWrapper.Wrap(Sender); + PyButton := PyLong_FromLong(Ord(Button)); + PyX := PyLong_FromLong(X); + PyY := PyLong_FromLong(Y); + PyTuple := PyTuple_New(5); + GetPythonEngine.PyTuple_SetItem(PyTuple, 0, PyObject); + GetPythonEngine.PyTuple_SetItem(PyTuple, 1, PyButton); + GetPythonEngine.PyTuple_SetItem(PyTuple, 2, ShiftToPython(Shift)); + GetPythonEngine.PyTuple_SetItem(PyTuple, 3, PyX); + GetPythonEngine.PyTuple_SetItem(PyTuple, 4, PyY); + try + PyResult := PyObject_CallObject(Callable, PyTuple); + if Assigned(PyResult) then + begin + Py_DECREF(PyResult); + end; + finally + Py_DECREF(PyTuple); + end; + CheckError; + end; +end; + +class function TMouseEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TMouseEvent); +end; + +{ TMouseMoveEventHandler } + +constructor TMouseMoveEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + Method : TMethod; +begin + inherited; + Method.Code := @TMouseMoveEventHandler.DoEvent; + Method.Data := Self; + SetMethodProp(Component, PropertyInfo, Method); +end; + +procedure TMouseMoveEventHandler.DoEvent(Sender: TObject; Shift: TShiftState; X: Integer; Y: Integer); +var + PyObject, PyTuple, PyX, PyY, PyResult : PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + PyObject := PyDelphiWrapper.Wrap(Sender); + PyX := PyLong_FromLong(X); + PyY := PyLong_FromLong(Y); + PyTuple := PyTuple_New(4); + GetPythonEngine.PyTuple_SetItem(PyTuple, 0, PyObject); + GetPythonEngine.PyTuple_SetItem(PyTuple, 1, ShiftToPython(Shift)); + GetPythonEngine.PyTuple_SetItem(PyTuple, 2, PyX); + GetPythonEngine.PyTuple_SetItem(PyTuple, 3, PyY); + try + PyResult := PyObject_CallObject(Callable, PyTuple); + if Assigned(PyResult) then + begin + Py_DECREF(PyResult); + end; + finally + Py_DECREF(PyTuple); + end; + CheckError; + end; +end; + +class function TMouseMoveEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TMouseMoveEvent); +end; + initialization RegisteredUnits.Add(TControlsRegistration.Create); end. 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); diff --git a/Source/vcl/WrapVclForms.pas b/Source/vcl/WrapVclForms.pas index 4a722da1..d0a34631 100644 --- a/Source/vcl/WrapVclForms.pas +++ b/Source/vcl/WrapVclForms.pas @@ -584,10 +584,17 @@ function TPyDelphiCustomForm.LoadProps_Wrapper(args: PPyObject): PPyObject; begin Adjust(@Self); - if InternalReadComponent(FindResource(), DelphiObject) then - Result := GetPythonEngine().ReturnTrue - else - Result := GetPythonEngine().ReturnFalse; + try + if InternalReadComponent(FindResource(), DelphiObject) then + Exit(GetPythonEngine().ReturnTrue) + else + Exit(GetPythonEngine().ReturnFalse); + except + on E: Exception do + GetPythonEngine().PyErr_SetString(PyExc_RuntimeError^, + PAnsiChar(AnsiString(E.Message))); + end; + Result := nil; end; function TPyDelphiCustomForm.Set_ModalResult(AValue: PPyObject; @@ -1041,9 +1048,9 @@ class procedure TPyDelphiScreen.RegisterGetSets(PythonType: TPythonType); AddGetSet('DesktopRect', @TPyDelphiScreen.Get_DesktopRect, nil, 'Specifies the boundaries of the virtual desktop relative to the upper-left corner of the primary monitor.', nil); AddGetSet('DesktopLeft', @TPyDelphiScreen.Get_DesktopLeft, nil, - 'Specifies the x-coordinate of the desktop’s left edge relative to the upper-left corner of the primary monitor.', nil); + 'Specifies the x-coordinate of the desktop’s left edge relative to the upper-left corner of the primary monitor.', nil); AddGetSet('DesktopTop', @TPyDelphiScreen.Get_DesktopTop, nil, - 'Specifies the y-coordinate of the entire desktop’s top edge relative to the upper-left corner of the primary monitor.', nil); + 'Specifies the y-coordinate of the entire desktop’s top edge relative to the upper-left corner of the primary monitor.', nil); {$ENDIF FPC} AddGetSet('DesktopWidth', @TPyDelphiScreen.Get_DesktopWidth, nil, 'Specifies the width of the entire virtual desktop.', nil); @@ -1106,7 +1113,7 @@ class procedure TPyDelphiScreen.RegisterMethods(PythonType: TPythonType); 'Allows forms to be aligned in the screen.'); PythonType.AddMethod('Realign', @TPyDelphiScreen.Realign_Wrapper, 'TScreen.Realign()'#10 + - 'Realigns the screen’s forms according to their Align properties.'); + 'Realigns the screen’s forms according to their Align properties.'); PythonType.AddMethod('ResetFonts', @TPyDelphiScreen.ResetFonts_Wrapper, 'TScreen.ResetFonts()'#10 + 'Reinitializes the fonts listed in the Fonts property.'); @@ -1399,7 +1406,7 @@ class procedure TPyDelphiMonitor.RegisterGetSets(PythonType: TPythonType); AddGetSet('Handle', @TPyDelphiMonitor.Get_Handle, nil, 'Indicates the Windows handle for the monitor.', nil); AddGetSet('MonitorNum', @TPyDelphiMonitor.Get_MonitorNum, nil, - 'Specifies the index of the monitor in the global screen object’s Monitors list.', nil); + 'Specifies the index of the monitor in the global screen object’s Monitors list.', nil); AddGetSet('Left', @TPyDelphiMonitor.Get_Left, nil, 'Indicates the logical position of the left edge of the monitor.', nil); AddGetSet('Height', @TPyDelphiMonitor.Get_Height, nil, @@ -1794,7 +1801,7 @@ class procedure TPyDelphiApplication.RegisterGetSets( AddGetSet('HintHidePause', @TPyDelphiApplication.Get_HintHidePause, @TPyDelphiApplication.Set_HintHidePause, 'Specifies the time interval to wait before hiding the Help Hint if the mouse has not moved from the control or menu item.', nil); AddGetSet('HintShortCuts', @TPyDelphiApplication.Get_HintShortCuts, @TPyDelphiApplication.Set_HintShortCuts, - 'Specifies whether the application’s pop-up hints include shortcut information.', nil); + 'Specifies whether the application’s pop-up hints include shortcut information.', nil); AddGetSet('HintShortPause', @TPyDelphiApplication.Get_HintShortPause, @TPyDelphiApplication.Set_HintShortPause, 'Specifies the time period to wait before bringing up a hint if another hint has already been shown.', nil); AddGetSet('Icon', @TPyDelphiApplication.Get_Icon, @TPyDelphiApplication.Set_Icon, diff --git a/Source/vcl/WrapVclMedia.pas b/Source/vcl/WrapVclMedia.pas new file mode 100644 index 00000000..648aa7d5 --- /dev/null +++ b/Source/vcl/WrapVclMedia.pas @@ -0,0 +1,192 @@ +{$I ..\Definition.Inc} +unit WrapVclMedia; + +interface + +uses + System.TypInfo, Vcl.MPlayer, + PythonEngine, WrapDelphi, WrapVclControls; + +type + TEMPNotifyEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Button: TMPBtnType; + var DoDefault: Boolean); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TEMPPostNotifyEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Button: TMPBtnType); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TPyDelphiMediaPlayer = class (TPyDelphiCustomControl) + private + function GetDelphiObject: TMediaPlayer; + procedure SetDelphiObject(const Value: TMediaPlayer); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TMediaPlayer read GetDelphiObject write SetDelphiObject; + end; + +implementation + +type + TMediaRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TVclMediaRegistration } + +function TMediaRegistration.Name: string; +begin + Result := 'Media'; +end; + +procedure TMediaRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +procedure TMediaRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayer); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TEMPNotifyEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TEMPPostNotifyEventHandler); +end; + +{ TPyDelphiMediaPlayer } + +class function TPyDelphiMediaPlayer.DelphiObjectClass: TClass; +begin + Result := TMediaPlayer; +end; + +function TPyDelphiMediaPlayer.GetDelphiObject: TMediaPlayer; +begin + Result := TMediaPlayer(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayer.SetDelphiObject(const Value: TMediaPlayer); +begin + inherited DelphiObject := Value; +end; + +{ TEMPNotifyEventHandler } + +constructor TEMPNotifyEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TEMPNotifyEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TEMPNotifyEventHandler.DoEvent(Sender: TObject; Button: TMPBtnType; + var DoDefault: Boolean); +var + LPyObject: PPyObject; + LPyTuple: PPyObject; + LPyResult: PPyObject; + LPyButton: PPyObject; + LDoDefault: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyButton := PyLong_FromLong(Integer(Button)); + LDoDefault := CreateVarParam(PyDelphiWrapper, DoDefault); + LVarParam := PythonToDelphi(LDoDefault) as TPyDelphiVarParameter; + + LPyTuple := PyTuple_New(3); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyButton); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LDoDefault); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DoDefault := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +class function TEMPNotifyEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(EMPNotify); +end; + +{ TEMPPostNotifyEventHandler } + +constructor TEMPPostNotifyEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TEMPPostNotifyEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TEMPPostNotifyEventHandler.DoEvent(Sender: TObject; + Button: TMPBtnType); +var + LPyObject: PPyObject; + LPyTuple: PPyObject; + LPyResult: PPyObject; + LPyButton: PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyButton := PyLong_FromLong(Integer(Button)); + + LPyTuple := PyTuple_New(2); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyButton); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +class function TEMPPostNotifyEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(EMPPostNotify); +end; + +initialization + RegisteredUnits.Add(TMediaRegistration.Create); + +end. diff --git a/Source/vcl/WrapVclWinXCtrls.pas b/Source/vcl/WrapVclWinXCtrls.pas index 58bb010f..0d420ebb 100644 --- a/Source/vcl/WrapVclWinXCtrls.pas +++ b/Source/vcl/WrapVclWinXCtrls.pas @@ -4,7 +4,11 @@ interface uses - Vcl.WinXCtrls, WrapVclControls; + Vcl.WinXCtrls, + {$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + Vcl.NumberBox, + {$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + WrapVclControls, WrapVclStdCtrls; type TPyDelphiCustomActivityIndicator = class (TPyDelphiCustomControl) @@ -43,6 +47,26 @@ TPyDelphiToggleSwitch = class (TPyDelphiCustomCustomToggleSwitch) property DelphiObject: TToggleSwitch read GetDelphiObject write SetDelphiObject; end; + {$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + TPyDelphiCustomNumberBox = class(TPyDelphiCustomEdit) + private + function GetDelphiObject: TCustomNumberBox; + procedure SetDelphiObject(const Value: TCustomNumberBox); + public + class function DelphiObjectClass : TClass; override; + property DelphiObject: TCustomNumberBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiNumberBox = class(TPyDelphiCustomNumberBox) + private + function GetDelphiObject: TNumberBox; + procedure SetDelphiObject(const Value: TNumberBox); + public + class function DelphiObjectClass : TClass; override; + property DelphiObject: TNumberBox read GetDelphiObject write SetDelphiObject; + end; + {$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + implementation uses @@ -77,6 +101,10 @@ procedure TWinXCtrlsRegistration.RegisterWrappers( APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiActivityIndicator); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCustomToggleSwitch); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToggleSwitch); + {$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomNumberBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiNumberBox); + {$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} end; { TPyDelphiCustomActivityIndicator } @@ -150,6 +178,45 @@ procedure TPyDelphiToggleSwitch.SetDelphiObject(const Value: TToggleSwitch); inherited DelphiObject := Value; end; +{$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + +{ TPyDelphiCustomNumberBox } + +class function TPyDelphiCustomNumberBox.DelphiObjectClass: TClass; +begin + Result := TCustomNumberBox; +end; + +function TPyDelphiCustomNumberBox.GetDelphiObject: TCustomNumberBox; +begin + Result := TCustomNumberBox(inherited DelphiObject); +end; + +procedure TPyDelphiCustomNumberBox.SetDelphiObject( + const Value: TCustomNumberBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiNumberBox } + +class function TPyDelphiNumberBox.DelphiObjectClass: TClass; +begin + Result := TNumberBox; +end; + +function TPyDelphiNumberBox.GetDelphiObject: TNumberBox; +begin + Result := TNumberBox(inherited DelphiObject); +end; + +procedure TPyDelphiNumberBox.SetDelphiObject(const Value: TNumberBox); +begin + inherited DelphiObject := Value; +end; + +{$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + initialization RegisteredUnits.Add(TWinXCtrlsRegistration.Create());