From 43618b8269de0678079af8eb2dd23a65030cae35 Mon Sep 17 00:00:00 2001 From: hartmutdavid Date: Thu, 14 Dec 2017 13:19:26 +0100 Subject: [PATCH 1/2] This version includes customizations to Python 3.x, 64bit and FireDAC. --- .../Components/Sources/Core/Definition.Inc | 2 +- .../Components/Sources/Core/PythonEngine.pas | 184 ++++++---- .../Components/Sources/Core/VarPyth.pas | 38 +-- .../Components/Sources/Core/WrapDelphi.pas | 8 +- .../Sources/Core/WrapDelphiClasses.pas | 225 ++++++------ PythonForDelphi/Demos/Demo01/Project1.conf | 32 -- PythonForDelphi/Demos/Demo01/Project1.dof | 136 -------- PythonForDelphi/Demos/Demo01/Project1.dpr | 2 - PythonForDelphi/Demos/Demo01/Project1.dproj | 31 +- PythonForDelphi/Demos/Demo01/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo01/Project1.res | Bin 2040 -> 59024 bytes PythonForDelphi/Demos/Demo01/Unit1.dfm | Bin 1477 -> 1504 bytes PythonForDelphi/Demos/Demo01/Unit1.pas | 2 - PythonForDelphi/Demos/Demo01/Unit1.xfm | Bin 1449 -> 0 bytes PythonForDelphi/Demos/Demo02/Project1.conf | 32 -- PythonForDelphi/Demos/Demo02/Project1.dof | 87 ----- PythonForDelphi/Demos/Demo02/Project1.dpr | 2 - PythonForDelphi/Demos/Demo02/Project1.dproj | 308 +++++++++++------ PythonForDelphi/Demos/Demo02/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo02/Project1.res | Bin 876 -> 3212 bytes PythonForDelphi/Demos/Demo02/Unit1.dfm | Bin 1377 -> 1368 bytes PythonForDelphi/Demos/Demo02/Unit1.pas | 2 - PythonForDelphi/Demos/Demo02/Unit1.xfm | Bin 1447 -> 0 bytes PythonForDelphi/Demos/Demo03/Project1.conf | 32 -- PythonForDelphi/Demos/Demo03/Project1.dof | 87 ----- PythonForDelphi/Demos/Demo03/Project1.dproj | 308 +++++++++++------ PythonForDelphi/Demos/Demo03/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo03/Project1.res | Bin 876 -> 3212 bytes PythonForDelphi/Demos/Demo03/Unit1.dfm | Bin 1823 -> 1839 bytes PythonForDelphi/Demos/Demo04/Project1.dof | 92 ----- PythonForDelphi/Demos/Demo04/Project1.dpr | 2 - PythonForDelphi/Demos/Demo04/Project1.dproj | 310 +++++++++++------ PythonForDelphi/Demos/Demo04/Project1.res | Bin 876 -> 3212 bytes PythonForDelphi/Demos/Demo04/Unit1.dfm | Bin 2502 -> 2536 bytes PythonForDelphi/Demos/Demo04/Unit1.pas | 2 - PythonForDelphi/Demos/Demo05/Project1.dof | 92 ----- PythonForDelphi/Demos/Demo05/Project1.dproj | 310 +++++++++++------ PythonForDelphi/Demos/Demo05/Project1.res | Bin 876 -> 3212 bytes PythonForDelphi/Demos/Demo05/Unit1.dfm | Bin 1630 -> 1665 bytes PythonForDelphi/Demos/Demo06/Project1.dof | 136 -------- PythonForDelphi/Demos/Demo06/Project1.dproj | 317 +++++++++-------- PythonForDelphi/Demos/Demo06/Project1.res | Bin 2040 -> 3212 bytes PythonForDelphi/Demos/Demo06/Unit1.dfm | Bin 2510 -> 2543 bytes PythonForDelphi/Demos/Demo06/Unit1.pas | 18 +- PythonForDelphi/Demos/Demo07/Project1.conf | 32 -- PythonForDelphi/Demos/Demo07/Project1.dof | 87 ----- PythonForDelphi/Demos/Demo07/Project1.dproj | 319 ++++++++++-------- PythonForDelphi/Demos/Demo07/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo07/Project1.res | Bin 2040 -> 3212 bytes PythonForDelphi/Demos/Demo07/Unit1.dfm | Bin 2609 -> 2667 bytes PythonForDelphi/Demos/Demo07/Unit1.pas | 20 +- PythonForDelphi/Demos/Demo08/Project1.conf | 32 -- PythonForDelphi/Demos/Demo08/Project1.dof | 88 ----- PythonForDelphi/Demos/Demo08/Project1.dproj | 319 ++++++++++-------- PythonForDelphi/Demos/Demo08/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo08/Project1.res | Bin 2040 -> 3212 bytes PythonForDelphi/Demos/Demo08/Unit1.dfm | Bin 2817 -> 2859 bytes PythonForDelphi/Demos/Demo09/Project1.conf | 32 -- PythonForDelphi/Demos/Demo09/Project1.dof | 150 -------- PythonForDelphi/Demos/Demo09/Project1.dproj | 307 +++++++++++------ PythonForDelphi/Demos/Demo09/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo09/Project1.res | Bin 876 -> 3212 bytes PythonForDelphi/Demos/Demo09/Unit1.dfm | 10 +- PythonForDelphi/Demos/Demo09/demodll.conf | 34 -- PythonForDelphi/Demos/Demo09/demodll.dof | 150 -------- PythonForDelphi/Demos/Demo09/demodll.dproj | 270 +++++++++------ PythonForDelphi/Demos/Demo09/demodll.kof | 61 ---- PythonForDelphi/Demos/Demo09/module.pas | 2 +- PythonForDelphi/Demos/Demo11/ThSort.dfm | Bin 2777 -> 2777 bytes PythonForDelphi/Demos/Demo11/ThrdDemo.dof | 93 ----- PythonForDelphi/Demos/Demo11/ThrdDemo.dproj | 310 +++++++++++------ PythonForDelphi/Demos/Demo11/ThrdDemo.res | Bin 876 -> 3212 bytes .../Demos/Demo16/Example1/Project1.dof | 93 ----- .../Demos/Demo16/Example1/Project1.dpr | 2 - .../Demos/Demo16/Example1/Project1.dproj | 310 +++++++++++------ .../Demos/Demo16/Example1/Project1.res | Bin 876 -> 3212 bytes .../Demos/Demo16/Example1/Unit1.dfm | Bin 3349 -> 3446 bytes .../Demos/Demo16/Example1/Unit1.pas | 2 - .../Demos/Demo16/Example2/Project1.dproj | 308 +++++++++++------ .../Demos/Demo16/Example2/Project1.res | Bin 876 -> 3212 bytes .../Demos/Demo16/Example2/Unit1.dfm | Bin 2948 -> 2929 bytes PythonForDelphi/Demos/Demo17/Project1.dof | 93 ----- PythonForDelphi/Demos/Demo17/Project1.dproj | 308 +++++++++++------ PythonForDelphi/Demos/Demo17/Project1.res | Bin 876 -> 3212 bytes PythonForDelphi/Demos/Demo17/Unit1.dfm | Bin 1534 -> 1591 bytes PythonForDelphi/Demos/readme.txt | 12 +- README.md | 4 + 87 files changed, 2918 insertions(+), 3693 deletions(-) delete mode 100644 PythonForDelphi/Demos/Demo01/Project1.conf delete mode 100644 PythonForDelphi/Demos/Demo01/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo01/Project1.kof delete mode 100644 PythonForDelphi/Demos/Demo01/Unit1.xfm delete mode 100644 PythonForDelphi/Demos/Demo02/Project1.conf delete mode 100644 PythonForDelphi/Demos/Demo02/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo02/Project1.kof delete mode 100644 PythonForDelphi/Demos/Demo02/Unit1.xfm delete mode 100644 PythonForDelphi/Demos/Demo03/Project1.conf delete mode 100644 PythonForDelphi/Demos/Demo03/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo03/Project1.kof delete mode 100644 PythonForDelphi/Demos/Demo04/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo05/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo06/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo07/Project1.conf delete mode 100644 PythonForDelphi/Demos/Demo07/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo07/Project1.kof delete mode 100644 PythonForDelphi/Demos/Demo08/Project1.conf delete mode 100644 PythonForDelphi/Demos/Demo08/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo08/Project1.kof delete mode 100644 PythonForDelphi/Demos/Demo09/Project1.conf delete mode 100644 PythonForDelphi/Demos/Demo09/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo09/Project1.kof delete mode 100644 PythonForDelphi/Demos/Demo09/demodll.conf delete mode 100644 PythonForDelphi/Demos/Demo09/demodll.dof delete mode 100644 PythonForDelphi/Demos/Demo09/demodll.kof delete mode 100644 PythonForDelphi/Demos/Demo11/ThrdDemo.dof delete mode 100644 PythonForDelphi/Demos/Demo16/Example1/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo17/Project1.dof diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index 8b83a1d0..83d3a1cc 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -37,7 +37,7 @@ //{$DEFINE PYTHON33} //{$DEFINE PYTHON34} //{$DEFINE PYTHON35} -//{$DEFINE PYTHON36} +{$DEFINE PYTHON36} //{$DEFINE PYTHON37} ///////////////////////////////////////////////////////////////////////////// diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 7516faa8..2dfbaf99 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -78,6 +78,9 @@ interface SysUtils, SyncObjs, Variants, +//DAV>>> + System.AnsiStrings, Data.SqlTimSt, +//DAV<<< {$IFDEF DELPHI2005_OR_HIGHER} {$IFNDEF UNICODE} WideStrings, @@ -138,7 +141,12 @@ interface (DllName: 'python33.dll'; RegVersion: '3.3'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python34.dll'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python35.dll'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True), +{$IFDEF DEBUG} + // (DllName: 'python36_d.dll'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True) ); (DllName: 'python36.dll'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True), +{$ELSE} + (DllName: 'python36.dll'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True), +{$ENDIF} (DllName: 'python37.dll'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF LINUX} @@ -193,12 +201,14 @@ interface {$IFDEF PYTHON36} COMPILED_FOR_PYTHON_VERSION_INDEX = 12; {$ENDIF} -{$IFDEF PYTHON36} +{$IFDEF PYTHON37} COMPILED_FOR_PYTHON_VERSION_INDEX = 13; {$ENDIF} - PYT_METHOD_BUFFER_INCREASE = 10; - PYT_MEMBER_BUFFER_INCREASE = 10; - PYT_GETSET_BUFFER_INCREASE = 10; +//DAV>>> !!! ReallocMethods, ReallocMembers, ReallocGetSets don't work correctly !!! + PYT_METHOD_BUFFER_INCREASE = 100; + PYT_MEMBER_BUFFER_INCREASE = 100; + PYT_GETSET_BUFFER_INCREASE = 100; +//DAV<<< METH_VARARGS = $0001; METH_KEYWORDS = $0002; @@ -1389,7 +1399,7 @@ EPyWindowsError = class (EPyOSError); {$IF not Defined(FPC) and (CompilerVersion >= 23)} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] - {$IFEND} + {$ENDIF} TPythonInputOutput = class(TComponent) protected FMaxLines : Integer; @@ -1916,6 +1926,7 @@ TPythonInterface=class(TDynamicDll) _PyObject_New:function (obt:PPyTypeObject;ob:PPyObject):PPyObject; cdecl; _PyString_Resize:function (var ob:PPyObject;i:NativeInt):integer; cdecl; Py_Finalize : procedure; cdecl; + Py_FinalizeEx : function : Integer; PyErr_ExceptionMatches : function ( exc : PPyObject) : Integer; cdecl; PyErr_GivenExceptionMatches : function ( raised_exc, exc : PPyObject) : Integer; cdecl; PyEval_EvalCode : function ( co : PPyCodeObject; globals, locals : PPyObject) : PPyObject; cdecl; @@ -2130,7 +2141,7 @@ TPythonTraceback = class {$IF not Defined(FPC) and (CompilerVersion >= 23)} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] - {$IFEND} + {$ENDIF} TPythonEngine = class(TPythonInterface) private FInitScript: TStrings; @@ -2598,7 +2609,7 @@ TErrors = class(TCollection) {$IF not Defined(FPC) and (CompilerVersion >= 23)} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] - {$IFEND} + {$ENDIF} TPythonModule = class(TMethodsContainer) protected FModuleName : AnsiString; @@ -2633,6 +2644,9 @@ TPythonModule = class(TMethodsContainer) procedure SetVar( const varName : AnsiString; value : PPyObject ); function GetVar( const varName : AnsiString ) : PPyObject; procedure DeleteVar( const varName : AnsiString ); +//DAV>>> + procedure ClearVars; +//DAV<<< procedure SetVarFromVariant( const varName : AnsiString; const value : Variant ); function GetVarAsVariant( const varName: AnsiString ) : Variant; @@ -2863,7 +2877,7 @@ TTypeServices = class(TPersistent) // that creates instances of itself. {$IF not Defined(FPC) and (CompilerVersion >= 23)} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] - {$IFEND} + {$ENDIF} TPythonType = class(TGetSetContainer) protected FType : PyTypeObject; @@ -2951,7 +2965,7 @@ TPythonType = class(TGetSetContainer) {$IF not Defined(FPC) and (CompilerVersion >= 23)} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] - {$IFEND} + {$ENDIF} TPythonDelphiVar = class( TEngineClient ) protected FModule : AnsiString; @@ -4002,6 +4016,8 @@ procedure TPythonInterface.MapDll; else _PyString_Resize :=Import('_PyBytes_Resize'); Py_Finalize :=Import('Py_Finalize'); + if IsPython3000 then + Py_FinalizeEx :=Import('Py_FinalizeEx'); if getProcAddress( FDLLHandle, 'PyCode_Addr2Line' ) <> nil then DLL_PyCode_Addr2Line := Import('PyCode_Addr2Line'); if getProcAddress( FDLLHandle, 'PyImport_ExecCodeModule' ) <> nil then @@ -4614,13 +4630,16 @@ procedure TPythonEngine.Finalize; Finalize; end; // Then finalize Python, if we have to - if Initialized and FAutoFinalize then + if Initialized and FAutoFinalize then begin try - FFinalizing := True; - Py_Finalize; - finally - FFinalizing := False; - end; + try + FFinalizing := True; + Py_Finalize; + finally + FFinalizing := False; + end; + except end; + end; // Detach our clients, when engine is beeing destroyed or one of its clients. canDetachClients := csDestroying in ComponentState; if not canDetachClients then @@ -4899,48 +4918,37 @@ procedure TPythonEngine.Notification( AComponent: TComponent; procedure TPythonEngine.CheckRegistry; {$IFDEF MSWINDOWS} var - key : string; - Path : string; - NewPath : string; - MajorVersion : integer; - MinorVersion : integer; - VersionSuffix: string; + key : String; + path : String; {$ENDIF} begin {$IFDEF MSWINDOWS} - if Assigned( FOnPathInitialization ) then try - with TRegistry.Create(KEY_ALL_ACCESS and not KEY_NOTIFY) do + with TRegistry.Create(KEY_READ and not KEY_NOTIFY) do try - MajorVersion := StrToInt(RegVersion[1]); - MinorVersion := StrToInt(RegVersion[3]); - VersionSuffix := ''; -{$IFDEF CPUX86} - if (MajorVersion > 3) or ((MajorVersion = 3) and (MinorVersion >= 5)) then - VersionSuffix := '-32'; -{$ENDIF} - key := Format('\Software\Python\PythonCore\%s%s\PythonPath', [RegVersion, VersionSuffix]); - + //Access := KEY_READ; // works only with Delphi5 or greater RootKey := HKEY_LOCAL_MACHINE; + key := Format('\Software\Python\PythonCore\%s\PythonPath', [RegVersion]); if not KeyExists( key ) then - begin - // try a current user installation - RootKey := HKEY_CURRENT_USER; - if not KeyExists( key ) then Exit; - end; - // Key found - OpenKey( key, True ); - try - Path := ReadString(''); - NewPath := Path; - FOnPathInitialization( Self, NewPath ); - if NewPath <> Path then begin - WriteString( '', NewPath ); + // try a current user installation + RootKey := HKEY_CURRENT_USER; + if not KeyExists( key ) then + begin + if Assigned( FOnPathInitialization ) then + begin + path := ''; + FOnPathInitialization( Self, path ); + if path <> '' then + begin + //Access := KEY_ALL_ACCESS; // works only with Delphi5 or greater + OpenKey( key, True ); + WriteString( '', path ); + CloseKey; + end; + end; + end; end; - finally - CloseKey; - end; finally Free; end; @@ -5731,6 +5739,9 @@ function TPythonEngine.VariantAsPyObject( const V : Variant ) : PPyObject; Disp : IDispatch; DispID : Integer; args : PPyObject; +//DAV>>> + l_dtSQLTimeStamp: TSQLTimeStamp; +//DAV<<< begin Disp := nil; //Dereference Variant @@ -5829,22 +5840,51 @@ function TPythonEngine.VariantAsPyObject( const V : Variant ) : PPyObject; Result := ReturnNone; end else - try - Disp := DeRefV; - wStr := '__asPPyObject__'; - // detect if the variant supports this special property - if Assigned(Disp) and (Disp.GetIDsOfNames(GUID_NULL, @wStr, 1, 0, @DispID) = S_OK) then - begin - myInt := DeRefV.__asPPyObject__; //Returns the address to PPyObject as integer. (See impl. in PythonAtom.pas) - Result := PPyObject(myInt); - Py_XIncRef(Result); +//DAV>>> + if VarIsSQLTimeStamp(V) then begin + l_dtSQLTimeStamp := VarToSQLTimeStamp(V); + dt := SQLTimeStampToDateTime(l_dtSQLTimeStamp); + DecodeDate( dt, y, m, d ); + DecodeTime( dt, h, mi, sec, ms ); + if (DatetimeConversionMode = dcmToTuple) then begin + wd := (DayOfWeek( dt ) + 7 - 2) mod 7; // In Python, Monday is the first day (=0) + jd := Round(EncodeDate(y,m,d)-EncodeDate(y,1,1))+1; // This shoud be the Julian day, the day in a year (0-366) + dl := -1; // This is daylight save... + Result := ArrayToPyTuple( [y, m, d, h, mi, sec, wd, jd, dl] ); + end + else if (DatetimeConversionMode = dcmToDatetime) then begin + if not Assigned(FPyDateTime_DateTimeType) then + raise EPythonError.Create('dcmToDatetime DatetimeConversionMode cannot be used with this version of python. Missing module datetime'); + args := ArrayToPyTuple([y, m, d, h, mi, sec, ms*1000]); + try + Result := PyEval_CallObjectWithKeywords(FPyDateTime_DateTimeType, args, nil); + CheckError(False); + finally + Py_DecRef(args); + end; end - else //If variant don't implement __asPPyObject__, then we have to return nothing. + else + raise EPythonError.Create('Invalid DatetimeConversionMode'); + end + else begin +//DAV<<< + try + Disp := DeRefV; + wStr := '__asPPyObject__'; + // detect if the variant supports this special property + if Assigned(Disp) and (Disp.GetIDsOfNames(GUID_NULL, @wStr, 1, 0, @DispID) = S_OK) then + begin + myInt := DeRefV.__asPPyObject__; //Returns the address to PPyObject as integer. (See impl. in PythonAtom.pas) + Result := PPyObject(myInt); + Py_XIncRef(Result); + end + else //If variant don't implement __asPPyObject__, then we have to return nothing. + Result := ReturnNone; + except + // if something went wrong, just return none! Result := ReturnNone; - except - // if something went wrong, just return none! - Result := ReturnNone; - end; // of try + end; // of try + end; end; // of case end; @@ -6029,7 +6069,7 @@ function TPythonEngine.VarRecAsPyObject( v : TVarRec ) : PPyObject; vtString: begin if Assigned(v.VString) then - Result := PyString_FromString( StrPCopy( buff, v.VString^) ) + Result := PyString_FromString( System.AnsiStrings.StrPCopy( buff, v.VString^) ) else Result := PyString_FromString( '' ); end; @@ -6155,7 +6195,7 @@ function TPythonEngine.ArrayToPyDict( items : array of const) : PPyObject; vtAnsiString: begin if Assigned(v.VAnsiString) then - Result := StrPas(PAnsiChar(Ansistring(v.VAnsiString))) + Result := System.AnsiStrings.StrPas(PAnsiChar(Ansistring(v.VAnsiString))) else Result := ''; end; @@ -6807,8 +6847,9 @@ function TMethodsContainer.AddMethod( AMethodName : PAnsiChar; AMethod : PyCFunction; ADocString : PAnsiChar ) : PPyMethodDef; begin - if FMethodCount = FAllocatedMethodCount then + if FMethodCount = FAllocatedMethodCount then begin ReallocMethods; + end; Result := Methods[ MethodCount ]; Result^.ml_name := AMethodName; Result^.ml_meth := AMethod; @@ -7582,6 +7623,19 @@ procedure TPythonModule.DeleteVar( const varName : AnsiString ); raise EPythonError.CreateFmt( 'Can''t delete var "%s" in module "%s", because it is not yet initialized', [varName, ModuleName] ); end; +//DAV>>> +procedure TPythonModule.ClearVars; +var + dict : PPyObject; +begin + if Assigned(FEngine) and Assigned( FModule ) then + with Engine do begin + dict := PyModule_GetDict( Module ); + PyDict_Clear(dict); + end; +end; +//DAV<<< + procedure TPythonModule.SetVarFromVariant( const varName : AnsiString; const value : Variant ); var obj : PPyObject; diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index f313d041..b0aeb6d0 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -42,7 +42,7 @@ interface uses - Variants, PythonEngine; + Variants, System.AnsiStrings, PythonEngine; type TSequenceType = (stTuple, stList); @@ -145,7 +145,7 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) function VarDataToPythonObject( AVarData : TVarData ) : PPyObject; procedure PythonObjectToVarData( var Dest : TVarData; AObject : PPyObject; APythonAtomCompatible : Boolean ); procedure PyhonVarDataCreate( var Dest : TVarData; AObject : PPyObject ); - {$IFNDEF USESYSTEMDISPINVOKE} + {$IFNDEF USESYSTEMDISPINVOKE} procedure DoDispInvoke(Dest: PVarData; const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); virtual; function GetPropertyWithArg(var Dest: TVarData; const V: TVarData; @@ -182,8 +182,8 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) const AName: string): Boolean; override; function SetProperty(const V: TVarData; const AName: string; const Value: TVarData): Boolean; override; - procedure DispInvoke(Dest: PVarData; const Source: TVarData; - CallDesc: PCallDesc; Params: Pointer); override; + procedure DispInvoke(Dest: PVarData; [Ref] const Source: TVarData; + CallDesc: PCallDesc; Params: Pointer); override; end; var @@ -932,9 +932,9 @@ procedure SetClearVarToEmptyParam(var V: TVarData); CPropertySet = $04; {$IFDEF USESYSTEMDISPINVOKE} -procedure TPythonVariantType.DispInvoke(Dest: PVarData; - const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); -{$IFDEF DELPHIXE2_OR_HIGHER} +procedure TPythonVariantType.DispInvoke(Dest: PVarData; [Ref] const Source: TVarData; + CallDesc: PCallDesc; Params: Pointer); +{$IFDEF DELPHIXE2} // Modified to correct memory leak QC102387 procedure PatchedDispInvoke(Dest: PVarData; const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); @@ -1029,7 +1029,7 @@ TStringDesc = record for I := Low(VarParams) to High(VarParams) do VarDataClear(VarParams[I]); end; -{$ENDIF DELPHIXE2_OR_HIGHER} +{$ENDIF DELPHIXE2} procedure GetNamedParams; var @@ -1042,7 +1042,7 @@ TStringDesc = record SetLength(fNamedParams, CallDesc^.NamedArgCount); // Skip function Name for I := 0 to CallDesc^.NamedArgCount - 1 do begin - LNamePtr := LNamePtr + Succ(StrLen(LNamePtr)); + LNamePtr := LNamePtr + Succ(System.AnsiStrings.StrLen(LNamePtr)); fNamedParams[I].Index := I+LNamedArgStart; fNamedParams[I].Name := AnsiString(LNamePtr); end; @@ -1056,17 +1056,17 @@ TStringDesc = record if (CallDesc^.CallType = CPropertyGet) and (CallDesc^.ArgCount = 1) then begin NewCallDesc := CallDesc^; NewCallDesc.CallType := CDoMethod; - {$IFDEF DELPHIXE2_OR_HIGHER} + {$IFDEF DELPHIXE2} PatchedDispInvoke(Dest, Source, @NewCallDesc, Params); - {$ELSE DELPHIXE2_OR_HIGHER} + {$ELSE DELPHIXE2} inherited DispInvoke(Dest, Source, @NewCallDesc, Params); - {$ENDIF DELPHIXE2_OR_HIGHER} + {$ENDIF DELPHIXE2} end else - {$IFDEF DELPHIXE2_OR_HIGHER} + {$IFDEF DELPHIXE2} PatchedDispInvoke(Dest, Source, CallDesc, Params); - {$ELSE DELPHIXE2_OR_HIGHER} + {$ELSE DELPHIXE2} inherited; - {$ENDIF DELPHIXE2_OR_HIGHER} + {$ENDIF DELPHIXE2} finally if CallDesc^.NamedArgCount > 0 then SetLength(fNamedParams, 0); end; @@ -2186,10 +2186,10 @@ function TPythonData.Equal(const Right: TPythonData): Boolean; function TPythonData.GetAsAnsiString: AnsiString; begin - if Assigned(PyObject) and GetPythonEngine.PyString_CheckExact(PyObject) then - Result := GetPythonEngine.PyString_AsString(PyObject) - else - result := GetAsString; + if Assigned(PyObject) and GetPythonEngine.PyString_CheckExact(PyObject) then + Result := GetPythonEngine.PyString_AsString(PyObject) + else + Result := AnsiString(GetAsString); end; function TPythonData.GetAsString: String; diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas index 5e632be7..947b21e2 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas @@ -1202,9 +1202,9 @@ constructor TContainerAccess.Create(AWrapper: TPyDelphiWrapper; AContainer: TObject); begin inherited Create; - Assert(Assigned(AWrapper)); + //DAV>>> Assert(Assigned(AWrapper)); Assert(Assigned(AContainer)); - Assert(AContainer.InheritsFrom(ExpectedContainerClass), Format('Class %s expects a container of class %s', [ClassName, ExpectedContainerClass.ClassName])); + //DAV>>> Assert(AContainer.InheritsFrom(ExpectedContainerClass), Format('Class %s expects a container of class %s', [ClassName, ExpectedContainerClass.ClassName])); fWrapper := AWrapper; fContainer := AContainer; end; @@ -1517,7 +1517,7 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; Finally call inherited which calls PyObject_GenericGetAttr *) var - Name: ShortString; + Name: String; {$IFNDEF FPC} Info: PMethodInfoHeader; {$ENDIF} @@ -1526,7 +1526,7 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; begin Result := nil; if GetPythonEngine.PyString_Check(Key) then - Name := ShortString(GetPythonEngine.PyString_AsDelphiString(Key)) + Name := GetPythonEngine.PyString_AsDelphiString(Key) else Name := ''; diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas index 8bd1932f..c2a9e78b 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas @@ -342,7 +342,7 @@ function TPyDelphiPersistent.Assign_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if PyArg_ParseTuple( args, 'O:Assign',@_obj ) <> 0 then + if PyArg_ParseTuple( args, PAnsiChar('O:Assign'), @_obj ) <> 0 then Result := Self.Assign(_obj) else Result := nil; @@ -365,7 +365,7 @@ function TPyDelphiPersistent.GetNamePath_Wrapper( with GetPythonEngine do begin // We adjust the transmitted self argument Adjust(@Self); - if PyArg_ParseTuple( args, ':GetNamePath' ) <> 0 then begin + if PyArg_ParseTuple( args, PAnsiChar(':GetNamePath') ) <> 0 then begin Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.GetNamePath))) end else Result := nil; @@ -376,12 +376,12 @@ class procedure TPyDelphiPersistent.RegisterMethods( PythonType: TPythonType); begin inherited; - PythonType.AddMethod('Assign', @TPyDelphiPersistent.Assign_Wrapper, - 'TPersistent.Assign(persistent)'#10 + - 'Assigns to this object the values of another TPersistent object'); - PythonType.AddMethod('GetNamePath', @TPyDelphiPersistent.GetNamePath_Wrapper, - 'TPersistent.GetNamePath()'#10 + - 'Returns the name of the object as it appears in the Object Inspector.'); + PythonType.AddMethod(PAnsiChar('Assign'), @TPyDelphiPersistent.Assign_Wrapper, + PAnsiChar('TPersistent.Assign(persistent)'#10 + + 'Assigns to this object the values of another TPersistent object')); + PythonType.AddMethod(PAnsiChar('GetNamePath'), @TPyDelphiPersistent.GetNamePath_Wrapper, + PAnsiChar('TPersistent.GetNamePath()'#10 + + 'Returns the name of the object as it appears in the Object Inspector.')); end; procedure TPyDelphiPersistent.SetDelphiObject(const Value: TPersistent); @@ -459,7 +459,7 @@ function TPyDelphiCollection.Add_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, ':Add' ) <> 0 then + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar(':Add') ) <> 0 then Result := Wrap(DelphiObject.Add) else Result := nil; @@ -470,7 +470,7 @@ function TPyDelphiCollection.BeginUpdate_Wrapper( begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, ':BeginUpdate' ) <> 0 then begin + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar(':BeginUpdate') ) <> 0 then begin DelphiObject.BeginUpdate; Result := GetPythonEngine.ReturnNone; end else @@ -481,7 +481,7 @@ function TPyDelphiCollection.Clear_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, ':Clear') <> 0 then begin + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar(':Clear')) <> 0 then begin (DelphiObject as TCollection).Clear; Result := GetPythonEngine.ReturnNone; end else @@ -494,7 +494,7 @@ function TPyDelphiCollection.Delete_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, 'i:Delete',@Index ) <> 0 then + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar('i:Delete'),@Index ) <> 0 then begin if not CheckIndex(Index, DelphiObject.Count) then Result := nil @@ -517,7 +517,7 @@ function TPyDelphiCollection.EndUpdate_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, ':EndUpdate') <> 0 then begin + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar(':EndUpdate')) <> 0 then begin DelphiObject.EndUpdate; Result := GetPythonEngine.ReturnNone; end else @@ -566,7 +566,7 @@ function TPyDelphiCollection.Insert_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, 'i:Insert',@Index ) <> 0 then + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar('i:Insert'),@Index ) <> 0 then Result := Wrap(DelphiObject.Insert(Index)) else Result := nil; @@ -577,12 +577,12 @@ class procedure TPyDelphiCollection.RegisterGetSets(PythonType: TPythonType); inherited; with PythonType do begin - AddGetSet('Count', @TPyDelphiCollection.Get_Count, nil, - 'Returns the count of collection items', nil); - AddGetSet('Items', @TPyDelphiCollection.Get_Items, nil, - 'Returns an iterator over the collection items', nil); - AddGetSet('Owner', @TPyDelphiCollection.Get_Owner, nil, - 'Returns the Owner of the collection', nil); + AddGetSet(PAnsiChar('Count'), @TPyDelphiCollection.Get_Count, nil, + PAnsiChar('Returns the count of collection items'), nil); + AddGetSet(PAnsiChar('Items'), @TPyDelphiCollection.Get_Items, nil, + PAnsiChar('Returns an iterator over the collection items'), nil); + AddGetSet(PAnsiChar('Owner'), @TPyDelphiCollection.Get_Owner, nil, + PAnsiChar('Returns the Owner of the collection'), nil); end; end; @@ -590,24 +590,24 @@ class procedure TPyDelphiCollection.RegisterMethods( PythonType: TPythonType); begin inherited; - PythonType.AddMethod('Insert', @TPyDelphiCollection.Insert_Wrapper, - 'TCollection.Insert(Index)'#10 + - 'Inserts a new collection item to the collection at the Index position'); - PythonType.AddMethod('Add', @TPyDelphiCollection.Add_Wrapper, - 'TCollection.Add()'#10 + - 'Adds a collection item to the collection'); - PythonType.AddMethod('Clear', @TPyDelphiCollection.Clear_Wrapper, - 'TCollection.Clear()'#10 + - 'Clears all collection items'); - PythonType.AddMethod('Delete', @TPyDelphiCollection.Delete_Wrapper, - 'TCollection.Delete(Index)'#10 + - 'Deletes a single item from the collection.'); - PythonType.AddMethod('BeginUpdate', @TPyDelphiCollection.BeginUpdate_Wrapper, - 'TCollection.BeginUpdate()'#10 + - 'Suspends screen repainting.'); - PythonType.AddMethod('EndUpdate', @TPyDelphiCollection.EndUpdate_Wrapper, - 'TCollection.EndUpdate()'#10 + - 'Re-enables screen repainting.'); + PythonType.AddMethod(PAnsiChar('Insert'), @TPyDelphiCollection.Insert_Wrapper, + PAnsiChar('TCollection.Insert(Index)'#10 + + 'Inserts a new collection item to the collection at the Index position')); + PythonType.AddMethod(PAnsiChar('Add'), @TPyDelphiCollection.Add_Wrapper, + PAnsiChar('TCollection.Add()'#10 + + 'Adds a collection item to the collection')); + PythonType.AddMethod(PAnsiChar('Clear'), @TPyDelphiCollection.Clear_Wrapper, + PAnsiChar('TCollection.Clear()'#10 + + 'Clears all collection items')); + PythonType.AddMethod(PAnsiChar('Delete'), @TPyDelphiCollection.Delete_Wrapper, + PAnsiChar('TCollection.Delete(Index)'#10 + + 'Deletes a single item from the collection.')); + PythonType.AddMethod(PAnsiChar('BeginUpdate'), @TPyDelphiCollection.BeginUpdate_Wrapper, + PAnsiChar('TCollection.BeginUpdate()'#10 + + 'Suspends screen repainting.')); + PythonType.AddMethod(PAnsiChar('EndUpdate'), @TPyDelphiCollection.EndUpdate_Wrapper, + PAnsiChar('TCollection.EndUpdate()'#10 + + 'Re-enables screen repainting.')); end; procedure TPyDelphiCollection.SetDelphiObject(const Value: TCollection); @@ -736,7 +736,7 @@ function TPyDelphiComponent.BindMethodsToEvents(args: PPyObject): PPyObject; Adjust(@Self); Result := nil; s := nil; - if PyArg_ParseTuple( args, '|O:BindMethodsToEvents',@s ) <> 0 then + if PyArg_ParseTuple( args, PAnsiChar('|O:BindMethodsToEvents'),@s ) <> 0 then begin if Assigned(S) then _prefix := PyString_AsDelphiString(s); @@ -869,7 +869,7 @@ function TPyDelphiComponent.GetParentComponent_Wrapper( with GetPythonEngine do begin // We adjust the transmitted self argument Adjust(@Self); - if PyArg_ParseTuple( args, ':GetParentComponent') <> 0 then begin + if PyArg_ParseTuple( args, PAnsiChar(':GetParentComponent')) <> 0 then begin Result := Wrap(DelphiObject.GetParentComponent) end else Result := nil; @@ -881,7 +881,7 @@ function TPyDelphiComponent.HasParent_Wrapper(args: PPyObject): PPyObject; with GetPythonEngine do begin // We adjust the transmitted self argument Adjust(@Self); - if PyArg_ParseTuple( args, ':HasParent') <> 0 then begin + if PyArg_ParseTuple( args, PAnsiChar(':HasParent')) <> 0 then begin Result := VariantAsPyObject(DelphiObject.HasParent) end else Result := nil; @@ -926,12 +926,12 @@ class procedure TPyDelphiComponent.RegisterGetSets( inherited; with PythonType do begin - AddGetSet('ComponentCount', @TPyDelphiComponent.Get_ComponentCount, nil, - 'Returns the owned component count', nil); - AddGetSet('Owner', @TPyDelphiComponent.Get_Owner, nil, - 'Returns the Component Owner', nil); - AddGetSet('Components', @TPyDelphiComponent.Get_Components, nil, - 'Returns an iterator over the owned components', nil); + AddGetSet(PAnsiChar('ComponentCount'), @TPyDelphiComponent.Get_ComponentCount, nil, + PAnsiChar('Returns the owned component count'), nil); + AddGetSet(PAnsiChar('Owner'), @TPyDelphiComponent.Get_Owner, nil, + PAnsiChar('Returns the Component Owner'), nil); + AddGetSet(PAnsiChar('Components'), @TPyDelphiComponent.Get_Components, nil, + PAnsiChar('Returns an iterator over the owned components'), nil); end; end; @@ -939,18 +939,18 @@ class procedure TPyDelphiComponent.RegisterMethods( PythonType: TPythonType); begin inherited; - PythonType.AddMethod('GetParentComponent', @TPyDelphiComponent.GetParentComponent_Wrapper, - 'TComponent.GetParentComponent()'#10 + - 'Returns the parent of a component.'); - PythonType.AddMethod('HasParent', @TPyDelphiComponent.HasParent_Wrapper, - 'TComponent.HasParent()'#10 + - 'Indicates whether the component has a parent to handle its filing.'); - PythonType.AddMethod('BindMethodsToEvents', @TPyDelphiComponent.BindMethodsToEvents, - 'TComponent.BindMethodsToEvents(prefix)'#10 + + PythonType.AddMethod(PAnsiChar('GetParentComponent'), @TPyDelphiComponent.GetParentComponent_Wrapper, + PAnsiChar('TComponent.GetParentComponent()'#10 + + 'Returns the parent of a component.')); + PythonType.AddMethod(PAnsiChar('HasParent'), @TPyDelphiComponent.HasParent_Wrapper, + PAnsiChar('TComponent.HasParent()'#10 + + 'Indicates whether the component has a parent to handle its filing.')); + PythonType.AddMethod(PAnsiChar('BindMethodsToEvents'), @TPyDelphiComponent.BindMethodsToEvents, + PAnsiChar('TComponent.BindMethodsToEvents(prefix)'#10 + 'Connects methods to component events if they are named using the following patter: Prefix_ComponentName_EventName.'+#10+ 'Example: def handle_button1_OnClick(Sender): pass'+#10+ 'The function returns a list of tuples. Each tuple contains the name of the component, the name of the event and the method object assigned to the event.'+#10+ - 'Note that the prefix parameter is optional and will default to "handle_".'); + 'Note that the prefix parameter is optional and will default to "handle_".')); end; class procedure TPyDelphiComponent.SetupType(PythonType: TPythonType); @@ -993,7 +993,7 @@ function TPyDelphiComponent.MpSubscript(obj: PPyObject): PPyObject; else begin Result := nil; - PyErr_SetString (PyExc_KeyError^, 'Key must be a string'); + PyErr_SetString (PyExc_KeyError^, PAnsiChar('Key must be a string')); end; end; end; @@ -1028,7 +1028,7 @@ constructor TPyDelphiComponent.CreateWith(APythonType: TPythonType; _owner : TObject; begin inherited; - if APythonType.Engine.PyArg_ParseTuple( args, 'O:Create',@_obj ) <> 0 then + if APythonType.Engine.PyArg_ParseTuple( args, PAnsiChar('O:Create'),@_obj ) <> 0 then begin _owner := nil; if CheckObjAttribute(_obj, 'Owner', TComponent, _owner) then @@ -1096,7 +1096,7 @@ function TStringsAccess.SetItem(AIndex: Integer; AValue: PPyObject): Boolean; else begin Result := False; - PyErr_SetString (PyExc_AttributeError^, 'You can only assign strings to TStrings items'); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar('You can only assign strings to TStrings items')); end; end end; @@ -1160,7 +1160,7 @@ function TStringsObjectsAccess.SetItem(AIndex: Integer; AValue: PPyObject): Bool else begin Result := False; - PyErr_SetString (PyExc_AttributeError^, 'You can only assign Delphi wrappers to Objects items'); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar('You can only assign Delphi wrappers to Objects items')); end; end end; @@ -1176,7 +1176,7 @@ function TPyDelphiStrings.AddObject_Wrapper(args: PPyObject): PPyObject; // We adjust the transmitted self argument Adjust(@Self); with GetPythonEngine do - if PyArg_ParseTuple( args, 'OO:AddObject',@PStr, @_obj ) <> 0 then + if PyArg_ParseTuple( args, PAnsiChar('OO:AddObject'),@PStr, @_obj ) <> 0 then begin if CheckObjAttribute(_obj, 'The second argument of AddObject', TObject, _value) then Result := PyInt_FromLong(DelphiObject.AddObject(PyString_AsDelphiString(PStr), _value)) @@ -1236,7 +1236,7 @@ function TPyDelphiStrings.BeginUpdate_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, ':BeginUpdate') <> 0 then begin + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar(':BeginUpdate')) <> 0 then begin DelphiObject.BeginUpdate; Result := GetPythonEngine.ReturnNone; end else @@ -1247,7 +1247,7 @@ function TPyDelphiStrings.Clear_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, ':Clear') <> 0 then begin + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar(':Clear')) <> 0 then begin DelphiObject.Clear; Result := GetPythonEngine.ReturnNone; end else @@ -1260,7 +1260,7 @@ function TPyDelphiStrings.Delete_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, 'i:Delete',@Index ) <> 0 then + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar('i:Delete'),@Index ) <> 0 then begin if CheckIndex(Index, DelphiObject.Count) then begin @@ -1283,7 +1283,7 @@ function TPyDelphiStrings.EndUpdate_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, ':EndUpdate') <> 0 then begin + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar(':EndUpdate')) <> 0 then begin DelphiObject.EndUpdate; Result := GetPythonEngine.ReturnNone; end else @@ -1333,7 +1333,7 @@ function TPyDelphiStrings.IndexOf_Wrapper(args: PPyObject): PPyObject; // We adjust the transmitted self argument Adjust(@Self); with GetPythonEngine do - if PyArg_ParseTuple( args, 'O:IndexOf',@PStr ) <> 0 then + if PyArg_ParseTuple( args, PAnsiChar('O:IndexOf'),@PStr ) <> 0 then Result := GetPythonEngine.PyInt_FromLong(DelphiObject.IndexOf(PyString_AsDelphiString(PStr))) else Result := nil; @@ -1345,7 +1345,7 @@ function TPyDelphiStrings.LoadFromFile_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, 's:LoadFromFile',@PStr ) <> 0 then + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar('s:LoadFromFile'),@PStr ) <> 0 then begin DelphiObject.LoadFromFile(String(PStr)); Result := GetPythonEngine.ReturnNone; @@ -1383,7 +1383,7 @@ function TPyDelphiStrings.MpSubscript(obj: PPyObject): PPyObject; Result := nil; end; end else with GetPythonEngine do begin - PyErr_SetString (PyExc_KeyError^, ''); + PyErr_SetString (PyExc_KeyError^, ('')); Result := nil; end; end; @@ -1395,45 +1395,45 @@ class procedure TPyDelphiStrings.RegisterGetSets(PythonType: TPythonType); inherited; with PythonType do begin - AddGetSet('Capacity', @TPyDelphiStrings.Get_Capacity, @TPyDelphiStrings.Set_Capacity, - 'Indicates the number of strings the TStrings object can hold.', nil); - AddGetSet('Text', @TPyDelphiStrings.Get_Text, @TPyDelphiStrings.Set_Text, - 'Lists the strings in the TStrings object as a single string with the individual strings delimited by carriage returns and line feeds.', nil); - AddGetSet('Objects', @TPyDelphiStrings.Get_Objects, nil, - 'Represents a set of objects that are associated one with each of the strings in the Strings property.', nil); + AddGetSet(PAnsiChar('Capacity'), @TPyDelphiStrings.Get_Capacity, @TPyDelphiStrings.Set_Capacity, + PAnsiChar('Indicates the number of strings the TStrings object can hold.'), nil); + AddGetSet(PAnsiChar('Text'), @TPyDelphiStrings.Get_Text, @TPyDelphiStrings.Set_Text, + PAnsiChar('Lists the strings in the TStrings object as a single string with the individual strings delimited by carriage returns and line feeds.'), nil); + AddGetSet(PAnsiChar('Objects'), @TPyDelphiStrings.Get_Objects, nil, + PAnsiChar('Represents a set of objects that are associated one with each of the strings in the Strings property.'), nil); end; end; class procedure TPyDelphiStrings.RegisterMethods(PythonType: TPythonType); begin inherited; - PythonType.AddMethod('Add', @TPyDelphiStrings.Add_Wrapper, - 'TStrings.Add(s)'#10 + - 'Adds a string to the TStrings object and returns the index position'); - PythonType.AddMethod('AddObject', @TPyDelphiStrings.AddObject_Wrapper, - 'TStrings.AddObject(s, delphiobject)'#10 + - 'Adds a string and an associated Delphi object to the Strings and returns the index position'); - PythonType.AddMethod('Clear', @TPyDelphiStrings.Clear_Wrapper, - 'TStrings.Clear()'#10 + - 'Clears all strings from a TStrings (and the associated objects'); - PythonType.AddMethod('Delete', @TPyDelphiStrings.Delete_Wrapper, - 'TStrings.Delete(i)'#10 + - 'Deletes the string at Index i (and the associated object'); - PythonType.AddMethod('IndexOf', @TPyDelphiStrings.IndexOf_Wrapper, - 'TStrings.IndexOf(s)'#10 + - 'Returns the Index of a string s or -1 if not found'); - PythonType.AddMethod('BeginUpdate', @TPyDelphiStrings.BeginUpdate_Wrapper, - 'TStrings.BeginUpdate()'#10 + - 'Enables the TStrings object to track when the list of strings is changing.'); + PythonType.AddMethod(PAnsiChar('Add'), @TPyDelphiStrings.Add_Wrapper, + PAnsiChar('TStrings.Add(s)'#10 + + 'Adds a string to the TStrings object and returns the index position')); + PythonType.AddMethod(PAnsiChar('AddObject'), @TPyDelphiStrings.AddObject_Wrapper, + PAnsiChar('TStrings.AddObject(s, delphiobject)'#10 + + 'Adds a string and an associated Delphi object to the Strings and returns the index position')); + PythonType.AddMethod(PAnsiChar('Clear'), @TPyDelphiStrings.Clear_Wrapper, + PAnsiChar('TStrings.Clear()'#10 + + 'Clears all strings from a TStrings (and the associated objects')); + PythonType.AddMethod(PAnsiChar('Delete'), @TPyDelphiStrings.Delete_Wrapper, + PAnsiChar('TStrings.Delete(i)'#10 + + 'Deletes the string at Index i (and the associated object')); + PythonType.AddMethod(PAnsiChar('IndexOf'), @TPyDelphiStrings.IndexOf_Wrapper, + PAnsiChar('TStrings.IndexOf(s)'#10 + + 'Returns the Index of a string s or -1 if not found')); + PythonType.AddMethod(PAnsiChar('BeginUpdate'), @TPyDelphiStrings.BeginUpdate_Wrapper, + PAnsiChar('TStrings.BeginUpdate()'#10 + + 'Enables the TStrings object to track when the list of strings is changing.')); PythonType.AddMethod('EndUpdate', @TPyDelphiStrings.EndUpdate_Wrapper, - 'TStrings.EndUpdate()'#10 + - 'Enables the TStrings object to keep track of when the list of strings has finished changing.'); - PythonType.AddMethod('LoadFromFile', @TPyDelphiStrings.LoadFromFile_Wrapper, - 'TStrings.LoadFromFile(filename)'#10 + - 'Fills the list with the lines of text in a specified file.'); - PythonType.AddMethod('SaveToFile', @TPyDelphiStrings.SaveToFile_Wrapper, - 'TStrings.SaveToFile(filename)'#10 + - 'Saves the strings in the list to the specified file.'); + PAnsiChar('TStrings.EndUpdate()'#10 + + 'Enables the TStrings object to keep track of when the list of strings has finished changing.')); + PythonType.AddMethod(PAnsiChar('LoadFromFile'), @TPyDelphiStrings.LoadFromFile_Wrapper, + PAnsiChar('TStrings.LoadFromFile(filename)'#10 + + 'Fills the list with the lines of text in a specified file.')); + PythonType.AddMethod(PAnsiChar('SaveToFile'), @TPyDelphiStrings.SaveToFile_Wrapper, + PAnsiChar('TStrings.SaveToFile(filename)'#10 + + 'Saves the strings in the list to the specified file.')); end; function TPyDelphiStrings.Repr: PPyObject; @@ -1449,7 +1449,7 @@ function TPyDelphiStrings.SaveToFile_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, 's:SaveToFile',@PStr ) <> 0 then + if GetPythonEngine.PyArg_ParseTuple( args, PAnsiChar('s:SaveToFile'),@PStr ) <> 0 then begin DelphiObject.SaveToFile(String(PStr)); Result := GetPythonEngine.ReturnNone; @@ -1481,7 +1481,7 @@ function TPyDelphiBasicAction.Execute_Wrapper(args: PPyObject): PPyObject; with GetPythonEngine do begin // We adjust the transmitted self argument Adjust(@Self); - if PyArg_ParseTuple( args, ':Execute') <> 0 then begin + if PyArg_ParseTuple( args, PAnsiChar(':Execute')) <> 0 then begin Result := VariantAsPyObject( DelphiObject.Execute ); end else Result := nil; @@ -1507,8 +1507,8 @@ class procedure TPyDelphiBasicAction.RegisterGetSets( inherited; with PythonType do begin - AddGetSet('ActionComponent', @TPyDelphiBasicAction.Get_ActionComponent, @TPyDelphiBasicAction.Set_ActionComponent, - 'Indicates the client component that caused this action to execute.', nil); + AddGetSet(PAnsiChar('ActionComponent'), @TPyDelphiBasicAction.Get_ActionComponent, @TPyDelphiBasicAction.Set_ActionComponent, + PAnsiChar('Indicates the client component that caused this action to execute.'), nil); end; end; @@ -1516,12 +1516,12 @@ class procedure TPyDelphiBasicAction.RegisterMethods( PythonType: TPythonType); begin inherited; - PythonType.AddMethod('Execute', @TPyDelphiBasicAction.Execute_Wrapper, - 'TBasicAction.Execute()'#10 + - 'Generates an OnExecute event.'); - PythonType.AddMethod('Update', @TPyDelphiBasicAction.Update_Wrapper, - 'TBasicAction.Update()'#10 + - 'Provides an opportunity to execute centralized code when an application is idle.'); + PythonType.AddMethod(PAnsiChar('Execute'), @TPyDelphiBasicAction.Execute_Wrapper, + PAnsiChar('TBasicAction.Execute()'#10 + + 'Generates an OnExecute event.')); + PythonType.AddMethod(PAnsiChar('Update'), @TPyDelphiBasicAction.Update_Wrapper, + PAnsiChar('TBasicAction.Update()'#10 + + 'Provides an opportunity to execute centralized code when an application is idle.')); end; procedure TPyDelphiBasicAction.SetDelphiObject(const Value: TBasicAction); @@ -1551,7 +1551,7 @@ function TPyDelphiBasicAction.Update_Wrapper(args: PPyObject): PPyObject; with GetPythonEngine do begin // We adjust the transmitted self argument Adjust(@Self); - if PyArg_ParseTuple( args, ':Update') <> 0 then begin + if PyArg_ParseTuple( args, PAnsiChar(':Update')) <> 0 then begin Result := VariantAsPyObject( DelphiObject.Update ); end else Result := nil; @@ -1593,5 +1593,6 @@ function TPyDelphiStrings.Set_Text(AValue: PPyObject; end; initialization - RegisteredUnits.Add(TClassesRegistration.Create); + RegisteredUnits.Add(TClassesRegistration.Create); + end. diff --git a/PythonForDelphi/Demos/Demo01/Project1.conf b/PythonForDelphi/Demos/Demo01/Project1.conf deleted file mode 100644 index 84e6d103..00000000 --- a/PythonForDelphi/Demos/Demo01/Project1.conf +++ /dev/null @@ -1,32 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J- --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W- --$X+ --$YD --$Z1 --cg --H+ --W+ --M --$M16384,1048576 --K$00400000 diff --git a/PythonForDelphi/Demos/Demo01/Project1.dof b/PythonForDelphi/Demos/Demo01/Project1.dof deleted file mode 100644 index 4a7631b0..00000000 --- a/PythonForDelphi/Demos/Demo01/Project1.dof +++ /dev/null @@ -1,136 +0,0 @@ -[FileVersion] -Version=7.0 -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -NamespacePrefix= -SymbolDeprecated=1 -SymbolLibrary=1 -SymbolPlatform=1 -UnitLibrary=1 -UnitPlatform=1 -UnitDeprecated=1 -HResultCompat=1 -HidingMember=1 -HiddenVirtual=1 -Garbage=1 -BoundsError=1 -ZeroNilCompat=1 -StringConstTruncated=1 -ForLoopVarVarPar=1 -TypedConstVarPar=1 -AsgToTypedConst=1 -CaseLabelRange=1 -ForVariable=1 -ConstructingAbstract=1 -ComparisonFalse=1 -ComparisonTrue=1 -ComparingSignedUnsigned=1 -CombiningSignedUnsigned=1 -UnsupportedConstruct=1 -FileOpen=1 -FileOpenUnitSrc=1 -BadGlobalSymbol=1 -DuplicateConstructorDestructor=1 -InvalidDirective=1 -PackageNoLink=1 -PackageThreadVar=1 -ImplicitImport=1 -HPPEMITIgnored=1 -NoRetVal=1 -UseBeforeDef=1 -ForLoopVarUndef=1 -UnitNameMismatch=1 -NoCFGFileFound=1 -MessageDirective=1 -ImplicitVariants=1 -UnicodeToLocale=1 -LocaleToUnicode=1 -ImagebaseMultiple=1 -SuspiciousTypecast=1 -PrivatePropAccessor=1 -UnsafeType=0 -UnsafeCode=0 -UnsafeCast=0 -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;Indy50;VM;rbCIDE55;rbIDE55;rbRCL55;rbBDE55;rbDBDE55;rbDAD55;rbDIDE55;rbUSER55;rbDB55;rbADO55;rbIBE55;VMREPORTBUILDER -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang=$00000409 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= diff --git a/PythonForDelphi/Demos/Demo01/Project1.dpr b/PythonForDelphi/Demos/Demo01/Project1.dpr index 34e6006c..66f3bb8a 100644 --- a/PythonForDelphi/Demos/Demo01/Project1.dpr +++ b/PythonForDelphi/Demos/Demo01/Project1.dpr @@ -1,7 +1,5 @@ program Project1; -{$I Definition.Inc} - uses {$IFDEF MSWINDOWS} Forms, diff --git a/PythonForDelphi/Demos/Demo01/Project1.dproj b/PythonForDelphi/Demos/Demo01/Project1.dproj index 359c290a..4b8f8ef6 100644 --- a/PythonForDelphi/Demos/Demo01/Project1.dproj +++ b/PythonForDelphi/Demos/Demo01/Project1.dproj @@ -4,11 +4,11 @@ Project1.dpr Debug DCC32 - 16.1 + 18.3 VCL True Win64 - 3 + 2 Application @@ -34,6 +34,12 @@ Base true + + true + Cfg_2 + true + true + true Cfg_2 @@ -48,6 +54,8 @@ Project1.exe 00400000 x86 + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + .\$(Platform)\$(Config) true @@ -55,12 +63,18 @@ System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 1033 $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png true $(BDS)\bin\default_app.manifest System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) Project1_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png false @@ -71,9 +85,14 @@ DEBUG;$(DCC_Define) + + Debug + $(BDS)\bin\delphi_PROJECTICON.ico true + Debug + true @@ -136,12 +155,14 @@ - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) - True + False True diff --git a/PythonForDelphi/Demos/Demo01/Project1.kof b/PythonForDelphi/Demos/Demo01/Project1.kof deleted file mode 100644 index 6ad26fc6..00000000 --- a/PythonForDelphi/Demos/Demo01/Project1.kof +++ /dev/null @@ -1,61 +0,0 @@ -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=0 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases= - -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -DynamicLoader=/lib/ld-linux.so.2 - -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages= -Conditionals= -DebugSourceDirs= -UsePackages=0 - -[Parameters] -RunParams= -HostApplication= -Launcher=/usr/X11R6/bin/xterm -T KylixDebuggerOutput -e bash -i -c %debuggee% -UseLauncher=0 -DebugCWD= - diff --git a/PythonForDelphi/Demos/Demo01/Project1.res b/PythonForDelphi/Demos/Demo01/Project1.res index 3f7606cf84212f64c91ed3383d42f7b5a779a10f..bdc8ee3e2202929e8c09bcd1ac8328fac32cff6f 100644 GIT binary patch literal 59024 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 HIA{L?RFob; diff --git a/PythonForDelphi/Demos/Demo01/Unit1.dfm b/PythonForDelphi/Demos/Demo01/Unit1.dfm index dd29a57825d05718dde83a839b8d2177c191b58e..1d5d09501e426cf45497d8e35974644c1524fd50 100644 GIT binary patch delta 108 zcmX@g{eYYIKNmxYn}3k6A%lUyg^j$g85uh!|729;CWSA_;B0JfM zNtRJ%a{`kn6T1d;NPYp6#^f@VGL9PzV2;4#cPy1028>WnCTlnk^9+cT0|NsC0DtZr A0{{R3 delta 81 zcmV-X0IvVw3&jf!{|W$9Mo&^rF#s?SwXqHB0Rf4V`2isd32<_0Zge0rD>49+8w4Gb nL;@WFC9`4z6#@YulYRtt02b=NCWk^Zs!`+#8&q2H@!Noee-7_Kr~86LK2Z#kzMw zM#}mPtXQPhXJB8_p_*78L~jTkPn7kk^5lX@6(v$I*2dC5$9znzAE41n6rGcf;7T7k zPJ5=5;DOV@siK0TM_n=%o)~%IjhYBNPGo&h+IPNIDz>?xCM$G3(-7r!IM(VP71_W-1CE+R; ztTsZrAS?@s?DJ#-Ke{=&WHxGfQMdqYP>Z9KQKg8i-EV@zF=!0C+cFGVs56t9erh$5 z7sVyJ#pswjHfGvm0POfwJ7ed|hSrxYE$bU7?^ZGEFslE*aY8xC{76a4$5{o{QoT`L z^H~$P%N}J8%CfdllWL5w269LwtN?)G5Ocy%v2KvxRvxw;K3{>gkP=h3P3D9RX4(n| zUCqw~Co6RToY?gLJ_g1ll&1<-jXKQAOu?tCkQ^^aqBXrNku+6niq3%R7bn-wei^Ky z+5$CAe!mv&Sdu>MAe{(2EHS?CuSk`Lq~>nY3qz__Hs17p2Pwky`v+~1;6u`jlC&NP z^B@y1xSa?cxb-ysv*!?iMr@|*4l0qhT)1Ecc#UBA!MnbMKaYndkxfO - - {C2FA2A8D-7DA4-4631-B05E-4C16A0FC8F3B} - Project1.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) - Project1.exe - 00400000 - x86 - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - - + + + {C2FA2A8D-7DA4-4631-B05E-4C16A0FC8F3B} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Project1.exe + 00400000 + x86 + Project1 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + .\$(Platform)\$(Config) + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + Project1_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + true + true + + + DEBUG;$(DCC_Define) + + + Debug + + + true + true + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo02/Project1.kof b/PythonForDelphi/Demos/Demo02/Project1.kof deleted file mode 100644 index 6ad26fc6..00000000 --- a/PythonForDelphi/Demos/Demo02/Project1.kof +++ /dev/null @@ -1,61 +0,0 @@ -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=0 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases= - -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -DynamicLoader=/lib/ld-linux.so.2 - -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages= -Conditionals= -DebugSourceDirs= -UsePackages=0 - -[Parameters] -RunParams= -HostApplication= -Launcher=/usr/X11R6/bin/xterm -T KylixDebuggerOutput -e bash -i -c %debuggee% -UseLauncher=0 -DebugCWD= - diff --git a/PythonForDelphi/Demos/Demo02/Project1.res b/PythonForDelphi/Demos/Demo02/Project1.res index 55f874204136d6cde31b105890029f4503c878e3..8bbe6f058ab26061a3048e31889c375df580bcfd 100644 GIT binary patch literal 3212 zcmbtX&2HO95FW*bRRu_6qdlaTh821!3Q#0P>d%qw8cAFTjguf&-D6FWOPjSssw5@F zFpB!*OMt#YA0j|vKq%l-pCgAJdTWk31Yy5jQk3Mz4UkYCa_9G(8P1Y45s?IncL%fIra>=88M02T243Rx@$cJH5*r;TXN)3>K9C${nRDkcq{tkRXvP7Id z;<@nk1k6LoeEJD`3vx}!RQhPfcNe+<-cuiqN1raeJ*BxF>jt>4tI@bHR;r}vqWEt zyV4dFdFVhFmb1MpEdI6lcQzjj*?cT7Pv_$+U`U{EKsgZ)3;4YKI3dCxotz{WoUsI* z(E0f}6nseeB~C6lCv(e%$+5DsJXwnC|MLqwXZ>08DW4bODSxaIjfnG!L;fi(s9WHN zln7w(%;CI~xaOZOjZX!?ml_PmXM#@+M&t1~;r9eqKI0w1FCC7bB>IGRoHU*z0`wi{ zFu`*i9ss-}_`_4dFJ=6*IsW+YY|j38JU*TE2Y<$SO8p;?&&Hx6@Hyl&dh+Z^4eI=o zvzPlsf4*|#)OpJ70SG~;EuHS&LbF6dd$|>eDSVzdz=B&*{uXbE$QV(vTo48VQX~fv zjy!EaE5Os9LO2qt|D59Ue4NqCn{f=<0DVsR_&3VMe`0E05dHd+Xd|VY;5l7Czl6AM zLh#9h7G4pVuZdp0q1@~EWZ_Nx;(E-FPl@nM;G_95ZPTWB_O-Ug72an{k}wEuf*|P;5t4%WuS+CPQk`TZP*NTI{TMexP)-yx7=URau`c5QUes9$b zd!?aPlzOJ;IxLKK=g@>Zw;Ag145Al-EJ?tI^{UzLcU{Yjkoh{KnSA7Wwm%AYSQMd( zaFXCb6!ljXCC#yvZa0-ol7K5o zRu|B@e=}9hCM@c(S)X|}`hAoZFcCzXX?HXDNxNGxkKE`;VDh4)qdsm6Q1x;#6MAM3 z!tKdzD5X`EZu`BS@5#4)FADr_ICaP-pjuM-Z>s4JI_UCu?5OP@GK@&I(x`N*hGrO+ zS}RFi z&aV~Cu;mTWlVDn`Bn{k6i`TnWbj)tZrmD1DF{Vm}aWR9YGMjBv$%^JX4s+Vaw0GPt zs(E)8=FIs9T$iq0Ei`9`kP8aUFJ!rWz@*k4sl&SdNWu=_+lqw}Y^89}@B2X{Ies9e zV(y7;3p(aT>bGq2IIc`sK)mS$4{Grppz* z(~u3r(BzKUuw=X1unp5Nt4yzd2y#ig99wg$wW?LC%5{}#vQgF>GB#;PuIskyRBhEZ zYafEGsh307nd;O`tt@w(j*f=2x{UT$WTWob71h)#W xCT|un;=v#c9xA8@vz7J>qkKmt#{{k77C#V1b delta 17 YcmeB?e8V`NC%4#_WI JvS46f004Ft3)lbv delta 55 zcmcb?^^lAAKNmxYn}3k6A%lTH;6`3ECVp<$ih`WX5-Xeig7c#Ra3#;u3$oX`>7U5ZzfXA`N;3<%Yi*WDND#w)y*f% zhV`1M&hd<(##!8qG0&SZk#uZtMpUI!&mU)(SW> z<)yjgwi%sp&&5o841k-QX=mJG+0y#CtM#S4TE(o(sQ&%NDdi*&VkIe`YBejqcGrvO?gbnA~0}ov<&IKoH zbpX7?HvYc<)*V#11FO~?n3rLKFIMSzda}T5jumO^MLjtccvND7AXt+s4@s@ZNynB{H8ZjzeRzZv9{0qhQU6_ z1`FCM%+bRnm^`(>`gIV1Mq+30gimyA8k!3||K$#{70P(Bq!# z0d{^n{sozol}=g^!okoxuqtog4+cD&E1e6ymZ53_P)~*#;XR6(nAF$X(C?8ko-=i_ zRA}!o$Zk=eG94*&Wc8Y3%1C}!oZJ-yxT@7s-L)B8)rW3E6(eY`5Vwu_4hnAJeaT&K i|3B9=J#Oa~{Y#?{N|(1SdE6&t{qk(Lj0Sw8HU0tWiob&Z diff --git a/PythonForDelphi/Demos/Demo03/Project1.conf b/PythonForDelphi/Demos/Demo03/Project1.conf deleted file mode 100644 index 84e6d103..00000000 --- a/PythonForDelphi/Demos/Demo03/Project1.conf +++ /dev/null @@ -1,32 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J- --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W- --$X+ --$YD --$Z1 --cg --H+ --W+ --M --$M16384,1048576 --K$00400000 diff --git a/PythonForDelphi/Demos/Demo03/Project1.dof b/PythonForDelphi/Demos/Demo03/Project1.dof deleted file mode 100644 index 9cccf462..00000000 --- a/PythonForDelphi/Demos/Demo03/Project1.dof +++ /dev/null @@ -1,87 +0,0 @@ -[Compiler] -A=1 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;Indy50;VM;rbCIDE55;rbIDE55;rbRCL55;rbBDE55;rbDBDE55;rbDAD55;rbDIDE55;rbUSER55;rbDB55;rbADO55;rbIBE55;VMREPORTBUILDER -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -[Language] -ActiveLang= -ProjectLang=$00000409 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= -[Excluded Packages] -D:\projects\Source\ThirdParty\ReportBuilder\dclRBC51.bpl=ReportBuilder TeeChart 4.0 Components -$(DELPHI)\Bin\dcldss50.bpl=Borland Decision Cube Components -$(DELPHI)\Bin\dcltee50.bpl=TeeChart Components -$(DELPHI)\Bin\dcltqr50.bpl=TeeChart for QuickReport Components diff --git a/PythonForDelphi/Demos/Demo03/Project1.dproj b/PythonForDelphi/Demos/Demo03/Project1.dproj index 5db58a3c..d8f14812 100644 --- a/PythonForDelphi/Demos/Demo03/Project1.dproj +++ b/PythonForDelphi/Demos/Demo03/Project1.dproj @@ -1,101 +1,207 @@ - - - {BA2F2117-1B8F-44C7-8610-DAB4F55DB2EC} - Project1.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) - Project1.exe - 00400000 - x86 - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - -
+ + + {BA2F2117-1B8F-44C7-8610-DAB4F55DB2EC} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Project1.exe + 00400000 + x86 + Project1 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + .\$(Platform)\$(Config) + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + Project1_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + true + true + + + DEBUG;$(DCC_Define) + + + Debug + + + true + true + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo03/Project1.kof b/PythonForDelphi/Demos/Demo03/Project1.kof deleted file mode 100644 index 6ad26fc6..00000000 --- a/PythonForDelphi/Demos/Demo03/Project1.kof +++ /dev/null @@ -1,61 +0,0 @@ -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=0 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases= - -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -DynamicLoader=/lib/ld-linux.so.2 - -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages= -Conditionals= -DebugSourceDirs= -UsePackages=0 - -[Parameters] -RunParams= -HostApplication= -Launcher=/usr/X11R6/bin/xterm -T KylixDebuggerOutput -e bash -i -c %debuggee% -UseLauncher=0 -DebugCWD= - diff --git a/PythonForDelphi/Demos/Demo03/Project1.res b/PythonForDelphi/Demos/Demo03/Project1.res index 6008d5821e597e0fc3131b0641383f58b0f097c5..9c86860d21b99d7fab2cfe5c634fa4371a887fd0 100644 GIT binary patch literal 3212 zcmbtX&rjP{9RD)VAk{j0*kL=>i*}eMIk6KbBq%^pX=yZQtCF$f=Gf2REwMA(fuL!E zokGf5Z+u?6%&ZYE|#^o*gHkGNkr}=jZqRe7-;4_kEvjh=?Tg zFpN5G&$o~I_ziGI1g21GEFpcQ;dYf)=m%Wy&?DSc=>grxyo&2x-1GLw*uQUyxPD}# zKh6o1h#Tx9v50OCE$XxmfxB8=9vpgqu0DFaXaPFUp^;769$z}2aV2p5Dc z1J;}1GF!xyRDH@??ACovM zVfcA+mWH3TmAOu{A#E_vw_Rr@t!9+8#2mvlZD(yJ{ax*@TuMuRpgX4Ca2+<2-eP`w zZua`MithWYS#NAfFyQzz>9*%g`^GwJ>b~5x4bSymE07JhIj#H6%!Znln!00K%nw%2 zc@yfKvys2jNInhEk_6viPwTB#!#4B)kVvytW@y9n0 zXGYsY#*$Qe?3XsmkeLrXd&6$9HRks*>{Wu^=|GVe*Am-cjU=^_)Zp`(wC-1(4dlcd zELM`*_PoK@JCnBbhR+62yj)SH*~G`i2rAj(Xe-%d(fq`rPFtwjjeKdQx0Q(yEO|f+Wj` z3i>gFnGaT^syUPXmE{yw)e2LxTF{EJmNyErUa**~C?%6ImN)a3@>@D9;&~tUQx zmkrr0mQ799^difbKE!iIz1+8I6{m{ER8cM|OqI1S1#j7uSq5LY@b7jiQ91qLr&4P*e rtgGNn7lzmHUAu(0U`>4gKf)WahS?)p#MgNZU-a?&aOnRC{z>>BvmS6x delta 50 xcmeB?e8V@GPueu=rMY&->(B^mj7hNgNcIXPU80iI#0Ma7x< zdCc#bxq?#Dp*%KbBfZJDS(MBbA*L$@fORPVO|eo?(ora`EY>T7Xk-(HC;Bf>nc2VRAZa8Pf)a$xm4;nJzF)PGgH_YG9armQ8Q6AiD^Q0|NsC0A*NKaR2}S diff --git a/PythonForDelphi/Demos/Demo04/Project1.dof b/PythonForDelphi/Demos/Demo04/Project1.dof deleted file mode 100644 index e3281697..00000000 --- a/PythonForDelphi/Demos/Demo04/Project1.dof +++ /dev/null @@ -1,92 +0,0 @@ -[FileVersion] -Version=6.0 -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;Indy50;VM;rbCIDE55;rbIDE55;rbRCL55;rbBDE55;rbDBDE55;rbDAD55;rbDIDE55;rbUSER55;rbDB55;rbADO55;rbIBE55;VMREPORTBUILDER -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang=$00000409 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= -[Excluded Packages] -D:\projects\Source\ThirdParty\ReportBuilder\dclRBC51.bpl=ReportBuilder TeeChart 4.0 Components -d:\program files\borland\delphi6\Bin\dcldss50.bpl=Borland Decision Cube Components -d:\program files\borland\delphi6\Bin\dcltee50.bpl=TeeChart Components -d:\program files\borland\delphi6\Bin\dcltqr50.bpl=TeeChart for QuickReport Components diff --git a/PythonForDelphi/Demos/Demo04/Project1.dpr b/PythonForDelphi/Demos/Demo04/Project1.dpr index 34e6006c..66f3bb8a 100644 --- a/PythonForDelphi/Demos/Demo04/Project1.dpr +++ b/PythonForDelphi/Demos/Demo04/Project1.dpr @@ -1,7 +1,5 @@ program Project1; -{$I Definition.Inc} - uses {$IFDEF MSWINDOWS} Forms, diff --git a/PythonForDelphi/Demos/Demo04/Project1.dproj b/PythonForDelphi/Demos/Demo04/Project1.dproj index 7f4466f1..8decde26 100644 --- a/PythonForDelphi/Demos/Demo04/Project1.dproj +++ b/PythonForDelphi/Demos/Demo04/Project1.dproj @@ -1,101 +1,209 @@ - - - {6F45452F-882D-4BBD-8AEA-872276E8B856} - Project1.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) - Project1.exe - 00400000 - x86 - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - -
+ + + {6F45452F-882D-4BBD-8AEA-872276E8B856} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Project1.exe + 00400000 + x86 + Project1 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + .\$(Platform)\$(Config) + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + Project1_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + true + true + + + DEBUG;$(DCC_Define) + + + Debug + + + true + true + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo04/Project1.res b/PythonForDelphi/Demos/Demo04/Project1.res index fdf1db32b6acc56b28b8e31b79866ee8d4e22e2d..9c86860d21b99d7fab2cfe5c634fa4371a887fd0 100644 GIT binary patch literal 3212 zcmbtX&rjP{9RD)VAk{j0*kL=>i*}eMIk6KbBq%^pX=yZQtCF$f=Gf2REwMA(fuL!E zokGf5Z+u?6%&ZYE|#^o*gHkGNkr}=jZqRe7-;4_kEvjh=?Tg zFpN5G&$o~I_ziGI1g21GEFpcQ;dYf)=m%Wy&?DSc=>grxyo&2x-1GLw*uQUyxPD}# zKh6o1h#Tx9v50OCE$XxmfxB8=9vpgqu0DFaXaPFUp^;769$z}2aV2p5Dc z1J;}1GF!xyRDH@??ACovM zVfcA+mWH3TmAOu{A#E_vw_Rr@t!9+8#2mvlZD(yJ{ax*@TuMuRpgX4Ca2+<2-eP`w zZua`MithWYS#NAfFyQzz>9*%g`^GwJ>b~5x4bSymE07JhIj#H6%!Znln!00K%nw%2 zc@yfKvys2jNInhEk_6viPwTB#!#4B)kVvytW@y9n0 zXGYsY#*$Qe?3XsmkeLrXd&6$9HRks*>{Wu^=|GVe*Am-cjU=^_)Zp`(wC-1(4dlcd zELM`*_PoK@JCnBbhR+62yj)SH*~G`i2rAj(Xe-%d(fq`rPFtwjjeKdQx0Q(yEO|f+Wj` z3i>gFnGaT^syUPXmE{yw)e2LxTF{EJmNyErUa**~C?%6ImN)a3@>@D9;&~tUQx zmkrr0mQ799^difbKE!iIz1+8I6{m{ER8cM|OqI1S1#j7uSq5LY@b7jiQ91qLr&4P*e rtgGNn7lzmHUAu(0U`>4gKf)WahS?)p#MgNZU-a?&aOnRC{z>>BvmS6x delta 50 xcmeB?e8Vm{6d)bKNmxYn}3k6A%lUyjfuR<=IqXi1tppJd2D870j1jNA}@cxFmT2D1Ru#OTY60+aO_H3WHGD++QllQT;oQW8v)!x@#i z1(?{NTGvl*WmM$QD=5m$D^bvxyp~aoQFHQTMoo2DsF0FhYPmvLVoqtQLT0g*l8!=2 zYH^7sn>|d20+TsVM>tathY?KZ6_b{|CYyAAQdVkmiC!33udRZ!hLT5WPENjpqLL=gCof@B>3j&n|CYF-JiPi9_fv0iXVQD$CxF(aE!0gzFm zFqw~8OrRvSxI`hd*h)c3M*+m1{E1OhRT`o|$uG5Bp)4_{G!>)*s({TFDmgijNquqx z6Cb0}q$}T<(leZ%Az3!`#jUbh-8sSp*8e$=}#C7!@|Fvd?2=YG9arnnO>N t&A+syptOXY)i*Ua--yL0HLZlnVe(&g<;lLB6Sx}~m_zalm=qWo7yxQTe#HO) diff --git a/PythonForDelphi/Demos/Demo04/Unit1.pas b/PythonForDelphi/Demos/Demo04/Unit1.pas index 291ed953..4ba12ae3 100644 --- a/PythonForDelphi/Demos/Demo04/Unit1.pas +++ b/PythonForDelphi/Demos/Demo04/Unit1.pas @@ -1,7 +1,5 @@ unit Unit1; -{$I Definition.Inc} - interface uses diff --git a/PythonForDelphi/Demos/Demo05/Project1.dof b/PythonForDelphi/Demos/Demo05/Project1.dof deleted file mode 100644 index e3281697..00000000 --- a/PythonForDelphi/Demos/Demo05/Project1.dof +++ /dev/null @@ -1,92 +0,0 @@ -[FileVersion] -Version=6.0 -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;Indy50;VM;rbCIDE55;rbIDE55;rbRCL55;rbBDE55;rbDBDE55;rbDAD55;rbDIDE55;rbUSER55;rbDB55;rbADO55;rbIBE55;VMREPORTBUILDER -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang=$00000409 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= -[Excluded Packages] -D:\projects\Source\ThirdParty\ReportBuilder\dclRBC51.bpl=ReportBuilder TeeChart 4.0 Components -d:\program files\borland\delphi6\Bin\dcldss50.bpl=Borland Decision Cube Components -d:\program files\borland\delphi6\Bin\dcltee50.bpl=TeeChart Components -d:\program files\borland\delphi6\Bin\dcltqr50.bpl=TeeChart for QuickReport Components diff --git a/PythonForDelphi/Demos/Demo05/Project1.dproj b/PythonForDelphi/Demos/Demo05/Project1.dproj index f12deaa7..cd961939 100644 --- a/PythonForDelphi/Demos/Demo05/Project1.dproj +++ b/PythonForDelphi/Demos/Demo05/Project1.dproj @@ -1,101 +1,209 @@ - - - {38ABBD9D-A0AD-422F-959B-062CAB828F37} - Project1.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) - Project1.exe - 00400000 - x86 - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - -
+ + + {38ABBD9D-A0AD-422F-959B-062CAB828F37} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Project1.exe + 00400000 + x86 + Project1 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + .\$(Platform)\$(Config) + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + Project1_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + true + true + + + DEBUG;$(DCC_Define) + + + Debug + + + true + true + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo05/Project1.res b/PythonForDelphi/Demos/Demo05/Project1.res index 6008d5821e597e0fc3131b0641383f58b0f097c5..9c86860d21b99d7fab2cfe5c634fa4371a887fd0 100644 GIT binary patch literal 3212 zcmbtX&rjP{9RD)VAk{j0*kL=>i*}eMIk6KbBq%^pX=yZQtCF$f=Gf2REwMA(fuL!E zokGf5Z+u?6%&ZYE|#^o*gHkGNkr}=jZqRe7-;4_kEvjh=?Tg zFpN5G&$o~I_ziGI1g21GEFpcQ;dYf)=m%Wy&?DSc=>grxyo&2x-1GLw*uQUyxPD}# zKh6o1h#Tx9v50OCE$XxmfxB8=9vpgqu0DFaXaPFUp^;769$z}2aV2p5Dc z1J;}1GF!xyRDH@??ACovM zVfcA+mWH3TmAOu{A#E_vw_Rr@t!9+8#2mvlZD(yJ{ax*@TuMuRpgX4Ca2+<2-eP`w zZua`MithWYS#NAfFyQzz>9*%g`^GwJ>b~5x4bSymE07JhIj#H6%!Znln!00K%nw%2 zc@yfKvys2jNInhEk_6viPwTB#!#4B)kVvytW@y9n0 zXGYsY#*$Qe?3XsmkeLrXd&6$9HRks*>{Wu^=|GVe*Am-cjU=^_)Zp`(wC-1(4dlcd zELM`*_PoK@JCnBbhR+62yj)SH*~G`i2rAj(Xe-%d(fq`rPFtwjjeKdQx0Q(yEO|f+Wj` z3i>gFnGaT^syUPXmE{yw)e2LxTF{EJmNyErUa**~C?%6ImN)a3@>@D9;&~tUQx zmkrr0mQ799^difbKE!iIz1+8I6{m{ER8cM|OqI1S1#j7uSq5LY@b7jiQ91qLr&4P*e rtgGNn7lzmHUAu(0U`>4gKf)WahS?)p#MgNZU-a?&aOnRC{z>>BvmS6x delta 50 xcmeB?e8VH%|FQ3kikHpa3ZggIlFUWK}lwQ9vh!aYHq$lewso+Wl2VU9*=WQ zW@=uEM`~tzMhSBOBR7N}o|#gT!7RWuG3qj-z+^o}4MASlih`WX~))H70Za`F|*^NVs))O8dLH78$UwBgcW zWQE$WS%PUgBhZQs%<8N{3_vjX9<$bD8x}=tWvEd~5Qi$bDCsB^R~GA)r4|(f zJ)_Ac3bPL=n4DiwSp@Qi=Hw|XnrzG=`2|c8llQVTax(v50P_?kJFsSPR4_uN*05%C zL)i=rq9KzPvWQGJU=uUt49&|-&QD48^ylOZN-Xy;Eh#81;b4Q%?5w`P05oFpNlhzZ Lo&Ygd1L$r577uMl delta 288 zcmZqVy~o4*pNk>H%|FQ3kikH}Zz8XfFl%^bN=XK@0u!4@YG!&y33EB)M16^gX_px# zCR;ITOfF_r=9YjeRR;*b}8yF_9Va;Y_m@LPpC&A`lT2fG2!VYl>i%)7=36lc@ G0|Nm6aaA+` diff --git a/PythonForDelphi/Demos/Demo06/Project1.dof b/PythonForDelphi/Demos/Demo06/Project1.dof deleted file mode 100644 index 911b28c0..00000000 --- a/PythonForDelphi/Demos/Demo06/Project1.dof +++ /dev/null @@ -1,136 +0,0 @@ -[FileVersion] -Version=7.0 -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=0 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -NamespacePrefix= -SymbolDeprecated=1 -SymbolLibrary=1 -SymbolPlatform=1 -UnitLibrary=1 -UnitPlatform=1 -UnitDeprecated=1 -HResultCompat=1 -HidingMember=1 -HiddenVirtual=1 -Garbage=1 -BoundsError=1 -ZeroNilCompat=1 -StringConstTruncated=1 -ForLoopVarVarPar=1 -TypedConstVarPar=1 -AsgToTypedConst=1 -CaseLabelRange=1 -ForVariable=1 -ConstructingAbstract=1 -ComparisonFalse=1 -ComparisonTrue=1 -ComparingSignedUnsigned=1 -CombiningSignedUnsigned=1 -UnsupportedConstruct=1 -FileOpen=1 -FileOpenUnitSrc=1 -BadGlobalSymbol=1 -DuplicateConstructorDestructor=1 -InvalidDirective=1 -PackageNoLink=1 -PackageThreadVar=1 -ImplicitImport=1 -HPPEMITIgnored=1 -NoRetVal=1 -UseBeforeDef=1 -ForLoopVarUndef=1 -UnitNameMismatch=1 -NoCFGFileFound=1 -MessageDirective=1 -ImplicitVariants=1 -UnicodeToLocale=1 -LocaleToUnicode=1 -ImagebaseMultiple=1 -SuspiciousTypecast=1 -PrivatePropAccessor=1 -UnsafeType=0 -UnsafeCode=0 -UnsafeCast=0 -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=dxBarD6;dxcomnd6;rtl;dxBarDBNavD6;dbrtl;dxBarExtItemsD6;dxBarExtDBItemsD6;dxsbD6;dxdbtrD6;dxtrmdD6;dxmdsd6;dxInsD6;dxDBEdD6;dxEdtrD6;dxObjInsD6;vcldb;dxorgcD6;dxdborD6;vcl;vclx;fc3000v6;EQTLD6;ECQDBCD6;EQDBTLD6;EQGridD6;dxGrEdD6;dxExELD6;dxELibD6;dxPSCoreD6;dxPsPrVwAdvD6;dxPSLnksD6;dxPSTLLnkD6;dxPSdxDBTLLnkD6;dxPSdxDBCtrlLnkD6;dxPSdxDBGrLnkD6;dxPSdxDBTVLnkD6;dxPSdxInsLnkD6;dxPSdxOCLnkD6;dxPSdxDBOCLnkD6;rbTDBC61;rbRCL66;rbCIDE66;rbIDE66;rbBDE66;rbRIDE66;rbRAP66;rbDBDE66;rbDAD66;rbDIDE66;rbUSER66;rbDB66;rbADO66;adortl;rbDBE66;dbxcds;dbexpress;rbIBE66;ibxpress;dxMasterViewD6;RxCtl6;VclSmp;RxDB6;RxBDE6 -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang= -RootDir=D:\Program Files\Borland\Delphi6\Bin\ -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= diff --git a/PythonForDelphi/Demos/Demo06/Project1.dproj b/PythonForDelphi/Demos/Demo06/Project1.dproj index 78fba70d..79cb07ae 100644 --- a/PythonForDelphi/Demos/Demo06/Project1.dproj +++ b/PythonForDelphi/Demos/Demo06/Project1.dproj @@ -1,134 +1,183 @@ - - - {2E88E1AD-C1A3-403E-8AEE-28895B68FBF7} - Project1.dpr - Debug - DCC32 - 13.4 - VCL - True - Win32 - 1 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - 1033 - Project1.exe - 00400000 - x86 - - - Project1_Icon.ico - - - true - Project1_Icon.ico - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - $(BDS)\bin\default_app.manifest - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - False - True - - - 12 - - -
+ + + {2E88E1AD-C1A3-403E-8AEE-28895B68FBF7} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 1033 + Project1.exe + 00400000 + x86 + Project1 + .\$(Platform)\$(Config) + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + true + Project1_Icon.ico + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + DEBUG;$(DCC_Define) + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo06/Project1.res b/PythonForDelphi/Demos/Demo06/Project1.res index 3f7606cf84212f64c91ed3383d42f7b5a779a10f..9c86860d21b99d7fab2cfe5c634fa4371a887fd0 100644 GIT binary patch delta 1442 zcmbtU&rj4q6rM$PH@iykAPESGL-k;cv;Do>Zb}ITje7twh+ds`rckrpHfB&3lKap?ScbE0qOxs{CpcVuK$N@_X2t^F$ zIZ>;OIztFCN|DTjkD*~9wOO$8g7ZQWP=g=U%JGe?V`&6=5$;qpm0>?j8?l(h7Vx4wKMJ zTW%PL+Z#PmktAJwb3Ry@FatM>{IvrbbNkg!Jmlimh9#at6LoQt)&=>Tz$#5=GoHzD z#v?vpeBh4kY+Rk6FNlhTBs_5XqaN5&KOJS?t8>|LRlZv~V7$-c1Qxy`v|CdC3fZ07 zqinS{m+jOZEEH~#U`d~@B@;e7`&xTGJFzC*9mc?IXMbx;S+l;JJ+3chz53$KQxVb5 zcI)?ACEIBL%q=mEhe_HSc%ePhw4j6$Y=qVdOApRoY~vnV5k7E5 zlI5|ccZjTOZKA2JPN?p2B1s10oU2Urq>qAFBy<)1&gI&wE~|!PQZm+=3EG~+h`|*` zsG@0-qUfHf(p>wBOE)f;)~Mns23Lu$Iwl!wnkEy6nl52&lWA0=ZLS*Ek#5PCi_2cS z({?*;Vn|#jnxc+PV(N}V43$Ymunkb@;X#jh~qgbl$;yHF?&=en&B~B oqOwlSqUMc8BR_)Tg)?Z0=gw+=n&GyV*JY-e{j9G{!ygI#2ee?2IsgCw delta 355 zcmeB?{J}p#LCJxUfkAo~XURplTYc~3caPM$2O!nrnWdVgG E09ue(p8x;= diff --git a/PythonForDelphi/Demos/Demo06/Unit1.dfm b/PythonForDelphi/Demos/Demo06/Unit1.dfm index 832fdbdc353bc772a544037168d0ff8234f7beef..67e4c229a34c09c36dd0165d4bf7d26143328ed7 100644 GIT binary patch delta 296 zcmX>n{9c&%KNmxYn}3k6A%lUy{f)fm7?qR?iZb&`6f}wp5_9#^^7A#+Gg5PM@)gSS zi*i!bbrcLWC;w(t3KNDZQwqojDz{S7Q7F)4<0#OpP_R`nwP53eN&^MJGC~D<{%L8& zsU=R88VaU53Z@F0Y@9GPnrwPd=HwhEHAcISRv`u;m^_cwn?o69(g#*)2~9RpD7Uz>ST8xhpt2}4J)=Z(vjUqQBYOgK gNPYp6!(@NiZb&`6p9NHbM?~l^EK2nQgd?h70UCA za#GZF6bvW-WmNJPgeX!9$Oo#mQqoZdmeQ zmHf>rEy^Yg;S^UE>m}zGR2F5XXOwK#W7A_~^q8E?-pIt1vH30gJVvGthRKsTV*qC5 BN^1ZB diff --git a/PythonForDelphi/Demos/Demo06/Unit1.pas b/PythonForDelphi/Demos/Demo06/Unit1.pas index f8df4802..ec37e5da 100644 --- a/PythonForDelphi/Demos/Demo06/Unit1.pas +++ b/PythonForDelphi/Demos/Demo06/Unit1.pas @@ -158,6 +158,8 @@ procedure PyPoint_dealloc(obj : PPyObject); cdecl; // object.value // object.method(args) function PyPoint_getattr(obj : PPyObject; key : PAnsiChar) : PPyObject; cdecl; +var + PyKey : PPyObject; begin with GetPythonEngine, PPyPoint(obj)^ do begin @@ -170,11 +172,17 @@ function PyPoint_getattr(obj : PPyObject; key : PAnsiChar) : PPyObject; cdecl; else begin // Else check for a method - Result := Py_FindMethod( MethodsByName('PythonType1'), obj, key); - // or we could write, because it's quicker: - // Result := Py_FindMethod( Form1.PythonType1.MethodsData, obj, key); - if not Assigned(Result) then - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Unknown attribute "%s"',[key]))); + if IsPython3000 then begin + PyKey := PyString_FromString(key); + Result := PyObject_GenericGetAttr(obj, PyKey); + end + else begin + Result := Py_FindMethod( MethodsByName('PythonType1'), obj, key); + // or we could write, because it's quicker: + // Result := Py_FindMethod( Form1.PythonType1.MethodsData, obj, key); + if not Assigned(Result) then + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Unknown attribute "%s"',[key]))); + end; end; end; end; diff --git a/PythonForDelphi/Demos/Demo07/Project1.conf b/PythonForDelphi/Demos/Demo07/Project1.conf deleted file mode 100644 index 84e6d103..00000000 --- a/PythonForDelphi/Demos/Demo07/Project1.conf +++ /dev/null @@ -1,32 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J- --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W- --$X+ --$YD --$Z1 --cg --H+ --W+ --M --$M16384,1048576 --K$00400000 diff --git a/PythonForDelphi/Demos/Demo07/Project1.dof b/PythonForDelphi/Demos/Demo07/Project1.dof deleted file mode 100644 index 9cccf462..00000000 --- a/PythonForDelphi/Demos/Demo07/Project1.dof +++ /dev/null @@ -1,87 +0,0 @@ -[Compiler] -A=1 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;Indy50;VM;rbCIDE55;rbIDE55;rbRCL55;rbBDE55;rbDBDE55;rbDAD55;rbDIDE55;rbUSER55;rbDB55;rbADO55;rbIBE55;VMREPORTBUILDER -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -[Language] -ActiveLang= -ProjectLang=$00000409 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= -[Excluded Packages] -D:\projects\Source\ThirdParty\ReportBuilder\dclRBC51.bpl=ReportBuilder TeeChart 4.0 Components -$(DELPHI)\Bin\dcldss50.bpl=Borland Decision Cube Components -$(DELPHI)\Bin\dcltee50.bpl=TeeChart Components -$(DELPHI)\Bin\dcltqr50.bpl=TeeChart for QuickReport Components diff --git a/PythonForDelphi/Demos/Demo07/Project1.dproj b/PythonForDelphi/Demos/Demo07/Project1.dproj index d6438414..31b2deb8 100644 --- a/PythonForDelphi/Demos/Demo07/Project1.dproj +++ b/PythonForDelphi/Demos/Demo07/Project1.dproj @@ -1,134 +1,185 @@ - - - {241C5DB1-E30A-4305-9F0A-4B7DD00FAD59} - Project1.dpr - Debug - DCC32 - 13.4 - VCL - True - Win32 - 1 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - 1033 - Project1.exe - 00400000 - x86 - - - Project1_Icon1.ico - - - true - Project1_Icon1.ico - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - $(BDS)\bin\default_app.manifest - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - False - True - - - 12 - - -
+ + + {241C5DB1-E30A-4305-9F0A-4B7DD00FAD59} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 1033 + Project1.exe + 00400000 + x86 + Project1 + .\$(Platform)\$(Config) + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + true + Project1_Icon1.ico + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon1.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + DEBUG;$(DCC_Define) + + + Debug + true + true + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo07/Project1.kof b/PythonForDelphi/Demos/Demo07/Project1.kof deleted file mode 100644 index 6ad26fc6..00000000 --- a/PythonForDelphi/Demos/Demo07/Project1.kof +++ /dev/null @@ -1,61 +0,0 @@ -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=0 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases= - -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -DynamicLoader=/lib/ld-linux.so.2 - -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages= -Conditionals= -DebugSourceDirs= -UsePackages=0 - -[Parameters] -RunParams= -HostApplication= -Launcher=/usr/X11R6/bin/xterm -T KylixDebuggerOutput -e bash -i -c %debuggee% -UseLauncher=0 -DebugCWD= - diff --git a/PythonForDelphi/Demos/Demo07/Project1.res b/PythonForDelphi/Demos/Demo07/Project1.res index 3f7606cf84212f64c91ed3383d42f7b5a779a10f..9c86860d21b99d7fab2cfe5c634fa4371a887fd0 100644 GIT binary patch delta 1442 zcmbtU&rj4q6rM$PH@iykAPESGL-k;cv;Do>Zb}ITje7twh+ds`rckrpHfB&3lKap?ScbE0qOxs{CpcVuK$N@_X2t^F$ zIZ>;OIztFCN|DTjkD*~9wOO$8g7ZQWP=g=U%JGe?V`&6=5$;qpm0>?j8?l(h7Vx4wKMJ zTW%PL+Z#PmktAJwb3Ry@FatM>{IvrbbNkg!Jmlimh9#at6LoQt)&=>Tz$#5=GoHzD z#v?vpeBh4kY+Rk6FNlhTBs_5XqaN5&KOJS?t8>|LRlZv~V7$-c1Qxy`v|CdC3fZ07 zqinS{m+jOZEEH~#U`d~@B@;e7`&xTGJFzC*9mc?IXMbx;S+l;JJ+3chz53$KQxVb5 zcI)?ACEIBL%q=mEhe_HSc%ePhw4j6$Y=qVdOApRoY~vnV5k7E5 zlI5|ccZjTOZKA2JPN?p2B1s10oU2Urq>qAFBy<)1&gI&wE~|!PQZm+=3EG~+h`|*` zsG@0-qUfHf(p>wBOE)f;)~Mns23Lu$Iwl!wnkEy6nl52&lWA0=ZLS*Ek#5PCi_2cS z({?*;Vn|#jnxc+PV(N}V43$Ymunkb@;X#jh~qgbl$;yHF?&=en&B~B oqOwlSqUMc8BR_)Tg)?Z0=gw+=n&GyV*JY-e{j9G{!ygI#2ee?2IsgCw delta 355 zcmeB?{J}p#LCJxUfkAo~XURplTYc~3caPM$2O!nrnWdVgG E09ue(p8x;= diff --git a/PythonForDelphi/Demos/Demo07/Unit1.dfm b/PythonForDelphi/Demos/Demo07/Unit1.dfm index e4d92573197572d67a00b72f47c2f686268bddb1..52c0d59a22b711805bd0f577a8e8f6b09f599ed6 100644 GIT binary patch delta 358 zcmdle@>+!VKNmxYn}3k6A%lTH^hVyZjEo(VZ!_w0$QKl4=9MUDOy*}27uRIt&de>y zFDg+eE=bH}Q-aA^Gf7PjVN%i)h6*SJ=v64#DwtZZ@j<150w9^m z3z$TOIbmX&Y+jC8myFb6bjfl3iK)zY!yr`*mxk4Kt4!Zs6fv@ zEv-1U#Hmt4!Bj`VR6&!C9jby&2WsvGCbh}mnKbpqAbgOWdg-YpDfy*IIjI_&Y~t9& zjWi|)GutroZl1urk%?UqYLq9Nv?!Y}RDET!UUGgxWl?5&M#<(HHa*748`ztem@+0? pbCfY{V3@p - - {237903A4-03D0-4047-A134-AAF207C6AC42} - Project1.dpr - Debug - DCC32 - 13.4 - VCL - True - Win32 - 1 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - 1033 - Project1.exe - 00400000 - x86 - - - Project1_Icon.ico - - - true - Project1_Icon.ico - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - $(BDS)\bin\default_app.manifest - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - False - True - - - 12 - - - + + + {237903A4-03D0-4047-A134-AAF207C6AC42} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 1033 + Project1.exe + 00400000 + x86 + Project1 + .\$(Platform)\$(Config) + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + true + Project1_Icon.ico + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + DEBUG;$(DCC_Define) + + + Debug + true + true + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo08/Project1.kof b/PythonForDelphi/Demos/Demo08/Project1.kof deleted file mode 100644 index 6ad26fc6..00000000 --- a/PythonForDelphi/Demos/Demo08/Project1.kof +++ /dev/null @@ -1,61 +0,0 @@ -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=0 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases= - -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -DynamicLoader=/lib/ld-linux.so.2 - -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages= -Conditionals= -DebugSourceDirs= -UsePackages=0 - -[Parameters] -RunParams= -HostApplication= -Launcher=/usr/X11R6/bin/xterm -T KylixDebuggerOutput -e bash -i -c %debuggee% -UseLauncher=0 -DebugCWD= - diff --git a/PythonForDelphi/Demos/Demo08/Project1.res b/PythonForDelphi/Demos/Demo08/Project1.res index 3f7606cf84212f64c91ed3383d42f7b5a779a10f..9c86860d21b99d7fab2cfe5c634fa4371a887fd0 100644 GIT binary patch delta 1442 zcmbtU&rj4q6rM$PH@iykAPESGL-k;cv;Do>Zb}ITje7twh+ds`rckrpHfB&3lKap?ScbE0qOxs{CpcVuK$N@_X2t^F$ zIZ>;OIztFCN|DTjkD*~9wOO$8g7ZQWP=g=U%JGe?V`&6=5$;qpm0>?j8?l(h7Vx4wKMJ zTW%PL+Z#PmktAJwb3Ry@FatM>{IvrbbNkg!Jmlimh9#at6LoQt)&=>Tz$#5=GoHzD z#v?vpeBh4kY+Rk6FNlhTBs_5XqaN5&KOJS?t8>|LRlZv~V7$-c1Qxy`v|CdC3fZ07 zqinS{m+jOZEEH~#U`d~@B@;e7`&xTGJFzC*9mc?IXMbx;S+l;JJ+3chz53$KQxVb5 zcI)?ACEIBL%q=mEhe_HSc%ePhw4j6$Y=qVdOApRoY~vnV5k7E5 zlI5|ccZjTOZKA2JPN?p2B1s10oU2Urq>qAFBy<)1&gI&wE~|!PQZm+=3EG~+h`|*` zsG@0-qUfHf(p>wBOE)f;)~Mns23Lu$Iwl!wnkEy6nl52&lWA0=ZLS*Ek#5PCi_2cS z({?*;Vn|#jnxc+PV(N}V43$Ymunkb@;X#jh~qgbl$;yHF?&=en&B~B oqOwlSqUMc8BR_)Tg)?Z0=gw+=n&GyV*JY-e{j9G{!ygI#2ee?2IsgCw delta 355 zcmeB?{J}p#LCJxUfkAo~XURplTYc~3caPM$2O!nrnWdVgG E09ue(p8x;= diff --git a/PythonForDelphi/Demos/Demo08/Unit1.dfm b/PythonForDelphi/Demos/Demo08/Unit1.dfm index 22aef1fa92e7fe571cc52cfff46a47b7a0fd433a..563d285dee46e8894b9f1676e4d46f3e7d0a7d5a 100644 GIT binary patch delta 637 zcmZn^TP?=-pNk>H%|FQ3kikGentLPPK}N<^lP@rOC2$rLW#*MAXcTC&2^Hx1r==CA zmN->vC>ZM~7%OP93BaWFDs&VI^eQ#k1fe1+nME4K1&O(uAdL_+KwQ0me4u%nY|>D% z$%Rb9jGB}GG0FHzC@4S$l?oIxixmDvzIa(Nd>1?B&QaXC?I_2T2z!@q>xxV z`8~5WmkB~oESnaOCR-9hU?N)t(2)Hs=A1q-pHF6Fwdd2-)dhM;85TsItkPVXY!D}C zDNH`dEGnX*RFVMH%|FQ3kikIUBiBa0gN%%;CtqOn%4RPp%FHWKC}0yR(DP4AD^4wO zs?<<0)=@B4&}8F-O6pbUC=}>bvhhRsDVaqY#RZAEnrs3P0T4$oARlNDn-oMusX)P2 zK?$f!M?pzJL08uf$eG;7Boiy9pa55qS*(z#0M@3&#+sT_oNC1;g({twUjkH805Tb< z1Z1WWAsej7w_);MMp=HAlA=m0HeHxICQoKooxGFTh%s=o0-G44&SXnAYfdA$Y#o~x z7h3|H+rSbr`6i1whZoe3lNDL5CL6GFgekEpLWNw5it>w!6*BWcey=Ra$j?(KPA>M`;# aB|roj7(_!RZ{!e}{D8}WyMqBH$N&H?@3n{k diff --git a/PythonForDelphi/Demos/Demo09/Project1.conf b/PythonForDelphi/Demos/Demo09/Project1.conf deleted file mode 100644 index 84e6d103..00000000 --- a/PythonForDelphi/Demos/Demo09/Project1.conf +++ /dev/null @@ -1,32 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J- --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W- --$X+ --$YD --$Z1 --cg --H+ --W+ --M --$M16384,1048576 --K$00400000 diff --git a/PythonForDelphi/Demos/Demo09/Project1.dof b/PythonForDelphi/Demos/Demo09/Project1.dof deleted file mode 100644 index c24dad24..00000000 --- a/PythonForDelphi/Demos/Demo09/Project1.dof +++ /dev/null @@ -1,150 +0,0 @@ -[FileVersion] -Version=7.0 -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=0 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -NamespacePrefix= -SymbolDeprecated=1 -SymbolLibrary=1 -SymbolPlatform=1 -UnitLibrary=1 -UnitPlatform=1 -UnitDeprecated=1 -HResultCompat=1 -HidingMember=1 -HiddenVirtual=1 -Garbage=1 -BoundsError=1 -ZeroNilCompat=1 -StringConstTruncated=1 -ForLoopVarVarPar=1 -TypedConstVarPar=1 -AsgToTypedConst=1 -CaseLabelRange=1 -ForVariable=1 -ConstructingAbstract=1 -ComparisonFalse=1 -ComparisonTrue=1 -ComparingSignedUnsigned=1 -CombiningSignedUnsigned=1 -UnsupportedConstruct=1 -FileOpen=1 -FileOpenUnitSrc=1 -BadGlobalSymbol=1 -DuplicateConstructorDestructor=1 -InvalidDirective=1 -PackageNoLink=1 -PackageThreadVar=1 -ImplicitImport=1 -HPPEMITIgnored=1 -NoRetVal=1 -UseBeforeDef=1 -ForLoopVarUndef=1 -UnitNameMismatch=1 -NoCFGFileFound=1 -MessageDirective=1 -ImplicitVariants=1 -UnicodeToLocale=1 -LocaleToUnicode=1 -ImagebaseMultiple=1 -SuspiciousTypecast=1 -PrivatePropAccessor=1 -UnsafeType=0 -UnsafeCode=0 -UnsafeCast=0 -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;Indy50;VM;rbCIDE55;rbIDE55;rbRCL55;rbBDE55;rbDBDE55;rbDAD55;rbDIDE55;rbUSER55;rbDB55;rbADO55;rbIBE55;VMREPORTBUILDER -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang=$00000409 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= -[Excluded Packages] -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSTLLnkD7.bpl=ExpressPrinting System ReportLink for ExpressQuantumTreeList by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSdxDBTLLnkD7.bpl=ExpressPrinting System ReportLink for ExpressQuantumDBTreeList by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSdxDBGrLnkD7.bpl=ExpressPrinting System ReportLink for ExpressQuantumGrid by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSdxDBTVLnkD7.bpl=ExpressPrinting System ReportLink for ExpressDBTree by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSdxInsLnkD7.bpl=ExpressPrinting System ReportLink for ExpressInspector by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSdxOILnkD7.bpl=ExpressPrinting System ReportLink for ExpressRTTIInspector by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSdxMVLnkD7.bpl=ExpressPrinting System ReportLink for ExpressMasterView by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSdxOCLnkD7.bpl=ExpressPrinting System ReportLinks for ExpressOrgChart by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSdxDBOCLnkD7.bpl=ExpressPrinting System ReportLinks for ExpressDBOrgChart by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSdxFCLnkD7.bpl=ExpressPrinting System ReportLinks for ExpressFlowChart by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPSdxLCLnkD7.bpl=ExpressPrinting System ReportLink for ExpressLayoutControl by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPscxTLLnkD7.bpl=ExpressPrinting System ReportLink for ExpressQuantumTreeList 4 by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 7\Lib\dxPScxPCProdD7.bpl=ExpressPrinting System ContainerProducer for ExpressPageControl 2 by Developer Express Inc. diff --git a/PythonForDelphi/Demos/Demo09/Project1.dproj b/PythonForDelphi/Demos/Demo09/Project1.dproj index 0a37d802..be2df094 100644 --- a/PythonForDelphi/Demos/Demo09/Project1.dproj +++ b/PythonForDelphi/Demos/Demo09/Project1.dproj @@ -1,100 +1,207 @@ - - - {A9EE3C80-927A-458F-83F8-5388BD57BAF3} - Project1.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - Project1.exe - 00400000 - x86 - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - -
+ + + {A9EE3C80-927A-458F-83F8-5388BD57BAF3} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Project1.exe + 00400000 + x86 + Project1 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + .\$(Platform)\$(Config) + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + Project1_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + true + true + + + DEBUG;$(DCC_Define) + + + Debug + + + true + true + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo09/Project1.kof b/PythonForDelphi/Demos/Demo09/Project1.kof deleted file mode 100644 index 6ad26fc6..00000000 --- a/PythonForDelphi/Demos/Demo09/Project1.kof +++ /dev/null @@ -1,61 +0,0 @@ -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=0 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases= - -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -DynamicLoader=/lib/ld-linux.so.2 - -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages= -Conditionals= -DebugSourceDirs= -UsePackages=0 - -[Parameters] -RunParams= -HostApplication= -Launcher=/usr/X11R6/bin/xterm -T KylixDebuggerOutput -e bash -i -c %debuggee% -UseLauncher=0 -DebugCWD= - diff --git a/PythonForDelphi/Demos/Demo09/Project1.res b/PythonForDelphi/Demos/Demo09/Project1.res index f928fd9e0631bd904b373cc7daeca2686e927df4..9c86860d21b99d7fab2cfe5c634fa4371a887fd0 100644 GIT binary patch literal 3212 zcmbtX&rjP{9RD)VAk{j0*kL=>i*}eMIk6KbBq%^pX=yZQtCF$f=Gf2REwMA(fuL!E zokGf5Z+u?6%&ZYE|#^o*gHkGNkr}=jZqRe7-;4_kEvjh=?Tg zFpN5G&$o~I_ziGI1g21GEFpcQ;dYf)=m%Wy&?DSc=>grxyo&2x-1GLw*uQUyxPD}# zKh6o1h#Tx9v50OCE$XxmfxB8=9vpgqu0DFaXaPFUp^;769$z}2aV2p5Dc z1J;}1GF!xyRDH@??ACovM zVfcA+mWH3TmAOu{A#E_vw_Rr@t!9+8#2mvlZD(yJ{ax*@TuMuRpgX4Ca2+<2-eP`w zZua`MithWYS#NAfFyQzz>9*%g`^GwJ>b~5x4bSymE07JhIj#H6%!Znln!00K%nw%2 zc@yfKvys2jNInhEk_6viPwTB#!#4B)kVvytW@y9n0 zXGYsY#*$Qe?3XsmkeLrXd&6$9HRks*>{Wu^=|GVe*Am-cjU=^_)Zp`(wC-1(4dlcd zELM`*_PoK@JCnBbhR+62yj)SH*~G`i2rAj(Xe-%d(fq`rPFtwjjeKdQx0Q(yEO|f+Wj` z3i>gFnGaT^syUPXmE{yw)e2LxTF{EJmNyErUa**~C?%6ImN)a3@>@D9;&~tUQx zmkrr0mQ799^difbKE!iIz1+8I6{m{ER8cM|OqI1S1#j7uSq5LY@b7jiQ91qLr&4P*e rtgGNn7lzmHUAu(0U`>4gKf)WahS?)p#MgNZU-a?&aOnRC{z>>BvmS6x delta 26 hcmeB?e8V - - {FFF278A4-CBAE-4C3F-B542-8C88A2EFDA53} - demodll.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - demodll.pyd - WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) - true - 00400000 - x86 - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - - - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - - - - - Delphi.Personality.12 - VCLApplication - - - - demodll.dpr - - - False - True - False - C:\Delphi\progs32\Python\P4D\PythonForDelphi\Demos\Demo09\Project1.exe - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - - + + + {FFF278A4-CBAE-4C3F-B542-8C88A2EFDA53} + demodll.dpr + Debug + DCC32 + 18.3 + None + True + Win64 + 2 + Library + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + demodll.pyd + true + 00400000 + x86 + demodll + 1033 + .\$(Platform)\$(Config) + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + C:\Delphi\progs32\Python\P4D\PythonForDelphi\Demos\Demo09\Project1.exe + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + DEBUG;$(DCC_Define) + + + Debug + + + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + (Ohne) + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + VCLApplication + + + + demodll.dpr + + + False + True + False + C:\Delphi\progs32\Python\P4D\PythonForDelphi\Demos\Demo09\Project1.exe + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + False + True + + + 12 + + + diff --git a/PythonForDelphi/Demos/Demo09/demodll.kof b/PythonForDelphi/Demos/Demo09/demodll.kof deleted file mode 100644 index 44affd6b..00000000 --- a/PythonForDelphi/Demos/Demo09/demodll.kof +++ /dev/null @@ -1,61 +0,0 @@ -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=0 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases= - -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=1 -RemoteSymbols=1 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -DynamicLoader=/lib/ld-linux.so.2 - -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=baseclx:visualclx:visualdbclx:dataclx:netdataclx:netclx:indy:Python_kylix -Conditionals= -DebugSourceDirs= -UsePackages=0 - -[Parameters] -RunParams= -HostApplication= -Launcher=/usr/X11R6/bin/xterm -T KylixDebuggerOutput -e bash -i -c %debuggee% -UseLauncher=0 -DebugCWD= - diff --git a/PythonForDelphi/Demos/Demo09/module.pas b/PythonForDelphi/Demos/Demo09/module.pas index e2545071..65c3798d 100644 --- a/PythonForDelphi/Demos/Demo09/module.pas +++ b/PythonForDelphi/Demos/Demo09/module.pas @@ -53,7 +53,7 @@ function PyInit_demodll : PPyObject; gEngine.UseLastKnownVersion := False; gEngine.RegVersion := '3.2'; //<-- Use the same version as the python 3.x your main program uses gEngine.APIVersion := 1013; - gEngine.DllName := 'python32.dll'; + gEngine.DllName := 'python36.dll'; gEngine.LoadDll; gModule := TPythonModule.Create(nil); gModule.Engine := gEngine; diff --git a/PythonForDelphi/Demos/Demo11/ThSort.dfm b/PythonForDelphi/Demos/Demo11/ThSort.dfm index 19bcd53345dbb273c78ff73d68b56018bb8ff6ac..529ed183fab699d099ca9e9335f4064bfdea6955 100644 GIT binary patch delta 24 gcmca9dQ)`6b56#B$uBsca}_X$ - - {FA5D85B3-B6D3-47F9-A4F9-482E5482F142} - ThrdDemo.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) - ThrdDemo.exe - 00400000 - x86 - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
ThreadSortForm
-
- - - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - ThrdDemo.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - - + + + {FA5D85B3-B6D3-47F9-A4F9-482E5482F142} + ThrdDemo.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + ThrdDemo.exe + 00400000 + x86 + ThrdDemo + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + .\$(Platform)\$(Config) + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + ThrdDemo_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + ThrdDemo_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + true + true + + + DEBUG;USE_FASTMM4_LEAK_MONITOR;FullDebugMode;LogMemoryLeakDetailToFile;$(DCC_Define) + + + Debug + + + true + true + + + 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= + + + + MainSource + + +
ThreadSortForm
+
+ + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + ThrdDemo.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo11/ThrdDemo.res b/PythonForDelphi/Demos/Demo11/ThrdDemo.res index 8d706e283ae300d46b4a395cc332a4412d138ef6..13c8ea14538b7027ca1e5c32474bb4223c8264ba 100644 GIT binary patch literal 3212 zcmbtWJ8#=o6h4ZL#tM)+1v<1-S)xNxfFdbUFGIF#b%^^u*og_ejr z%rr9*J%gYCe=&vRkx%>Z=24dzJp1HQ0AN#KG%`t}2FOGXJfjUN!ZyR-gH1%X@Y9Ds z54OGt)20JR9pZ?d@JR5owqW}dnh@4=8=XqPWJIX)Q{W#16(GluEO=_cBVRUTJz%-_ z4m2So7UFTA0pwT3FN@q$e+~^`5hDio%C61X6ge;3T+aM*-aNws?i$Z3>(sonL|=%z z(iRo@=s*|9#oiTH|6ctkpO2M%KJMI^&&QXDA%VUI6@))rz~<^TA;O;~lk|imF6r#- z3}>$3L&{G{dcrZCTL{-Kro-X*V*2c&R_9Rg`}+qM)Bc=)AN@326Yg(HMYMAaoedj^MIy*#8=MJ@hN`Ci~Q-y>1oavPflMPznJTbC&wqp3;5#6 z2}k63;{5UN3;glvi<3D^MTA>W6T$lu55NK(m&FC|LUWm4GN0MLBwD|UpkB%7jOgY$ zaIZm_n48I2;dydSh2-^(Ka&Tc}so+K|nOOkWYf7?m&29$96 z4U~M0AQ~u1KBQgR5zoFB-4#zlh{e(t_66S!1(Kvyu`Bp4D$pMvkk~6p@(KLl!G^W? ztZi=3^(^0WSrk8AiYClCW@xQ ztZ5bXhh<|q^$g!m-`g2kA=_$)1ExOSZK}B>4X&nHU5d`_n={p7!lDj`^_lOW--ojT zGC{mE>uw%CYj+Fq*ozNEOkQ++*vD-_RHH2CLf`5^xSQRE(yXe|-JsVCeC2N7$6?To z<_7r$R7)EF%{Bc&2VMS_9kzp?7)GR8X;eB@Q#Vc9c6G;{BfFNrKd|-@_^Y|F9|ksy zq9EJ}?E^1nc033LLYk_%8>m$ zz!);;ap(=bF572Oro+9;wfDy`WOw~Nb@!*Ud^z(JN+EF%7$-SQVEknpSrhV}@h6+OM)I@_Co=wd+G072T+J8kSOV8VK!n z9Hq|6j$)NfQ!AG%Zo{y6=yxoPp9I*osqaIHqMwYgM~eRq7hk6|-zK6l~ItQa2pUtvZ@x)!rwzu3aCx&NR1X>1Czkb__I} z)fKeAqL_8psc4p7u^OV`#bS|9pL%Khn(ES+@-fH5GJUgv5ubHUyt9(z7QTib;w{(~ b-~UhWMr?z7Lf_!)yp1pVbS=Ky_$T52@e@vg delta 17 YcmeB?e8V` - - {FEB76A6C-3FF0-423D-AA7F-BA28CE5A6B63} - Project1.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) - Project1.exe - 00400000 - x86 - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - - + + + {FEB76A6C-3FF0-423D-AA7F-BA28CE5A6B63} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Project1.exe + 00400000 + x86 + Project1 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + ..\..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + .\$(Platform)\$(Config) + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + Project1_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + true + true + + + DEBUG;$(DCC_Define) + + + Debug + + + true + true + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo16/Example1/Project1.res b/PythonForDelphi/Demos/Demo16/Example1/Project1.res index d1f138dfb52f8ed50565d29bd85d6f310132fb78..9c86860d21b99d7fab2cfe5c634fa4371a887fd0 100644 GIT binary patch literal 3212 zcmbtX&rjP{9RD)VAk{j0*kL=>i*}eMIk6KbBq%^pX=yZQtCF$f=Gf2REwMA(fuL!E zokGf5Z+u?6%&ZYE|#^o*gHkGNkr}=jZqRe7-;4_kEvjh=?Tg zFpN5G&$o~I_ziGI1g21GEFpcQ;dYf)=m%Wy&?DSc=>grxyo&2x-1GLw*uQUyxPD}# zKh6o1h#Tx9v50OCE$XxmfxB8=9vpgqu0DFaXaPFUp^;769$z}2aV2p5Dc z1J;}1GF!xyRDH@??ACovM zVfcA+mWH3TmAOu{A#E_vw_Rr@t!9+8#2mvlZD(yJ{ax*@TuMuRpgX4Ca2+<2-eP`w zZua`MithWYS#NAfFyQzz>9*%g`^GwJ>b~5x4bSymE07JhIj#H6%!Znln!00K%nw%2 zc@yfKvys2jNInhEk_6viPwTB#!#4B)kVvytW@y9n0 zXGYsY#*$Qe?3XsmkeLrXd&6$9HRks*>{Wu^=|GVe*Am-cjU=^_)Zp`(wC-1(4dlcd zELM`*_PoK@JCnBbhR+62yj)SH*~G`i2rAj(Xe-%d(fq`rPFtwjjeKdQx0Q(yEO|f+Wj` z3i>gFnGaT^syUPXmE{yw)e2LxTF{EJmNyErUa**~C?%6ImN)a3@>@D9;&~tUQx zmkrr0mQ799^difbKE!iIz1+8I6{m{ER8cM|OqI1S1#j7uSq5LY@b7jiQ91qLr&4P*e rtgGNn7lzmHUAu(0U`>4gKf)WahS?)p#MgNZU-a?&aOnRC{z>>BvmS6x delta 25 gcmeB?e8VxJo#rp@vW1$R*6EIr#{ehq1DP0+Nlz zdVYzysX7WunZ*i;3ShS@DrvIuA}i6HY|Sk%%L5AupVYJxCT4CJHzdD+dH&=`Ze?JI z)p95C7%+oGDi|3UL_;R=h)n*^EoQ_SnwOcJpOWh7&&e5-Sngk1QczmL!3Lq(S$$J; c^Nm<(0Gh=B0QFpzUH||9 delta 377 zcmew+HC2lDKNmxYn}3k6A%lSc>qK59Vb<`>l#&eQ9ZYNPC+b^HY`-!& zm(hT6-{yIYKbUyAJWEn@A@WSTo2RjGGji83!ZhrgyoNQBv1T$Go5o~&Hf1CkrOCN$ z)>55$}NhRcIfQ9%J}s2#T?FB><)`r^sy-13u`a4P{l zcbq$kor5_fzkqqdWCI?3X*U1Tl7i9_c2?ii+G9~dAUMg|53 E0KzG58vp - - {3B870EA7-EAEB-434F-8C0D-2800B09DC00C} - Project1.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) - Project1.exe - 00400000 - x86 - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - - + + + {3B870EA7-EAEB-434F-8C0D-2800B09DC00C} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Project1.exe + 00400000 + x86 + Project1 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + .\$(Platform)\$(Config) + ..\..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + Project1_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + true + true + + + DEBUG;$(DCC_Define) + + + Debug + + + true + true + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo16/Example2/Project1.res b/PythonForDelphi/Demos/Demo16/Example2/Project1.res index d1f138dfb52f8ed50565d29bd85d6f310132fb78..9c86860d21b99d7fab2cfe5c634fa4371a887fd0 100644 GIT binary patch literal 3212 zcmbtX&rjP{9RD)VAk{j0*kL=>i*}eMIk6KbBq%^pX=yZQtCF$f=Gf2REwMA(fuL!E zokGf5Z+u?6%&ZYE|#^o*gHkGNkr}=jZqRe7-;4_kEvjh=?Tg zFpN5G&$o~I_ziGI1g21GEFpcQ;dYf)=m%Wy&?DSc=>grxyo&2x-1GLw*uQUyxPD}# zKh6o1h#Tx9v50OCE$XxmfxB8=9vpgqu0DFaXaPFUp^;769$z}2aV2p5Dc z1J;}1GF!xyRDH@??ACovM zVfcA+mWH3TmAOu{A#E_vw_Rr@t!9+8#2mvlZD(yJ{ax*@TuMuRpgX4Ca2+<2-eP`w zZua`MithWYS#NAfFyQzz>9*%g`^GwJ>b~5x4bSymE07JhIj#H6%!Znln!00K%nw%2 zc@yfKvys2jNInhEk_6viPwTB#!#4B)kVvytW@y9n0 zXGYsY#*$Qe?3XsmkeLrXd&6$9HRks*>{Wu^=|GVe*Am-cjU=^_)Zp`(wC-1(4dlcd zELM`*_PoK@JCnBbhR+62yj)SH*~G`i2rAj(Xe-%d(fq`rPFtwjjeKdQx0Q(yEO|f+Wj` z3i>gFnGaT^syUPXmE{yw)e2LxTF{EJmNyErUa**~C?%6ImN)a3@>@D9;&~tUQx zmkrr0mQ799^difbKE!iIz1+8I6{m{ER8cM|OqI1S1#j7uSq5LY@b7jiQ91qLr&4P*e rtgGNn7lzmHUAu(0U`>4gKf)WahS?)p#MgNZU-a?&aOnRC{z>>BvmS6x delta 25 gcmeB?e8V|0u@$pNk>H%|FQ3kikG8aU!qML?<129_O6Q)Vvap)XemZ66T$Z+z@_vW=cs0 z^9rVkd1qwU;F5f<6$Lq&$(bcyrGlc& zyb=YC$sgFHCUdgevw&qh*&85?Q|vwvhB(JA2;&k*28T3ElOv}vqvqrgP7h;c1qG;J zKv8}{v7TRIZmN!gQf9G2q5{}bMI}u(USuVjlTULx0zJaZH%|FQ3kikHpWFoJUFl%^bN=XLu4kk8_)XemZ66Obt6ZLf_R-I9X z$S^U(B#tt&IhPg{=NGYaBo}!E7vyA?Oip6dV?4TfBI6GxUM|m))Le)eOuU;rS-2Uw zYZ&2rC(mb%WUQI|lT~A~5t}lS%*V+IY@S*nMWv| QhI*!xqqxE*ALCjL0IL;wn*aa+ diff --git a/PythonForDelphi/Demos/Demo17/Project1.dof b/PythonForDelphi/Demos/Demo17/Project1.dof deleted file mode 100644 index a3bc2aa7..00000000 --- a/PythonForDelphi/Demos/Demo17/Project1.dof +++ /dev/null @@ -1,93 +0,0 @@ -[FileVersion] -Version=6.0 -[Compiler] -A=8 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=0 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=dxBarD6;dxcomnd6;rtl;dxBarDBNavD6;dbrtl;dxBarExtItemsD6;dxBarExtDBItemsD6;dxsbD6;dxdbtrD6;dxtrmdD6;dxmdsd6;dxInsD6;dxDBEdD6;dxEdtrD6;dxObjInsD6;vcldb;dxorgcD6;dxdborD6;vcl;vclx;fc3000v6;EQTLD6;ECQDBCD6;EQDBTLD6;EQGridD6;dxGrEdD6;dxExELD6;dxELibD6;dxPSCoreD6;dxPsPrVwAdvD6;dxPSLnksD6;dxPSTLLnkD6;dxPSdxDBTLLnkD6;dxPSdxDBCtrlLnkD6;dxPSdxDBGrLnkD6;dxPSdxDBTVLnkD6;dxPSdxInsLnkD6;dxPSdxOCLnkD6;dxPSdxDBOCLnkD6;rbTDBC61;rbRCL66;rbCIDE66;rbIDE66;rbBDE66;rbRIDE66;rbRAP66;rbDBDE66;rbDAD66;rbDIDE66;rbUSER66;rbDB66;rbADO66;adortl;rbDBE66;dbxcds;dbexpress;rbIBE66;ibxpress;dxMasterViewD6;RxCtl6;VclSmp;RxDB6;RxBDE6 -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang= -RootDir=D:\Program Files\Borland\Delphi6\Bin\ -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= -[Excluded Packages] -d:\Program Files\Developer Express Inc\ExpressInspector\Delphi 6\Lib\dcldxExRwD6.bpl=ExpressInspector Extended Rows -d:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 6\Lib\dxPSTeeChartD6.bpl=ExpressPrinting System ReportLink for TeeChart by Developer Express Inc. -d:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 6\Lib\dxPSDBTeeChartD6.bpl=ExpressPrinting System ReportLink for DBTeeChart by Developer Express Inc. -d:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 6\Lib\dxPSdxMVLnkD6.bpl=ExpressPrinting System ReportLink for ExpressMasterView by Developer Express Inc. -d:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 6\Lib\dxPSdxFCLnkD6.bpl=ExpressPrinting System ReportLinks for ExpressFlowChart by Developer Express Inc. diff --git a/PythonForDelphi/Demos/Demo17/Project1.dproj b/PythonForDelphi/Demos/Demo17/Project1.dproj index 588f2d7b..0297371a 100644 --- a/PythonForDelphi/Demos/Demo17/Project1.dproj +++ b/PythonForDelphi/Demos/Demo17/Project1.dproj @@ -1,101 +1,207 @@ - - - {45B70068-605E-4FFB-B78E-2045071FD5FA} - Project1.dpr - Debug - DCC32 - 12.0 - - - true - - - true - Base - true - - - true - Base - true - - - WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) - Project1.exe - 00400000 - x86 - - - false - RELEASE;$(DCC_Define) - 0 - false - - - DEBUG;$(DCC_Define) - - - - MainSource - - -
Form1
-
- - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- - - Delphi.Personality.12 - VCLApplication - - - - Project1.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - 12 - -
+ + + {45B70068-605E-4FFB-B78E-2045071FD5FA} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Project1.exe + 00400000 + x86 + Project1 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + .\$(Platform)\$(Config) + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + Project1_Icon.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Project1_Icon.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + true + true + + + DEBUG;$(DCC_Define) + + + Debug + + + true + true + + + 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= + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Project1.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo17/Project1.res b/PythonForDelphi/Demos/Demo17/Project1.res index cfdbb79b84b18cf82b327a0f0699fa90712c1552..9c86860d21b99d7fab2cfe5c634fa4371a887fd0 100644 GIT binary patch literal 3212 zcmbtX&rjP{9RD)VAk{j0*kL=>i*}eMIk6KbBq%^pX=yZQtCF$f=Gf2REwMA(fuL!E zokGf5Z+u?6%&ZYE|#^o*gHkGNkr}=jZqRe7-;4_kEvjh=?Tg zFpN5G&$o~I_ziGI1g21GEFpcQ;dYf)=m%Wy&?DSc=>grxyo&2x-1GLw*uQUyxPD}# zKh6o1h#Tx9v50OCE$XxmfxB8=9vpgqu0DFaXaPFUp^;769$z}2aV2p5Dc z1J;}1GF!xyRDH@??ACovM zVfcA+mWH3TmAOu{A#E_vw_Rr@t!9+8#2mvlZD(yJ{ax*@TuMuRpgX4Ca2+<2-eP`w zZua`MithWYS#NAfFyQzz>9*%g`^GwJ>b~5x4bSymE07JhIj#H6%!Znln!00K%nw%2 zc@yfKvys2jNInhEk_6viPwTB#!#4B)kVvytW@y9n0 zXGYsY#*$Qe?3XsmkeLrXd&6$9HRks*>{Wu^=|GVe*Am-cjU=^_)Zp`(wC-1(4dlcd zELM`*_PoK@JCnBbhR+62yj)SH*~G`i2rAj(Xe-%d(fq`rPFtwjjeKdQx0Q(yEO|f+Wj` z3i>gFnGaT^syUPXmE{yw)e2LxTF{EJmNyErUa**~C?%6ImN)a3@>@D9;&~tUQx zmkrr0mQ799^difbKE!iIz1+8I6{m{ER8cM|OqI1S1#j7uSq5LY@b7jiQ91qLr&4P*e rtgGNn7lzmHUAu(0U`>4gKf)WahS?)p#MgNZU-a?&aOnRC{z>>BvmS6x delta 50 xcmeB?e8V3m(<*Rh5R&yfXb4L{5&4# zoXpg`5|7l(^o$bbPDXABKRh#~B!gLiX=3y#uAdC7Q0`=XMh!o1*NTFi%;e0Hko*E> zK}KE}7otXjiGhJN#207>D~K>;@kvc9VPaqgDgFaDh=~niAyeYyRz_V8`+}m(yb=YC z$vYX%1vT0Dpxlzw;u1X{&B^~5)!fi*<%8J@HOGg6fh{B;F)uZT4NRig8_Njuz-BL| z>5M!AFzcCrGE9EU?72CMMV(QMGc+$VIX@-U)1Q+wD6!nXw4|W4gk$nV)(jrz31AN} JB``2B001ImXjT9K delta 274 zcmdna^N*YFKNmxYn}3k6A%lUyJJyMOO2Vw+nJFb1%nD3w9;un>870gc7$+J?OiVw; zCCCVslbCGHsG-Nez#8J4nw!rGA`Dr4QqxM97??xy3z$XV3SovYg-+hcsLO6!P?VWh zqA>Xxqd6ZN4}?>aT3n*%Gg*&GO^tzpEhHc@FExh^Orn^X2{&`|ET-v6?u)E~s_$B710?n-~$;i($G}TMV$>DMg@C-{WD$dN$V}8%f6_lC|<*_jv>X~kC SV^L?Ee3&(Zl_`ONfdK%*%S>Sa diff --git a/PythonForDelphi/Demos/readme.txt b/PythonForDelphi/Demos/readme.txt index 8f7c3681..69cb47c5 100644 --- a/PythonForDelphi/Demos/readme.txt +++ b/PythonForDelphi/Demos/readme.txt @@ -7,12 +7,13 @@ Demo06 Defining a new Type Demo07 Using Delphi methods as Python functions Demo08 Using Delphi classes for new Python types Demo09 Making a Python module as a Dll -Demo10 Mapping Delphi VCL components inside Python +Demo10 Mapping Delphi VCL components inside Python using TPythonDatabase (BDE - not changed) +Demo10_FireDAC Database demo using FireDAC Demo11 Using Threads inside Python -Demo12 Using PythonAtom. (Deprecated since Delphi 6, See VarPyth instead) -Demo13 Using TPythonDatabase. -Demo14 Making a Dll with TPythonDatabase -Demo15 Using a TDataset descendant with Python, except TTable and TQuery. +Demo12 Using PythonAtom. -> Deprecated since Delphi 6, See VarPyth instead +Demo13 Using TPythonDatabase. (BDE - not changed) +Demo14 Making a Dll with TPythonDatabase (BDE - not changed) +Demo15 Using a TDataset descendant with Python, except TTable and TQuery. (BDE - not changed) Demo16 Using a TDelphiVar or Module methods ? (Kylix ready) Demo17 Using variant arrays of 2 dimensions (Kylix ready) Demo18 C++ Builder: using the Python Dll in a console application @@ -30,3 +31,4 @@ Demo29 Using Python Imaging Library (PAL) Demo30 Using Named Parameters (Kylix ready) Demo31 Using WrapDelphi to access Delphi Form attributes (Requires Delphi5 or later) Demo32 Demo08 revisited using WrapDelphi (Requires Delphi7 or later) +Demo33 Using Threads inside Python diff --git a/README.md b/README.md index c2cb10eb..a12f51cc 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,7 @@ Python for Delphi (P4D) is a set of free components that wrap up the Python dll * **Wrapping of Delphi objects for use in python scripts using RTTI (WrapDelphi.pas)** P4D makes it very easy to use python as a scripting language for Delphi applications. It comes with an extensive range of demos and tutorials. + +This forked-version includes customizations to Python 3.x, 64bit and FireDAC. +The GetIt-package "SynEdit" is required. +All changed demos have been compiled and tested to 64-bit-Windows. From dafce9dbb1488bb5480202df295437a2c7bcfc77 Mon Sep 17 00:00:00 2001 From: hartmutdavid Date: Thu, 14 Dec 2017 13:23:47 +0100 Subject: [PATCH 2/2] This version includes customizations to Python 3.x, 64bit and FireDAC. --- PythonForDelphi/Components/PyDelphi.ico | Bin 0 -> 766 bytes PythonForDelphi/Components/Python_D10_2.dpk | 57 + PythonForDelphi/Components/Python_D10_2.dproj | 611 ++++ PythonForDelphi/Components/Python_D10_2.dres | Bin 0 -> 872 bytes PythonForDelphi/Components/Python_D10_2.res | Bin 0 -> 664 bytes .../Components/Python_D10_2Resource.rc | 1 + .../Sources/FireDAC/pyDBFireDac.pas | 2788 +++++++++++++++++ .../Demos/Demo01/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo02/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo03/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo04/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo05/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo06/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo07/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo07/Project1_Icon1.ico | Bin 0 -> 766 bytes .../Demos/Demo08/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo09/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo09/ProjectGroup1.groupproj | 48 + PythonForDelphi/Demos/Demo09/demodll.res | Bin 0 -> 628 bytes PythonForDelphi/Demos/Demo10_FireDAC/Demo.ini | 26 + .../Demos/Demo10_FireDAC/Demo.s3db | Bin 0 -> 90112 bytes .../Demos/Demo10_FireDAC/Demo10.dpr | 17 + .../Demos/Demo10_FireDAC/Demo10.dproj | 583 ++++ .../Demos/Demo10_FireDAC/Demo10.res | Bin 0 -> 3200 bytes .../Demos/Demo10_FireDAC/Demo10_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo10_FireDAC/Demo10_Icon1.ico | Bin 0 -> 766 bytes .../Demos/Demo10_FireDAC/Example1.py | 65 + .../Demos/Demo10_FireDAC/Example2.py | 76 + .../Demos/Demo10_FireDAC/Example3.py | 54 + .../Demos/Demo10_FireDAC/Example4.py | 30 + .../Demos/Demo10_FireDAC/FDDrivers.ini | 19 + .../Demos/Demo10_FireDAC/fmMain.dfm | Bin 0 -> 8255 bytes .../Demos/Demo10_FireDAC/fmMain.pas | 488 +++ .../Demos/Demo11/ThrdDemo_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo16/Example1/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo16/Example2/Project1_Icon.ico | Bin 0 -> 766 bytes .../Demos/Demo17/Project1_Icon.ico | Bin 0 -> 766 bytes clean.bat | 145 + 38 files changed, 5008 insertions(+) create mode 100644 PythonForDelphi/Components/PyDelphi.ico create mode 100644 PythonForDelphi/Components/Python_D10_2.dpk create mode 100644 PythonForDelphi/Components/Python_D10_2.dproj create mode 100644 PythonForDelphi/Components/Python_D10_2.dres create mode 100644 PythonForDelphi/Components/Python_D10_2.res create mode 100644 PythonForDelphi/Components/Python_D10_2Resource.rc create mode 100644 PythonForDelphi/Components/Sources/FireDAC/pyDBFireDac.pas create mode 100644 PythonForDelphi/Demos/Demo01/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo02/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo03/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo04/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo05/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo06/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo07/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo07/Project1_Icon1.ico create mode 100644 PythonForDelphi/Demos/Demo08/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo09/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo09/ProjectGroup1.groupproj create mode 100644 PythonForDelphi/Demos/Demo09/demodll.res create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo.ini create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo.s3db create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dpr create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dproj create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo10.res create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon1.ico create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Example1.py create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Example2.py create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Example3.py create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Example4.py create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/FDDrivers.ini create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/fmMain.dfm create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/fmMain.pas create mode 100644 PythonForDelphi/Demos/Demo11/ThrdDemo_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo16/Example1/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo16/Example2/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo17/Project1_Icon.ico create mode 100644 clean.bat diff --git a/PythonForDelphi/Components/PyDelphi.ico b/PythonForDelphi/Components/PyDelphi.ico new file mode 100644 index 0000000000000000000000000000000000000000..1146af0111c80e1a011d467ca4ea51098cc8c4ed GIT binary patch literal 766 zcmaJm7Gr4;TOknx3x zdITSpbU9%;^-I-;oO_q^tmT|S;2S0(XZmX1jdh``R98*WxTkLkPwq6|(hc4!x7th{ zn#XoZs2p2z1np3T3+2!oRE`(DnB|dk!fQvtEfSyt6Q%-o=z8r?3sOpO9e9V4bI#l| zVU9b-Ieq7*19XU#k^7ljj+R(6_1CxxGsnn7r}I`D1^-Ja>X(>;y6x6GyP$YmzyHhs z=CgL5b!@{MF553#^B-tL4(3?~x_jV>u!JEnU_~^yAJ`0!@#+vi8!6sOxinJFi4`R3 a?{ox1Zm2U4jeKLnz9M^bjKT8U2azA*9-Qj{ literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Components/Python_D10_2.dpk b/PythonForDelphi/Components/Python_D10_2.dpk new file mode 100644 index 00000000..6bf14f05 --- /dev/null +++ b/PythonForDelphi/Components/Python_D10_2.dpk @@ -0,0 +1,57 @@ +package Python_D10_2; + +{$R *.res} +{$R 'Sources\Core\PythonEngine.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'Components for Python'} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + dbrtl; + +contains + MethodCallBack in 'Sources\Core\MethodCallBack.pas', + PythonEngine in 'Sources\Core\PythonEngine.pas', + PythonGUIInputOutput in 'Sources\Core\PythonGUIInputOutput.pas', + WrapDelphi in 'Sources\Core\WrapDelphi.pas', + WrapDelphiActnList in 'Sources\Core\WrapDelphiActnList.pas', + WrapDelphiButtons in 'Sources\Core\WrapDelphiButtons.pas', + WrapDelphiClasses in 'Sources\Core\WrapDelphiClasses.pas', + WrapDelphiComCtrls in 'Sources\Core\WrapDelphiComCtrls.pas', + WrapDelphiControls in 'Sources\Core\WrapDelphiControls.pas', + WrapDelphiExtCtrls in 'Sources\Core\WrapDelphiExtCtrls.pas', + WrapDelphiForms in 'Sources\Core\WrapDelphiForms.pas', + WrapDelphiGraphics in 'Sources\Core\WrapDelphiGraphics.pas', + WrapDelphiGrids in 'Sources\Core\WrapDelphiGrids.pas', + WrapDelphiStdCtrls in 'Sources\Core\WrapDelphiStdCtrls.pas', + WrapDelphiTypes in 'Sources\Core\WrapDelphiTypes.pas', + WrapDelphiVCL in 'Sources\Core\WrapDelphiVCL.pas', + WrapDelphiWindows in 'Sources\Core\WrapDelphiWindows.pas', + pyDBFireDac in 'Sources\FireDAC\pyDBFireDac.pas'; + +end. diff --git a/PythonForDelphi/Components/Python_D10_2.dproj b/PythonForDelphi/Components/Python_D10_2.dproj new file mode 100644 index 00000000..4be24aa7 --- /dev/null +++ b/PythonForDelphi/Components/Python_D10_2.dproj @@ -0,0 +1,611 @@ + + + {1E7BC104-3E7C-43AE-8152-901DA2AEB8C3} + Python_D10_2.dpk + True + Debug + 3 + Package + VCL + 18.3 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + false + false + false + false + false + 00400000 + true + true + Python_D10_2 + Components for Python + true + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) + 1031 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + .\dcu\$(Platform)\$(Config) + .\dcp\$(Platform)\$(Config) + .\bpl\$(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 + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar + rtl;dbrtl;$(DCC_UsePackage) + + + rtl;dbrtl;$(DCC_UsePackage) + + + rtl;dbrtl;$(DCC_UsePackage) + + + rtl;dbrtl;$(DCC_UsePackage) + + + rtl;dbrtl;$(DCC_UsePackage) + + + Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + rtl;vcl;dbrtl;$(DCC_UsePackage) + + + Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + rtl;vcl;dbrtl;$(DCC_UsePackage) + + + RELEASE;$(DCC_Define) + 0 + false + 0 + + + true + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + true + 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= + + + DEBUG;$(DCC_Define) + false + true + + + Debug + + + true + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + true + 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= + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + Python_D10_2.dpk + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + False + False + True + True + + + + + Python_D10_2.bpl + true + + + + + 1 + + + Contents\MacOS + 0 + + + + + classes + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + + + res\values + 1 + + + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + 12 + + + + + diff --git a/PythonForDelphi/Components/Python_D10_2.dres b/PythonForDelphi/Components/Python_D10_2.dres new file mode 100644 index 0000000000000000000000000000000000000000..e980306b3556b8aceb883153d696cf7fc12efef5 GIT binary patch literal 872 zcmaJ=y-ve05dK^vs-_4!Ft9Zv1A~#bOh^of1s!B1!4)$;TweEptqaEf%wboODj7q+U@C5?!a%( zsOx07(nZ&Gv>MPM)JQU1(_Bjame4k1()tjZB81F^(0b3$4@3y`Ra_D4e3hWCnxb(> z-%=fMq4}1scUH00X6jHJ) zWLLjWrE^xgBO~1*bpok}o5l2a!&pjd$TJU9`NWcaMYd*Nd&_-qL{3?Fp~Z5HTU_HF YcUa+)OcFPG6Z#Si%5o83guWnyFOo2-fB*mh literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Components/Python_D10_2.res b/PythonForDelphi/Components/Python_D10_2.res new file mode 100644 index 0000000000000000000000000000000000000000..92d6551b9f101f04f587190f48c95ad8aa5b5e65 GIT binary patch literal 664 zcmaKq%}T>i5QR@_7FG~kb|biOEvaOq2vVs^z@HLBwxQNq3vD8?3O<}~OmRjrDCi|_qyXAab95? z`SO2$B~xExxbL}*N(RtH{$2XO;eoeMsi|^JK$~i&G03@|Rgf6loIs%houDB-n2s*A zORdZAQ}d>g#d!s9N^Ndw2KwawV(*#y>VlE!*v0~FH!xB#N>G-yT^*6_R64bs1F{M| z=^efW6BuevrIAfsq2*ewU1wb9OSMmbb6!; +public + FField : TField; + FOnChange : PPyObject; + FOnGetText : PPyObject; + FOnSetText : PPyObject; + FOnValidate : PPyObject; + constructor Create( APythonType : TPythonType ); override; + constructor CreateWith( PythonType : TPythonType; args : PPyObject ); override; + // + class var PyDBFieldType: TPythonType; + // + destructor Destroy; override; + function GetAttr(key : PAnsiChar) : PPyObject; override; + function SetAttr(key : PAnsiChar; value : PPyObject) : Integer; override; + function Repr : PPyObject; override; + class procedure RegisterMethods( PythonType : TPythonType ); override; + function CheckField : Boolean; + procedure AppendProperties( List : PPyObject ); override; + // Do-Methods + function Do_Clear( args : PPyObject ) : PPyObject; cdecl; + function Do_FocusControl( args : PPyObject ) : PPyObject; cdecl; + function Do_IsValidChar( args : PPyObject ) : PPyObject; cdecl; + function Do_RefreshLookupList( args : PPyObject ) : PPyObject; cdecl; + // Events + procedure OnChange( Sender : TField ); + procedure OnGetText( Sender: TField; var Text: String; DisplayText: Boolean ); + procedure OnSetText( Sender : TField; const Text: String ); + procedure OnValidate( Sender : TField ); +end; + +TPyDBVarArg = class(TPyObject) +public + FValue : PPyObject; + constructor CreateWith( APythonType : TPythonType; args : PPyObject ); override; + destructor Destroy; override; + // + class var PyDBVarArgType: TPythonType; + // + function GetAttr(key : PAnsiChar) : PPyObject; override; + function SetAttr(key : PAnsiChar; value : PPyObject) : Integer; override; + function Repr : PPyObject; override; +end; + +{ +TPyDSRowsRegistration = class(TRegisteredUnit) +public + function Name(): String; override; + procedure RegisterWrappers(aPyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(aPyDelphiWrapper: TPyDelphiWrapper); override; +end; +} + +TDSRowsAccess = class(TContainerAccess) +private + function GetContainer: TPyDBDataset; +public + function GetItem(AIndex : Integer) : PPyObject; override; + function GetSize : Integer; override; + function IndexOf(AValue : PPyObject) : Integer; override; + + class function ExpectedContainerClass : TClass; override; + class function SupportsIndexOf : Boolean; override; + class function Name : String; override; +end; + +{DAV>>> $M+ <<; + // Methods + procedure RaiseDBError( E : Exception ); +public + FSharedObject: TPyDBSharedObject; + constructor Create( aPythonType: TPythonType ); override; + constructor CreateWith( aPythonType : TPythonType; args : PPyObject ); override; + destructor Destroy; override; + // + function CreateContainerAccess : TContainerAccess; override; + // + // Class methodes + class function DelphiObjectClass : TClass; override; + class function GetContainerAccessClass : TContainerAccessClass; override; + class procedure RegisterGetSets( PythonType : TPythonType ); override; + class procedure RegisterMembers( PythonType : TPythonType ); override; + class procedure RegisterMethods( PythonType : TPythonType ); override; + // + // Property Getters + function Get_RowsCount( AContext : Pointer) : PPyObject; cdecl; + function Get_Rows( AContext : Pointer) : PPyObject; cdecl; + // + // Attributes + function GetAttr(key : PAnsiChar) : PPyObject; override; + function SetAttr(key : PAnsiChar; value : PPyObject) : Integer; override; + // + // Methods + function Do_Fields( args : PPyObject ): PPyObject; cdecl; + function Do_FieldByName( args : PPyObject ): PPyObject; cdecl; + function Do_FieldNamesAsTuple( args: PPyObject): PPyObject; cdecl; + function Do_FieldsAsTuple( args: PPyObject): PPyObject; cdecl; + function Do_FieldsAsDict( args: PPyObject): PPyObject; cdecl; + function Do_First( args : PPyObject ) : PPyObject; cdecl; + function Do_Last( args : PPyObject ) : PPyObject; cdecl; + function Do_Next( args : PPyObject ) : PPyObject; cdecl; + function Do_Prior( args : PPyObject ) : PPyObject; cdecl; + function Do_Locate( args : PPyObject ) : PPyObject; cdecl; + function Do_Lookup( args : PPyObject ) : PPyObject; cdecl; + function Do_Refresh( args : PPyObject ) : PPyObject; cdecl; + function Do_FindKey( args : PPyObject ) : PPyObject; cdecl; + function Do_FindNearest( args : PPyObject ) : PPyObject; cdecl; + // + property DelphiObject: TFDDataset read GetDelphiObject write SetDelphiObject; +end; + +{DAV>>> $M+ <<>> $M+ << 0 then begin + aAnsiStrBuf := AnsiString(aStr); + Result := PAnsiChar(aAnsiStrBuf); + end + else begin + aAnsiStrBuf := ''; + Result := Nil; + end; +end; + +// ----------------------- TPyDBSharedObject ----------------------------------- + +procedure TPyDBSharedObject.DoDecRef; +begin + if FRefCount > 0 then + Dec(FRefCount); + if (FRefCount = 0) then + FreeData; +end; + +procedure TPyDBSharedObject.SetData( value : TObject ); +begin + DoDecRef; + FRefCount := 0; + FData := value; + IncRef; +end; + +constructor TPyDBSharedObject.Create; +begin + inherited; + Owner := True; +end; + +constructor TPyDBSharedObject.CreateWith( value : TObject; isOwner : Boolean ); +begin + inherited; + Data := value; + Owner := isOwner; +end; + +destructor TPyDBSharedObject.Destroy; +begin + FreeData; + inherited; +end; + +procedure TPyDBSharedObject.IncRef; +begin + Inc(FRefCount); +end; + +procedure TPyDBSharedObject.DecRef; +begin + if not Assigned(Self) then + Exit; + DoDecRef; + if (FRefCount = 0) then + Free; +end; + +procedure TPyDBSharedObject.FreeData; +begin + if Owner and Assigned(FData) then + FData.Free; + FData := nil; +end; + +// ----------------------- TPyDBCommon ----------------------------------------- + +function TPyDBCommon.GetProperties : PPyObject; +begin + with GetPythonEngine do begin + Result := PyList_New(0); + AppendProperties( Result ); + PyList_Sort(Result); + end; +end; + +procedure TPyDBCommon.AppendProperties( List : PPyObject ); +begin + // Override this method in the subclasses and add your + // properties to the list +end; + +procedure TPyDBCommon.AppendProp( List : PPyObject; const prop : String ); +var + obj : PPyObject; +begin + with GetPythonEngine do begin + obj := PyString_FromString(PAnsiChar(AnsiString(prop))); + PyList_Append( List, obj ); + Py_XDecRef(obj); + end; +end; + +function TPyDBCommon.GetAttr(key : PAnsiChar) : PPyObject; +begin + try + if (CompareText( String(key), '__properties__' ) = 0) or + (CompareText( String(key), '__members__' ) = 0) then + Result := GetProperties + else + Result := inherited GetAttr(key); + except // Remap Delphi exception to a Python exception + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; +end; + +procedure TPyDBCommon.RaiseDBError( E : Exception ); +begin + if GetModule <> nil then + GetModule.RaiseError( AnsiString('DBError'), AnsiString(E.Message) ); +end; + +function TPyDBCommon.EventBelongsToObject( Event : TCallbackSplit ) : Boolean; +begin + Result := Event.Self = Self; +end; + +// ----------------------- TPyDBField ------------------------------------------ + +constructor TPyDBField.Create( APythonType : TPythonType ); +begin + inherited; + SetLength(m_arAnsiTextBuf,0); +end; + +constructor TPyDBField.CreateWith( PythonType : TPythonType; args : PPyObject ); +begin + inherited; + SetLength(m_arAnsiTextBuf,0); +end; + +destructor TPyDBField.Destroy; +begin + SetLength(m_arAnsiTextBuf,0); + if Assigned(FField) then begin + if EventBelongsToObject( TCallbackSplit(FField.OnChange) ) then + FField.OnChange := nil; + if EventBelongsToObject( TCallbackSplit(FField.OnGetText) ) then + FField.OnGetText := nil; + if EventBelongsToObject( TCallbackSplit(FField.OnSetText) ) then + FField.OnSetText := nil; + if EventBelongsToObject( TCallbackSplit(FField.OnValidate) ) then + FField.OnValidate := nil; + end; + FField := nil; + ClearEvent( FOnChange ); + ClearEvent( FOnGetText ); + ClearEvent( FOnSetText ); + ClearEvent( FOnValidate ); + inherited; +end; + +// Then we override the needed services + +function TPyDBField.GetAttr(key : PAnsiChar) : PPyObject; +var + l_pAnsiChar: PAnsiChar; + l_sUpperKey, l_sStr: String; +begin + with GetPythonEngine do begin + if not CheckField then begin + Result := nil; + Exit; + end; + try + l_sUpperKey := UpperCase(String(key)); + if CompareText(l_sUpperKey, 'ALIGNMENT' ) = 0 then + Result := VariantAsPyObject( Integer(FField.Alignment) ) + else if CompareText(l_sUpperKey, 'ASBOOLEAN' ) = 0 then + Result := VariantAsPyObject( FField.AsBoolean ) + else if CompareText(l_sUpperKey, 'ASDATETIME' ) = 0 then + Result := VariantAsPyObject( FField.AsDateTime ) + else if CompareText(l_sUpperKey, 'ASFLOAT' ) = 0 then + Result := VariantAsPyObject( FField.AsFloat ) + else if CompareText(l_sUpperKey, 'ASINTEGER' ) = 0 then + Result := VariantAsPyObject( FField.AsInteger ) + else if CompareText(l_sUpperKey, 'ASSTRING' ) = 0 then + Result := VariantAsPyObject( FField.AsString ) + else if CompareText(l_sUpperKey, 'CANMODIFY' ) = 0 then + Result := VariantAsPyObject( FField.CanModify ) + else if CompareText(l_sUpperKey, 'ConstraintErrorMessage' ) = 0 then + Result := VariantAsPyObject( FField.ConstraintErrorMessage ) + else if CompareText(l_sUpperKey, 'CurValue' ) = 0 then + Result := VariantAsPyObject( FField.CurValue ) + else if CompareText(l_sUpperKey, 'CustomConstraint' ) = 0 then + Result := VariantAsPyObject( FField.CustomConstraint ) + else if CompareText(l_sUpperKey, 'DATASIZE' ) = 0 then + Result := VariantAsPyObject( FField.DataSize ) + else if CompareText(l_sUpperKey, 'DATATYPE' ) = 0 then + Result := VariantAsPyObject( FField.DataType ) + else if CompareText(l_sUpperKey, 'DefaultExpression' ) = 0 then + Result := VariantAsPyObject( FField.DefaultExpression ) + else if CompareText(l_sUpperKey, 'DISPLAYLABEL' ) = 0 then + Result := VariantAsPyObject( FField.DisplayLabel ) + else if CompareText(l_sUpperKey, 'DISPLAYNAME' ) = 0 then + Result := VariantAsPyObject( FField.DisplayName ) + else if CompareText(l_sUpperKey, 'DISPLAYTEXT' ) = 0 then + Result := VariantAsPyObject( FField.DisplayText ) + else if CompareText(l_sUpperKey, 'DISPLAYWIDTH' ) = 0 then + Result := VariantAsPyObject( FField.DisplayWidth ) + else if CompareText(l_sUpperKey, 'EDITMASK' ) = 0 then + Result := VariantAsPyObject( FField.EditMask ) + else if CompareText(l_sUpperKey, 'FIELDKIND' ) = 0 then + Result := VariantAsPyObject( FField.FieldKind ) + else if CompareText(l_sUpperKey, 'FIELDNAME' ) = 0 then + Result := VariantAsPyObject( FField.FieldName) + else if CompareText(l_sUpperKey, 'FIELDNO' ) = 0 then + Result := VariantAsPyObject( FField.FieldNo ) + else if CompareText(l_sUpperKey, 'HASCONSTRAINTS' ) = 0 then + Result := VariantAsPyObject( FField.HasConstraints ) + else if CompareText(l_sUpperKey, 'IMPORTEDCONSTRAINT' ) = 0 then + Result := VariantAsPyObject( FField.ImportedConstraint ) + else if CompareText(l_sUpperKey, 'INDEX' ) = 0 then + Result := VariantAsPyObject( FField.Index ) + else if CompareText(l_sUpperKey, 'ISBLOB' ) = 0 then + Result := VariantAsPyObject( FField.IsBlob) + else if CompareText(l_sUpperKey, 'ISINDEXFIELD' ) = 0 then + Result := VariantAsPyObject( FField.IsIndexField ) + else if CompareText(l_sUpperKey, 'ISNULL' ) = 0 then + Result := VariantAsPyObject( FField.IsNull ) + else if CompareText(l_sUpperKey, 'KEYFFIELDS' ) = 0 then + Result := VariantAsPyObject( FField.KeyFields ) + else if CompareText(l_sUpperKey, 'LOOKUP' ) = 0 then + Result := VariantAsPyObject( FField.Lookup ) + else if CompareText(l_sUpperKey, 'LOOKUPCACHE' ) = 0 then + Result := VariantAsPyObject( FField.LookupCache ) + else if CompareText(l_sUpperKey, 'LOOKUPDATASET' ) = 0 then + Result := ReturnNone + else if CompareText(l_sUpperKey, 'LOOKUPKeyFields' ) = 0 then + Result := VariantAsPyObject( FField.LookupKeyFields ) + else if CompareText(l_sUpperKey, 'LOOKUPLIST' ) = 0 then + Result := ReturnNone + else if CompareText(l_sUpperKey, 'LOOKUPRESULTFIELD' ) = 0 then + Result := VariantAsPyObject( FField.LookupResultField ) + else if CompareText(l_sUpperKey, 'NEWVALUE' ) = 0 then + Result := VariantAsPyObject( FField.NewValue ) + else if CompareText(l_sUpperKey, 'OFFSET' ) = 0 then + Result := VariantAsPyObject( FField.Offset ) + else if CompareText(l_sUpperKey, 'OLDVALUE' ) = 0 then + Result := VariantAsPyObject( FField.OldValue ) + else if CompareText(l_sUpperKey, 'ORIGIN' ) = 0 then + Result := VariantAsPyObject( FField.Origin ) + else if CompareText(l_sUpperKey, 'READONLY' ) = 0 then + Result := VariantAsPyObject( FField.ReadOnly ) + else if CompareText(l_sUpperKey, 'REQUIRED' ) = 0 then + Result := VariantAsPyObject( FField.Required ) + else if CompareText(l_sUpperKey, 'SIZE' ) = 0 then + Result := VariantAsPyObject( FField.Size ) + else if CompareText(l_sUpperKey, 'TEXT' ) = 0 then + Result := VariantAsPyObject( FField.Text ) + else if CompareText(l_sUpperKey, 'VALIDCHARS' ) = 0 then + Result := ReturnNone + else if CompareText(l_sUpperKey, 'VALUE' ) = 0 then begin + if (FField.DataType = ftString) or (FField.DataType = ftWideString) then begin + SetLength(m_arAnsiTextBuf,1); + l_sStr := FField.AsString; + l_pAnsiChar := _PAnsiChar(l_sStr, m_arAnsiTextBuf[0]); + Result := PyString_FromString( l_pAnsiChar ); + end + else + Result := VariantAsPyObject( FField.Value ); + end + else if CompareText(l_sUpperKey, 'VISIBLE' ) = 0 then + Result := VariantAsPyObject( FField.Visible ) + else if CompareText(l_sUpperKey, 'ONCHANGE' ) = 0 then + Result := ReturnEvent( FOnChange ) + else if CompareText(l_sUpperKey, 'ONGETTEXT' ) = 0 then + Result := ReturnEvent( FOnGetText ) + else if CompareText(l_sUpperKey, 'ONSETTEXT' ) = 0 then + Result := ReturnEvent( FOnSetText ) + else if CompareText(l_sUpperKey, 'ONVALIDATE' ) = 0 then + Result := ReturnEvent( FOnValidate ) + else + Result := inherited GetAttr(key); + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBField.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; +var + l_sUpperKey: String; +begin + Result := -1; + with GetPythonEngine do begin + if not CheckField then + Exit; + try + l_sUpperKey := UpperCase(String(key)); + if CompareText(l_sUpperKey, 'ALIGNMENT' ) = 0 then begin + FField.Alignment := TAlignment(PyObjectAsVariant( value )); + Result := 0; + end + else if CompareText(l_sUpperKey, 'ASBOOLEAN' ) = 0 then begin + FField.AsBoolean := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'ASDATETIME' ) = 0 then begin + FField.AsDateTime := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'ASFLOAT' ) = 0 then begin + FField.AsFloat := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'ASINTEGER' ) = 0 then begin + FField.AsInteger := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'ASSTRING' ) = 0 then begin + FField.AsString := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'CANMODIFY' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'CONSTRAINTERRORMESSAGE' ) = 0 then begin + FField.ConstraintErrorMessage := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'CURVALUE' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'CUSTOMCONSTRAINT' ) = 0 then begin + FField.CustomConstraint := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'DATASIZE' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'DATATYPE' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'DEFAULTEXPRESSION' ) = 0 then begin + FField.DefaultExpression := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'DISPLAYLABEL' ) = 0 then begin + FField.DisplayLabel := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'DISPLAYNAME' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'DISPLAYTEXT' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'DISPLAYWIDTH' ) = 0 then begin + FField.DisplayWidth := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'EDITMASK' ) = 0 then begin + FField.EditMask := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'FIELDKIND' ) = 0 then begin + FField.FieldKind := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'FIELDNAME' ) = 0 then begin + FField.FieldName:= PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'FIELDNO' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'HASCONSTRAINTS' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'IMPORTEDCONSTRAINT' ) = 0 then begin + FField.ImportedConstraint := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'INDEX' ) = 0 then begin + FField.Index := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'ISBLOB' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'ISINDEXFIELD' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'ISNULL' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'KEYFIELDS' ) = 0 then begin + FField.KeyFields := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'LOOKUP' ) = 0 then begin + FField.Lookup := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'LOOKUPCACHE' ) = 0 then begin + FField.LookupCache := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'LOOKUPDATASET' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'LOOKUPKEYFIELDS' ) = 0 then begin + FField.LookupKeyFields := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'LOOKUPLIST' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'LOOKUPRESULTFIELD' ) = 0 then begin + FField.LookupResultField := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'NEWVALUE' ) = 0 then begin + FField.NewValue := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'OFFSET' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'OLDVALUE' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'ORIGIN' ) = 0 then begin + FField.Origin := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'READONLY' ) = 0 then begin + FField.ReadOnly := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'REQUIRED' ) = 0 then begin + FField.Required := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'SIZE' ) = 0 then begin + FField.Size := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'TEXT' ) = 0 then begin + FField.Text := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'VALIDCHARS' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'VALUE' ) = 0 then begin + FField.Value := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'VISIBLE' ) = 0 then begin + FField.Visible := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'ONCHANGE' ) = 0 then begin + SetEvent( FOnChange, Value, 'OnChange', 'TField' ); + if Assigned(FOnChange) then + FField.OnChange := OnChange + else + FField.OnChange := nil; + Result := 0; + end + else if CompareText(l_sUpperKey, 'ONGETTEXT' ) = 0 then begin + SetEvent( FOnGetText, Value, 'OnGetText', 'TField' ); + if Assigned(FOnGetText) then + FField.OnGetText := OnGetText + else + FField.OnGetText := nil; + Result := 0; + end + else if CompareText(l_sUpperKey, 'ONSETTEXT' ) = 0 then begin + SetEvent( FOnSetText, Value, 'OnSetText', 'TField' ); + if Assigned(FOnSetText) then + FField.OnSetText := OnSetText + else + FField.OnSetText := nil; + Result := 0; + end + else if CompareText(l_sUpperKey, 'ONVALIDATE' ) = 0 then begin + SetEvent( FOnValidate, Value, 'OnValidate', 'TField' ); + if Assigned(FOnValidate) then + FField.OnValidate := OnValidate + else + FField.OnValidate := nil; + Result := 0; + end + else + Result := inherited SetAttr(key, value); + except + on E : Exception do begin + RaiseDBError( E ); + Result := -1; + end; + end; + end; +end; + +function TPyDBField.Repr: PPyObject; +begin + Result := inherited Repr; +end; + +class procedure TPyDBField.RegisterMethods( PythonType : TPythonType ); +begin + inherited; + with PythonType do begin + AddMethod(AnsiString('Clear'), @TPyDBField.Do_Clear, + AnsiString('DBField.Clear() -> None') ); + AddMethod(AnsiString('FocusControl'), @TPyDBField.Do_FocusControl, + AnsiString('DBField.FocusControl() -> None') ); + AddMethod(AnsiString('IsValidChar'), @TPyDBField.Do_IsValidChar, + AnsiString('DBField.IsValidChar( InputChar : String ) -> True or False') ); + AddMethod(AnsiString('RefreshLookupList'), @TPyDBField.Do_RefreshLookupList, + AnsiString('DBField.RefreshLookupList() -> None') ); + end; +end; + +function TPyDBField.CheckField : Boolean; +begin + if not Assigned(FField) then begin + Result := False; + with GetPythonEngine do + PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('No field defined !') ); + end + else + Result := True; + Result := Result; +end; + +procedure TPyDBField.AppendProperties( List : PPyObject ); +begin + inherited; + AppendProp( List, 'Alignment'); + AppendProp( List, 'AsBoolean'); + AppendProp( List, 'AsDateTime'); + AppendProp( List, 'AsFloat'); + AppendProp( List, 'AsInteger'); + AppendProp( List, 'AsString'); + AppendProp( List, 'CanModify'); + AppendProp( List, 'ConstraintErrorMessage'); + AppendProp( List, 'CurValue'); + AppendProp( List, 'CustomConstraint'); + AppendProp( List, 'DataSize'); + AppendProp( List, 'DataType'); + AppendProp( List, 'DefaultExpression'); + AppendProp( List, 'DisplayLabel'); + AppendProp( List, 'DisplayName'); + AppendProp( List, 'DisplayText'); + AppendProp( List, 'DisplayWidth'); + AppendProp( List, 'EditMask'); + AppendProp( List, 'FieldKind'); + AppendProp( List, 'FieldName'); + AppendProp( List, 'FieldNo'); + AppendProp( List, 'HasConstraints'); + AppendProp( List, 'ImportedConstraint'); + AppendProp( List, 'Index'); + AppendProp( List, 'IsBlob'); + AppendProp( List, 'IsIndexField'); + AppendProp( List, 'IsNull'); + AppendProp( List, 'KeyFields'); + AppendProp( List, 'Lookup'); + AppendProp( List, 'LookupCache'); + AppendProp( List, 'LookupDataset'); + AppendProp( List, 'LookupKeyFields'); + AppendProp( List, 'LookupList'); + AppendProp( List, 'LookupResultField'); + AppendProp( List, 'NewValue'); + AppendProp( List, 'Offset'); + AppendProp( List, 'OldValue'); + AppendProp( List, 'Origin'); + AppendProp( List, 'ReadOnly'); + AppendProp( List, 'Required'); + AppendProp( List, 'Size'); + AppendProp( List, 'Text'); + AppendProp( List, 'ValidChars'); + AppendProp( List, 'Value'); + AppendProp( List, 'Visible'); +end; + +function TPyDBField.Do_Clear( args : PPyObject ) : PPyObject; +begin + with GetPythonEngine do begin + Adjust(@Self); // <- adjust the transmitted self argument + try + if CheckField then begin + FField.Clear; + Result := ReturnNone; + end + else + Result := nil; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBField.Do_FocusControl( args : PPyObject ) : PPyObject; +begin + with GetPythonEngine do begin + Adjust(@Self); // <- adjust the transmitted self argument + try + if CheckField then begin + FField.FocusControl; + Result := ReturnNone; + end + else + Result := nil; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBField.Do_IsValidChar( args : PPyObject ) : PPyObject; +var + c : Char; + s : PAnsiChar; + str : AnsiString; +begin + with GetPythonEngine do begin + Adjust(@Self); // <- adjust the transmitted self argument + try + if CheckField then begin + if PyArg_ParseTuple( args, 's:TField.IsValidChar',@s ) <> 0 then begin + str := s; + if Length(str) > 0 then + c := Char(str[1]) + else + c := #0; + Result := VariantAsPyObject( FField.IsValidChar( c ) ) + end + else + Result := nil; + end + else + Result := nil; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBField.Do_RefreshLookupList( args : PPyObject ) : PPyObject; +begin + with GetPythonEngine do begin + Adjust(@Self); // <- adjust the transmitted self argument + try + if CheckField then begin + FField.RefreshLookupList; + Result := ReturnNone; + end + else + Result := nil; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +procedure TPyDBField.OnChange( Sender : TField ); +begin + IncRef; + ExecuteEvent( FOnChange, [GetSelf] ); +end; + +procedure TPyDBField.OnGetText( Sender: TField; var Text: String; DisplayText: Boolean ); +var + v : PPyObject; +begin + IncRef; + with GetPythonEngine do begin + v := TPyDBVarArg.PyDBVarArgType.CreateInstanceWith( VariantAsPyObject( Text ) ); + Py_XIncRef(v); + try + ExecuteEvent( FOnGetText, [GetSelf, v, DisplayText] ); + with PythonToDelphi(v) as TPyDBVarArg do + Text := PyObjectAsVariant(FValue); + finally + Py_XDecRef(v); + end; + end; +end; + +procedure TPyDBField.OnSetText( Sender : TField; const Text: String ); +begin + IncRef; + ExecuteEvent( FOnSetText, [GetSelf, Text] ); +end; + +procedure TPyDBField.OnValidate( Sender : TField ); +begin + IncRef; + ExecuteEvent( FOnValidate, [GetSelf] ); +end; + +// ----------------------- TPyDBVarArg ----------------------------------------- + +constructor TPyDBVarArg.CreateWith( APythonType : TPythonType; args : PPyObject ); +begin + inherited; + with GetPythonEngine do begin + if PyTuple_Check(args) and (PyTuple_Size(args)>=1) then begin + FValue := PyTuple_GetItem( args, 0 ); + Py_XIncRef(FValue); + end; + end; +end; + +destructor TPyDBVarArg.Destroy; +begin + with GetPythonEngine do + Py_XDecRef(FValue); + inherited; +end; + +function TPyDBVarArg.GetAttr(key : PAnsiChar) : PPyObject; +begin + with GetPythonEngine do begin + if CompareText(String(key), 'Value' ) = 0 then begin + Result := FValue; + if not Assigned(Result) then + Result := Py_None; + Py_XIncRef(Result); + end + else + Result := inherited GetAttr(key); + end; +end; + +function TPyDBVarArg.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; +begin + with GetPythonEngine do begin + if CompareText(String(key), 'Value' ) = 0 then begin + Py_XDecRef(FValue); + FValue := value; + Py_XIncRef(FValue); + Result := 0; + end + else + Result := inherited SetAttr(key, value); + end; +end; + +function TPyDBVarArg.Repr : PPyObject; +begin + with GetPythonEngine do + Result := PyString_FromString( PAnsiChar(AnsiString(PyObjectAsString(FValue))) ); +end; + +// ----------------------- TDSRowsAccess --------------------------------------- + +class function TDSRowsAccess.ExpectedContainerClass: TClass; +begin + Result := TPyDBDataset; +end; + +function TDSRowsAccess.GetContainer: TPyDBDataset; +begin + Result := TPyDBDataset(inherited Container); +end; + +function TDSRowsAccess.GetItem(aIndex: Integer): PPyObject; +var + i : Integer; + l_sStr: String; + l_pAnsiChar: PAnsiChar; + l_oDataset: TFDDataset; +begin + Result := nil; + l_oDataset := GetContainer.GetDelphiObject; + if (aIndex >= 0) and (aIndex < l_oDataset.RecordCount) then begin + with GetPythonEngine do begin + try + l_oDataset.RecNo := AIndex + 1; + Result := PyTuple_New(l_oDataset.FieldCount); + for i := 0 to l_oDataset.FieldCount - 1 do begin + with l_oDataset.Fields[i] do begin + PyTuple_SetItem( Result, i, VariantAsPyObject( Value ) ); + end; + end; + except + on E : Exception do begin + raise Exception.CreateFmt('Exception in TDSRowsAccess.GetItem - Index=%d', [AIndex]); + end; + end; + end; + end; +end; + +function TDSRowsAccess.GetSize: Integer; +var + l_oDataset: TFDDataset; +begin + l_oDataset := GetContainer.GetDelphiObject; + Result := l_oDataset.RecordCount; +end; + +function TDSRowsAccess.IndexOf(AValue: PPyObject): Integer; +var + i : Integer; + S : string; + _obj : TPyObject; + _value : TObject; + _ds : TFDDataset; +begin + Result := -1; + { + with GetPythonEngine do + begin + if PyString_Check(AValue) then + begin + S := PyString_AsDelphiString(AValue); + for i := 0 to Container.ControlCount-1 do + if SameText( Container.Controls[i].Name, S) then + begin + Result := i; + Break; + end; + end + else if IsDelphiObject(AValue) then + begin + _obj := PythonToDelphi(AValue); + if _obj is TPyDelphiObject then + begin + _value := TPyDelphiObject(_obj).DelphiObject; + if _value is TControl then + begin + _ctrl := TControl(_value); + for i := 0 to Container.ControlCount-1 do + if Container.Controls[i] = _ctrl then + begin + Result := i; + Break; + end; + end; + end; + end; + end; + } +end; + +class function TDSRowsAccess.Name: String; +begin + Result := 'DSRows'; +end; + +class function TDSRowsAccess.SupportsIndexOf: Boolean; +begin + Result := True; +end; + +// ----------------------- TPyDBDataset ------------------------------------ + +constructor TPyDBDataset.Create( aPythonType : TPythonType ); +begin + inherited; + if not Assigned(DelphiObject) then + DelphiObject := TFDDataset.Create(Nil); +end; + +constructor TPyDBDataset.CreateWith( aPythonType : TPythonType; args : PPyObject ); +begin + inherited; + if not Assigned(DelphiObject) then + DelphiObject := TFDDataset.Create(Nil); +end; + +destructor TPyDBDataset.Destroy; +var + l_oDataset: TFDDataset; +begin + l_oDataset := DelphiObject; + if Assigned(l_oDataset) then begin + if not ((l_oDataset is TFDTable) or (l_oDataset is TFDQuery)) then begin + DelphiObject := Nil; // <- implizit Free!!! + end; + end; + SetLength(m_arAnsiTextBuf,0); + inherited; +end; + +function TPyDBDataset.GetDelphiObject: TFDDataset; +begin + Result := TFDDataset(inherited DelphiObject); +end; + +procedure TPyDBDataset.SetDelphiObject(const Value: TFDDataset); +begin + inherited DelphiObject := Value; +end; + +function TPyDBDataset.CreateContainerAccess : TContainerAccess; +var + l_ContainerAccessClass : TContainerAccessClass; +begin + l_ContainerAccessClass := TDSRowsAccess; + Result := l_ContainerAccessClass.Create(PyDelphiWrapper, self) +end; + +class function TPyDBDataset.DelphiObjectClass : TClass; +begin + Result := TFDDataset; +end; + +class function TPyDBDataset.GetContainerAccessClass : TContainerAccessClass; +begin + Result := TDSRowsAccess; +end; + +function TPyDBDataset.Get_RowsCount(AContext: Pointer): PPyObject; +begin + with GetPythonEngine do begin + Adjust(@Self); + Result := PyInt_FromLong(DelphiObject.RecordCount); + end; +end; + +function TPyDBDataset.Get_Rows(AContext: Pointer): PPyObject; +begin + with GetPythonEngine do begin + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TDSRowsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); + end; +end; + +class procedure TPyDBDataset.RegisterGetSets( PythonType : TPythonType ); +begin + inherited; + PythonType.AddGetSet(PAnsiChar('RowsCount'), @TPyDBDataset.Get_RowsCount, nil, + PAnsiChar('Returns the count of contained dataset rows'), nil); + PythonType.AddGetSet(PAnsiChar('Rows'), @TPyDBDataset.Get_Rows, nil, + PAnsiChar('Returns an iterator over contained dataset rows'), nil); +end; + +class procedure TPyDBDataset.RegisterMembers( PythonType : TPythonType ); +begin + inherited; +end; + +class procedure TPyDBDataset.RegisterMethods( PythonType : TPythonType ); +begin + inherited; + with PythonType do begin + AddMethod(AnsiString('Fields'), @TPyDBDataset.Do_Fields, + AnsiString('DBDataset.Fields( index : Integer ) -> TField') ); + AddMethod(AnsiString('FieldByName'), @TPyDBDataset.Do_FieldByName, + AnsiString('DBDataset.FieldByName(FieldName: String) -> DBField') ); + AddMethod(AnsiString('FieldNamesAsTuple'), @TPyDBDataset.Do_FieldNamesAsTuple, + AnsiString('DBDataset.FieldNamesAsTuple() -> a tuple containing all field names') ); + AddMethod(AnsiString('FieldsAsTuple'), @TPyDBDataset.Do_FieldsAsTuple, + AnsiString('DBDataset.FieldsAsTuple() -> a tuple containing all TFields') ); + AddMethod(AnsiString('FieldsAsDict'), @TPyDBDataset.Do_FieldsAsDict, + AnsiString('DBDataset.FieldsAsDict() -> a dictionary containing all TFields, with FieldName as Key, and TField as Value') ); + AddMethod(AnsiString('First'), @TPyDBDataset.Do_First, + AnsiString('DBDataset.First() -> None') ); + AddMethod(AnsiString('Last'), @TPyDBDataset.Do_Last, + AnsiString('DBDataset.Last() -> None') ); + AddMethod(AnsiString('Next'), @TPyDBDataset.Do_Next, + AnsiString('DBDataset.Next() -> None') ); + AddMethod(AnsiString('Prior'), @TPyDBDataset.Do_Prior, + AnsiString('DBDataset.Prior() -> None') ); + AddMethod(AnsiString('Locate'), @TPyDBDataset.Do_Locate, + AnsiString('DBDataset.Locate( KeyFields : String, KeyValues : Object or Sequence, Options : TLocateOptions ) -> True or False') ); + AddMethod(AnsiString('Lookup'), @TPyDBDataset.Do_Lookup, + AnsiString('DBDataset.Lookup( KeyFields : String, KeyValues : Object or Sequence, ResultFields : String ) -> a list containing all Result fields') ); + AddMethod(AnsiString('FindKey'), @TPyDBDataset.Do_FindKey, + AnsiString('DBDataset.FindKey( KeyValues : Sequence ) -> True or False') ); + AddMethod(AnsiString('FindNearest'), @TPyDBDataset.Do_FindNearest, + AnsiString('DBDataset.FindNearest( KeyValues : Sequence ) -> None') ); + + end; +end; + +function TPyDBDataset.GetAttr(key : PAnsiChar) : PPyObject; +var + l_sUpperKey: String; + l_oDataset: TFDDataset; +begin + Result := nil; + with GetPythonEngine do begin + try + l_oDataset := DelphiObject; + l_sUpperKey := UpperCase(String(key)); + if CompareText(l_sUpperKey, 'BOF' ) = 0 then + Result := VariantAsPyObject( l_oDataset.BOF ) + else if CompareText(l_sUpperKey, 'CANMODIFY' ) = 0 then + Result := VariantAsPyObject( l_oDataset.CanModify ) + else if CompareText(l_sUpperKey, 'EOF' ) = 0 then + Result := VariantAsPyObject( l_oDataset.EOF ) + else if CompareText( string(key), 'FIELDCOUNT' ) = 0 then + Result := VariantAsPyObject( l_oDataset.FieldCount ) + else if CompareText( string(key), 'RECNO' ) = 0 then + Result := VariantAsPyObject( l_oDataset.RecNo ) + else + Result := inherited GetAttr(key); + except + on E : Exception do begin + RaiseDBError( E ); + Result := Nil; + end; + end; + end; +end; + +function TPyDBDataset.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; +var + l_sUpperKey: String; + l_oDataset: TFDDataset; +begin + Result := -1; + with GetPythonEngine do begin + try + l_oDataset := DelphiObject; + l_sUpperKey := UpperCase(String(key)); + if CompareText(l_sUpperKey, 'FILTER' ) = 0 then begin + l_oDataset.Filter := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'FILTERED' ) = 0 then begin + l_oDataset.Filtered := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'BOF' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'CanModify' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'EOF' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'RECNO' ) = 0 then begin + l_oDataset.RecNo := PyObjectAsVariant( value ); + Result := 0; + end + else + Result := inherited SetAttr(key, value); + except + on E : Exception do begin + RaiseDBError( E ); + Result := -1; + end; + end; + end; +end; + +// Methods + +procedure TPyDBDataset.RaiseDBError( E : Exception ); +begin + if self.GetModule <> nil then + GetModule.RaiseError( AnsiString('DBError'), AnsiString(E.Message) ); +end; + +function TPyDBDataset.Do_Fields( args : PPyObject ): PPyObject; +var + idx : Integer; + fld : TField; + F : TPyDBField; + l_oDataset: TFDDataset; +begin + with GetPythonEngine do begin + // We adjust the transmitted self argument + Adjust(@Self); + l_oDataset := DelphiObject; + try + if PyArg_ParseTuple( args, 'i:DBDataset.Fields',@idx ) <> 0 then begin + if (idx >= 0) and (idx < l_oDataset.FieldCount) then begin + Result := TPyDBField.PyDBFieldType.CreateInstance; + F := PythonToDelphi(Result) as TPyDBField; + F.FField := l_oDataset.Fields[idx]; + end + else begin + Result := nil; + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Value out of range : %d', [idx])))); + end; + end + else + Result := nil; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_FieldByName( args : PPyObject ) : PPyObject; +var + l_sAStr: AnsiString; + s : PAnsiChar; + fld : TField; + F : TPyDBField; + l_oDataset: TFDDataset; +begin + with GetPythonEngine do begin + // We adjust the transmitted self argument + Adjust(@Self); + l_oDataset := DelphiObject; + try + if (PyArg_ParseTuple( args, PAnsiChar('s:DBDataset.FieldByName'),@s ) <> 0) then begin + l_sAStr := AnsiString(s); + fld := l_oDataset.FieldByName(String(l_sAStr)); + if Assigned(fld) then begin + Result := TPyDBField.PyDBFieldType.CreateInstance; + F := PythonToDelphi(Result) as TPyDBField; + F.FField := fld; + end + else begin + Result := nil; + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown field "%s"', [String(s)]))) ); + end; + end + else + Result := nil; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_FieldNamesAsTuple( args: PPyObject): PPyObject; +var + i : Integer; + l_sStr: String; + l_pAnsiChar: PAnsiChar; + l_oDataset: TFDDataset; +begin + with GetPythonEngine do begin + Adjust(@Self); + l_oDataset := DelphiObject; + try + Result := PyTuple_New(l_oDataset.FieldCount); + SetLength(m_arAnsiTextBuf,l_oDataset.FieldCount); + for i := 0 to l_oDataset.FieldCount - 1 do begin + with l_oDataset.Fields[i] do begin + l_sStr := FieldName; + l_pAnsiChar := _PAnsiChar(l_sStr, m_arAnsiTextBuf[i]); + PyTuple_SetItem( Result, i, PyString_FromString( l_pAnsiChar ) ); + end; + end; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_FieldsAsTuple( args: PPyObject): PPyObject; +var + i : Integer; + l_sStr: String; + l_pAnsiChar: PAnsiChar; + l_oDataset: TFDDataset; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); // <- adjust the transmitted self argument + l_oDataset := DelphiObject; + try + Result := PyTuple_New(l_oDataset.FieldCount); + SetLength(m_arAnsiTextBuf,l_oDataset.FieldCount); + for i := 0 to l_oDataset.FieldCount - 1 do begin + if (l_oDataset.Fields[i].DataType = ftString) or + (l_oDataset.Fields[i].DataType = ftWideString) then begin + l_sStr := l_oDataset.Fields[i].AsString; + l_pAnsiChar := _PAnsiChar(l_sStr, m_arAnsiTextBuf[i]); + PyTuple_SetItem( Result, i, PyString_FromString( l_pAnsiChar ) ); + end + else + PyTuple_SetItem( Result, i, VariantAsPyObject( l_oDataset.Fields[i].AsVariant ) ); + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBDataset.Do_FieldsAsDict( args: PPyObject): PPyObject; +var + i : Integer; + l_sStr: String; + l_pAnsiChar: PAnsiChar; + l_oDataset: TFDDataset; + obj : PPyObject; + _fieldName : PPyObject; +begin + with GetPythonEngine do begin + Adjust(@Self); // <- adjust the transmitted self argument + l_oDataset := DelphiObject; + try + Result := PyDict_New; + for i := 0 to l_oDataset.FieldCount - 1 do + with l_oDataset.Fields[i] do begin + obj := VariantAsPyObject( AsVariant ); + _fieldName := VariantAsPyObject(Variant(FieldName)); + PyDict_SetItem( Result, _fieldName, obj ); + Py_XDecRef(obj); + Py_XDecRef(_fieldName); + end; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_First( args : PPyObject ) : PPyObject; +var + l_oDataset: TFDDataset; +begin + with GetPythonEngine do begin + Adjust(@Self); + l_oDataset := DelphiObject; + try + l_oDataset.First; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_Last( args : PPyObject ) : PPyObject; +var + l_oDataset: TFDDataset; +begin + with GetPythonEngine do begin + Adjust(@Self); + l_oDataset := DelphiObject; + try + l_oDataset.Last; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_Next( args : PPyObject ) : PPyObject; +var + l_oDataset: TFDDataset; +begin + with GetPythonEngine do begin + Adjust(@Self); + l_oDataset := DelphiObject; + try + l_oDataset.Next; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_Prior( args : PPyObject ) : PPyObject; +var + l_oDataset: TFDDataset; +begin + with GetPythonEngine do begin + Adjust(@Self); + l_oDataset := DelphiObject; + try + l_oDataset.Prior; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_Locate( args : PPyObject ) : PPyObject; +var + l_oDataset: TFDDataset; + keyFields : PAnsiChar; + keyValues, options : PPyObject; + rslt : Boolean; + vvalues : Variant; + opt : TLocateOptions; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oDataset := DelphiObject; + try + if PyArg_ParseTuple( args, 'sOO:DBDataset.Locate',@keyFields, @keyValues, @options ) <> 0 then begin + if PySequence_Check(options) = 0 then + PyErr_SetString (PyExc_AttributeError^, 'Third argument of Locate must be a sequence.') + else begin + // Prepare the locate options + ListToSet( options, @opt, sizeof(opt) ); + // Create a variant containing the key values + vvalues := PyObjectAsVariant( keyValues ); + // Execute the locate + rslt := l_oDataset.Locate( String(keyFields), vvalues, opt ); + // Return its result + Result := VariantAsPyObject( rslt ); + end; + end; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_Lookup( args : PPyObject ) : PPyObject; +var + l_oDataset: TFDDataset; + keyFields, resultFields : PAnsiChar; + keyValues : PPyObject; + rslt : Variant; + vvalues : Variant; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oDataset := DelphiObject; + try + if PyArg_ParseTuple( args, 'sOs:DBDataset.Lookup',@keyFields, @keyValues, @resultFields ) <> 0 then begin + // Create a variant containing the key values + vvalues := PyObjectAsVariant( keyValues ); + // Execute the lookup + rslt := l_oDataset.Lookup( String(keyFields), vvalues, String(resultFields) ); + // Return its result + Result := VariantAsPyObject( rslt ); + end; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_Refresh( args : PPyObject ) : PPyObject; +var + l_oDataset: TFDDataset; +begin + with GetPythonEngine do begin + Adjust(@Self); + l_oDataset := DelphiObject; + try + l_oDataset.Refresh(); + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBDataset.Do_FindKey( args : PPyObject ) : PPyObject; +var + i : Integer; + V : Variant; + l_oDataset: TFDDataSet; + KeyValues : PPyObject; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oDataset := DelphiObject; + try + if PyArg_ParseTuple( args, 'O:DBDataset.FindKey',@KeyValues ) <> 0 then begin + if PySequence_Check( KeyValues ) <> 0 then begin + V := PyObjectAsVariant( KeyValues ); + l_oDataset.CheckBrowseMode; + l_oDataset.SetKey; + for i := 0 to VarArrayHighBound(V, 1) do + l_oDataset.IndexFields[i].AsVariant := V[i]; + Result := VariantAsPyObject( l_oDataset.GotoKey ); + end + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBDataset.Do_FindNearest( args : PPyObject ) : PPyObject; +var + i : Integer; + V : Variant; + l_oDataset: TFDDataset; + KeyValues : PPyObject; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oDataset := DelphiObject; + try + if PyArg_ParseTuple( args, 'O:DBDataset.FindNearest',@KeyValues ) <> 0 then begin + if PySequence_Check( KeyValues ) <> 0 then begin + V := PyObjectAsVariant( KeyValues ); + l_oDataset.CheckBrowseMode; + l_oDataset.SetKey; + for i := 0 to VarArrayHighBound(V, 1) do + l_oDataset.IndexFields[i].AsVariant := V[i]; + l_oDataset.GotoNearest; + end; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +// ----------------------- TPyDBTable ------------------------------------ + +constructor TPyDBTable.Create( aPythonType : TPythonType ); +begin + if not Assigned(DelphiObject) then begin + DelphiObject := TFDTable.Create(Nil); + self.Owned := True; + end; + inherited; +end; + +constructor TPyDBTable.CreateWith( aPythonType : TPythonType; args : PPyObject ); +begin + if not Assigned(DelphiObject) then begin + DelphiObject := TFDTable.Create(Nil); + self.Owned := True; + end; + inherited; +end; + +destructor TPyDBTable.Destroy; +var + l_oTbl: TFDTable; +begin + l_oTbl := DelphiObject; + if Assigned(l_oTbl) then begin + if l_oTbl.Active then + l_oTbl.Close(); + DelphiObject := Nil; // <- implizit Free!!! + end; + inherited; +end; + +function TPyDBTable.GetDelphiObject: TFDTable; +begin + Result := TFDTable(inherited DelphiObject); +end; + +procedure TPyDBTable.SetDelphiObject(const Value: TFDTable); +begin + inherited DelphiObject := Value; +end; + +class function TPyDBTable.DelphiObjectClass: TClass; +begin + Result := TFDTable; +end; + +class procedure TPyDBTable.RegisterMethods( PythonType : TPythonType ); +begin + inherited; + with PythonType do begin + AddMethod(AnsiString('Open'), @TPyDBTable.Do_Open, + AnsiString('FDTable.Open() -> None') ); + AddMethod(AnsiString('Close'), @TPyDBTable.Do_Close, + AnsiString('FDTable.Close() -> None') ); + AddMethod(AnsiString('Edit'), @TPyDBTable.Do_Edit, + AnsiString('FDTable.Edit() -> None') ); + AddMethod(AnsiString('Insert'), @TPyDBTable.Do_Insert, + AnsiString('FDTable.Insert() -> None') ); + AddMethod(AnsiString('Append'), @TPyDBTable.Do_Append, + AnsiString('FDTable.Append() -> None') ); + AddMethod(AnsiString('Post'), @TPyDBTable.Do_Post, + AnsiString('FDTable.Post() -> None') ); + AddMethod(AnsiString('Cancel'), @TPyDBTable.Do_Cancel, + AnsiString('FDTable.Cancel() -> None') ); + AddMethod(AnsiString('Delete'), @TPyDBTable.Do_Delete, + AnsiString('FDTable.Delete() -> None') ); + AddMethod(AnsiString('SetRangeStart'), @TPyDBTable.Do_SetRangeStart, + AnsiString('FDTable.SetRangeStart() -> None') ); + AddMethod(AnsiString('EditRangeStart'), @TPyDBTable.Do_EditRangeStart, + AnsiString('FDTable.EditRangeStart() -> None') ); + AddMethod(AnsiString('SetRangeEnd'), @TPyDBTable.Do_SetRangeEnd, + AnsiString('FDTable.SetRangeEnd() -> None') ); + AddMethod(AnsiString('EditRangeEnd'), @TPyDBTable.Do_EditRangeEnd, + AnsiString('FDTable.EditRangeEnd() -> None') ); + AddMethod(AnsiString('ApplyRange'), @TPyDBTable.Do_ApplyRange, + AnsiString('FDTable.ApplyRange() -> None') ); + AddMethod(AnsiString('SetRange'), @TPyDBTable.Do_SetRange, + AnsiString('FDTable.SetRange( sequence of RangeStart values, sequence of RangeEnd values ) -> None') ); + AddMethod(AnsiString('CancelRange'), @TPyDBTable.Do_CancelRange, + AnsiString('FDTable.CancelRange() -> None') ); + AddMethod(AnsiString('GetIndexNames'), @TPyDBTable.Do_GetIndexNames, + AnsiString('FDTable.GetIndexNames() -> list of Index Names') ); + end; +end; + +class procedure TPyDBTable.RegisterMembers( PythonType : TPythonType ); +begin + inherited; + //-- PythonType.AddMember( 'Active', mtInt, NativeInt(@TPyDBTable(nil).x), mfDefault, 'Active'); +end; + +class procedure TPyDBTable.RegisterGetSets( PythonType : TPythonType ); +begin + inherited; + //-- PythonType.AddGetSet(PAnsiChar('Active'), @TPyDBTable.Get_Active, @TPyDBTable.Set_Active, + //-- PAnsiChar('Returns/Sets the Active'), nil); +end; + +function TPyDBTable.CheckActiveDBTable(aMustOpen: Boolean): Boolean; +begin + Result := True; + if GetDelphiObject.Active then begin + if not aMustOpen then begin + Result := False; + with GetPythonEngine do + PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('DBTable is open!') ); + end; + end + else begin + if aMustOpen then begin + Result := False; + with GetPythonEngine do + PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('DBTable is not open!') ); + end; + end; +end; + +function TPyDBTable.GetAttr(key : PAnsiChar) : PPyObject; +var + l_sUpperKey: String; + l_sConnectionDefName, l_sDatabaseName: String; + l_oConn: TFDCustomConnection; + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + l_oConn := Nil; + try + l_oTable := DelphiObject; + l_sUpperKey := UpperCase(String(key)); + if CompareText(l_sUpperKey, 'CONNECTIONDEFNAME' ) = 0 then begin + l_oConn := DelphiObject.Connection; + l_sConnectionDefName := DelphiObject.ConnectionName; + if Assigned(l_oConn) then + l_sConnectionDefName := l_oConn.ConnectionName; + Result := VariantAsPyObject( l_sConnectionDefName ) + end + else if CompareText(UpperCase(String(key)), 'DATABASENAME' ) = 0 then begin + l_oConn := DelphiObject.Connection; + if Assigned(l_oConn) then + l_sDatabaseName := l_oConn.Params.Database + else + l_sDatabaseName := ''; + Result := VariantAsPyObject( l_sDatabaseName ) + end + else if CompareText(l_sUpperKey, 'TABLENAME' ) = 0 then + Result := VariantAsPyObject( l_oTable.TableName ) + else if CompareText(l_sUpperKey, 'ACTIVE' ) = 0 then + Result := VariantAsPyObject( l_oTable.Active ) + else if CompareText(l_sUpperKey, 'FILTER' ) = 0 then + Result := VariantAsPyObject( l_oTable.Filter ) + else if CompareText(l_sUpperKey, 'FILTERED' ) = 0 then + Result := VariantAsPyObject( l_oTable.Filtered ) + else if CompareText(l_sUpperKey, 'STATE' ) = 0 then + Result := VariantAsPyObject( Integer(l_oTable.State) ) + else if CompareText(l_sUpperKey, 'MODIFIED' ) = 0 then + Result := VariantAsPyObject( l_oTable.Modified ) + else if CompareText(l_sUpperKey, 'ISRANGED' ) = 0 then + // Ermöglicht das Ermitteln des aktuellen Bereichsfilterungsmodus. + Result := VariantAsPyObject( l_oTable.IsRanged ) + else if CompareText(l_sUpperKey, 'KEYEXCLUSIVE' ) = 0 then + // Ermittelt oder setzt die Einbeziehung der niedrigsten und höchsten Werte in einen gefilterten Bereich. + Result := VariantAsPyObject( l_oTable.KeyExclusive ) + else if CompareText(l_sUpperKey, 'KEYFIELDCOUNT' ) = 0 then + // Ermittelt oder setzt die Anzahl der in der Bereichsfilterung zu verwendenden Indexfelder + Result := VariantAsPyObject( l_oTable.KeyFieldCount ) + else if CompareText(l_sUpperKey, 'INDEXNAME' ) = 0 then + Result := VariantAsPyObject( l_oTable.IndexName ) + else + Result := inherited GetAttr(key); + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBTable.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; +var + i: Integer; + l_sUpperKey: String; + l_sName, l_sConnectionDefName, l_sDatabaseName: String; + l_oConn: TFDCustomConnection; + l_oTable: TFDTable; +begin + Result := -1; + with GetPythonEngine do begin + l_oConn := Nil; + try + l_oTable := DelphiObject; + l_sUpperKey := UpperCase(String(key)); + if CompareText(l_sUpperKey, 'CONNECTIONDEFNAME' ) = 0 then begin + if CheckActiveDBTable(False) then begin + l_sConnectionDefName := UpperCase(PyObjectAsVariant(value)); + for i := 0 to FDManager.ConnectionCount-1 do begin + l_sName := UpperCase(FDManager.Connections[i].ConnectionDefName); + if l_sName = l_sConnectionDefName then begin + l_oConn := FDManager.Connections[i]; + break; + end; + end; + if Assigned(l_oConn) then begin + if l_oTable.Active then + l_oTable.Active := False; + l_oTable.Connection := l_oConn; + end; + Result := 0; + end; + end + else if CompareText(l_sUpperKey, 'DATABASENAME' ) = 0 then begin + if CheckActiveDBTable(False) then begin + l_sDatabaseName := PyObjectAsVariant( value ); + l_oConn := DelphiObject.Connection; + if Assigned(l_oConn) then begin + l_oConn.Params.Database := l_sDatabaseName; + end; + Result := 0; + end; + end + else if CompareText(l_sUpperKey, 'TABLENAME' ) = 0 then begin + if CheckActiveDBTable(False) then begin + l_oTable.TableName := PyObjectAsVariant( value ); + Result := 0; + end; + end + else if CompareText(l_sUpperKey, 'ACTIVE' ) = 0 then begin + l_oTable.Active := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'FILTER' ) = 0 then begin + l_oTable.Filter := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'FILTERED' ) = 0 then begin + l_oTable.Filtered := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'STATE' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'MODIFIED' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'ISRANGED' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'KEYEXCLUSIVE' ) = 0 then begin + // Ermittelt oder setzt die Einbeziehung der niedrigsten und höchsten Werte in einen gefilterten Bereich. + l_oTable.KeyExclusive := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'KEYFIELDCOUNT' ) = 0 then begin + // Ermittelt oder setzt die Anzahl der in der Bereichsfilterung zu verwendenden Indexfelder + l_oTable.KeyFieldCount := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'INDEXNAME' ) = 0 then begin + // Ermittelt oder setzt die Anzahl der in der Bereichsfilterung zu verwendenden Indexfelder + l_oTable.IndexName := PyObjectAsVariant( value ); + Result := 0; + end + else + Result := inherited SetAttr(key, value); + except + on E : Exception do begin + RaiseDBError( E ); + Result := -1; + end; + end; + end; +end; + +function TPyDBTable.Do_Open( args : PPyObject ) : PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); // <- Adjust the transmitted self argument + l_oTable := DelphiObject; + try + l_oTable.Open; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_Close( args : PPyObject ) : PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + l_oTable.Close; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_Edit( args : PPyObject ): PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.Edit; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_Insert( args : PPyObject ): PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.Insert; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_Append( args : PPyObject ): PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.Append; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_Post( args : PPyObject ): PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.Post; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_Cancel( args : PPyObject ): PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.Cancel; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_Delete( args : PPyObject ): PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.Delete; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_SetRangeStart( args : PPyObject ) : PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.SetRangeStart; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_EditRangeStart( args : PPyObject ) : PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.EditRangeStart; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_SetRangeEnd( args : PPyObject ) : PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.EditRangeEnd; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_EditRangeEnd( args : PPyObject ) : PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.EditRangeEnd; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_ApplyRange( args : PPyObject ) : PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.ApplyRange; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_SetRange( args : PPyObject ) : PPyObject; +var + i: Integer; + l_oTable: TFDTable; + l_oPyStartValues, l_oPyEndValues : PPyObject; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active and + (PyArg_ParseTuple( args, 'OO:FDTable.SetRange',@l_oPyStartValues, @l_oPyEndValues ) <> 0) then begin + if PySequence_Check(l_oPyStartValues) = 0 then begin + PyErr_SetString (PyExc_AttributeError^, 'First argument of SetRange must be a sequence.'); + end + else if PySequence_Check(l_oPyEndValues) = 0 then begin + PyErr_SetString (PyExc_AttributeError^, 'Second argument of SetRange must be a sequence.'); + end + else begin + l_oTable.SetRangeStart; + for i := 0 to PySequence_Length(l_oPyStartValues)-1 do + l_oTable.IndexFields[i].Value := PyObjectAsVariant(PySequence_GetItem(l_oPyStartValues, i)); + l_oTable.SetRangeEnd; + for i := 0 to PySequence_Length(l_oPyEndValues)-1 do + l_oTable.IndexFields[i].Value := PyObjectAsVariant(PySequence_GetItem(l_oPyEndValues, i)); + l_oTable.ApplyRange; + end; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_CancelRange( args : PPyObject ) : PPyObject; +var + l_oTable: TFDTable; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + try + if l_oTable.Active then begin + l_oTable.CancelRange; + Result := ReturnNone; + end; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBTable.Do_GetIndexNames( args : PPyObject ) : PPyObject; +var + l_oTable: TFDTable; + L : TStringList; +begin + Result := nil; + L := Nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oTable := DelphiObject; + L := TStringList.Create; + try + l_oTable.GetIndexNames( L ); + Result := GetPythonEngine.StringsToPyList( L ); + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; + if Assigned(L) then + L.Free; +end; + +// --------------------- TPyDBQuery -------------------------------------------- + +constructor TPyDBQuery.Create( aPythonType : TPythonType ); +begin + if not Assigned(DelphiObject) then begin + DelphiObject := TFDQuery.Create(Nil); + self.Owned := True; + end; + inherited; +end; + +constructor TPyDBQuery.CreateWith( aPythonType : TPythonType; args : PPyObject ); +begin + if not Assigned(DelphiObject) then begin + DelphiObject := TFDQuery.Create(Nil); + self.Owned := True; + end; + inherited; +end; + +destructor TPyDBQuery.Destroy; +var + l_oQry: TFDQuery; +begin + l_oQry := DelphiObject; + if Assigned(l_oQry) then begin + if l_oQry.Active then + l_oQry.Close(); + DelphiObject := Nil; // <- implizit Free!!! + end; + inherited; +end; + +function TPyDBQuery.GetDelphiObject: TFDQuery; +begin + Result := TFDQuery(inherited DelphiObject); +end; + +procedure TPyDBQuery.SetDelphiObject(const Value: TFDQuery); +begin + inherited DelphiObject := Value; +end; + +class function TPyDBQuery.DelphiObjectClass : TClass; +begin + Result := TFDQuery; +end; + +class procedure TPyDBQuery.RegisterMethods( PythonType : TPythonType ); +begin + inherited; + with PythonType do begin + AddMethod(AnsiString('Open'), @TPyDBQuery.Do_Open, + AnsiString('FDQuery.Open() -> None') ); + AddMethod(AnsiString('Close'), @TPyDBQuery.Do_Close, + AnsiString('FDQuery.Close() -> None') ); + AddMethod(AnsiString('Prepare'), @TPyDBQuery.Do_Prepare, + AnsiString('FDQuery.Prepare() -> None') ); + AddMethod(AnsiString('Unprepare'), @TPyDBQuery.Do_Unprepare, + AnsiString('FDQuery.Unprepare() -> None') ); + AddMethod(AnsiString('ExecSQL'), @TPyDBQuery.Do_ExecSQL, + AnsiString('FDQuery.ExecSQL() -> None') ); + end; +end; + +class procedure TPyDBQuery.RegisterMembers( PythonType : TPythonType ); +begin + inherited; + //-- PythonType.AddMember( 'Active', mtInt, NativeInt(@TPyDBTable(nil).x), mfDefault, 'Active'); +end; + +class procedure TPyDBQuery.RegisterGetSets( PythonType : TPythonType ); +begin + inherited; + //-- PythonType.AddGetSet(PAnsiChar('Active'), @TPyDBTable.Get_Active, @TPyDBTable.Set_Active, + //-- PAnsiChar('Returns/Sets the Active'), nil); +end; + +function TPyDBQuery.CheckActiveDBQuery(aMustOpen: Boolean): Boolean; +begin + Result := True; + if GetDelphiObject.Active then begin + if not aMustOpen then begin + Result := False; + with GetPythonEngine do + PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('DBQuery is open!') ); + end; + end + else begin + if aMustOpen then begin + Result := False; + with GetPythonEngine do + PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('DBQuery is not open!') ); + end; + end; +end; + +function TPyDBQuery.GetAttr(key : PAnsiChar) : PPyObject; +var + i: Integer; + l_sUpperKey, l_sStr: String; + l_sConnectionDefName, l_sDatabaseName: String; + l_pAnsiChar: PAnsiChar; + l_oConn: TFDCustomConnection; + l_oQuery: TFDQuery; +begin + Result := nil; + with GetPythonEngine do begin + l_oConn := Nil; + try + l_oQuery := DelphiObject; + l_sUpperKey := UpperCase(String(key)); + if CompareText(l_sUpperKey, 'CONNECTIONDEFNAME' ) = 0 then begin + l_oConn := DelphiObject.Connection; + l_sConnectionDefName := DelphiObject.ConnectionName; + if Assigned(l_oConn) then + l_sConnectionDefName := l_oConn.ConnectionName; + Result := VariantAsPyObject( l_sConnectionDefName ) + end + else if CompareText(UpperCase(String(key)), 'DATABASENAME' ) = 0 then begin + l_oConn := DelphiObject.Connection; + if Assigned(l_oConn) then + l_sDatabaseName := l_oConn.Params.Database + else + l_sDatabaseName := ''; + Result := VariantAsPyObject( l_sDatabaseName ) + end + else if CompareText(l_sUpperKey, 'PARAMCOUNT' ) = 0 then + Result := VariantAsPyObject( l_oQuery.ParamCount ) + else if CompareText(l_sUpperKey, 'ACTIVE' ) = 0 then + Result := VariantAsPyObject( l_oQuery.Active ) + else if CompareText(l_sUpperKey, 'PREPARED' ) = 0 then + Result := VariantAsPyObject( l_oQuery.Prepared ) + else if CompareText(l_sUpperKey, 'SQL' ) = 0 then begin + Result := PyTuple_New(l_oQuery.SQL.Count); + SetLength(m_arAnsiTextBuf,l_oQuery.SQL.Count); + for i := 0 to l_oQuery.SQL.Count - 1 do begin + l_sStr := l_oQuery.SQL[i]; + l_pAnsiChar := _PAnsiChar(l_sStr, m_arAnsiTextBuf[i]); + PyTuple_SetItem( Result, i, PyString_FromString( l_pAnsiChar ) ); + end; + end + else + Result := inherited GetAttr(key); + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; +end; + +function TPyDBQuery.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; +var + i, j: Integer; + l_sUpperKey, l_sText, l_sStr, l_sSql: String; + l_sName, l_sConnectionDefName, l_sDatabaseName: String; + l_oConn: TFDCustomConnection; + l_oQuery: TFDQuery; + l_pPyObj: PPyObject; +begin + Result := -1; + with GetPythonEngine do begin + l_oConn := Nil; + try + l_oQuery := DelphiObject; + l_sUpperKey := UpperCase(String(key)); + if CompareText(l_sUpperKey, 'CONNECTIONDEFNAME' ) = 0 then begin + if CheckActiveDBQuery(False) then begin + l_sConnectionDefName := UpperCase(PyObjectAsVariant(value)); + for i := 0 to FDManager.ConnectionCount-1 do begin + l_sName := UpperCase(FDManager.Connections[i].ConnectionDefName); + if l_sName = l_sConnectionDefName then begin + l_oConn := FDManager.Connections[i]; + break; + end; + end; + if Assigned(l_oConn) then begin + if l_oQuery.Active then + l_oQuery.Active := False; + l_oQuery.Connection := l_oConn; + end; + Result := 0; + end; + end + else if CompareText(l_sUpperKey, 'DATABASENAME' ) = 0 then begin + if CheckActiveDBQuery(False) then begin + l_sDatabaseName := PyObjectAsVariant( value ); + l_oConn := DelphiObject.Connection; + if Assigned(l_oConn) then begin + l_oConn.Params.Database := l_sDatabaseName; + end; + Result := 0; + end; + end + else if CompareText(l_sUpperKey, 'PARAMCOUNT' ) = 0 then begin + Result := 0; + end + else if CompareText(l_sUpperKey, 'ACTIVE' ) = 0 then begin + l_oQuery.Active := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'PREPARED' ) = 0 then begin + l_oQuery.Prepared := PyObjectAsVariant( value ); + Result := 0; + end + else if CompareText(l_sUpperKey, 'SQL' ) = 0 then begin + if not PyList_Check(value) then + raise EPythonError.Create('the python object is not a list'); + l_sSql := ''; + for i := 0 to PyList_Size( value ) - 1 do begin + l_pPyObj := PyList_GetItem( value, i ); + l_sStr := PyObjectAsString( l_pPyObj ); + for j := 1 to Length(l_sStr) do begin + if (l_sStr[j] > #0) and (l_sStr[j] <= #13) then + l_sStr[j] := ' '; + end; + if (Length(l_sSql) > 0) and (l_sSql[Length(l_sSql)] <> ' ') then + l_sSql := l_sSql + ' '; + l_sSql := l_sSql + l_sStr; + end; + l_oQuery.SQL.Clear; + l_oQuery.SQL.Add(l_sSql); + l_sText := l_oQuery.SQL.Text; + Result := 0; + end + else + Result := inherited SetAttr(key, value); + except + on E : Exception do begin + RaiseDBError( E ); + Result := -1; + end; + end; + end; +end; + +function TPyDBQuery.Do_Open( args : PPyObject ) : PPyObject; +var + l_oQuery: TFDQuery; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); // <- Adjust the transmitted self argument + l_oQuery := DelphiObject; + try + l_oQuery.Open; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBQuery.Do_Close( args : PPyObject ) : PPyObject; +var + l_oQuery: TFDQuery; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oQuery := DelphiObject; + try + l_oQuery.Close; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBQuery.Do_Prepare( args : PPyObject ) : PPyObject; +var + l_oQuery: TFDQuery; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oQuery := DelphiObject; + try + l_oQuery.Prepare; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBQuery.Do_Unprepare( args : PPyObject ) : PPyObject; +var + l_oQuery: TFDQuery; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oQuery := DelphiObject; + try + l_oQuery.Unprepare; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +function TPyDBQuery.Do_ExecSQL( args : PPyObject ) : PPyObject; +var + l_oQuery: TFDQuery; +begin + Result := nil; + with GetPythonEngine do begin + Adjust(@Self); + l_oQuery := DelphiObject; + try + l_oQuery.ExecSQL; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; +end; + +// ----------------------------------------------------------------------------- + +initialization +begin + //-- RegisteredUnits.Add( TPyDSRowsRegistration.Create ); + //-- Classes.RegisterClasses([TPyDBTable]); +end; + +finalization +begin + { + if Assigned(g_oDBFieldType) then begin + g_oDBFieldType.Free; + g_oDBFieldType := Nil; + end; + if Assigned(g_oDBVarArgType) then begin + g_oDBVarArgType.Free; + g_oDBVarArgType := Nil; + end; + if Assigned(g_oDBTableType) then begin + g_oDBTableType.Free; + g_oDBTableType := Nil; + end; + if Assigned(g_oDBQueryType) then begin + g_oDBQueryType.Free; + g_oDBQueryType := Nil; + end; + if Assigned(g_oDBModule) then begin + g_oDBModule.Free; + g_oDBModule := Nil; + end; + } +end; + +end. diff --git a/PythonForDelphi/Demos/Demo01/Project1_Icon.ico b/PythonForDelphi/Demos/Demo01/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo02/Project1_Icon.ico b/PythonForDelphi/Demos/Demo02/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1998c2db4f9d3c870f5dc2715f351a4b348b459b GIT binary patch literal 766 zcmaKqyK2KQ6o!A-#TrvnD4m*&9aB1V$dFEXfxdvdXz>yV#03xaH8JZaCjlJ?fc?;C-O)_f`S?P*r~7$R$;w zZCg65e6ZH7D0XLZLuhGwwO`8oKgTc4_%!^;O3X(t`#=H5K0(b9_ebO@ynz7=?O6L% zHBU?}oP~g?X@o;SVT|#dNiB6?Eu7?L=KY?v4*O}@V61iS>uK#aAZy{g7ETVlIO8&J z&f-gB>eGC3;}{|T%``^-h#c`e#cVNqqFW_8i>@D+>20m&E}jKxm^>tPHsEE+fwCy2 z8Iz??V1$c;8n`Qw6LVKCV+oLwayXjU6h`z)@o=X!7UKFb*jCwt)?I6hZ pK9d#jz6ORtU9wZB{X@>T7jqO9Z-Cb=u-PHn+A7}JRfo^d+HY9lw=e(z literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo03/Project1_Icon.ico b/PythonForDelphi/Demos/Demo03/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo04/Project1_Icon.ico b/PythonForDelphi/Demos/Demo04/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo05/Project1_Icon.ico b/PythonForDelphi/Demos/Demo05/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo06/Project1_Icon.ico b/PythonForDelphi/Demos/Demo06/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo07/Project1_Icon.ico b/PythonForDelphi/Demos/Demo07/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo07/Project1_Icon1.ico b/PythonForDelphi/Demos/Demo07/Project1_Icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo08/Project1_Icon.ico b/PythonForDelphi/Demos/Demo08/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo09/Project1_Icon.ico b/PythonForDelphi/Demos/Demo09/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo09/ProjectGroup1.groupproj b/PythonForDelphi/Demos/Demo09/ProjectGroup1.groupproj new file mode 100644 index 00000000..29ccb633 --- /dev/null +++ b/PythonForDelphi/Demos/Demo09/ProjectGroup1.groupproj @@ -0,0 +1,48 @@ + + + {DE1835E8-3F23-495E-987E-5FADD5840B51} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PythonForDelphi/Demos/Demo09/demodll.res b/PythonForDelphi/Demos/Demo09/demodll.res new file mode 100644 index 0000000000000000000000000000000000000000..98b439876305a9880901a0e024eb21a50b6ad12e GIT binary patch literal 628 zcmZvaPfNo<5XE042kWUvj~+Zrgd7wEDO4p;|4>7((l%8BX(F+HJim>1FFhN7vvFxt zIxxxX&YL%HcUF>4@TO^J7GBg%&WEdQ}B5a+pXlsxI*u4W{Tqhtzuf zkeUz89nU*_Ikly0laX1n%HS=GuTwW6TT{8gpX&^acWI sys@{fwk#~GWi7Vl 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�AZLM`1#%Y1Ss-VD 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�AZLM`1#%Y1S>V63 z0CHbtM~Q(eJL>15Iu5YL#xz*{A^?d58;KsK?GrN}rtK3m9|l^?>6l&&3v>jaHDH5J zEA4!MZ+B9t7HA>ZqjTJeH_?^j7?4NZ9B5mMJPH&AMlR-1$)SS7LJqVsL>`5OG-?8c zfI#~Ug=xUUAOL%VFo{D62Vg5O68IkknFEk=7=lGSLJ + + {1D701B96-D47C-4AD0-BE2E-830C95586BC9} + Demo10.dpr + Debug + DCC32 + 18.3 + VCL + True + Win64 + 2 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo10.exe + 00400000 + x86 + Demo10 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1032 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + .\$(Platform)\$(Config) + ..\..\Components\Sources\Core;$(DCC_UnitSearchPath) + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + Demo10_Icon1.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Demo10_Icon1.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + true + + + true + true + + + DEBUG;USE_FASTMM4_LEAK_MONITOR;FullDebugMode;LogMemoryLeakDetailToFile;$(DCC_Define) + + + Debug + + + true + true + true + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + true + true + true + 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= + false + + + + MainSource + + +
Main
+
+ + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + VCLApplication + + + + Demo10.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1032 + 1253 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Embarcadero Bibliothekskomponenten (Entwurf) + Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver + Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server + Security Manager for Microsoft Outlook, VCL Edition (Delphi 10.2 Tokyo) + + + + False + False + False + True + + + + + Demo10.exe + true + + + + + 1 + + + Contents\MacOS + 0 + + + + + classes + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + + + res\values + 1 + + + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + 12 + + + + diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.res b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.res new file mode 100644 index 0000000000000000000000000000000000000000..b51b21ff26650088b16b2936848703bee07aeb1f GIT binary patch literal 3200 zcmbtX&rjP{9RFsZ0o6Ksn6%yMMLSHBoY;vI5)`1Qv@{#6Rms?Ka_ncYme`r?K+rUi zokGf5Z+u?6w{%LDj0>=e;;ih{}-K7oMNr_w)Jwc;EMZwjm;t z(8I9TaeJY?O!V;^;9!EL(A0RJ^fIC0cAeJfCtUB)L)?|=K7EgQ8P~hG=k1U2f8P>u z{hp2fxFAp>Zm^F;BC0@;fW3e`vdN(hShJ}{43-_T$OTam9ECJQRYcbi1CJhIA2rae~Q`2 zXCQDo+6fozbHYlm@%fd6XG0da!pe|^TPW&NK{yrdgb23xTjzU`3yy=(*=v&^2pojg zB+`k^N9&Im2_-U)P-)(>Xsr z>^^}$Euk&%?LL0}`mp-~bM80joF5$@ABg!l$2*UXkB++Cr@#^5X>i^>dUXH;T!G`u zUCa&yPFx{))ja@T;1QwQJ?!B^BRB&i!nxqq{psC#5?X2fNo=^AHBgrcfUJTPT z*ZwmM!{1*_hwYQGu#E~q-#sB(_>1T!f}M`~1m?Vt{a*)ng7~djQI0{m*%ImN{ixoSEk$I=?AfB%Fwysry)U-G%ijBKSc?8 z`Y}ak>5KR*4L@H?3$1!h+G3t>yUtuvO({u#if;cAda;YyLnXu7G?>;lBaWXjYNs@7PYo{h6Ue^0{KJn%7iKGYm^LtpT&9 zI~z@X1CGBL2pgVjFyD8*MbFr@17-wGPcYKalGE>8GqO9#jmTBtHT|IMSZ;qmuP8Xw zN^f6$W;8uyEKa4zerci%nfbu8x9l3*V16INUd8C078H4Lt*|Xti&HB}H9nt9>VDbT zLQcHFVkN0*FB*Kkb4g3D`D_41%N1psj(vDPm0P&TDS2? zkYpKAK|f+J^ZuGtHs_MRvW%jtT5d*Gb6Q^3vPMqUa~6{orC>6~vS!v&eoLlBJn!Rv z=5p8BoSH3Ei@KaMi*RjKO}W4_rmSZ)P03_(Rxzt{*YCOT!sVVdJ!54GEGy@-)uOCv znkrZIq9L34qN(Yco@d#@hj>n@m-|+&{7l}M$;$P!C>jG1(8C}iDRjZms!dXE^`g5{Yu*{sIt2w>BK`w5j literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon.ico b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon1.ico b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Example1.py b/PythonForDelphi/Demos/Demo10_FireDAC/Example1.py new file mode 100644 index 00000000..0c47eb89 --- /dev/null +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Example1.py @@ -0,0 +1,65 @@ +import DBFireDac + +# Create and open the table +T = DBFireDac.CreateFDTable() +T.ConnectionDefName = "SQLite_DB" +T.TableName = "Customer" +T.Active = True #or use T.Open() + +# Display columns +print ("Columns: ", T.FieldNamesAsTuple()) + +LastInvoiceDate = T.FieldByName("LastInvoiceDate") + +# For each record of the table +T.First() +while not T.EOF: + # Get all the fields in a list + A = [] + for i in range( 0, T.FieldCount ): + A.append( T.Fields(i).Value ) + # Print the current record number and the list + print ("Rec.", T.RecNo, ":", A) + # Edit record + T.Edit() + T.FieldByName("TaxRate").Value = 2.5 + # Increments date by one day + D = LastInvoiceDate.Value + if D[2] < 28: + D2 = D[:2]+(D[2]+1,)+D[3:] # this is tuple arithmetic ! + else: + D2 = D[:2]+(1,)+D[3:] # this is tuple arithmetic ! + LastInvoiceDate.Value = D2 + T.Post() + # Get next record + T.Next() + +# Print some fields by their names +F = T.FieldByName("Company") +print (F, F.FieldName, "=", F.Value) + +# Use the TFields and print the list of companies +T.First() +while not T.EOF: + print (F.AsString) + T.Next() + +# Print the fields as a dictionary +D = T.FieldsAsDict() +print (D) +print ("COMPANY:", D["COMPANY"]) # <- case-sensitive + +T.Close() + +T.TableName = "Dummy" +try: + T.Open() +except DBFireDac.DBError: + print ("could not open table ", T.TableName) + +#delete fields +del F +del LastInvoiceDate + +# delete the table +del T diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Example2.py b/PythonForDelphi/Demos/Demo10_FireDAC/Example2.py new file mode 100644 index 00000000..3b6ef1e1 --- /dev/null +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Example2.py @@ -0,0 +1,76 @@ +import DBFireDac + +# Get the TTable object associated to +# the delphi table displayed on right +# It is done when you click on Execute +T = DBFireDac.T + +# Display TableName +print ("TableName: ", T.TableName) + +# Display columns +print ("Columns: ") +for i in T.FieldNamesAsTuple(): + print (" ", i) + +T.CancelRange() +# For each record of the table +for i in T: # <- required ContainerAccess !!! + print ("Rec.", T.RecNo, ":", i) + +# Print some fields by their names +print ("Rec.", T.RecNo, ": ", "Company: ", T.FieldByName("Company").Value) + +# check state +if not T.State in [DBFireDac.dsEdit, DBFireDac.dsInsert]: + print ("Table is not edited") + +# access the table like an array +print ("Index 10; Row 11: ", T[10]) # Row 11 <- required ContainerAccess !!! +print ("Index 10; Row 11 - First field: ", T[10][1]) # second field of row 11 <- required ContainerAccess !!! + +# locate a record +if T.Locate( "City;State", ["Largo","FL"], [] ): + print ("Found RecNo:", T.RecNo, " for Locate(Key: 'City;State', Value: [Largo,FL])") +if T.Locate( "Company", "BLUE SPORTS", [DBFireDac.loCaseInsensitive] ): + print ("Found RecNo:", T.RecNo, " for Locate(Key: 'Company', Value: [BLUE SPORTS])") +if T.Locate( "Company", "ISLAND", [DBFireDac.loCaseInsensitive, DBFireDac.loPartialKey] ): + print ("Found RecNo:", T.RecNo, " for Locate(Key: 'Company', Value: [ISLAND])") + +# lookup a record +print ("Lookup 'CustNo;Company' for Key: 'City;State', Value: [Largo,FL] -> ", T.Lookup( "City;State", ["Largo","FL"], "CustNo;Company" )) + +# define a range +print ("-----------------------------------------------------------") +print ("Names of Indexes:", T.GetIndexNames()) +T.IndexName = "SK1_CUSTOMER" +T.SetRange( ["Unisco"], ["Unisco"] ) +for i in T: + print ("Rec.", T.RecNo, ":", i) +T.CancelRange() + +print ("-----------------------------------------------------------") +# Find a record +if T.FindKey( ['Unisco'] ): + print ("Unisco found !") +else: + print ("Could not find Unisco !") + +# Find the nearest record +T.FindNearest( ['Ocean'] ) +print ("Find nearest Ocean :", T.FieldsAsTuple()) + +# Print all doc strings of an instance's methods +def PrintDocOf( inst ): + print ("--------------------- Type ", type(inst).__name__, "---------------------") + if type(inst).__doc__: + print (type(inst).__doc__) +print ("-----------------------------------------------------------") +print ("Documentation:") +print +print ("Module DBFireDac:") +print (DBFireDac.__doc__) +PrintDocOf(T) +print ("-----------------------------------------------------------") + + diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Example3.py b/PythonForDelphi/Demos/Demo10_FireDAC/Example3.py new file mode 100644 index 00000000..419f64d4 --- /dev/null +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Example3.py @@ -0,0 +1,54 @@ +import DBFireDac +from datetime import datetime + +# Get the TTable object associated to +# the delphi table displayed on right +# It is done when you click on Execute +T = DBFireDac.T + +# Display columns +print ("Columns: ") +for i in T.FieldNamesAsTuple(): + print (" ", i) + +# For each record of the table +print ("Company name for each record of table : ") +T.First() +while not T.EOF: + # Print the current record number and the Company + print ("Rec.", T.RecNo, "; Company: ", T.FieldByName("Company").Value) + # Get next record + T.Next() + +# check state +if not T.State in [DBFireDac.dsEdit, DBFireDac.dsInsert]: + print ("Table is not edited") + +# Find and edit a record +T.IndexName = "SK1_CUSTOMER" +if T.FindKey( ['Unisco'] ): + print ("Unisco found !") + T.Edit() + T.FieldByName('ADDR2').AsString = 'Egal' + T.FieldByName('LASTINVOICEDATE').AsDateTime = datetime.today() + T.Post() + print ("New values for ADDR2='", T.FieldByName('ADDR2').AsString, "'and LASTINVOICEDATE=", T.FieldByName('LASTINVOICEDATE').AsString) +else: + print ("Could not find Unisco !") + +# New Company: Append or Delete +if T.FindKey( ['Test-Company'] ): + # Delete record + T.Delete() + print ("New Company 'Test-Company' deleted !") +else: + # New record + T.Append() + T.FieldByName('COMPANY').AsString = 'Test-Company' + T.FieldByName('ADDR1').AsString = 'Marktplatz 1' + T.FieldByName('CITY').AsString = 'Köln' + T.FieldByName('LASTINVOICEDATE').AsDateTime = datetime.today() + T.Post() + print ("New Company 'Test-Company' created !") + + diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Example4.py b/PythonForDelphi/Demos/Demo10_FireDAC/Example4.py new file mode 100644 index 00000000..25a1183b --- /dev/null +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Example4.py @@ -0,0 +1,30 @@ +import DBFireDac + +# Create and open the Query +Q = DBFireDac.CreateFDQuery() +Q.ConnectionDefName = "SQLite_DB" +Q.SQL = [ +"select *", +" from ORDERS" ] + +Q.Open() # or Q.Active = True + +# Display columns +print ("Columns: ", Q.FieldNamesAsTuple()) +# For each record of the table +Q.First() +while not Q.EOF: + # Get all the fields in a list + A = [] + for i in range( 0, Q.FieldCount ): + A.append( Q.Fields(i).AsString ) + # Print the current record number and the list + print ("Rec.", Q.RecNo, ":", A) + # Get next record + Q.Next() +# +Q.Close() + +# delete the Query +del Q + diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/FDDrivers.ini b/PythonForDelphi/Demos/Demo10_FireDAC/FDDrivers.ini new file mode 100644 index 00000000..6711ca60 --- /dev/null +++ b/PythonForDelphi/Demos/Demo10_FireDAC/FDDrivers.ini @@ -0,0 +1,19 @@ +[ADDrivers.ini] +Encoding=UTF8 + +[OraXE] +BaseDriverID=Ora +VendorHome=XE + +[MSSQL_2005] +BaseDriverID=MSSQL +ODBCDriver=SQL SERVER + +[MSSQL_2008] +BaseDriverID=MSSQL +ODBCDriver=SQL Server Native Client 11.0 + +[MSSQL_2012] +BaseDriverID=MSSQL +ODBCDriver=SQL Server Native Client 11.0 + diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.dfm b/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.dfm new file mode 100644 index 0000000000000000000000000000000000000000..fb6fd36f9eb0281c7858974145bb70909e12a8d3 GIT binary patch literal 8255 zcmeHMOK%&=5grb$89pV-iFfTJi%fE|fdykra&{5G2RAeR7}>c?<~B4sO%4S2KBf$Hf;RabS@ zSJl;DmMs6E(K)nk*KT{3<@fe(ulWav&@1X^A0LbSudTe##`)h^ZVQbCVbpoAjYrJ8 zbKCoo*KT@eL=3$>!f_h~UZdBkv?7A3c!0^tP~?AWm-Y7(5{hB|v;10%MU1<}AZiM_ zhXP#LV^q{zL&Re&+>Q3`UgK!r|8eU<<57RtFX>UWrV>O?2o2epkEf!n1~eD@A4TUe7YjWW6Dg9rK4$%ZV@zAHbr|W= zHjV{nGZ*;qk@;}Cv_E8LZbA0RR<%c_IEs6icW5xQpO)m#%$}-N(eIBVA|$<}ap#KE zsjXG|x7=Ey6~`=coz{fMpr1m(AFD-cjfk93w}7H16M~J(yHg+<5Frocd%0@zsVV)@ zwt(#;5)5}kB8o|4f$cw+*yew4ooBOnDwW1zzw<_pq|`$kR4$LNP=X_1QPc!WaGf{? zd4~lb4b)lLR^bWb;S-L=g)5&hHnKy@a{L~mIC9kQ4>PK@ttHLgG7_$#2sD?{%>k8t zGyp2<_pYXLQ`)>;(^Twway-?!4;0!+paF`pWx0NH0w+UD13~*A?fYOjib(!}t*Dd? zm4^wH8*?gGL!Mvk#rk&N_t@HZJ|2bD`1cIDmxxy{Nx%7t^i#w^|Xg^Px z*#(ehh$u|o%&^g2AWuRfr8U<}ad(PF;|P0qRyolJTD_m=l)#peGyjKNC2+(qD5K!_XHmJ9W zLq@^D7Tnw%{@=~v8$12g^5Fntp0~(zzHW}Wq|E61hSJXxN_Jyzj$h2p(ThRG*qgD5 z2Mtd!526Od6WPN(c1AsauMLI`rppFD!GZ7)4ZSnQpXoSBM7>(7mJ)hf7t%vZgaYt* zAc#ZB713(RlYb}z{^87QBlOxh8V^aj_~zLVf`K&hS-b9GkmKq)t}5!Xshe2SwkXoAZ4&vn65CASdX5MsX=Qz7 zWo{*mdC;1~kXm7$ikI8;iHPtE;dLW3Wf@#+>1YD2>uJ}DR5e4+0PBST$|zW+k#A>! zvcFCNYL$1Vh&cD|?N#2r^V+=I;KUpEZq3Jj&ECCzfp=?D&%dH~ms3yQ`l>j$(eMAA zyZ%;WpR1hv?sDkfS>@cucwcf;xlHIblop*k|Dv?_m7}*tB)j%{qxVkY-xu7u4A-~V z>T_SKkY-);b&`JnsMDe2iGVy1e!sb@vv@>Fz(U;V7K@M2nVwm2^ndq!6{;r#lg zvQrnwN}9a_n_^}IoHHJ;Ti3d@aSSQ&;v)CES%NDj=&*iWT`2OmLD;ep)}M`WS-_9E zC|*j^cQXrKEa;8Q%*8ElwppNW-1CdK^U#M2pSgv>mOLV>E+Z(&#p)_}{x+GEdAs^< zOK42sLaC3a?%b8c#+;2Y7X-)Z>N~=4}}uMR~R;HkUJ|K6&K-OjHiv&DZ|k3~ZW4z0d!IfM8S9`iNm5F9>QD2l9i z<_p2BBPc-Yaz)wNm=7d9oAaJN{&a$AfXjtA-pBMr452{T5qM7o*4X)q$fTU9H`GjCg~etUTKlp)b4U<%hO~JWW2Sq(R|P zz>^?gxEBMyL21)q{0t^W6a2pC{6JS3Wmz;p)RQGiUHIe#YNLSl@N@(9Y*{W<4+740 zn1%SsM1~qU4xhWH(5^clkYiQm6Hv;7`D3UM3l%x^rr!66fKqA{EsVe}oMN)8Y(y!{ zb@i1x{b73gRVXOS#~vvC!b4>#ZLY)185*TUbZ4W@;dzF4+V|jL2=wk;mC;4MQQead zw)J>B95|cutpGt8nL~`ccjWJVXqERFq*^`BMq^RXxbjrt%3q);zX|Li1DrlVMChl< z+WC$GEIoxhfIIoUgO4lb9aTSLR!#!`019pQBNWFvuszpxx(_X@2DA^bKplF_6nK|M zpZ0m6(vdhLsheq+)aXNa29C?Fc&5IriiVDU0I5e@zQW>znakp?7-DXM@pFBz_*mwg z*@uXQSBV>4^}Zd~8xz6WSb)lRsjTIPg>Nqp$tR3`G9vJryOE4OCNY8eMvK1E;xFaX zhROYO8oQ9w+MTYuGO5o literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.pas b/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.pas new file mode 100644 index 00000000..d270b632 --- /dev/null +++ b/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.pas @@ -0,0 +1,488 @@ +unit fmMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + System.Types, System.UITypes, + ComCtrls, ExtCtrls, StdCtrls, PythonEngine, PythonGUIInputOutput, Db, + Grids, DBGrids, Datasnap.DBClient, FireDAC.Stan.Intf, FireDAC.Stan.Option, + FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, + FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.FMXUI.Wait, + FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, + FireDAC.Comp.Client, FireDAC.Comp.DataSet, FireDAC.Comp.UI, + FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs, + WrapDelphi, pyDBFireDac, SynEditHighlighter, SynHighlighterPython, SynEdit; + +type + TMain = class(TForm) + RichEdit1: TRichEdit; + Splitter1: TSplitter; + PythonGUIInputOutput: TPythonGUIInputOutput; + typeFDTable: TPythonType; + modDBFireDac: TPythonModule; + dsrcCustomer: TDataSource; + typeFDQuery: TPythonType; + DataSource2: TDataSource; + typeDBField: TPythonType; + typeDBVarArg: TPythonType; + Panel6: TPanel; + btnSQLTest: TButton; + cobxConnSQLServer: TComboBox; + Label5: TLabel; + Connection: TFDConnection; + FDGUIxWaitCursor: TFDGUIxWaitCursor; + mqSrcTables: TFDMetaInfoQuery; + SynPythonSyn: TSynPythonSyn; + PythonEngine: TPythonEngine; + tblCustomer: TFDTable; + PageControl: TPageControl; + TabSheet1: TTabSheet; + Splitter7: TSplitter; + SynEditScript1: TSynEdit; + Panel7: TPanel; + Label1: TLabel; + Label2: TLabel; + btnExecuteExample1: TButton; + TabSheet2: TTabSheet; + Splitter3: TSplitter; + Panel1: TPanel; + btnExecuteExample2: TButton; + DBGrid1: TDBGrid; + SynEditScript2: TSynEdit; + TabSheet4: TTabSheet; + Splitter4: TSplitter; + Panel3: TPanel; + btnExecuteExample3: TButton; + DBGrid2: TDBGrid; + SynEditScript3: TSynEdit; + TabSheet5: TTabSheet; + Splitter2: TSplitter; + Panel2: TPanel; + btnExecuteExample4: TButton; + SynEditScript4: TSynEdit; + procedure btnExecuteExample1Click(Sender: TObject); + procedure typeFDTableInitialization(Sender: TObject); + procedure btnExecuteExample2Click(Sender: TObject); + procedure Table1CalcFields(DataSet: TDataSet); + procedure typeFDQueryInitialization(Sender: TObject); + procedure btnExecuteExample4Click(Sender: TObject); + procedure btnExecuteExample3Click(Sender: TObject); + procedure typeDBFieldInitialization(Sender: TObject); + procedure modDBFireDacAfterInitialization(Sender: TObject); + procedure modDBFireDacInitialization(Sender: TObject); + procedure typeDBVarArgInitialization(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure btnSQLTestClick(Sender: TObject); + procedure modDBFireDacFinalization(Sender: TObject); + procedure typeFDTableFinalization(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure typeFDQueryFinalization(Sender: TObject); + procedure typeDBFieldFinalization(Sender: TObject); + procedure PageControlChange(Sender: TObject); + private + function DBConnectionClosedCheck(aConnectionDefName: String): Boolean; + public + end; + +var + Main: TMain; + + +implementation + + +{$R *.DFM} + + +procedure TMain.FormShow(Sender: TObject); +var + i: Integer; + l_sStr: String; +begin + SynEditScript1.Lines.LoadFromFile( 'Example1.py' ); + SynEditScript2.Lines.LoadFromFile( 'Example2.py' ); + SynEditScript3.Lines.LoadFromFile( 'Example3.py' ); + SynEditScript4.Lines.LoadFromFile( 'Example4.py' ); + // + PageControl.ActivePage := TabSheet1; + // + RichEdit1.Lines.Clear; + cobxConnSQLServer.ItemIndex := -1; + if FileExists('FDDrivers.ini') then begin + FDManager.DriverDefFileName := 'FDDrivers.ini'; + FDManager.DriverDefFileAutoLoad := True; + end + else begin + l_sStr := 'Die Ini-Datei "FDDrivers.ini" existiert nicht!'; + RichEdit1.Lines.Add(l_sStr); + MessageDlg(l_sStr, TMsgDlgType.mtError, [TMsgDlgBtn.mbOK], 0); + Close; + end; + if FileExists('Demo.ini') then begin + FDManager.ConnectionDefFileName := 'Demo.ini'; + try + FDManager.LoadConnectionDefFile; + FDManager.GetConnectionNames(cobxConnSQLServer.Items); + for i := 0 to cobxConnSQLServer.Items.Count-1 do begin + l_sStr := UpperCase(cobxConnSQLServer.Items[i]); + if (Pos('SQLITE',l_sStr) > 0) and (cobxConnSQLServer.ItemIndex < 0) then begin + cobxConnSQLServer.ItemIndex := i; + break; + end; + end; + except + on E: Exception do begin + l_sStr := 'Exception: ' + E.Message; + RichEdit1.Lines.Add(l_sStr); + MessageDlg(l_sStr, TMsgDlgType.mtError, [TMsgDlgBtn.mbOK], 0); + end; + end; + end + else begin + l_sStr := 'Die Ini-Datei "Demo.ini" existiert nicht!'; + RichEdit1.Lines.Add(l_sStr); + MessageDlg(l_sStr, TMsgDlgType.mtError, [TMsgDlgBtn.mbOK], 0); + Close; + end; +end; + +procedure TMain.FormDestroy(Sender: TObject); +begin + if Connection.Connected then + Connection.Close; + typeFDTableFinalization(TPyDBTable.PyDBTableType); + typeFDQueryFinalization(TPyDBQuery.PyDBQueryType); + typeDBFieldFinalization(TPyDBField.PyDBFieldType); + modDBFireDacFinalization(pyDBFireDac.g_oDBModule); +end; + +procedure TMain.btnSQLTestClick(Sender: TObject); +var + l_sStr, l_sConnName: String; +begin + RichEdit1.Lines.Clear; + l_sConnName := cobxConnSQLServer.Items[cobxConnSQLServer.ItemIndex]; + l_sStr := UpperCase(l_sConnName); + if Pos('ORA',l_sStr) > 0 then begin + RichEdit1.Lines.Add('Oracle Parameter:'); + end + else if Pos('MSSQL',l_sStr) > 0 then begin + RichEdit1.Lines.Add('MS SQL Server Parameter:'); + end + else if Pos('SQLITE',l_sStr) > 0 then begin + RichEdit1.Lines.Add('SQLite Parameter:'); + end + else begin + RichEdit1.Lines.Add('Unkown database type!'); + exit; + end; + if self.DBConnectionClosedCheck(l_sConnName) then + RichEdit1.Lines.Add('Database was connected!') + else + RichEdit1.Lines.Add('Database was not connected!'); +end; + +function TMain.DBConnectionClosedCheck(aConnectionDefName: String): Boolean; +var + l_sStr: String; + l_oDef: IFDStanConnectionDef; +begin + Result := True; + if Connection.Connected then + Connection.Close; + if Connection.ConnectionDefName <> aConnectionDefName then begin + l_oDef := FDManager.ConnectionDefs.ConnectionDefByName(aConnectionDefName); + Connection.Params.Clear; + Connection.Params.AddStrings(l_oDef.Params); + Connection.ConnectionDefName := aConnectionDefName; + // + try + Connection.Connected := True; + if Connection.Connected then begin + Result := True; + Connection.Close; + end; + except + on E: Exception do begin + Result := False; + l_sStr := 'Exception: ' + E.Message; + RichEdit1.Lines.Add(l_sStr); + end; + end; + end; +end; + +procedure TMain.typeFDTableInitialization(Sender: TObject); +var + l_oPythonType: TPythonType; +begin + if Sender is TPythonType then begin + l_oPythonType := TPythonType(Sender); + l_oPythonType.PyObjectClass := TPyDBTable; + if not Assigned(typeFDTable) then + typeFDTable := l_oPythonType; + TPyDBTable.PyDBTableType := l_oPythonType; + end; +end; + +procedure TMain.typeFDTableFinalization(Sender: TObject); +var + l_oPythonType: TPythonType; +begin + if Sender is TPythonType then begin + l_oPythonType := TPythonType(Sender); + //-- l_oPythonType.ClearMethods; + end; +end; + +procedure TMain.typeFDQueryInitialization(Sender: TObject); +var + l_oPythonType: TPythonType; +begin + if Sender is TPythonType then begin + l_oPythonType := TPythonType(Sender); + l_oPythonType.PyObjectClass := TPyDBQuery; + if not Assigned(typeFDQuery) then + typeFDQuery := l_oPythonType; + TPyDBQuery.PyDBQueryType := l_oPythonType; + end; +end; + +procedure TMain.typeFDQueryFinalization(Sender: TObject); +var + l_oPythonType: TPythonType; +begin + if Sender is TPythonType then begin + l_oPythonType := TPythonType(Sender); + //-- l_oPythonType.ClearMethods; + end; +end; + +procedure TMain.typeDBFieldInitialization(Sender: TObject); +var + l_oPythonType: TPythonType; +begin + if Sender is TPythonType then begin + l_oPythonType := TPythonType(Sender); + l_oPythonType.PyObjectClass := TPyDBField; + if not Assigned(typeDBField) then + typeDBField := l_oPythonType; + TPyDBField.PyDBFieldType := l_oPythonType; + end; +end; + +procedure TMain.typeDBFieldFinalization(Sender: TObject); +var + l_oPythonType: TPythonType; +begin + if Sender is TPythonType then begin + l_oPythonType := TPythonType(Sender); + //-- l_oPythonType.ClearMethods; + end; +end; + +procedure TMain.typeDBVarArgInitialization(Sender: TObject); +var + l_oPythonType: TPythonType; +begin + if Sender is TPythonType then begin + l_oPythonType := TPythonType(Sender); + l_oPythonType.PyObjectClass := TPyDBVarArg; + if not Assigned(typeDBVarArg) then + typeDBVarArg := l_oPythonType; + TPyDBVarArg.PyDBVarArgType := l_oPythonType; + end; +end; + +procedure TMain.Table1CalcFields(DataSet: TDataSet); +begin + Dataset.FieldByName('Demo').AsString := Dataset.FieldByName('State').AsString + ' - ' + + Dataset.FieldByName('Zip').AsString; +end; + +procedure TMain.modDBFireDacAfterInitialization(Sender: TObject); +begin + with Sender as TPythonModule do begin + // Values for type TDatasetState + SetVarFromVariant( AnsiString('dsInactive'), 0 ); + SetVarFromVariant( AnsiString('dsBrowse'), 1 ); + SetVarFromVariant( AnsiString('dsEdit'), 2 ); + SetVarFromVariant( AnsiString('dsInsert'), 3 ); + SetVarFromVariant( AnsiString('dsSetKey'), 4 ); + SetVarFromVariant( AnsiString('dsCalcFields'), 5 ); + SetVarFromVariant( AnsiString('dsFilter'), 6 ); + SetVarFromVariant( AnsiString('dsNewValue'), 7 ); + SetVarFromVariant( AnsiString('dsOldValue'), 8 ); + SetVarFromVariant( AnsiString('dsCurValue'), 9 ); + // Values for type TFieldType + SetVarFromVariant( AnsiString('ftUnknown'), 0 ); + SetVarFromVariant( AnsiString('ftString'), 1 ); + SetVarFromVariant( AnsiString('ftSmallint'), 2 ); + SetVarFromVariant( AnsiString('ftInteger'), 3 ); + SetVarFromVariant( AnsiString('ftWord'), 4 ); + SetVarFromVariant( AnsiString('ftBoolean'), 5 ); + SetVarFromVariant( AnsiString('ftFloat'), 6 ); + SetVarFromVariant( AnsiString('ftCurrency'), 7 ); + SetVarFromVariant( AnsiString('ftBCD'), 8 ); + SetVarFromVariant( AnsiString('ftDate'), 9 ); + SetVarFromVariant( AnsiString('ftTime'), 10 ); + SetVarFromVariant( AnsiString('ftDateTime'), 11 ); + SetVarFromVariant( AnsiString('ftBytes'), 12 ); + SetVarFromVariant( AnsiString('ftVarBytes'), 13 ); + SetVarFromVariant( AnsiString('ftAutoInc'), 14 ); + SetVarFromVariant( AnsiString('ftBlob'), 15 ); + SetVarFromVariant( AnsiString('ftMemo'), 16 ); + SetVarFromVariant( AnsiString('ftGraphic'), 17 ); + SetVarFromVariant( AnsiString('ftFmtMemo'), 18 ); + SetVarFromVariant( AnsiString('ftParadoxOle'), 19 ); + SetVarFromVariant( AnsiString('ftDBaseOle'), 20 ); + SetVarFromVariant( AnsiString('ftTypedBinary'), 21 ); + SetVarFromVariant( AnsiString('ftCursor'), 22 ); + // Values for type TFieldKind + SetVarFromVariant( AnsiString('fkData'), 0 ); + SetVarFromVariant( AnsiString('fkCalculated'), 1 ); + SetVarFromVariant( AnsiString('fkLookup'), 2 ); + SetVarFromVariant( AnsiString('fkInternalCalc'), 3 ); + // Values for type TLocateOption + SetVarFromVariant( AnsiString('loCaseInsensitive'), 0 ); + SetVarFromVariant( AnsiString('loPartialKey'), 1 ); + // Values for type TLockType + SetVarFromVariant( AnsiString('ltReadLock'), 0 ); + SetVarFromVariant( AnsiString('ltWriteLock'), 1 ); + // Values for type TIndexOptions + SetVarFromVariant( AnsiString('ixPrimary'), 0 ); + SetVarFromVariant( AnsiString('ixUnique'), 1 ); + SetVarFromVariant( AnsiString('ixDescending'), 2 ); + SetVarFromVariant( AnsiString('ixCaseInsensitive'), 3 ); + SetVarFromVariant( AnsiString('ixExpression'), 4 ); + // Values for type TDataAction + SetVarFromVariant( AnsiString('daFail'), 0 ); + SetVarFromVariant( AnsiString('daAbort'), 1 ); + SetVarFromVariant( AnsiString('daRetry'), 2 ); + // Values for type TUpdateKind + SetVarFromVariant( AnsiString('ukModify'), 0 ); + SetVarFromVariant( AnsiString('ukInsert'), 1 ); + SetVarFromVariant( AnsiString('ukDelete'), 2 ); + // Values for type TUpdateAction + SetVarFromVariant( AnsiString('uaFail'), 0 ); + SetVarFromVariant( AnsiString('uaAbort'), 1 ); + SetVarFromVariant( AnsiString('uaSkip'), 2 ); + SetVarFromVariant( AnsiString('uaRetry'), 3 ); + SetVarFromVariant( AnsiString('uaApplied'), 4 ); + end; +end; + +procedure TMain.modDBFireDacInitialization(Sender: TObject); +begin + pyDBFireDac.g_oDBModule := Sender as TPythonModule; + with Sender as TPythonModule do begin + with DocString do begin + Add( 'This module contains several Object Types that' ); + Add( 'will let you work with FireDAC and access' ); + Add( 'a database.' ); + Add( '' ); + Add( 'CreateDBTable() -> creates a TFDTable instance' ); + Add( 'CreateDBQuery() -> creates a TFDQuery instance' ); + end; + with Errors.Add do begin + Name := 'DBError'; + ErrorType := etClass; // <- !!! Must ... + end; + end; +end; + +procedure TMain.modDBFireDacFinalization(Sender: TObject); +begin + if Sender is TPythonModule then begin + with Sender as TPythonModule do begin + ClearVars; + end; + end; +end; + +procedure TMain.PageControlChange(Sender: TObject); +begin + if PageControl.TabIndex = 1 then begin + // Example2 + if not tblCustomer.Active then + tblCustomer.Active := True; + end + else begin + if tblCustomer.Active then + tblCustomer.Active := False; + end; +end; + +procedure TMain.btnExecuteExample1Click(Sender: TObject); +var + l_sConnName: String; +begin + l_sConnName := cobxConnSQLServer.Items[cobxConnSQLServer.ItemIndex]; + if self.DBConnectionClosedCheck(l_sConnName) then begin + with GetPythonEngine do begin + ExecStrings( SynEditScript1.Lines ); + end; + end; +end; + +procedure TMain.btnExecuteExample2Click(Sender: TObject); +var + pyTbl : TPyDBTable; + pyObj : PPyObject; +begin + // Instantiate a new Python object TPyTable + pyObj := typeFDTable.CreateInstance; + pyTbl := PythonToDelphi(pyObj) as TPyDBTable; + // Attach our Delphi table to the Python object + pyTbl.DelphiObject := tblCustomer; + pyTbl.Owned := False; + with GetPythonEngine do begin + // Define a new variable "T" in the DB module + modDBFireDac.SetVar( 'T', pyObj ); + Py_XDecRef(pyObj); + // Excecute the script + ExecStrings( SynEditScript2.Lines ); + end; + pyTbl.Free; +end; + +procedure TMain.btnExecuteExample3Click(Sender: TObject); +var + pyTbl : TPyDBTable; + pyObj : PPyObject; + l_oTable: TFDTable; +begin + // Instantiate a new Python object TPyTable + pyObj := typeFDTable.CreateInstance; + pyTbl := PythonToDelphi(pyObj) as TPyDBTable; + // connect the Datasource2 to the Python Table + l_oTable := pyTbl.GetDelphiObject; + l_oTable.TableName := 'Customer'; + l_oTable.Connection := Connection; + Datasource2.Dataset := l_oTable; + l_oTable.Open(); + // Datasource2.Dataset. + with GetPythonEngine do begin + // Define a new variable "T" in the DB module + modDBFireDac.SetVar( 'T', pyObj ); + Py_XDecRef(pyObj); + // Excecute the script + ExecStrings( SynEditScript3.Lines ); + end; + pyTbl.Free; +end; + +procedure TMain.btnExecuteExample4Click(Sender: TObject); +var + l_sConnName: String; +begin + l_sConnName := cobxConnSQLServer.Items[cobxConnSQLServer.ItemIndex]; + if self.DBConnectionClosedCheck(l_sConnName) then begin + with PythonEngine do + ExecStrings( SynEditScript4.Lines ); + end; +end; + +end. + diff --git a/PythonForDelphi/Demos/Demo11/ThrdDemo_Icon.ico b/PythonForDelphi/Demos/Demo11/ThrdDemo_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..61bf674fa1b1f971bb8c738a0c1844ad2191743d GIT binary patch literal 766 zcmbtSv2MaJ6ugj1kSXfYwTvCR!Pb6CH##C!BHn6=As$(+Ed7m$#h=31F%m;MAYSh| z1VY8uXP@nRckelh3?v-W=^Zq_N5BL3Ct^yx5(zpD)NY3bIALwKape&q1nw$GoDk6y z!J#Q#CaqhoOzYm-*<7vUi^Y5EmKXjX-SuI$pF>$_Fd4Z)FL&GlPNJiT_v;5aF=~o_ z(wHa}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo16/Example2/Project1_Icon.ico b/PythonForDelphi/Demos/Demo16/Example2/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo17/Project1_Icon.ico b/PythonForDelphi/Demos/Demo17/Project1_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d GIT binary patch literal 766 zcmah{v1-FG5WUm^dnkD8nvDI6WGFa;p}&&BP;FKxIb`q{gol2I@nAtcWXMN!?3m3C z2~pq4t_h{IPkuVzy>}-KBAQ^$=Tl;Q-Vr?@K7w;_2~Mcj2-@$EMEFR`K48Z$8DkJx zuR`X#639w*Ra2tzzy-u zgeB3mafZgh5Mg#Mx@^mhDt&^nb^;l(r@Ha2fpf^I~ zQj~hsS6P>D&*g5^mFntJ@6b$2BfN7BME=v-JnhiRcxj2qGR=Z|^#-9A)K?s}t4 zA$Pyy5xgElD~)F*o&=a0qQwW%43`ZD`pB8yUxe3ZcJP6d3*r?KugtRs@woD=z4+E% JL&O>4;tTy@|JDEi literal 0 HcmV?d00001 diff --git a/clean.bat b/clean.bat new file mode 100644 index 00000000..731f4e52 --- /dev/null +++ b/clean.bat @@ -0,0 +1,145 @@ +rd /s /q PythonForDelphi\Components\__history +rd /s /q PythonForDelphi\Components\bpl +rd /s /q PythonForDelphi\Components\dcp +rd /s /q PythonForDelphi\Components\dcu + +rd /s /q PythonForDelphi\Components\Sources\Core\__history +rd /s /q PythonForDelphi\Components\Sources\Core\__recovery + +rd /s /q PythonForDelphi\Components\Sources\FireDAC\__history +rd /s /q PythonForDelphi\Components\Sources\FireDAC\__recovery + +rd /s /q PythonForDelphi\Demos\Demo01\__history +rd /s /q PythonForDelphi\Demos\Demo01\__recovery +rd /s /q PythonForDelphi\Demos\Demo01\Win64 +del /q PythonForDelphi\Demos\Demo01\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo01\Project1.identcache +del /q PythonForDelphi\Demos\Demo01\Project1.stat +del /q PythonForDelphi\Demos\Demo01\Project1.exe +del /q PythonForDelphi\Demos\Demo01\Project1.rsm + +rd /s /q PythonForDelphi\Demos\Demo02\__history +rd /s /q PythonForDelphi\Demos\Demo02\__recovery +rd /s /q PythonForDelphi\Demos\Demo02\Win64 +del /q PythonForDelphi\Demos\Demo02\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo02\Project1.identcache +del /q PythonForDelphi\Demos\Demo02\Project1.stat +del /q PythonForDelphi\Demos\Demo02\Project1.exe +del /q PythonForDelphi\Demos\Demo02\Project1.rsm + +rd /s /q PythonForDelphi\Demos\Demo03\__history +rd /s /q PythonForDelphi\Demos\Demo03\__recovery +rd /s /q PythonForDelphi\Demos\Demo03\Win64 +del /q PythonForDelphi\Demos\Demo03\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo03\Project1.identcache +del /q PythonForDelphi\Demos\Demo03\Project1.stat +del /q PythonForDelphi\Demos\Demo03\Project1.exe +del /q PythonForDelphi\Demos\Demo03\Project1.rsm + +rd /s /q PythonForDelphi\Demos\Demo04\__history +rd /s /q PythonForDelphi\Demos\Demo04\__recovery +rd /s /q PythonForDelphi\Demos\Demo04\Win64 +del /q PythonForDelphi\Demos\Demo04\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo04\Project1.identcache +del /q PythonForDelphi\Demos\Demo04\Project1.stat +del /q PythonForDelphi\Demos\Demo04\Project1.exe +del /q PythonForDelphi\Demos\Demo04\Project1.rsm + +rd /s /q PythonForDelphi\Demos\Demo05\__history +rd /s /q PythonForDelphi\Demos\Demo05\__recovery +rd /s /q PythonForDelphi\Demos\Demo05\Win64 +del /q PythonForDelphi\Demos\Demo05\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo05\Project1.identcache +del /q PythonForDelphi\Demos\Demo05\Project1.stat +del /q PythonForDelphi\Demos\Demo05\Project1.exe +del /q PythonForDelphi\Demos\Demo05\Project1.rsm + +rd /s /q PythonForDelphi\Demos\Demo06\__history +rd /s /q PythonForDelphi\Demos\Demo06\__recovery +rd /s /q PythonForDelphi\Demos\Demo06\Win64 +del /q PythonForDelphi\Demos\Demo06\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo06\Project1.identcache +del /q PythonForDelphi\Demos\Demo06\Project1.stat +del /q PythonForDelphi\Demos\Demo06\Project1.exe +del /q PythonForDelphi\Demos\Demo06\Project1.rsm + +rd /s /q PythonForDelphi\Demos\Demo07\__history +rd /s /q PythonForDelphi\Demos\Demo07\__recovery +rd /s /q PythonForDelphi\Demos\Demo07\Win64 +del /q PythonForDelphi\Demos\Demo07\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo07\Project1.identcache +del /q PythonForDelphi\Demos\Demo07\Project1.stat +del /q PythonForDelphi\Demos\Demo07\Project1.exe +del /q PythonForDelphi\Demos\Demo07\Project1.rsm + +rd /s /q PythonForDelphi\Demos\Demo08\__history +rd /s /q PythonForDelphi\Demos\Demo08\__recovery +rd /s /q PythonForDelphi\Demos\Demo08\Win64 +del /q PythonForDelphi\Demos\Demo08\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo08\Project1.identcache +del /q PythonForDelphi\Demos\Demo08\Project1.stat +del /q PythonForDelphi\Demos\Demo08\Project1.exe +del /q PythonForDelphi\Demos\Demo08\Project1.rsm + +rd /s /q PythonForDelphi\Demos\Demo09\__history +rd /s /q PythonForDelphi\Demos\Demo09\__recovery +rd /s /q PythonForDelphi\Demos\Demo09\Win64 +del /q PythonForDelphi\Demos\Demo09\ProjectGroup1.groupproj.local +del /q PythonForDelphi\Demos\Demo09\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo09\Project1.identcache +del /q PythonForDelphi\Demos\Demo09\Project1.stat +del /q PythonForDelphi\Demos\Demo09\Project1.exe +del /q PythonForDelphi\Demos\Demo09\Project1.rsm +del /q PythonForDelphi\Demos\Demo09\demodll.dproj.local +del /q PythonForDelphi\Demos\Demo09\demodll.identcache +del /q PythonForDelphi\Demos\Demo09\demodll.stat +del /q PythonForDelphi\Demos\Demo09\demodll.pyd +del /q PythonForDelphi\Demos\Demo09\demodll.rsm + +rd /s /q PythonForDelphi\Demos\Demo10_FireDAC\__history +rd /s /q PythonForDelphi\Demos\Demo10_FireDAC\__recovery +rd /s /q PythonForDelphi\Demos\Demo10_FireDAC\Win64 +del /q PythonForDelphi\Demos\Demo10_FireDAC\Demo10.dproj.local +del /q PythonForDelphi\Demos\Demo10_FireDAC\Demo10.identcache +del /q PythonForDelphi\Demos\Demo10_FireDAC\Demo10.stat +del /q PythonForDelphi\Demos\Demo10_FireDAC\Demo10.exe +del /q PythonForDelphi\Demos\Demo10_FireDAC\Demo10.rsm +del /q PythonForDelphi\Demos\Demo10_FireDAC\Demo10_MemoryManager_EventLog.txt + +rd /s /q PythonForDelphi\Demos\Demo11\__history +rd /s /q PythonForDelphi\Demos\Demo11\__recovery +rd /s /q PythonForDelphi\Demos\Demo11\Win64 +del /q PythonForDelphi\Demos\Demo11\ThrdDemo.dproj.local +del /q PythonForDelphi\Demos\Demo11\ThrdDemo.identcache +del /q PythonForDelphi\Demos\Demo11\ThrdDemo.stat +del /q PythonForDelphi\Demos\Demo11\ThrdDemo.exe +del /q PythonForDelphi\Demos\Demo11\ThrdDemo.rsm + +rd /s /q PythonForDelphi\Demos\Demo16\Example1\__history +rd /s /q PythonForDelphi\Demos\Demo16\Example1\__recovery +rd /s /q PythonForDelphi\Demos\Demo16\Example1\Win64 +del /q PythonForDelphi\Demos\Demo16\Example1\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo16\Example1\Project1.identcache +del /q PythonForDelphi\Demos\Demo16\Example1\Project1.stat +del /q PythonForDelphi\Demos\Demo16\Example1\Project1.exe +del /q PythonForDelphi\Demos\Demo16\Example1\Project1.rsm + +rd /s /q PythonForDelphi\Demos\Demo16\Example2\__history +rd /s /q PythonForDelphi\Demos\Demo16\Example2\__recovery +rd /s /q PythonForDelphi\Demos\Demo16\Example2\Win64 +del /q PythonForDelphi\Demos\Demo16\Example2\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo16\Example2\Project1.identcache +del /q PythonForDelphi\Demos\Demo16\Example2\Project1.stat +del /q PythonForDelphi\Demos\Demo16\Example2\Project1.exe +del /q PythonForDelphi\Demos\Demo16\Example2\Project1.rsm + +rd /s /q PythonForDelphi\Demos\Demo17\__history +rd /s /q PythonForDelphi\Demos\Demo17\__recovery +rd /s /q PythonForDelphi\Demos\Demo17\Win64 +del /q PythonForDelphi\Demos\Demo17\Project1.dproj.local +del /q PythonForDelphi\Demos\Demo17\Project1.identcache +del /q PythonForDelphi\Demos\Demo17\Project1.stat +del /q PythonForDelphi\Demos\Demo17\Project1.exe +del /q PythonForDelphi\Demos\Demo17\Project1.rsm + +Pause \ No newline at end of file