From b91a188197cf08e6b8749697727d1c4b681e4d51 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 6 Oct 2015 13:05:22 +0200 Subject: [PATCH 001/123] Catch exceptions during DLL load (Loading an Python 3.5 on Windows XP dosend finds Procedure Entry Points in other dlls) --- .../Components/Sources/Core/PythonEngine.pas | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 375a0419..3086ef09 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -126,7 +126,7 @@ interface end; const {$IFDEF MSWINDOWS} - PYTHON_KNOWN_VERSIONS: array[1..11] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..12] of TPythonVersionProp = ( (DllName: 'python23.dll'; RegVersion: '2.3'; APIVersion: 1012; CanUseLatest: True), (DllName: 'python24.dll'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), (DllName: 'python25.dll'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), @@ -137,7 +137,8 @@ interface (DllName: 'python32.dll'; RegVersion: '3.2'; APIVersion: 1013; CanUseLatest: True), (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) ); + (DllName: 'python35.dll'; RegVersion: '3.5-32'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'python35.dll'; RegVersion: '3.5-64'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF LINUX} PYTHON_KNOWN_VERSIONS: array[1..11] of TPythonVersionProp = @@ -4669,7 +4670,11 @@ procedure TPythonEngine.DoOpenDll(const aDllName : String); for i:= Integer(COMPILED_FOR_PYTHON_VERSION_INDEX) to High(PYTHON_KNOWN_VERSIONS) do begin RegVersion := PYTHON_KNOWN_VERSIONS[i].RegVersion; - FDLLHandle := SafeLoadLibrary(GetDllPath+PYTHON_KNOWN_VERSIONS[i].DllName); + try + FDLLHandle := SafeLoadLibrary(GetDllPath+PYTHON_KNOWN_VERSIONS[i].DllName); + except + FDLLHandle:=0; + end; if IsHandleValid then begin DllName := PYTHON_KNOWN_VERSIONS[i].DllName; From c4cb2a9fc7521bcfb1475430d9f1a0b4d263979d Mon Sep 17 00:00:00 2001 From: Christian U Date: Tue, 6 Oct 2015 17:33:07 +0200 Subject: [PATCH 002/123] fix Version handling in Linux --- .../Components/Sources/Core/PythonEngine.pas | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index e1343cd6..fce5aa13 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3296,6 +3296,28 @@ procedure TDynamicDll.DoOpenDll(const aDllName : String); GetDllPath+DllName {$ENDIF} ); + {$IFDEF LINUX} + if FDLLHandle=0 then + begin + FDLLHandle := LoadLibrary( + {$IFDEF FPC} + PAnsiChar(AnsiString('/usr/lib/x86_64-linux-gnu/'+DllName)) + {$ELSE} + GetDllPath+DllName + {$ENDIF} + ); + end; + if FDLLHandle=0 then + begin + FDLLHandle := LoadLibrary( + {$IFDEF FPC} + PAnsiChar(AnsiString('/usr/lib/i386-linux-gnu/'+DllName)) + {$ELSE} + GetDllPath+DllName + {$ENDIF} + ); + end; + {$ENDIF} end; end; @@ -3496,8 +3518,13 @@ procedure TPythonInterface.AfterLoad; begin inherited; FIsPython3000 := Pos('PYTHON3', UpperCase(DLLName)) = 1; - FMajorVersion := StrToInt(DLLName[7 {$IFDEF LINUX}+3{$ENDIF}]); + {$IFDEF WINDOWS} + FMajorVersion := StrToInt(DLLName[7{$IFDEF LINUX}+3{$ENDIF}]); FMinorVersion := StrToInt(DLLName[8{$IFDEF LINUX}+3{$ENDIF}]); + {$ELSE} + FMajorVersion := StrToInt(DLLName[7{$IFDEF LINUX}+3{$ENDIF}]); + FMinorVersion := StrToInt(DLLName[9{$IFDEF LINUX}+3{$ENDIF}]); + {$ENDIF} if FIsPython3000 then @@ -3544,6 +3571,8 @@ function TPythonInterface.GetUnicodeTypeSuffix : String; begin if (fMajorVersion > 3) or ((fMajorVersion = 3) and (fMinorVersion >= 3)) then Result := '' + else if ((fMajorVersion = 2) and (fMinorVersion >= 7)) then + Result := '' else if APIVersion >= 1011 then Result := 'UCS2' else From 7a0fecc375841eb5d12810348653d12d05fa5efa Mon Sep 17 00:00:00 2001 From: Christian U Date: Wed, 7 Oct 2015 05:22:47 +0200 Subject: [PATCH 003/123] Remove Widestring Functions in Linux (dont exists in library) --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 1745f607..ccc7dfce 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3996,11 +3996,13 @@ procedure TPythonInterface.MapDll; PyType_GenericAlloc :=Import('PyType_GenericAlloc'); PyType_GenericNew :=Import('PyType_GenericNew'); PyType_Ready :=Import('PyType_Ready'); + {$IFNDEF LINUX} PyUnicode_FromWideChar :=Import(AnsiString(Format('PyUnicode%s_FromWideChar',[GetUnicodeTypeSuffix]))); PyUnicode_AsWideChar :=Import(AnsiString(Format('PyUnicode%s_AsWideChar',[GetUnicodeTypeSuffix]))); PyUnicode_Decode :=Import(AnsiString(Format('PyUnicode%s_Decode',[GetUnicodeTypeSuffix]))); PyUnicode_AsEncodedString :=Import(AnsiString(Format('PyUnicode%s_AsEncodedString',[GetUnicodeTypeSuffix]))); PyUnicode_FromOrdinal :=Import(AnsiString(Format('PyUnicode%s_FromOrdinal',[GetUnicodeTypeSuffix]))); + {$ENDIF} PyWeakref_GetObject :=Import('PyWeakref_GetObject'); PyWeakref_NewProxy :=Import('PyWeakref_NewProxy'); PyWeakref_NewRef :=Import('PyWeakref_NewRef'); From d1e93601ea80293693ee580c48097effba1f95db Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 8 Oct 2015 07:18:48 +0200 Subject: [PATCH 004/123] In Windows use UCS2 was correct only in Linux binarys Widestring support is missing --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 -- 1 file changed, 2 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index ccc7dfce..b0f4f363 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3577,8 +3577,6 @@ function TPythonInterface.GetUnicodeTypeSuffix : String; begin if (fMajorVersion > 3) or ((fMajorVersion = 3) and (fMinorVersion >= 3)) then Result := '' - else if ((fMajorVersion = 2) and (fMinorVersion >= 7)) then - Result := '' else if APIVersion >= 1011 then Result := 'UCS2' else From 71d3323849806cb0e01c7c1d61cff7221212878d Mon Sep 17 00:00:00 2001 From: Christian U Date: Sun, 25 Oct 2015 21:09:51 +0100 Subject: [PATCH 005/123] support arm cpus --- .../Components/Sources/Core/PythonEngine.pas | 2 + PythonForDelphi/Demos/FPC/Demo01/fpc-res.or | Bin 138668 -> 0 bytes PythonForDelphi/Demos/FPC/Demo25/fpc-res.or | Bin 138668 -> 0 bytes PythonForDelphi/Demos/FPC/Demo31/Project1.lpi | 180 ++++++++++++------ 4 files changed, 129 insertions(+), 53 deletions(-) delete mode 100644 PythonForDelphi/Demos/FPC/Demo01/fpc-res.or delete mode 100644 PythonForDelphi/Demos/FPC/Demo25/fpc-res.or diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index b0f4f363..63db577c 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -9696,6 +9696,7 @@ function PyType_HasFeature(AType : PPyTypeObject; AFlag : Integer) : Boolean; procedure MaskFPUExceptions(ExceptionsMasked : boolean; MatchPythonPrecision : Boolean); begin + {$IFNDEF CPUARM} if MatchPythonPrecision then begin if ExceptionsMasked then Set8087CW($1232 or $3F) @@ -9707,6 +9708,7 @@ procedure MaskFPUExceptions(ExceptionsMasked : boolean; else Set8087CW($1332); end; + {$ENDIF} end; {$IFDEF MSWINDOWS} diff --git a/PythonForDelphi/Demos/FPC/Demo01/fpc-res.or b/PythonForDelphi/Demos/FPC/Demo01/fpc-res.or deleted file mode 100644 index 17d61c85a7cc9a19bb50e16979a5afea0f1ef08b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138668 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

wUZ$>ikC-e~o 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 WJ9DY6t5x8WM+YH%8lO=Ulm7$fT39>) diff --git a/PythonForDelphi/Demos/FPC/Demo31/Project1.lpi b/PythonForDelphi/Demos/FPC/Demo31/Project1.lpi index 9645cf5e..890ee820 100644 --- a/PythonForDelphi/Demos/FPC/Demo31/Project1.lpi +++ b/PythonForDelphi/Demos/FPC/Demo31/Project1.lpi @@ -40,13 +40,13 @@ - + - + - + @@ -57,8 +57,9 @@ + - + @@ -69,17 +70,13 @@ - - + - - - + - @@ -95,7 +92,6 @@ - @@ -105,10 +101,10 @@ - - + + - + @@ -136,19 +132,19 @@ - + - + - + - + @@ -162,10 +158,10 @@ - + - + @@ -186,10 +182,10 @@ - + - + @@ -241,70 +237,148 @@ - - - + + + + + + + + + + + + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bce18fee766f91ec8c91d0355a75d79a8a1bc00b Mon Sep 17 00:00:00 2001 From: Christian U Date: Tue, 17 Nov 2015 17:38:04 +0100 Subject: [PATCH 006/123] Fix Callbacks in Linux64 --- .../Sources/Core/MethodCallBack.pas | 4 +- PythonForDelphi/Demos/FPC/Demo06/Project1.lpi | 124 +++++++++--------- PythonForDelphi/Demos/FPC/Demo06/Project1.lpr | 2 +- PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm | 4 +- PythonForDelphi/Demos/FPC/Demo06/Unit1.pas | 4 +- 5 files changed, 66 insertions(+), 72 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas b/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas index 845252de..50801ed9 100644 --- a/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas +++ b/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas @@ -179,8 +179,8 @@ procedure GetCodeMem(var ptr: PByte; size: integer); {$IFDEF MSWINDOWS} page:=VirtualAlloc(nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); {$ELSE} - //page := GetMem(PageSize); - page := mmap(Pointer($10000000), PageSize, PROT_NONE, MAP_PRIVATE or MAP_ANON, -1, 0); + page := GetMem(PageSize); + //page := mmap(Pointer($10000000), PageSize, PROT_NONE, MAP_PRIVATE or MAP_ANON, -1, 0); mprotect(page, PageSize, PROT_READ or PROT_WRITE or PROT_EXEC); {$ENDIF} page^.next:=CodeMemPages; diff --git a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi index 4b4bfea4..f740b927 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi +++ b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi @@ -1,4 +1,4 @@ - + @@ -7,7 +7,6 @@ - @@ -26,7 +25,7 @@ - + @@ -38,14 +37,11 @@ - + - - - - + @@ -56,11 +52,8 @@ - - - - + @@ -68,17 +61,12 @@ - - - - - - + @@ -87,142 +75,147 @@ - + + + + + + + + + + + - - - + + - + - + - - + - + - + - + - + - + - - + - + - + - + - + - + - + - - + - + - + - + - + - + - + - + - + - - + - - + + - - + + - - + + - + @@ -239,14 +232,17 @@ - - - - - - + + + + + + + + + diff --git a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpr b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpr index b2943a89..0d555335 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpr +++ b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpr @@ -7,7 +7,7 @@ Forms, Interfaces, {$ENDIF} {$IFDEF LINUX} - QForms, + Forms, Interfaces, {$ENDIF} Unit1 in 'Unit1.pas' {Form1}; diff --git a/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm b/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm index 94a42c35..314e7128 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm +++ b/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm @@ -10,7 +10,7 @@ object Form1: TForm1 Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' - LCLVersion = '0.9.30.2' + LCLVersion = '1.5' object Splitter1: TSplitter Cursor = crVSplit Left = 0 @@ -91,7 +91,7 @@ object Form1: TForm1 end object Edit1: TEdit Left = 368 - Height = 21 + Height = 24 Top = 32 Width = 161 TabOrder = 4 diff --git a/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas b/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas index 76f79034..10f17178 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas +++ b/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas @@ -1,7 +1,5 @@ unit Unit1; -{$I Definition.Inc} - interface uses @@ -11,7 +9,7 @@ interface StdCtrls, ComCtrls, ExtCtrls, {$ENDIF} {$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, + Forms, Dialogs, StdCtrls, Controls, ExtCtrls, {$ENDIF} PythonEngine, PythonGUIInputOutput; From e175f1bf43d71e4c2042c2ce06493d91b7f1b118 Mon Sep 17 00:00:00 2001 From: Christian U Date: Tue, 17 Nov 2015 19:48:15 +0100 Subject: [PATCH 007/123] Final fixes MethodCallback on Linux --- .../Sources/Core/MethodCallBack.pas | 27 +++---- PythonForDelphi/Demos/FPC/Demo06/Project1.lpi | 76 +++++++++---------- 2 files changed, 45 insertions(+), 58 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas b/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas index 50801ed9..d868d76e 100644 --- a/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas +++ b/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas @@ -102,6 +102,7 @@ implementation Windows, {$ELSE WINDOWS} {$IFDEF FPC} + BaseUnix, {$ELSE} Posix.SysMMan, {$ENDIF} @@ -143,19 +144,13 @@ implementation {$IFNDEF MSWINDOWS} {$IFDEF FPC} -function mmap(Addr: Pointer; Len: Integer; Prot: Integer; Flags: Integer; FileDes: Integer; Off: Integer): Pointer; cdecl; - external 'c' name 'mmap'; - function mprotect(Addr: Pointer; Len: Integer; Prot: Integer): Integer; cdecl; external 'c' name 'mprotect'; - -function munmap(Addr: Pointer; Len: Integer): Integer; cdecl; - external 'c' name 'munmap'; -const - PROT_NONE =0; - PROT_READ =1; - PROT_WRITE =2; - PROT_EXEC =4; +const +// PROT_NONE =0; +// PROT_READ =1; +// PROT_WRITE =2; +// PROT_EXEC =4; MAP_PRIVATE =2; MAP_ANON=$1000; {$ENDIF} @@ -180,7 +175,7 @@ procedure GetCodeMem(var ptr: PByte; size: integer); page:=VirtualAlloc(nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); {$ELSE} page := GetMem(PageSize); - //page := mmap(Pointer($10000000), PageSize, PROT_NONE, MAP_PRIVATE or MAP_ANON, -1, 0); + //page := fpmmap(nil, PageSize, PROT_NONE, MAP_ANONYMOUS, -1, 0); mprotect(page, PageSize, PROT_READ or PROT_WRITE or PROT_EXEC); {$ENDIF} page^.next:=CodeMemPages; @@ -238,8 +233,8 @@ procedure FreeCodeMem(ptr: Pointer); {$IFDEF MSWINDOWS} VirtualFree(page, 0, MEM_RELEASE); {$ELSE} - // FreeMem(page); - munmap(page,PageSize); + FreeMem(page); + //fpmunmap(page,PageSize); {$ENDIF} end; @@ -601,8 +596,8 @@ procedure FreeCallBacks; {$IFDEF MSWINDOWS} VirtualFree(page, 0, MEM_RELEASE); {$ELSE} - //FreeMem(page); - munmap(page,PageSize); + FreeMem(page); + //fpmunmap(page,PageSize); {$ENDIF} page := nextpage; diff --git a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi index f740b927..ab3c5a27 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi +++ b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi @@ -52,8 +52,10 @@ + - + + @@ -86,10 +88,9 @@ - - - + + @@ -98,119 +99,119 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + + - + - + - - + + @@ -234,15 +235,6 @@ - - - - - - - - - From 675c30f572fa647edb1161086552435dab7d864d Mon Sep 17 00:00:00 2001 From: Cutec OSX Date: Tue, 8 Dec 2015 05:18:01 +0100 Subject: [PATCH 008/123] fix compiling on OSX --- .../Components/Sources/Core/PythonEngine.pas | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 63db577c..a72ee085 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -69,8 +69,7 @@ interface uses {$IFDEF MSWINDOWS} Windows, -{$ENDIF} -{$IFDEF LINUX} +{$ELSE} Types, dynlibs, {$ENDIF} @@ -154,6 +153,20 @@ interface (DllName: 'libpython3.4.so'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.5.so'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} +{$IFDEF DARWIN} + PYTHON_KNOWN_VERSIONS: array[1..11] of TPythonVersionProp = + ( (DllName: 'libpython2.3.dylib'; RegVersion: '2.3'; APIVersion: 1012; CanUseLatest: True), + (DllName: 'libpython2.4.dylib'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), + (DllName: 'libpython2.5.dylib'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython2.6.dylib'; RegVersion: '2.6'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython2.7.dylib'; RegVersion: '2.7'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.0.dylib'; RegVersion: '3.0'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.1.dylib'; RegVersion: '3.1'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.2.dylib'; RegVersion: '3.2'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.3.dylib'; RegVersion: '3.3'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.4.dylib'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.5.dylib'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True) ); +{$ENDIF} {$IFDEF PYTHON23} COMPILED_FOR_PYTHON_VERSION_INDEX = 1; {$ENDIF} @@ -3264,6 +3277,7 @@ function TPythonInputOutput.GetCurrentThreadSlotIdx : Integer; thread_id : Longint; i : Integer; begin + {$ifndef DARWIN} thread_id := GetCurrentThreadId; for i := 0 to FLinesPerThread.Count-1 do if Longint(FLinesPerThread.Objects[i]) = thread_id then @@ -3272,6 +3286,7 @@ function TPythonInputOutput.GetCurrentThreadSlotIdx : Integer; Exit; end; Result := FLinesPerThread.AddObject( '', TObject(thread_id) ); + {$endif} end; function TPythonInputOutput.GetCurrentThreadLine : IOString; @@ -9758,4 +9773,4 @@ function IsPythonVersionRegistered(PythonVersion : string; {$ENDIF} end. - + \ No newline at end of file From 050d64e6ae0f080f71976589f3d27c1984ea15b5 Mon Sep 17 00:00:00 2001 From: "sergey.bugay" Date: Mon, 11 Jan 2016 10:37:43 +0300 Subject: [PATCH 009/123] Resolve hints Resolved hints: * [dcc32 Hint] PythonEngine.pas(5559): H2443 Inline function 'TList.Remove' has not been expanded because unit 'System.Types' is not specified in USES list * [dcc32 Hint] PythonEngine.pas(5561): H2443 Inline function 'TList.Remove' has not been expanded because unit 'System.Types' is not specified in USES list --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 9900134a..3e5e2a4a 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3111,9 +3111,11 @@ procedure MaskFPUExceptions(ExceptionsMasked : boolean; implementation +uses {$IFDEF MSWINDOWS} -uses Registry; + Registry, {$ENDIF} + System.Types; (*******************************************************) From 03a9ce835a22d0cd56c718e35473affd23ae7dbc Mon Sep 17 00:00:00 2001 From: "sergey.bugay" Date: Mon, 11 Jan 2016 10:41:04 +0300 Subject: [PATCH 010/123] Change event types --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 3e5e2a4a..f5459f1b 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -1364,10 +1364,10 @@ EPyWindowsError = class (EPyOSError); kMaxLineLength = 256; type - TSendDataEvent = procedure (Sender: TObject; const Data : AnsiString ) of object; - TReceiveDataEvent = procedure (Sender: TObject; var Data : AnsiString ) of object; - TSendUniDataEvent = procedure (Sender: TObject; const Data : UnicodeString ) of object; - TReceiveUniDataEvent = procedure (Sender: TObject; var Data : UnicodeString ) of object; + TSendDataEvent = reference to procedure (Sender: TObject; const Data : AnsiString ); + TReceiveDataEvent = reference to procedure (Sender: TObject; var Data : AnsiString ); + TSendUniDataEvent = reference to procedure (Sender: TObject; const Data : UnicodeString ); + TReceiveUniDataEvent = reference to procedure (Sender: TObject; var Data : UnicodeString ); IOChar = WideChar; IOString = UnicodeString; TIOStringList = TUnicodeStringList; From 0fe0de3e25d961e1568a129d31c29a959790f795 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 20 Jan 2016 14:44:01 +0100 Subject: [PATCH 011/123] fix compiling in fpc 3.0.0 --- .../Components/Sources/Core/Definition.Inc | 1 + .../Components/Sources/Core/VarPyth.pas | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index af7364be..5f1f7bc9 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -443,6 +443,7 @@ {$DEFINE MACOS32} {$ENDIF CPU32} {$ENDIF DARWIN} + {$H+} {$ENDIF FPC} diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index d3eb8ce1..1246a8b9 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -180,9 +180,9 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) const Arguments: TVarDataArray): Boolean; override; function GetProperty(var Dest: TVarData; const V: TVarData; const AName: string): Boolean; override; - function SetProperty(const V: TVarData; const AName: string; + function SetProperty(var V: TVarData; const AName: string; const Value: TVarData): Boolean; override; - procedure DispInvoke(Dest: PVarData; const Source: TVarData; + procedure DispInvoke(Dest: PVarData; var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); override; end; @@ -877,8 +877,8 @@ procedure TPythonVariantType.Clear(var V: TVarData); FreeAndNil(TPythonVarData(V).VPython); end; -function TPythonVariantType.CompareOp(const Left, Right: TVarData; - const AOperator: TVarOp): Boolean; +function TPythonVariantType.CompareOp(const Left: TVarData; + const Right: TVarData; const AOperator: TVarOp): Boolean; begin Result := False; if (Left.VType = VarType) and (Right.VType = VarType) then @@ -932,8 +932,8 @@ procedure SetClearVarToEmptyParam(var V: TVarData); CPropertySet = $04; {$IFDEF USESYSTEMDISPINVOKE} -procedure TPythonVariantType.DispInvoke(Dest: PVarData; - const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); +procedure TPythonVariantType.DispInvoke(Dest: PVarData; var Source: TVarData; + CallDesc: PCallDesc; Params: Pointer); {$IFDEF DELPHIXE2} // Modified to correct memory leak QC102387 procedure PatchedDispInvoke(Dest: PVarData; @@ -1855,8 +1855,8 @@ function TPythonVariantType.RightPromotion(const V: TVarData; Result := False; end; -function TPythonVariantType.SetProperty(const V: TVarData; - const AName: string; const Value: TVarData): Boolean; +function TPythonVariantType.SetProperty(var V: TVarData; const AName: string; + const Value: TVarData): Boolean; var _newValue : PPyObject; begin From a7a2dd6affdc714312804c429f2cd9e2afe1fb7e Mon Sep 17 00:00:00 2001 From: Christian U Date: Wed, 20 Jan 2016 16:55:15 +0100 Subject: [PATCH 012/123] fix compiling with fpc < 3.0.0 --- .../Components/Sources/Core/PythonEngine.pas | 15 ++++++------- .../Components/Sources/Core/VarPyth.pas | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 88bd0409..8dde7779 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -1383,10 +1383,10 @@ EPyWindowsError = class (EPyOSError); kMaxLineLength = 256; type - TSendDataEvent = reference to procedure (Sender: TObject; const Data : AnsiString ); - TReceiveDataEvent = reference to procedure (Sender: TObject; var Data : AnsiString ); - TSendUniDataEvent = reference to procedure (Sender: TObject; const Data : UnicodeString ); - TReceiveUniDataEvent = reference to procedure (Sender: TObject; var Data : UnicodeString ); + TSendDataEvent = procedure (Sender: TObject; const Data : AnsiString ) of object; + TReceiveDataEvent = procedure (Sender: TObject; var Data : AnsiString ) of object; + TSendUniDataEvent = procedure (Sender: TObject; const Data : UnicodeString ) of object; + TReceiveUniDataEvent = procedure (Sender: TObject; var Data : UnicodeString ) of object; IOChar = WideChar; IOString = UnicodeString; TIOStringList = TUnicodeStringList; @@ -3130,11 +3130,10 @@ procedure MaskFPUExceptions(ExceptionsMasked : boolean; implementation -uses {$IFDEF MSWINDOWS} - Registry, +uses + Registry; {$ENDIF} - System.Types; (*******************************************************) @@ -9775,4 +9774,4 @@ function IsPythonVersionRegistered(PythonVersion : string; {$ENDIF} end. - \ No newline at end of file + diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index 1246a8b9..46fdc952 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -180,10 +180,17 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) const Arguments: TVarDataArray): Boolean; override; function GetProperty(var Dest: TVarData; const V: TVarData; const AName: string): Boolean; override; + {$if FPC_VERSION>=3} function SetProperty(var V: TVarData; const AName: string; const Value: TVarData): Boolean; override; procedure DispInvoke(Dest: PVarData; var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); override; + {$else} + 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; + {$endif} end; var @@ -932,8 +939,13 @@ procedure SetClearVarToEmptyParam(var V: TVarData); CPropertySet = $04; {$IFDEF USESYSTEMDISPINVOKE} +{$if FPC_VERSION>=3} procedure TPythonVariantType.DispInvoke(Dest: PVarData; var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); +{$else} +procedure TPythonVariantType.DispInvoke(Dest: PVarData; const Source: TVarData; + CallDesc: PCallDesc; Params: Pointer); +{$endif} {$IFDEF DELPHIXE2} // Modified to correct memory leak QC102387 procedure PatchedDispInvoke(Dest: PVarData; @@ -1073,8 +1085,13 @@ TStringDesc = record end; {$ELSE USESYSTEMDISPINVOKE} +{$if FPC_VERSION>=3} procedure TPythonVariantType.DispInvoke(Dest: PVarData; const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); +{$else} +procedure TPythonVariantType.DispInvoke(Dest: PVarData; + var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); +{$endif} begin DoDispInvoke(Dest, Source, CallDesc, Params); end; @@ -1855,8 +1872,13 @@ function TPythonVariantType.RightPromotion(const V: TVarData; Result := False; end; +{$if FPC_VERSION>=3} function TPythonVariantType.SetProperty(var V: TVarData; const AName: string; const Value: TVarData): Boolean; +{$else} +function TPythonVariantType.SetProperty(const V: TVarData; const AName: string; + const Value: TVarData): Boolean; +{$endif} var _newValue : PPyObject; begin From 09ca35519812548535489f065c9c2fc4097ab296 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 11 Feb 2016 14:39:15 +0100 Subject: [PATCH 013/123] Add FPC Only Package --- PythonForDelphi/Components/P4DFpc.lpk | 66 +++++++++++++++++++++++++++ PythonForDelphi/Components/P4DFpc.pas | 22 +++++++++ PythonForDelphi/Components/p4dlaz.lpk | 11 ++--- 3 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 PythonForDelphi/Components/P4DFpc.lpk create mode 100644 PythonForDelphi/Components/P4DFpc.pas diff --git a/PythonForDelphi/Components/P4DFpc.lpk b/PythonForDelphi/Components/P4DFpc.lpk new file mode 100644 index 00000000..688c17ef --- /dev/null +++ b/PythonForDelphi/Components/P4DFpc.lpk @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ExternHelp Items="Count"/> + + + diff --git a/PythonForDelphi/Components/P4DFpc.pas b/PythonForDelphi/Components/P4DFpc.pas new file mode 100644 index 00000000..c82e424b --- /dev/null +++ b/PythonForDelphi/Components/P4DFpc.pas @@ -0,0 +1,22 @@ +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit P4DFpc; + +interface + +uses + PythonEngine, MethodCallBack, TinyWideStrings, VarPyth, WrapDelphiClasses, + WrapDelphiTypes, LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('PythonEngine', @PythonEngine.Register); +end; + +initialization + RegisterPackage('P4DFpc', @Register); +end. diff --git a/PythonForDelphi/Components/p4dlaz.lpk b/PythonForDelphi/Components/p4dlaz.lpk index afdb8f03..9c80ff72 100644 --- a/PythonForDelphi/Components/p4dlaz.lpk +++ b/PythonForDelphi/Components/p4dlaz.lpk @@ -64,15 +64,11 @@ - + - - - - - + @@ -81,5 +77,8 @@ + + <_ExternHelp Items="Count"/> + From f525576b24c1660c889de4639f840b5d93e9f9db Mon Sep 17 00:00:00 2001 From: Christian U Date: Mon, 21 Mar 2016 20:46:28 +0100 Subject: [PATCH 014/123] fix compiling --- .../Components/Sources/Core/PythonGUIInputOutput.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonGUIInputOutput.pas b/PythonForDelphi/Components/Sources/Core/PythonGUIInputOutput.pas index 018f2cf8..7c7a1f54 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonGUIInputOutput.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonGUIInputOutput.pas @@ -49,7 +49,7 @@ interface {$IFDEF MSWINDOWS} Windows, Messages, {$ENDIF} - SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + SysUtils, Classes;//, Graphics, Controls, Forms, Dialogs, StdCtrls, PythonEngine; {$IFDEF MSWINDOWS} From 357834105b7a8aaec854a848a3bfd3f4b7072d4e Mon Sep 17 00:00:00 2001 From: Christian Ulrich Date: Wed, 14 Sep 2016 22:46:42 +0200 Subject: [PATCH 015/123] Fix compiling in old Lazarus (0.9.3x) --- PythonForDelphi/Components/P4DFpc.lpk | 11 ++++++----- PythonForDelphi/Components/P4DFpc.pas | 13 +++---------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/PythonForDelphi/Components/P4DFpc.lpk b/PythonForDelphi/Components/P4DFpc.lpk index 688c17ef..63a050ce 100644 --- a/PythonForDelphi/Components/P4DFpc.lpk +++ b/PythonForDelphi/Components/P4DFpc.lpk @@ -1,11 +1,10 @@ - + - + - - + @@ -18,11 +17,13 @@ + + + - diff --git a/PythonForDelphi/Components/P4DFpc.pas b/PythonForDelphi/Components/P4DFpc.pas index c82e424b..e1a1c690 100644 --- a/PythonForDelphi/Components/P4DFpc.pas +++ b/PythonForDelphi/Components/P4DFpc.pas @@ -2,21 +2,14 @@ This source is only used to compile and install the package. } -unit P4DFpc; +unit P4DFpc; interface uses - PythonEngine, MethodCallBack, TinyWideStrings, VarPyth, WrapDelphiClasses, - WrapDelphiTypes, LazarusPackageIntf; + PythonEngine, MethodCallBack, TinyWideStrings, VarPyth, WrapDelphiClasses, + WrapDelphiTypes; implementation -procedure Register; -begin - RegisterUnit('PythonEngine', @PythonEngine.Register); -end; - -initialization - RegisterPackage('P4DFpc', @Register); end. From 5f043aa4b6645c317605287e533862ff66afda12 Mon Sep 17 00:00:00 2001 From: Christian U Date: Fri, 13 Oct 2017 11:05:22 +0200 Subject: [PATCH 016/123] Fixed compiling for Lazarus Package --- .../Components/Sources/Core/PythonGUIInputOutput.pas | 2 +- PythonForDelphi/Components/p4dlaz.lpk | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonGUIInputOutput.pas b/PythonForDelphi/Components/Sources/Core/PythonGUIInputOutput.pas index 7c7a1f54..018f2cf8 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonGUIInputOutput.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonGUIInputOutput.pas @@ -49,7 +49,7 @@ interface {$IFDEF MSWINDOWS} Windows, Messages, {$ENDIF} - SysUtils, Classes;//, Graphics, Controls, Forms, Dialogs, + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, PythonEngine; {$IFDEF MSWINDOWS} diff --git a/PythonForDelphi/Components/p4dlaz.lpk b/PythonForDelphi/Components/p4dlaz.lpk index 9c80ff72..e210b8a5 100644 --- a/PythonForDelphi/Components/p4dlaz.lpk +++ b/PythonForDelphi/Components/p4dlaz.lpk @@ -64,11 +64,14 @@ - + + + + - + From 28ba6ebe73c8aac58dc1727dafe85485514e6013 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 15 Oct 2017 05:42:41 +0300 Subject: [PATCH 017/123] Support for Python 3.5 and 3.6 added --- PythonForDelphi/Components/Python_XE7.dpk | 2 + .../Components/Sources/Core/Definition.Inc | 63 +++- .../Components/Sources/Core/PythonEngine.pas | 31 +- PythonForDelphi/Demos/Demo32/Project1.dpr | 2 + PythonForDelphi/Demos/Demo32/Project1.dproj | 291 +++++++++--------- PythonForDelphi/Demos/Demo32/Project1.res | Bin 2040 -> 62704 bytes PythonForDelphi/Demos/Demo32/Unit1.dfm | Bin 2705 -> 2763 bytes 7 files changed, 233 insertions(+), 156 deletions(-) diff --git a/PythonForDelphi/Components/Python_XE7.dpk b/PythonForDelphi/Components/Python_XE7.dpk index a54cda0b..9ebd0ef9 100644 --- a/PythonForDelphi/Components/Python_XE7.dpk +++ b/PythonForDelphi/Components/Python_XE7.dpk @@ -1,3 +1,5 @@ +// JCL_DEBUG_EXPERT_GENERATEJDBG OFF +// JCL_DEBUG_EXPERT_INSERTJDBG OFF package Python_XE7; {$R *.res} diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index 11515028..3e124961 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -322,19 +322,23 @@ // Note that the installer will let the user specify its default Python version, and // thus will edit this file. -{$IFNDEF PYTHON34} - {$IFNDEF PYTHON33} - {$IFNDEF PYTHON32} - {$IFNDEF PYTHON31} - {$IFNDEF PYTHON30} - {$IFNDEF PYTHON27} - {$IFNDEF PYTHON26} - {$IFNDEF PYTHON25} - {$IFNDEF PYTHON24} - {$IFNDEF PYTHON23} - {------} - {$DEFINE PYTHON27} - {------} +{$IFNDEF PYTHON36} + {$IFNDEF PYTHON35} + {$IFNDEF PYTHON34} + {$IFNDEF PYTHON33} + {$IFNDEF PYTHON32} + {$IFNDEF PYTHON31} + {$IFNDEF PYTHON30} + {$IFNDEF PYTHON27} + {$IFNDEF PYTHON26} + {$IFNDEF PYTHON25} + {$IFNDEF PYTHON24} + {$IFNDEF PYTHON23} + {------} + {$DEFINE PYTHON27} + {------} + {$ENDIF} + {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} @@ -369,6 +373,7 @@ {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} + {$DEFINE PYTHON26_OR_HIGHER} {$DEFINE PYTHON27_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON30} @@ -376,6 +381,7 @@ {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} + {$DEFINE PYTHON27_OR_HIGHER} {$DEFINE PYTHON30_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON31} @@ -383,6 +389,7 @@ {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} + {$DEFINE PYTHON27_OR_HIGHER} {$DEFINE PYTHON30_OR_HIGHER} {$DEFINE PYTHON31_OR_HIGHER} {$ENDIF} @@ -391,6 +398,7 @@ {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} + {$DEFINE PYTHON27_OR_HIGHER} {$DEFINE PYTHON30_OR_HIGHER} {$DEFINE PYTHON31_OR_HIGHER} {$DEFINE PYTHON32_OR_HIGHER} @@ -400,6 +408,7 @@ {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} + {$DEFINE PYTHON27_OR_HIGHER} {$DEFINE PYTHON30_OR_HIGHER} {$DEFINE PYTHON31_OR_HIGHER} {$DEFINE PYTHON32_OR_HIGHER} @@ -410,11 +419,39 @@ {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} + {$DEFINE PYTHON27_OR_HIGHER} + {$DEFINE PYTHON30_OR_HIGHER} + {$DEFINE PYTHON31_OR_HIGHER} + {$DEFINE PYTHON32_OR_HIGHER} + {$DEFINE PYTHON33_OR_HIGHER} + {$DEFINE PYTHON34_OR_HIGHER} +{$ENDIF} +{$IFDEF PYTHON35} + {$DEFINE PYTHON23_OR_HIGHER} + {$DEFINE PYTHON24_OR_HIGHER} + {$DEFINE PYTHON25_OR_HIGHER} + {$DEFINE PYTHON26_OR_HIGHER} + {$DEFINE PYTHON27_OR_HIGHER} + {$DEFINE PYTHON30_OR_HIGHER} + {$DEFINE PYTHON31_OR_HIGHER} + {$DEFINE PYTHON32_OR_HIGHER} + {$DEFINE PYTHON33_OR_HIGHER} + {$DEFINE PYTHON34_OR_HIGHER} + {$DEFINE PYTHON35_OR_HIGHER} +{$ENDIF} +{$IFDEF PYTHON36} + {$DEFINE PYTHON23_OR_HIGHER} + {$DEFINE PYTHON24_OR_HIGHER} + {$DEFINE PYTHON25_OR_HIGHER} + {$DEFINE PYTHON26_OR_HIGHER} + {$DEFINE PYTHON27_OR_HIGHER} {$DEFINE PYTHON30_OR_HIGHER} {$DEFINE PYTHON31_OR_HIGHER} {$DEFINE PYTHON32_OR_HIGHER} {$DEFINE PYTHON33_OR_HIGHER} {$DEFINE PYTHON34_OR_HIGHER} + {$DEFINE PYTHON35_OR_HIGHER} + {$DEFINE PYTHON36_OR_HIGHER} {$ENDIF} ///////////////////////////////////////////////////////////////////////////// diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 9900134a..4970cb83 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -126,7 +126,7 @@ interface end; const {$IFDEF MSWINDOWS} - PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..12] of TPythonVersionProp = ( (DllName: 'python23.dll'; RegVersion: '2.3'; APIVersion: 1012; CanUseLatest: True), (DllName: 'python24.dll'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), (DllName: 'python25.dll'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), @@ -136,10 +136,12 @@ interface (DllName: 'python31.dll'; RegVersion: '3.1'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python32.dll'; RegVersion: '3.2'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python33.dll'; RegVersion: '3.3'; APIVersion: 1013; CanUseLatest: True), - (DllName: 'python34.dll'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True) ); + (DllName: 'python34.dll'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'python35.dll'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'python36.dll'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF LINUX} - PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..12] of TPythonVersionProp = ( (DllName: 'libpython2.3.so'; RegVersion: '2.3'; APIVersion: 1012; CanUseLatest: True), (DllName: 'libpython2.4.so'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), (DllName: 'libpython2.5.so'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), @@ -149,7 +151,9 @@ interface (DllName: 'libpython3.1.so'; RegVersion: '3.1'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.2.so'; RegVersion: '3.2'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.3.so'; RegVersion: '3.3'; APIVersion: 1013; CanUseLatest: True), - (DllName: 'libpython3.4.so'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True) ); + (DllName: 'libpython3.4.so'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.5.so'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.6.so'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF PYTHON23} COMPILED_FOR_PYTHON_VERSION_INDEX = 1; @@ -180,6 +184,12 @@ interface {$ENDIF} {$IFDEF PYTHON34} COMPILED_FOR_PYTHON_VERSION_INDEX = 10; +{$ENDIF} +{$IFDEF PYTHON35} + COMPILED_FOR_PYTHON_VERSION_INDEX = 11; +{$ENDIF} +{$IFDEF PYTHON36} + COMPILED_FOR_PYTHON_VERSION_INDEX = 12; {$ENDIF} PYT_METHOD_BUFFER_INCREASE = 10; PYT_MEMBER_BUFFER_INCREASE = 10; @@ -3493,7 +3503,7 @@ procedure TPythonInterface.AfterLoad; inherited; FIsPython3000 := Pos('PYTHON3', UpperCase(DLLName)) = 1; FMajorVersion := StrToInt(DLLName[7 {$IFDEF LINUX}+3{$ENDIF}]); - FMinorVersion := StrToInt(DLLName[8{$IFDEF LINUX}+3{$ENDIF}]); + FMinorVersion := StrToInt(DLLName[8{$IFDEF LINUX}+4{$ENDIF}]); if FIsPython3000 then @@ -9676,8 +9686,14 @@ function IsPythonVersionRegistered(PythonVersion : string; // the registry info in HKEY_CURRENT_USER. // Hence, for Current user installations we need to try and find the install path // since it may not be on the system path. + + // The above convension was changed in Python 3.5. Now even for all user + // installations the dll is located at the InstallPath. + var key: string; + MajorVersion : integer; + MinorVersion : integer; begin Result := False; InstallPath := ''; @@ -9690,6 +9706,11 @@ function IsPythonVersionRegistered(PythonVersion : string; if KeyExists(key) then begin AllUserInstall := True; Result := True; + MajorVersion := StrToInt(PythonVersion[1]); + MinorVersion := StrToInt(PythonVersion[3]); + if (MajorVersion > 3) or ((MajorVersion = 3) and (MinorVersion >= 5)) then + if OpenKey(Key, False) then + InstallPath := ReadString(''); end; finally Free; diff --git a/PythonForDelphi/Demos/Demo32/Project1.dpr b/PythonForDelphi/Demos/Demo32/Project1.dpr index 34e6006c..ca9fdea5 100644 --- a/PythonForDelphi/Demos/Demo32/Project1.dpr +++ b/PythonForDelphi/Demos/Demo32/Project1.dpr @@ -1,3 +1,5 @@ +// JCL_DEBUG_EXPERT_GENERATEJDBG OFF +// JCL_DEBUG_EXPERT_INSERTJDBG OFF program Project1; {$I Definition.Inc} diff --git a/PythonForDelphi/Demos/Demo32/Project1.dproj b/PythonForDelphi/Demos/Demo32/Project1.dproj index b5826909..e792d344 100644 --- a/PythonForDelphi/Demos/Demo32/Project1.dproj +++ b/PythonForDelphi/Demos/Demo32/Project1.dproj @@ -1,138 +1,153 @@ - - - {26D3B086-D6C0-40C9-820A-269741BAC910} - 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= - 1032 - 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 - 1032 - 1253 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - False - True - - - 12 - - - + + + {26D3B086-D6C0-40C9-820A-269741BAC910} + Project1.dpr + Debug + DCC32 + 16.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + Project1 + 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= + 1032 + Project1.exe + 00400000 + x86 + + + 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 + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + $(BDS)\bin\default_app.manifest + true + 1033 + Project1_Icon.ico + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + DEBUG;$(DCC_Define) + + + $(BDS)\bin\delphi_PROJECTICON.ico + 1033 + true + + + + 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 + 1032 + 1253 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + True + True + + + 12 + + +
diff --git a/PythonForDelphi/Demos/Demo32/Project1.res b/PythonForDelphi/Demos/Demo32/Project1.res index 3f7606cf84212f64c91ed3383d42f7b5a779a10f..0f3facb9cfa933a493c5f938866266d85d282161 100644 GIT binary patch literal 62704 zcmZ6y1yo$YvM9O-cXxsYcM{y)-QC?S5P}U32?V#`5FCQLI|K+G+=9FN0DsQC|NOW9 z>$Q4M@9wJVYOATLt_=VHKncxnZ~vR2#s6Ot1O2xh3km~$fhG5aZaR5kAdjEyjf#P@o zo=|L8DCU0>C%^`U`ELfGIRAlHgF?9iR=_8~658wkjrD)yNI~gejG zn*SM<7PQqI+N&p&b8{%w|HA_^+z#A+IRH>X>Abzc{(tj}h4p{tH(E_a79E8I1qy;L zFDIq(zq14akPx6XMjoX$08su*UP@f+^YV!?q8Z+&zdzP9=q?6gS1!e@jrLokoB+fgV#lEbWbiX}M{y7^zajKK&p%Tks6U@lY zZn_Sv?xqjsaVX?zvyt~`Rn3cCE{$cQXatFoHcoRZIRjHN&R*!6q<~RxgT>*DQ)GX_ zv3tAcXfD4?vthYTh3oH$$>9y{f0v(U=9sh{w7k4R?~S$fkqIhpsh4E)mFPSvME!|k z=w=D(PCOP*ZL4&S4-E=0cMM&-145k6DA^}>yC|IJ+#F!R%-~d3M*w}$syc4vUYZXv@vA5LgW(+!Q`|QV-|LHb|Jq# zrQq2^A!QNK$L=%}14W+ZgtTLijcy(k73e^I+bt#1z8I_6QbbG5)CWXjtXWuC2prxb zsFf$@%{%mazpD${sEho4c7fzpzl7$UN#@|_nD_JN&f-=mA|{TqMfa%P>dO(SYb8~t zUOqaW0eT~-$C}RSbMx3IT^*G_&S6WgG10L_F~2m*q?)Va^jl-rrY41R+Qjp^CPPnG zZ0gm`N*UNA71P*Gg}&^J?EU`z+jQOkxN3gK614%;XI;nx*qIx&*{QP^{N6}OPrgxe zFnEeZjz-R#JrrX~L2w$g<~ys4pKb|SKm>Z5%Hmp&1tIbs=|t&o2=UF4f}hSHVjdoKy;#JfNmnfOo*7+i zbS`VaCURSBP_sYStViq!79mwlu(a$~L|>o8?Dx}^1syFd|NEhyV8u~cIy>0V8tB#w zOCVr3TKpz7uIh8P`iO}vFMpU2c4)1UaqihXtW0sCHuqS83Jff42?nOkqhVpS+>h;g zi*tiQQTP9(IIVOAOf1#g?)zUImShHBk~U-@o997inwmA8m)(Fa30+Q3$-hi862sVH z``<(2`spR7NLmQzNh1=_cRKPybFU_|{&J6fZtAN~e6rSlzZ3lOY)jy@RA;rDW@-X% zdKX5gP6}`(Mj7WS6CL*dT5EfuVr8A^xn16tWKF)2D33cNg#m6~j2CKK_l*d-{~}JQ z0h>S2FGO38fdfIuqOnKhv9fC=$j7kfQ6*Awc*7roI>gxc{r&n+trw4+=MzJlmH5%$g-NMpE*$n8c{@ zVS0yb}#IP_94oBY|RkckicT4fOH#|i#{3q{95 znuA07X+rO;tj+DT*0wudP0HiX@nt-{dZgUI&Xb@C1eimdI!#1>d8Ylsv@j9D89HO! zZZ}?6;|7BV8#4_ooZG9sT*N4h!7DN$L+giO2L_PNMVnOxK1au*sW z8q<)%#?EB;K})ACVj&w_Fu(*C&085a6AHrTQ=(e_ptE=W_iH|$fkurE15dZds)_82 zTO@EHjyM1TtKO6-Gqa=jGX#Q`VxYXRC28I)=-(WU3IvvIZ~%5?3}Otqh%2c@dkA2& zVliWNuv#|wlRfZy?pKOXGV36gZ-r9pq{F<2m0YFQdUYC|M8}FaBgkNt^sdtbYeJJFR`e`;}kW=ZF9h{K*xiWM_A!OL$7qaD|Bu zmGjSBL$)KY8)roTZe-x?Kz%-cl$~vW(zo*-PX`ucP0!F>0M5{b2;gEv8-WK>M<4fq zw~suInuY42DkawAFlnfT@TvIBI{tiLP8Nx+`k7h~3gC5xfpIF0+^H;+&M%@-^S*Ki z^UZqtNva;w0N{s{r5Z|}_F{A~A1}X3asdYlZ4NO5dIwrl-T z@0QzRdJYH>wL}Gh*J-dt#XJQ;lFuucFiL4;ANjIXN=r+B9@p6I^@V?1Kj&N_j-})C ze{k!0^g3C@rlwB6pcgrN7$_+!dN4?mo~5JnVB!p4`}RO5Zk#Xr+V%wGajFAWCv81F zZ)DzN*R3*DAxHsmojhr}q@;*An!47u;40?# z+MT-R(tw4(`yY99am~7iZ6R&|U|J`cow)AQB&Mv)I`@}kYdqs4*Yxg4Lg5XSH{S`D zFfoN$suRz*;Vm~lWFkJJK#!!;%iXQ4xG*8efIy-=a^cvB;;(rbhA1m3KlzXa)+F;~ z)@}L8$;pzc@w)nY@#=-(UNfLd2X{ah%b?sf@8^CHIaE-MPXGX}_GSpkhxBa>6JU{+ zmJa!SOvA#)7C{jNxojsi{cAX$7q_O64ZJQBJ+AM8aOEyZJRC%HzEmLC*2TyBYidJ!aqNP0luut%? zxMsF6dD_Hj)5@9)seThbhY(#tixo=7Z2t5YD}&f^Ji-bcM=lcKE&omtjS8)Dno@J~ z%=)u6KQRXf6dHPZ9J8pr@cxGn zer1jISn4%%x6$KM7Id5-P3O<^T<=@U0ki48aMk_Y-Pnmgqnslnp=UHP5}!j`)!1=S zK|R&zQA@8UJ~TZkueTt;C!mwumkn3ISWUwKfe;mSYq1u0k>DFgORR!-WWNj-QN@~x zfsF=!nqJW^zRI`xa<8^EY$?5CG%4)`Y<%P60DGvehFh$qV4X*OK3?uxJiGc_lyDCXK&E&+!t7ok8)EwSX9<8CiSEHS2{D-Mo>4@^F{wE#3x+GWd zNP0R^s7^&1t{J6SJi_Tpb7*oho}66Nwf2QOh%&vH5+cL}do z`<%{;1wcdqwxsL+Afu98JiXawDk^?9WMTP{&vf;~zmaCo*P1C*vW29zygyohrd|Tk zw!h91Csnj8syO+iNWx4D6e*C%|8&4JXA6}OH&K|vP2moaGqv)D*BS9O{otYO;Su|x zx*-ikIra1M^#&og_L>y~L5j7&^~yR5ZI7#UT%{sFzu=p3$;ltdCnJ0O@xNWc9zW7;zA zPe}P8F`b8mPWNX=2U;qt;oVDKZ|F1)Ls&%*P0K&f<~RNNg6QnGPxs`)E>sSTFPBPE zM}k=@!AF16o&t;0Pyn&Mm8M@blv^GF145HZ>%H#OTbN`556$%PB7E>^L8?X;2Q|XA zLyrztmfEqKSkVN+pm*kD!`hco>Lg<0%UTD04Gn(}4}}JWqJ%u}sWMIa0;-*-jtdJw zEf+z}ha7B5dcl6}{MIu9^8kPakdOf>nGbZqDd|ZSU2m@k5AsPl%b`3=_~f)L1t7Ea zEdGIY)yKreY+}8eU@{8_2j$mqNpc|$fQ0;{_BCu#x8B2KP>k7*Unx-PLw@=I`;6He zjZ4qaU)UhKZ#0+xzOgZ!aBY_-Q@l`%0e6n1M_0%f+cEQlQ2A}8!iJjs`pkd>hTR9f zXnjk%1(gO^hDHP766e&JZz{IYtiOSrhPj8ixfr-u8D^?tQm@0AjC8coIVGraUGpO( zednInnH-ZTlf>a!L_Fr z{Y0jqk67R{B%}4z!`^K}g$85!xepRR1#q0luuWQfyL>xp`zcBRK*lP)Y@t5%nm{$8nMb(czdE1K_5}dFj#^cNc zh8j>I^9}`=Sx+~_NxM_nj_S@;9;4K~MsCa~hxp{cRGZPb0cvszoKapE_s{M@~UUz&GzCX{H?0Fpl z`X5@z`+q9&(sNP(qNV^Nhc(G;6nX--S8GctQn7L-kNN7u<@=FbX}9p;9{l?(>^+K& zcGcYf$P^7#?x8_<3syhIf52wiQzdav%F_dzRp43IKvB2p(X1?bw&hN+$fqY3r;RSy z-(w0r7M$<5{iuCTez6I8%E;VE1$;YkRN!GA^E_ zEix!lD3g%SB{K(eWn&aXe~t4N7C8S^N|Bd=3?j>pCQ@gp*Wb!p@;c;e`J?aQnds@U zTr@m5sMzLxsxSd-CDwH#ixYtmUJU-$Rd{os2{$hI6xT97*@0NB=^0l-(@iCSIQ?c- z&fUjr8q|1Lq-z=w;qOKA3u^mWs34Gv&prM1ong%$pAts|doe zok+(fBPM=SJnsr>aI zIY(QhquHyoQnqX$=^zzGqdUnVB5;qUK#RW6_>{SZ68*!MjUJsbhbvQA(5V=9Z(Iom z&X@o4Qob%n*iT%?rj5OKq~hd}frDw2-~nD}{l;Dt3GVprgg!q$LBcCJM+SxC&FW>j zk#H!6?0NAO7SUUh`J8XAJXfCL`u=cMSvj5J<1xJ(+6cjs?l#TA@4fVF7ba?tmiLi zgmuHpV3#|2^O^GyH!rh1lkw|Empwl6*VZDt_1`XlR%Vou)-7HEHl&*INqAt3p;-(C zE?6$~yA4Kxe2dHJ^0)Ug-~IoMOcxpk%Tu_dP)<4IDqFpVg@u{6d7rPNCrM>t5b8PK z+G_>d0R0e+?}e&5kqfzRg&t(GDcbW=|IQ<>_y34FJEI>&Kb`BhcYTqarZw)+p`WCW z+4zGcpY4~PPfw^d-l+Z=sTCd6Sg!rx48XIxN(1qFzKt|JG#m$?^0XLx9h!RDJ~^_-zT-Zks3L|lpasUIMqQ&I zMY`uEYg{DgtUKoY{`p22VKK`Gn@aq z2zn4bt5yg~$w(shK@N8M@rX%i>1Z}N$WZom?6=G?7 z&^`3afN8|V#Y*98et<~)4 z_v37abyhBuCY`U}6E_Y$c)^buW0%8sv<2m&nYf$Hk1t`ENy8JspRNGJ&COoex%z6V zqvD-s?s?L&uV_nOLVs#%acSS${*T|A5zzY% zda&)Jr-OBFcc`x|vnVn)q={>(&d1a<#~z$+m(w)pg_%dnbK>0V-PzNF?$5zu3E@#r~Fix9N%Yt4*j0X*b_xTL$GU0ux( zCuP4uD?oCErY?0hmW3`=`;l_t_(yS>QsAz z>8eBNu;jT7w&FeK6j+GCJx=O@iB#bNf8)D99l)KU#boCbg*}Q zZgadp`#5bP8SUi5rF2z4PGNMLc4Yv5)DS7#xySNq>bpB#*;;L_=PJ(q{FD_isVcg} zjDHp7GF>~xN|&k-kZm-bI^YS9O^2(E?Q9m>dUuik^I;j1)A?+U>=8%4W?wDIh=NcJ z?#Z1$$Gvd-+0EP|Kf;aJ@=8O)sSKpO_abRy{mz*yWIt1B|Ix-@NkjlKt<`(8PISU_ zJc~b1apBk4wta3O^&=U2##oPSAl+mx>GA%`OC@2twLgSvY>e4_rKxHslCg*>=-*`b z9K`J=icY^;*Nc99BVqB`S>x?Dt(9h_n2T4Pha$*-J=%IxGv)rk}k$r&2nH`AwGZwMgigk(if0$n0)BqqEM_2ltzY-*|@q*+{Lf`Fp^HEo|{G4^jP5 zGx~R&vCp#J+YwdF715~cTjuCzCtV38`4W+ZwXDn)jH|2V>C}BRq>+xvRC=*fS>+y6 zg_FIo7-1?w1ot-s^w}3XMRD<4s1sB4)82T-ZBGoXpfFtbF1e!S)}3VLUD88@pC;Nw=Ek&$9DywoZ+ zv*zy~(KHeEnpdSW}jl`nVyugzp!k~ns z%_+dI?fYy51??53nFhvGt|Ka~iG7=~27z1aZR5^oo6p}kRwH9Ji1rA14mV-J zEnf3EKh4N!RbOlODVh+8XXYr$wU_9NKw5+O2);ygTS-6_r>toie={me_J~ii#p@5f z-k;pyIGI(=rLTySM3qG_fXLI2zj+O-WZMo63{CY%{(_HQh-ooUhdYC3GAv#C>9Q|DbT1Ov!I=<+cQ_DX)~G5?a0vJW|b$M zd!I2|au2;ZF@ZXtqbJspt`#MlpQIh`TC2JikpM%2-w?HNOidjfjOV*kP*NGe91p3M za*j!BW0OFes||tq>*pWC)v3m7CV~BhK_LF7zZ&Hsu3;)1DFP4sBX~aqM23|+s=62x zHU`|!V3K2dbe@8{y>_Y{OjL4{oe8Pem!NTOtbkr z*_EJ}k`vcF12$mwfgdRV#;9zP8&NNok`HkEF(2QZqEKvbvsk-*r(P)AS?|5p_P8@? zVMkSB_6?>-cP#Dvc(F)PSD<9FzneHmARavZG}!sN>eBsS(cbgHo5cKe#$!=2o#Oeb zC|SFw>#&|F`h_sS*hNsRQ51icyZQ<%mum)K)THm(t$9#be?~fyjYF)|{d5d-8M<*( zO{rup>;=aHhsJ`0z|GC-{oToY`byXjeky#0G(H`aS=B-RIttK^hvbx`2MpS zjbyjX71xqf-M-Z5T;1$O!@^&#xtN{N%W=kE ze!<)3-ZdFg?uouRTyFpP`-YODX^T*qCL<;Guhg9K+gF@7>OaJM-XY*#of@Y#(68UW z3HVJb`a!0yD{b450H2k1$5X+n{L*xmFtHvx7+@8KYAXv=8yFINP4@_Ickrvv zmgpIYMZeB!b}CL(CP?ht99jbsfHfZ^29-Ri^fWYTL-%3_N`y{$jVmLhfDSQp`{|e9rX_q0-OoII#xp{TpZZ%BTFgAgKiGY z9j>9u5NY}XLN1;p9_wYdDcH>Xu?A%0RvReLQXTqBuYD5>l;HotktM^U*hmpD9 zi`EocI}JUUZ(4J^F%EDPQ)LaqIvrK=0gqkuu!A4 zP3Xgiul#t!OFC(@adGjG^;eu|Q`pT26SZ4j5@ol83vqz}`m%<1O|fLAzT-|YXC>3U zpVrzWscZSGG4|5H<%+UVEfu1r(M+sVJ)bX4Cp8-l<lb++*%!`|RLWGiE)Xlb;EZ#fh1V+e5ICn|_wJ->>K?(!7rU*88-t z3QZj~C~Yt>CUHnr^NXS8IR=lJ^ro9W@O`o43?VJAs4&|pRsWb;trrX{TjNoquM}*v zjiB}Nab{N4GDox@@--q`PfP~?ZLqQRVsCqD=)G(lc+etj#NmAw34fc1pYta#(MF7? zq7q35l|T5C5Dn^JFRAdqx83MF$jDu{2Q=+BxoJ|}NnGY=Biq{sC+{4)o(LQW*irSW zDK6-vAY-`(JMZ45v2jj^u?qIM-#KmHOL8%Js&iIWR;}*%zP6@gkO}yVkJ`)H;?$@! zz=47uRFMF=U`dCTAkSv=(Nimu4RYZxbFY2h*b5jh-g6}}PC32f3_4qNg=$Hcl-etd z*U##c+hxxJ15=6mySmRWmU%)0f18ss2RXXGQu^$sN2fTl=fs^U(gc}ilYj8Lg&RyE z*{5Il=HNe&?E`L8WoPmYvs$ai{4GL;Ut^M!iXvYqVqdHIDK%MQ`qy6-w;lYUO3UOv z_O7NX^?|i>iImn0#$&(7vUzjXRz*@-nHGKWKvuOh$MZ_hilPrv`ebWk9Zbhq%gy)!z^7%lJTvAl1sw&PfH#C~!- z2@lt#FFHFmA^pn8(gEP()8gT25VG>d>2>R@7#4<;a$(1duivh+3|FHsQZi~Hdx5&-`}dZsT3ndFvZD8@Q)}*q-?AhnN2Hycu3ZiD zzVsFdd{ZxtkZ%Amr(t4T(mY#Mc;15JL?DL#{slt({KWnfKgIu52<_6tT+Rj!ih-9@ zJ{#p30L2aGYpoS`RaECfKCh6++!5JyJZv6K%9AWk&!?NXHlO3y?&9E(x^PZt4!=EUylE@E-P#9_xI^D!${ zhJo~!cror>g^!`EIwv10yT&hOcY&(cRu-Z2ngn0Aq3IE?pG#BonkIm-D0cJZ!6Wd`jPqTna>zs)~JQJ1My|QoBhF zLxXq4XKc0>1h!%LXDs4Wp9;C_S!=I84q6aq9JPl=xex(8v7rFSxZe{{fM0f|#G3N3 zicBHDwlJsaxO+NwCFlDbU&`VIYi+uBQwV8%eY4wsmK22=Z9zjrz81!jsWIcd zf~t;cVW#b2o5#X2dXpsA{V?lGYjh}CQZ&tB0qU3M=E+IZZ%o*y-E5jXM_L17Jrrk! z=qph>-D0wC6{kEkm=wC5n{(46$DJzOpQ#_+r6NC6lZ~J~xfz?xMgfV%KJ0xD15M|D zX{R0yiIcEv&_E zVBmwJfaNhiHyoq ziX=jxj2*i>yVXx$X;P0s7LranWff_*m@@!>y?1&%1J!Ad&=Qy>*BhtgsXIVQ1Cx^9 z{4P2xJ7CHyn1Kq~dcx|O?(2S^D-(y<8yo7E*&U_oKx7aIExQq6KUbiHi0+F16HiOs2 z0V2ZpM=W(*ij1rd4A+qv-dl22+i zNVVQ1wY`mmt@8txkd2Dn45#_`L;Ox+CZPn=_J=f`BZ7P??Q8b1xqHPCc-cdoZ{g8!sMrM#l(Q^{+(q z1Mq&NQxOpWdR<c1NjhzPM3a8%7k=e6jI>hiXdJW z!>kK9UE~K{yxIu6NRGJQy-SXTuvpoe2JFy`pY!!kvPex1moFa$EXS?K%E`-*^^Sm( z$&lGW-z_tJZBf<+fSzY~tfy|sia<00_)pE6-yKoz)4pgfUBzEe64j!e!v`SmX7YT| z-6l*&Hr-U518gl75&d%hFA^OA=2gp-w3~YJ0ApGvxR7h6Nk`T{~p(#iNaY^1pPLYo%rs95Ha69 zjo0_J_iOaQ396~QaD<>UA|_&`Y*3G#;>6d;Vx>U2!oQ=1g`LrciDtz>?!YlDgi11X z3UkwAvDc2LcOV+K+n~cNqnu*QA)|^B?|!dB$;LFj?8}lusqrPgt1+ZKRD8Znvffy6;)?z7n<6K>2<9?r zwPTZIgaVQZ)anC2His0Svmh<0Wc>^b2U{jBuoo{|Uge*UCMIcmZd>3&Ccl6QdaCiP zjHXe^7Aae*d*fKCIhbgUc0cVNN>$=3|2D-a|MB^IuG8ObJ{0zl`cl1{kMA4= zSItdc7jMd7lNHb(`4>4FB1_=sj8P~SxuiR z(kjSY$?U4f8qqdHy|bhb3H;6i`J_Dm=WdqH#<4LXePqOLgFcwCFOZ(UJ0=|yrq2YX zC41K8RvIqn<-VJ=3Z4rE5Xt4M4QlV`XiPwWmBV*%Rj_<%FK1psj+W|15{83c^$HO3$1uzVfwPU?)_oBs`TmIV9byKeb)w&jXB-X!W*pVdt$) z)Z=-*x$v*k3w4HWBh)6+ zOeH50Q>GH%->%YK8IkiF?DOzkVW}#q8a$@?tdr+a_o<$Z~DDnM|0sO_j!lXCyTCgSL1hgVM`HTPgvw09s;KKXjsMPmhKr7Kutro2he5DbLy5rpRvHh^Y%Nad2~ zm47UB8a8*2x*_CBY%4;xsI!QWqPQO}d~R>=uZMfd7nc?Dlf`ciJvr`E7Rp)3eddg% zp7t5FZ|`n3vE>(y^nF+uKg^U)u;X8InCD!{u?z(1zw4vGYwqb^yDXc5- zAUW}<&lR!$r&AiLyKARONtN-{tC~q6a%#v$#3Eo}Fkb57!V$St>prpKc|_kvvEAp3Q59fkXYf z{p-YZy0G|0>!1XrOfPU26*u%ku0%E0y94r@8CFq2krVa^Cae^m3kjh6PVuIc_9wf9 zS)0k=Oc6DRvgKwULmKJbIjvbB=0{(AkXV(DMBkq^j;&72^3fuhg45hWwFs^zQerIv zd!&9<*1Gc!Z!F%2*f0Gi^QZ)pr_G`le~bQP5;vjn55rs7be!>iq&{m$EXesRRJrhV zE#Rw30ICoH>I>;Urdg=^p*2ITO=29!R@rV=fcUxMCv-9u942G0jBle zdHq?prqSsjh))**)&bg$1IUHG#n`(BH`WsphAdhMIbwFg2u7EZl=ux@o0E)>_xsJR z8{rX*YA=LxH_%9+H;ayy!sYWzpGWb%VV<#r$AylY;>Ydxhz&${l83HH?%)z?VW=bL z61}xD9?5fUI)PsO@8rPVgkin~gl4^MXLP$SH5V++rx(+&u`1{q+@@GkW8(U_7;U!H zHu0PmX7tRQcSii`G}MOFPNp3wqTH~twM*S3Z#S|aW-{wEbQ@&E_r{Yp_FfvRbOR0R z4*`-3!qnx?I!OkrVY5!h)6;P}QV97=CwLeMTd{m8ae#?)qC`b7n-RUa& zsZBc0kRmz-Zb5cXrQ~pG>`i2`%da}n4&h;m%`Ju~?Qv-pi1sPa;rQ4i$ptvY>Pnw2 z#ow=I);KQw8nxnHX1x7Qgh>oUJ&D%(HM>kI+O@M6-3Ozlt{+^c2qUDtlFQus_>Bc* zt00cxYY4;{3tj{qKMSJHy+q#(ufHas6K%v^A8M0blitA2OCPOwB3-{>(x7KCyIn5r z_Zn~K&V?3-wi$jluu8!o70=Y9G+$wNdc$Wc7!;}QglB`XkV{`p=7Vg<_p-m+;rkSE zxU>Kb!621L58C44trQlm8}e#)Ud!E^I6U`i6CXNFX1##tFhrFMS)DP%W(9kXHqDkP zp%Snz^I9KiC5sTfuWEMI8v$xQZ}oZF+uI+0=2<+^)Z5cbyRqGX{n_nW`~%Tw2Zoxu z0n7c0i{;Df;BSSrk56Yvusb*dXxdMj)O(?Ail2W3Tj&_yTu<_(KPIS!6wp{BYkF~N z^S<-CY$f!EXPkZuAn?|wE((n4zUut*$GQkuu`XPp5b+qeskY4x$bbZ^ zlzzL-)|JbW{`m$Jys|HlQrj=ak=|IbFC`}X zoDE^@uSD*dFMfm!h-4n94|fH#l~$ESAVY)cU)<-*&39l~R!i$eC}{x7ySES*EO?@cO{m`G{Z#&bjnogj`etl#VR$&w-IO;d04j!erMg{TmVg=GBBo@ z6)ojrlePG}x=Vn^WtEQ$_GkhPExH~0t$|v0>JNuJ&=*GDn|)!f>K~)shE#x?p}%iW zB$3q9*kR9Lvi|i}5xb3kdl~nUVdEErvlXH~A@C4ESy)9O>+;(Hq8YLvjO^R-A>DbJ zcaw2T7~A$D`@1)Mj1Mnu*i53f9{5wW=~5?w`lx95gFkcX5-ed*N)6tdLny8R5=A?{ z@zZJh2}#$Ez~+gFkcO0uyyrysiZX(RZ=R3f!{DikffON_h%M1lUkW<{Gv&z-``R;>TS;8PR@_BcbT>5 z+Je~}l(YHYZn3@L`_9DB^W7$Awo{KCp6-I7Zat?fk=D)!99fJ)^GU#?wZ~W+Bj*Rx z#hgy)u%4tABI@T6)Oo+SSyxlV9R-x3ruW0W)=eRir6oTyT@bXp11Y0p^6OuIeB;P& ze&=_m&E4AST#xGw>T?lOE;^6pj{NoJVPD+8HRCH3JPp)l0YOE1L6CF?0Bet4lx+^{ zqdR0EnpwA6|6_9H8s?{T&@D{Q!=y;2)ZE)!!P7a_j3`IeaMrur#|&fCOp*@*-MUX7 z-!$7zs~040nv6MYHhUamrAT~BR50yPtdrVO%rxU8Zni!`cFj4^9xQRc6Upu7D*v=B zPv|T9McB!MlocM{fWqnfkErdBu`wv8K*EhMNq3a?!feIMC;h~(3d1V8j51mk#$JO& zZq$!&9OinDRV_FpfEry3x^lQ!Hwj!RN-k-In~y=KC+_{q3zmh35ft$QVqpErD(nke z1PMyOY-Gy0#HOcU@Ea!7LL>9*x9pWuuDLEt8{V7D^brweWsOZ`@z{fK;;aSzGfKuO zXFM5ocMh_lklOuw%z$*T{&`rW)U2>hG~qRXyZ87-k~Uff{YZsOa$Uq_iqt&UDs%~) zjvs~h-6or;fZ6|_X>u!icRM~8*@xawXI%Vhp(s5+WEAj6X6nR#B%sbzdQ+-%c>!po z_74~a74@nym5~^s!!tGZ61{d23T<1{zMd{sRou^yL;IMPQIim8n5-UWwAj=ac=jJ4 zs}<F!Foxk7-A6VE5dBzs&E218kMNxXc5I!De5PDa!Z+@ws?!oX1Rl z`uJrSp-fLF+?t?Xp!cKCL6cHaOZHup^a4&7sdrs@N_D-IyfBjncYIh!9{D zDdo=nd|A3bho7yJ&QtgbQ&!;qnoyIdgi#msE`IkD9XMXoRg^Do0s|jcw1mvBnx;>@ zps7$fm$_%gJhM?t@Yu86pi1!*zkX0U(Y5Cb=%02-p!ite5;~3rf|iy}-!nxZpY!>8 zCtn?LJACvI+c9Kt=sWp~%>tWo#27w`2Z|A}`Q-%^CilnZwRXjQ91fHDr7@2xQNVmu zfr!sMi%~a!W^EmAKR2Gk)i`B=ZRfOqtpit4)_#G!S|F$C;#)+;Bp>P7II^nst=vPsXMhDBXCNvhrr z^C|utXV;-6LIPTbKq>{SDw&*?voqFX>)`@SaK~_9``nM ziNO4Lwi2amxpsm`sgZ|a46xu5rJDc-{vkjr1SztmYm+4fYt93x+vkx zz|VZHN&B_S{c7F2Uu8TB?^KGTF*kk^$iNAK0LmZua&kxJSsnlJRFYr4KHDKwQdQ&B zUYFtmsVoLN@=9{RjZT{wG+6H;3IBn9WNooM+eg1pTU<#AkAcl3B$qs>?qBHyj;E>= z%?=jn$E<|?h$iGXzZYw@`$PPu?Pn67ct@3YFUSlt8pp3NHqto)Fn`E0O9@5&c|#!N za7MH{uQ0r=zjq6|pfQ7o9*ao9d5)%T>B4H9&IHv-7b#M`%V6FVl_h6<4rhtjUaV~E z#>E$W;GO-bZ6MH10ak{=!9-N(l}}xDD=S4J_k&ypTg{`Gk%YsksX_ndg5Flg#~TGK z+S^9igkhTSK8UVmlwQXzMOZ$~N<^fm%c)gpW693FHH(m1(s&0AunH8sMlKq+P|abP zinTNX+mpw64o`$${I8vDes}F-Uwd19$!_;}eO(c83a51Y{ex^5gTQ zgW8oI%SzfFO;8Tg6%#v1_mURS+@3d0n*bH#N}I7e1o*z(s<$`?u~D&OecWvJ%L#mf zez$8-%=n!WR&5n;vk5=xD-7_}kUEpJs zRyt|2BsKOgK+oBFzvi2JtV9|3;en{Q;PCKGPgJNyckSI#_c=8w5q4C-t@PB*F>b2m zifT?oV(eO^9)SsFp~$)bHQ7i$tnfdAsKr>~NX8(|LU z{&9A*%`L)6tAE&ei8;nh$RD)&_ix%ZMNHq}BVnQR=Bo5K*kspQ+sua}|BE};1zb8@ zAg&mS#glT&F z5IQnlRH+a>_w=#H=KC9jnR65&FK2IoGIAvl%vBQlxelZJj*Y(XDl&;4B~*&VR)}<@m9|*9jF0QTe5|Yy0T}wzvcQ?{V z=fdv0?>Csau9-P!&bja3`R>0etx=a+n^fe%#g8{!OJy`sEZS;0gR$?p&l z7JQ(>LyYu99cFw_ZxfB3jnWeP{ct&u;S@Inc(I*IlJ4lh6*g|FHi(FLwehZ;-(<7V z_#s`D?C6!RR-PQlt z4~mrZK5kduhumnNB5@DlcjR`&qoi#QFcJ+&k9CN+mowR%>u%L-memMDN&wT>%`wSQ zuRlPtA?U%+XvD(!vn@pnJM=^KvvDe7mSpjhu&Sz;6$=c7d^I<}?|@EX`DrFIHJ%e4 zNI_X)*!OH@KEBzi7n2mwTlZ)dq4lAtG)XdpCkbX=MBA4_N9U&UZs4n>`oUh((Or+2 zBzoETkI35*FV5p%*`1qWtQMI0Ht|9NKFljK6j!mcQ$Q^dBn#r65nS})bc zPCf?zk~Q%)mr<+If$!Ji0pArGu zi?vO&xJmvf-(oO=GP3Dv zN8b9sIdMzeyRye@Sbjzr*kZ#1%FmAZ#;@pPt3f|4a_`T!mF|M2_n2Oh|l^a(0=0-({qe^=rgE{ z4W@Wyip@9*_Ed^AAd=4OMrNZQCwL*Nn~QDV!Ft?!zMDZK0?-M2*vez(O~W?RF26e5 zL9Q!a%0OSIPgc7g-GG&<6AilnAwg|Gub9{^H~zTqWiG_0o}oEbBZ%Pq2_gm31K?EvU!T?r<$o~>6(p871sUN@7~D=7}7-q zBi<%KlycfJ%TIE|-}MHc;S{gXi$mB!puZizwAm#A>Igk|DqNSQkol#^N== z)$fmHr~unm#wd=cB(8f_!1e>__77jA#|Hs%&pTzEmzi&}Kab{$_4zJC0-WJVgmGU} z+e`6hKId6ZH1-F-J+Yq{a1Bn&J{+Yy7Jn%HPK>ukP{ww_;x*?*^QTIh3M0r0R_%98 zB9CBz9j=j5CY%a`IcZc)bRYS>d^t)PQMr@5`TL;*{jo+AvqTjft0I{1>r;JnPYGNr zOZ%E(s#t*r7?SrSk?gyVs+wkAQ0Wc@Tx7V#h4a_rLpXny0Caz5swDt^4K-8eHJ?e$ zvjM$Lx5v0LP?~#4ReZQHmUo>=^ftC{EPGm56|usuZDI}?_SNoy@)?eP_82nnET zx=K-y(|L6r@<~q2kzc*K@U`oq&IPvgLxt& zLvviS85gli34PFIIo)KMxS~_~T@M<1G#PjHLQLG#88nj~goLn-rPItTX({?9P7FJf zHbx2r`41TYKYF}pyABC+utK=E)tsmh1#9L@yTi^o&QOIkU6ZJpUfX0==*@kA_&clQ z3=*&`3x_jt^1~9V=YFz|^W}0ShM~EIJA~)=07!e3t1FD`Xrg%LXM;msqn~cNOu@=O zFOp}#4LM=m$Iq;U95D$$iF{hgg%>=Ln;3Mt0{{2!)rO<3C=3aa6rQE?oy1Nixz)ir z@p4nxaQE3;4KtLF`BJEKH|eWOI3y<-ZHOmUnaJFJ2Q|Fm($vEF?RXU!VxwumV;=r! zL5xJvErj?m%hyRRFW$UN7eovoK2vi#{23X@et@X8;^NX6ei6B!r z-=Y}ASpSgV6*xfwIwYei$}nXsMomDs?f(1OH|O?{W_QZdtv{IZ$Z-SyJQGjJMFoKNN^<>N_PJNwgYqxy$Dn{7cJxx*8I6o@L;;_EMizhDV zbXgAdSZ*HmFaSJrf+R3f02I8h6rp3nD>WNdT)gh{m-b7DzE&$mnnn}83%ZC`ubBeN z{_sf7tDDW#5#P%1Nt}*qulzM_(BUmCl#kiO0S4~SUtsVMgq-Byia3qhll*9=_#g4e z4Q=T_yQ4>DlDI-Ef784BzOz4{(A6F8?&*f`P2#;FfBEGx2kz!Q$wHv74Dcza(6&D& zK9x}SC)wqax9OCfh32F`C4Qf7k>MmLN!U|-hqXa&^RTjB?(*82DF1j}*hJ_w$*!aB zE>bcr;EUA1tL?wkuRG9ZVym(b-xl%N&rs6TFAtP2wRaM-Lz7OKbf?)(KK8O?HvAKH zVOgRW4)XZ5AUsXE17%FBPLA|VQ6RuNic^o;;;Gvr`JWU*1l#2vA!EWfLadoj{2*pe zUG<6I%f_k{wEP19A19Q&J(AJe=I)CumOcJ-w2`HV^6DEgEsl-=*yaDD>!s#@lcPfi zsJ_JkHsUsMpI46)0vw3DNrvmo@4W-s3yzgulz^(EJVBygP} z#-%x8)n@XJ@Y0#~v(vne3RDtRL6%(HrG)iRe=cO8dhP{zT9R(pymJj&6M7^br7;5OEKdgR#2~z_J%}6 zndEs}Wb1c%5H#W(>o6h#(wes>h+$LH#)3C1Bl_Ghs)_hD)^Ay}iRs}UDQ&G3swNq4DbUH`5_?-EllH2D@W^327%yg-5^kr{!MsfI!jI6bE z`ScGkAjb}&^RRo8G-#D1={O&zFL!@VXWUHQ!I`OFYqcWG8W!^S%izol ze?WFCQD-ZWn)7J3QAQIqjZKNdT4fq|jI+LW&cXSx{i)As_xpRw+RaaxB~$ZACdLNw zWyZig*DoW-UfCE)vJ1YBer$|efG@pUyx^6|b*Gc5$=klG6(EaDP%4+JzAx{y7%OtcwXX6hp!WMZ%=r)K~i&bT^^4$wM*BuV_s`}%DApGO||{E zV46g~>3lqZ^#vP|Ad~5KatXi1ixQ=^yR0q0Q2%kP5GV~??{rawU+zy3d<=U65IWmc zP?=pKWCd3*dAg`a_p|&1q$JVmQXZnDjB>-X>e-)nvZn*fLUj=r6w50)ZFk~Sdv}Q5 z0yXwXVb~@{27D`bmmaXi{g$E(N8Zpl&Ns7#H7y|dT-%UO1%RnapRE$Jr%Edg{1iy1 zu=TaI8W?FbKW2H?6Zax@VDLU=z?fSmWgCYovx9PAvY!vcJzm%X$81zP+(@D6}jppk5u z3cD1tP-M;eU6ePJeca^aGQ2F%l;3M9YvQR8Zh>7EA?)@PFZ17WsTv9ya7l;06b2zw zbv*jQH+QK&7gQnq=LR$D_&ppb)xtOV8woFuXbHY1{_uFTu;^|Oxft#ew|~v%;$ZU7 z@TcG}qGzF6GJ8YTg!u8Q@1tN2>ubC%G&*D6kH-w=Y<*eMBwBm>3)bg;N6C5Zdhe%)FX&+{qX za$w^)tN36v<}oK1%+r&T3^d&)+IPDfy;8_Jsv@6HOAIP%_6R+HK+;uJUbSYCNu?P4 z>{LNXGA&GLpq0~#ozpXfi`VUOGLzWQOe3bISB7!oC zwu_Lke6*1Kmk5n%WVn4}6s+hUT_U2ofE##QE_^F%2;UJf<==O|Ja~bH-4GK4ekju< z5-6T2ae89CFwYY*Jf|nz+`dQI(Jl_x2Adu!H?-lhta1VVTFsvIBp|5Z-742BYQ#2< z83-CV3~;yI@J~#Bp<)KZnz38>wL!s*Sc7UnB{0X??z$yBBB1w2J7C>|riYZXM;Q-K zyUtDGe@IhZdeSFQMRegaUH{LZAn5KvrpQ_}BnwV9?OdffZIs8vAAc!;VjP zV&3C97L9Xr-v2*O0c}f^gSciUx~DI-)WQaNIf-^Qzj;mamX`@HmW#oD{0e>f_LU(8 z1Mc@|ImRDL=EXL+fqg8=%eNkxT6~4+K%myhBEh2*Jqj5ued83os|`1_)~MJqO2sAs zlb}#j<2B$jPasGWtMnVOeu+vB{PiuTD$vre!c*gOxT~l6c?M3B;2&p} ziKu@e3H*}GJxR_#<`$jQ4(6&8_W(dl`}y`8yxW_xBN8(J$ZRPgod{Hk)Bo5XS>!4W zB&lQ16o5z;Y@h1k`?31Gy`3_mf&`*+vCUgQU{CO*Pz@^ck$hVAPW89^PYL{9M1GA6 zgP{5!&&HT%7SGZijB-B`>yo}@KGuuOZz#fCn$EA{FkAi*Iug7J6~y0a*r;0nu_APF zSDL!0be~81mc>w-c_Q(z*wTZ#e@aREw#lc3JJz#rTC9$e2mB*DUrsqCYF4?M)GB1X z6#uA92smZjk3<8<{=oZTSZ%8G$CpI$RKPWgTH8A3b;av`$8Q_tqNDd7CUO z3KAA*)jnkBJcC;pAt`=0&iVzYDLd3d11(1sQOuTb)yZ*zWgLAu&k#z@)l<@ zW4x`hIf*K5ApSGMYSXP{B=Fy&Q@$$9}s827Eg7q0-quRsM~rz-_o5-6j9@g<5t z0A5_+082&GCvy^`3Tye>w)jISwI6oi7Or&@lbVVfJ7K-HAC4bStSP zlB-#GE|*RS`wTInq? z>cECQxh}XLa7=#~Os}%te+5 zK=lh$a@U2Z(#>c8S4UfhqiQP2Iw{i}e3CDsBfVqnGULM#mufl)N59y<3{~1x5rW_1 zk8vu^8&VdQ`F|82a_PDaSU8=#8|lBWBZwko`ZxBn59<{YuOJqPH}rPU^t@*ta{4pd zmP#^gjQ11rLGYjxPkP{7=0k)}0*l)Q}zA_CsForvkAXcX-@ByB-zT1Up`3@k&aS zQRu6n_0r|j;jZdoCiYu~p1Ub+L0Hhj=$toGtk*7HkqUb1{R|V2IqF$&*wo;MEC^xm zw|?h#ikz?lD><>=Y18BbHOeL)=D_Eiv{sgu`Tv&v^_1>aK5FdT6RgtWo}>km0^A>T zM+5XZ2~|UVIRMNDU=(f zL<5D#GfIN_GKGrE?S}m_ydE~==4zz9weE(WAfwbGBxF9F^WXM2@g} zhaq4`w9Q*OeI8r%;-Y125f2nJj5#f~DBSlK-pi6Q`C285Dx6mrk5NVdF==UOP4|$;s*3#vwqxG0fd;V{zgPZ)MS@ECzYAW0<2yF@wYMoAZ^7ozwE9Q7e9AY{$ZXhn7gA$SiBM6V6^vQi;k9IBija(C^ zBrLu^D8ANwQRppbqgVV2<0_l=al&v+OX=5@ASXFZ{Sw7^L&y)AG5bMERSkr?5{~L} z^)_KI!RnSfZYOG$n2mI22G~@>LF$;<+CI6v@8{YlK8u=)!ZBF!LUjcwLKWgN8(GJ>VFAT&J0RzuO0 z(x1NacjA^@@J^M-^elqO+t!fQCjH^;qZuRCM*dV#Z%TPVmw=f#55F&~G;$@m<>~FB zM(f>ZknBT#WA!NHxWwzo@$qM|mj@C|!W6K#gdA32mugUg8_@<%0R^xH0aQuBznX%BgAZB=?DAj#E`UlYXHYRERFjD< zc&l@Nqn0x3F0pIqiu;}h+4eyzSDBg;etV9mB_T+Md;J}7qJi0oHZNSU5R%NCQ~=YD}G(r|LqA*d6|h zateF{iMUORPagmdKk<+{%8w2vy&5-^Y!{gOhaZ@m2|TE((18Ol+@OU=$-F=W*@+taMZ zEY=*2TT&+bcJQ{7t6Gl#*=xy)u1Z&tSpx#Qhbh)8fUS>KbLt7rfUvubXvGMnrQbrYQHk%gkT-_FVrQuq?#SaBZ z(%&kBtDm#2bp)(FAxoVIR}-A?$lj@P{7ol}F;(S-)o`pi$RFq)w7E#;9KH&EC39Xc zDRuFVwn>>O(0YmA0(DXRfiq6O3xJtf=)mm-ofIIkZv}v`)=H62s(_&7=?9B9R#v0$ zp+}}c6F+pIkO?5k5*Oj8s->1g=T>#ZSNqhS=iFg)9-MpHsuF1(%$a_Z!_6IakrRp9RY%Sbb!aBuVZ;($jm1iNN?l2SoMuaK}f? zjkXIwFXyy)a(Osk`%!X9$9}6PG&BwI>9ssPU1la&hsXRLtlRfTEBySc@H|Ck!%FEE zLqe`06LHFv0)Tjoe1-YcGPdHCkf3<7kHhxN_??A(&nuZbTw_uAEoZ6822~ik#yPt1 zN_-8ft@!{OUsv-jop8e~Rjp zGK-R;79y{3=*2t_ZtpG+oxQT~k^4oAN;t{RbF{nXD16w)ub=FNsAr-=xO1`xHuie3t$ z@iDdsN(zsF5QXtgckEmA1lv&;TaXC#TxVfSFr!CvSYGR7)4XdkWD4A$x6Zg8Xc3rC zlL`lPIQzgKvR#}&go1H_^u$b*Q8~I$;12FP1EPPCe7|xTyG+6c0&|3LGUt3LD6pQ9 z3Vj{jemLA&I8ze-S9-rN74LU-Vs$#VSr*Z_uK*EWOia2%?4hM6W(8$s<>l#VEH5BL-plWA@PiqQ4j-g7!~qr1#a4YJZ13L7mPkEhx=c)>`q|5!0YE2 zLn&aoI6AkXroX?-E9gqo&^{RNM;85+Lq=XLn`RV`JGv#0pE9IY29a!;q zl=gCr-?tG^3_BpLBBb3yen?zT@=gvN-P4yH_)OxP@kQf_Q5wkESmeQ{qT!7{dhvw+&K~llPVl=7tELz1%Xu%L8Ku{lc7pG7X)j2(yKOj4r zno+t4I2cl?rdcR_9nC?=CS9bGR85 zviL~O%(G_as<46SIP3_n1}NWOux7paggkWblw$RB+1Y=rP8+oN4$*$Ms|`;Q47l5` ztgJNiXt=wpo8)LT@OKOSFJ-!Ih#!6*D zxjipKV_fcQ&7{5F7c-m0UfeUCW4u@|^0FD7eE)&^ujrjH_RS@2WmD?5)q@4GKI>F4 zuc>dDjKVd{Bb+20QtjE~hh7fQaUzTQSAE7FR#hUw&FPD=L))K!*}tMdTtrgrKYw1W zOU}eiX^E~Rsi0vvCZzQPvBg+$cPI)IleE;?j7?`um;L5OoPWr?IomdUhOH_5B|14V z^YXcS+`;Q7e}xA(gn(%Z(5c5~XhcV7FqDt)LCesPi`k!&Jdx?GkYNo1Wt-bA*j=rG z!kve~gjxrm{97z7%PX+RjK0>@@hvY0NUwdtVkh50+#YyA`64yK6sy zCLp0e4DiI)+SogI*rQq9KBi-VoL)^!AmzaQLGWQ3q!Dn_v9?sW6ERQ#+u_ZfnhR}B3c1{=NXCaZp6v<6?fRoSdkfCgNe4@3M(!1V z$_aSx)wZ8|?b3-b3NE8?xedn)3A$b;SO!ip%ba~98#`LTU$q-1mgG9toE}x0FeRKO zW6|+B>}5Td`j|&$XTSeK@lz0%AO0TVg@X_IQaiGr$KkRy$k6cja^Z#v;rQVrUVGfa z*$U>?;AXY6(?J-+%%7#%OO5Co-f#%O!wr$+U`}fJq3{N-fv*srdHT(3wQ)Pco_l;Z zE_}D|%M?)-Y<`cVH*G-k+wU^0xBc}QfC9Lc%%7#|Tf_en^&8jHnY=LaXV38gjkas+ zxw_-lsf>Sn*CYh?r808{OPG~`1$Km)yz+#bSP+gO(I>Z#o<-x-fmf1J=%Y)TgNEH( zYPuzlZN%v*v0(CO3zgP7nD8GlFUwedOyi3=uhBO0X0Jmx>Fb^B$iCOC;Gg&hBmrFE zaM_E=x>s1ZRF^?8oE6=r3IPmgOWqLc28HSeZjR7fe68VqTRau?{+{!CXIjecb42d9 z=kCK1F1cfb_g>Dp+jYif_ulNYq7LBg@9U!#G~NX-wL?Sf-1tML*9FI$uV*3!@GU`Ku6|t) zWMEocw!Si)owP+#w(;)a!8)wi#>$Wd^G`VlVWSVtt|huU%tmp{{yTnbAbj948!JQ= zGp<(Jaoci+PoJ+vo|<}#Us1Y3IQ{MCF5hb|J^%kM{)l^nyD_(h5v|95758TWdk|{H zg5~D=dyVST97LT2bK;b8$a5UQd{zQipBts0Ha(v8l(KHFO`5bk2To3*)(77sV|+Tm zDE?gozG{YVLPEcP&nD>`-qTHkRViUHha(-9*894&tv6Qv_3DYgaE{?0&gk?*Ajtcx zW#6Nm&(x-!I+?w_k`G#zR|yfA;J9t?T2`9CJ-NbN*!9{e0XZUmlIC{JzDJ|7-M&a< zaId?{O!A>ihhkN^6a_1rQpIOGf=lLRWUtqYN31LapL0z8$hljx?24a>1T*7<*X(Cp z-J;N2H;1Rjoyj0(G8!kbqvT$fcfkoUuo0G_r3CSknPe*`lb@5LX1~Z`t^-GiLyAXS zW-!0p19*8NsJ`n@7+?zbUzpE;n`oq?qa4sFmk{vv#*&w*sQKNsb6jj(;K`H6e$TRS zA@PJ9901`t#x<@Z8GSHH@Ubskbv zq%n|py;=&V=Z{9Oz89o)X|$`*>2fjAmW}=}(**~P5oi$Fh4*BB{{=e4*QjCJYaaEq zE|FP_=V#<_w0(hxZov~)2Hm}{Z~xHo-L>_9fjUf*$3A1O+-*k`man%4cOxy49U_3Az%cBJ)%HS;zC?62dk*fD z7_1C9wQi8p1n`3ARYfs+4-44~O#J>eDk^^Yg8%x$l4^uPR`EF7!*X`%V4I>04 zKEXhm%uW8HkrA#t>BeLvmXIt@jrf~BlHpciBjA>BlUPB?zoroHXJ5wDHMI3 z=8xwY$G~+C%MRXmh50dnEZc(9T^!m!S9TN!e!q{&)BdS!+%KCuDoclUeZ}}Im1uQ@ z3itNY>Z&{>1EO+Z&!wlCWR7YmTo$jUeh$9a{)%Wb^;<0R7m{^C&2+_<7e*=v{tH`} zV?D?A1zRp!4qU%p$q{|wxLIQ#`^7#8=v_Pvkez(^Yo8Sc5oj^m?kZErAAfPeYvCh~teL@*xDp{BQyyWhS*Ycmja%V)7 zWSq^#RVW1EekXTcIkFFWI-NJ`aJ*&Yd}vhZ_E-`~j6D<%kpTZbI%?SXQy9kuPfOJZ zQBphb(2_}f3?OuX4?t{c_n`A}9Xh$iEnV%c|dY#uj($B}~)>dzIA&;Bg^ zo}k;*|3&fT?;t2IX)O2>uN#dZoT(Z?wtAFqqGEVS;ogiihdOE7VmN)3dj6+2+vX0i zpxjQ!z}|I4lfG}q{>~JxB$cJMtgg`3`rOQ#df&pte=_%AaH zdz%9OHDbwNOvsmY2_K3Rmf7irB29dUViSL=hni-^>W<_RLSf)6TqHW1v-hDi?me)% zE+B`~Y-MUbzgxkXW*-rnqh+TXD0E*kW8yT`mM&w2yqQA9mJ?A2b>@<@*U*^~qr%leN!t%PT{o_dWlIyN&>;Rzxyc>d%N&Ei+!vF zqIZU}Km9j<&ElIFs7b&s?36c^; zC``Du2`g$cxJ}Tc9?Q&02@vU*IEWD%o z{Pi*I5eb}$BQWFg$_~tokYTVDNxW+iZf%?+otpBHXRJ%T9g##mQdf&BBySUhq6slcs=@#> zx8k_RV?t;*0n!J3{}BiA7{{IeeVoo90V2EC{4AlpOu%*SHK)67I8-U81nF|@fMG~o zd6|zQ&IZZ;OpwIM{S&-<^Q~L`RF6k+?+fFq;2_f62#D!NF^I=P4+bl37?uneMZdEJ8re z(hY{D+L}JNb@J|RL+=%D1$cXBKCVDSVSFfo!ez>azpzoadwm2({_;h^sXcoP%mM|dCi>oUD@+h^Wkj1pZY=5@WqIcD< zY>Gr`0GFg)kVu~U?xm%fPM{nW(vr~XgO$!}L|ff8*3oxRUF*&0X!wdN1yo3J$DpUS zX20#K*N{`bI%z=W4r;Ywj#~2f{X1#2Wof?a{F*vlCF`D*9-k@# z_gcXLgN^aLjC(~Lnv)nT7Cecz?et5@z4jH!728qcei=Mf%%Z1DvXs_c$QA9q(GfF1 zh${!WrVbKc!zN6nSoEpH^VM0RS+6N)4XMNFoX_2)syjhHreZTG8RWMg$j!x$WF+7| z*(Qryj`kDV@Yfy&8hC>t6kBuU+B1cFs?R1ntS)(b2Pk< zWUg9N1`!Wm>CaFnyrC2|8lg)Ef|vq{f1!&rO#|SDOq;cDGtE!&F13H|lg)B))W)TR zK&iHuaBV5>bN@K~?jEn_4gN~cLVbZ{F( zZ;^u7t(?oUL5R%e90m3JY#foSi() zWd|oQN3;UA)R0q?-UWd_oRsFF(7Lm{xG*UgNrgawiD!46-QJ7Lp7y6#BK!78&4^(G zf6n!l%7kgyL|wMt)14QnQP^? zGlewbX74S}7oi=iM*m-Iz=c2jZo^O>wk7w&uSVl|v@iIfdAb0C8 zXEIK&XqAF=C|DI&vIlo(8~xLRn>%iH-|x~9t?m8ujV*whGqrvtkd_M|(@1K;XNh_~ zYqaVjKtx#Kd{D5bzU=+H%gGBnl&WGbf}}MGF#Ltio;TI^Bwi%N$p}Du|F+J6M-|Ii zc^wiMdP2VyxE~m84>ddP#XpH0BZaACayo1=mgDt7U@^~QS~am9%&#S+)7BN%tR=1J zym`Z(1kb2p!Z58Jdft$LN!7laO&Og6qpe`rb6^N0u^PdDVdJUPXpQnQi|9cpXcrSm z4NS^A{{4$rB}*bIBkne#d(>g<5DyJf8&wB)j0T_@MMT8J^4i)c4@8H#dPk0qZ|9W& ztB=oxr>1l-Fe~M)b(Y&@#;k!#H|6wWCf-CNawrG2wM_Y4p0BRGJt~WA*iS$ec&uZ# z-qf^CVe|!mk$U-AtDak*tCL0vn^EcRc??vG^d)?+lJ+q8{_+qLpdq?X9vMJde=p%M zf*yv6%Y_Kah_7Fj7UGJHacsPVi49>Yc5}e=hw~{&~Vkp7@nxcI{n!n9HI(8z|x3({Ua|=ux>Z4y-x`e zTtsR$UeKcZF{F_x#o%Y^RhdBcCavK5B1XR<%~eOy;POHuzpYgb=@$;97na0Ph4>B+1#AT>fSujgv~~ucj9)6wLklAQ>X|HKOR%bRd2h&|A-N~*@lL^!ce{vC~I%~ z*F?gfDq{ZvzcFc)bX0k4?ngP^s$$?N2QW!AD<(ka?!)Xzx7E67c=WWFqM7UAdk+TV zOuS5@(d}Ri!hA6);>d$pid++O&yB=p|j zz>!97Ff`xh*%Z1W(vumT3o^j8{CZS%E2j97y1e$pwp|uJp>1+)6nh(4z%8fwX%^3Z zrnI`H#)ZuX<9e||{0tlBYeIl{jF|KCN(Ak(cCZOW*z6~_du1ovzvYB9F+d&8Yhsmf z*LuS=d^fj`yLT|AKWokBj4Mxj$)$!xx*3}kNMJi(!eA>SvLCETs2a4=gSJN65L*I? zzy!y{nSc)9+pq%X6p1kZ+y18V}fb zUfq;+7T^qZ%RlpdnNOgCy8*(Mx%##kp#ipe2%rA^xwm)-a+>O7leXn_CS2d+l4OgerKa{yzJexW%d<_o;Gd;{u z#g+1_(mEcEf%ynxKTv3Z5CXczhMIGBLqymQVY{tmFiE|msP^c?jVehAfy~kf=2)B) zc2s}cKM7sXGO@f6Wu586c%mYv8);m9=+>jD3pZdM@>A@je^8J)xO5^nZCbT}FQCog`}nfe7T!}Tzg=VC=` zU-=#bzwxTAG+SojxrnHcI|xQi&?_f^O5VE# zzLaoK+ur$>_Droo=DQ##>wA2)YY3B*i!(nF6|O$Uy$P>1diKhsD(H1WIw3`kg$A=G z=};1ATp)Hu*%v!VvGFl19GZgTh8$Lyj{V|^V!@8_yKR|!XyAL{>bj@=ntFB1^oC9F znmRPm8ASW-P=Eu`6DBDrCMK`%A;SCV?&Qec&Q9<=yms*~B=k1g=G%Xceml-0&UnPg^vAX%tAY>O)cXkiQKt3FZw*LiOtZT$BMwy>Kn`# z>e>kvyrg)O&+rJ)@HV?J*b&Z57VgUcA5=>OO8iH%oRUXw%=aCLAeeK$_2RL_zuo~D< zR@I&GlJnHwRNf5Ma8xK~gBo~)R?8BJ&AGntm>FtxnJ$TTaYC>>$6*)83GIwNz9QLF zLs0v%F>vH@C>km=`VSkJQsgBkO1268bl*4^`rHw7b?If-H?rWW#9T0f4 z{wlLp-L}($gf{*wy(lm9K3In&0{^9x2Z_@|S`7e=`YiDf`07_FFbGS*BS1$gIq? zrfS#vN(sVngm}5}9Gr?;t>yQNsME+@`1~}c*=Aen&r9r|ym|J??Ec2|UJTC>wfBdy zg7_o))hym+o6Fy5C7^SL+4G_BKej>Y%j zIOf+c;Ysk<%I_0KzdNG|IS49kyLi5H#w>{uP{mTc4PUL?a5??6|FeFM??h&dEh6Hx z2&9xVQ}^srtmmkiboTrKb+GVwUc%PAcP5i$lYY3BXbJAfp7UeV>^6jReTK+yg-tql zirFTuLQ#5sO-)Um*Tzr(+$7T8{gA}i6%UW@wPQzlNTE;8C+M$wQ!pYB%N^~AItb#n zr|}~zHWitsF2LI%Rn{pAss*0B*=R-I`3CLb#<#G-c4xpfjAWY>EUL`GG$XB~ro1Na z5`O7gU(VP_l?J=`0`2y0c77ETdb4wlBy0}?kKx@1??#uWzeK4KCQ`pEmj=m3x~utY z)McAVxq7-&K9fOL*mh4DaAvvuNSDTA5o5QxJdC43|0qLig{S>L;F^XMW2Q?RPP6Z$ zjp2r=R&#H5)x4={5p0S(4W_L^{6&>7#`9oM%_J&NPj{n}0zH+|YhY!Y)AZfP-(<&I zC+u65w@D4cwN1XlkZ<4~dYPrB$9;R{Y45l*SnitTf}S~>6_YbNZ2?0h*G>i`(X;n1 z(gOMBJyqp#uij#xV1OF_squm2J$R#?ZEwnSR*;4o?)M=>#`m(u`$DBg-}5b>+14P} z`}boMus56B(mms^K$JwsXb>Li6Ef2;;@d__EQ=iIuYrm4vd#0}ZwG97h|Rr~A&98V zr%|2J!5ja5a*Y~bJ2E=f`>v623LSPE){^jvOAI3L&l zB3yV_S=9EZn+B=*7z#?^FZmz>O4Sr>C_tpKBd)Rc`J`{9xR3G~0c3pl-z!k?EA0b} zQ`7B79r{|~M^FOnSEE|L_p;<2crb4&wp@ZoBLtV+^J2zXWHFL9g#b$o3@^frty>5O z>uX(m<4$7wdbd|1apaC^9Wij(GmW1Ha3x>WZ$AH0B`8dgwxAsXoq|VnWyh32NQD`9 z2=2A=qfMD4uTf{1+z;_SwJ={a@lok@S)I=RsCx^rs+zTLd{Y7{qF{r9lnRO{qGHep zDy1M`Q7TdbB8t+DL5YIWAV_zYv~-trNOx`6o1Fj5=3qY0InR5(_xrBvzpiVTy*6vj z{hNF4nYnB26)9a_IDNn49qG`BKaF&bu#uQpFgdenrPE0!jFRR-9<~j~Kg#v{S-u^V zjP_qGyK?wYcj%S!T#@S*{>qKGx;B9i)p|RV;s*Wq71!RVu&nx$+G%dm)%38fHEWT% zb@Y|Q!mR&llJ0WaBVo-i{%7|R%Pe}^O?C5-#81guU?l0}b1j!m#V_~FY=Lf(N8@@I z{5|&1IyTYGy}WI8)riD+rFN-{w&v<^9tBQevNn+UTCP5$J(&rORB_Qs$(968BD)rm z7*WGzGC2!>#<5-O%T|L-Z!z+l;Nv4*uY0q*6ti}dF^sNQSf7eoeKGI0YtCKa_HkUk zCwJEsN$KLt+h;5cFU;X%1jo$g<0-dj zUm0%Tddh8qG0zEpcgBK7&WN0i_3*|-!F>lM6(3%rp7-P1GGV0bVP4r|Kcbg9_raC1 zb!EZ(YsBV9kJudwh{)#|XwKl%6mtY<1xVXgYZX>hoBZ4QEi=6KD&kwU>0V#C%oUTd zx!JAj6px}tH5qr0U*_cMYC9z@+u>R%g@~ZDSv7lhr`=B`ak|K=xkaTpUcY(k2z9{0 z>DR1r6SZWGy8fqwazacNNU$6B6&B4oHZtS|7u$TU-B>DXUt${A6iUu~Tk)_W^BoG? zdOQ05hc|1^k{wEkFzQO`cci;3k_k!zY2w-*M%|q3&01~ltsbOe!eqo!e>7N~o;tCg zi*~m3%4*dNgL&A>P_IjTE48X^ zYw3!?7cU@7c#Z zEQGCQC}R;}?^lhzQdFWv1X-(|5=&lf`6I=M*MY)Sn1s}o2aHs-IvSqwAk{ix%5Lm5~EFxL2GnGX0G@ZzfNKE!1?i7(AD1_b$YkH%rRRMbvk ztZ&DIM?s;w9xHi=Ck=R?+40;wcf)po#^h8{04B< z^Q3D0PDU0ozGDJ5r58sqltWL>?&i}Xz45SR_c=F#*~Z88UGLrVWqg%fdcR}@zh}I$ z(kl|l&vX4nfasikuz60VN}wTH8Qt zMD_568^jaTN^eXnuj|=oxSQO1R_H8t!zcdvOm$@MOZJUJ*tVPp{AXS^m9{QeH7SV? zU{x1Nxud9G=$F(&|qBs@!$k0DH*eI$UzRInM_A)@)0#DwfC?rM6Jy zdm|vpd6@;n`)v~snYDsMptPk@J3DrhhG0RoaoE6J`)>FK%;m^vy)MBp&vVrodAhY* zYDajEw~HrKiCiqcN$Lz4Njt^KGfqCr{gHy-QmR z+R6B}UGDL$sm%P_QI6dkL==6b!HpCJfw_czxr!OmQUXplAMX47#P@1={oyz>TxW*~ z5%=oy(a*feU6Pa+o+bBw(v)k%xv11^zZLxN|( zzSxh>Zkrmr1#K=aKdtg{A|c;$vgVE4M9E>7{Jwx(%I#XDX%X>MqHicpvQvefJVL4B zR#Wq)V0qUWH-TXvZ}0hYI*-V1eoo*Pb3AZWGifiAB4Q zVtGUVLB~pm4^}taVv|o@_;4eK_`J49S+-J+eN+t3!>9VGoAzSp?Ks{?%-y)5wcTJd z&hv%G;UwH17Z-}iV*Zwc&5m|qLgx8j_w4dMap&5#Z_g)`!A;%77I`8%+%dbS`pcBH zZ#D%@CzNw~Ta=EqNFOZx@`kpL#DPO`x9#DAZ-dXd1;_9ouM%awIDVYslI82|0ihST zxoPb;Z?cVbCB3Yh7T#l9{^q1Wq^#j}g`SDc=imErN%C^hxSEGA>u(?TrM6-^y6K}` zYS#Al$!rm*+^H0+jM2C6s}Z-&0Y*T!sDGfYBBj9LRbWPh*Y&0J8|Dob!qAi6>f1H4 z>rUd)ZRYUt`%I40o|THDIgi2WO4#DvvSX(fb#PwO&McVoPs1|Qa;corJ zgGVBK@7wMuB`UDqE3q=CO`>&~^rWo544>q#fva;9v`HQl;4=!iRx3Q93G(O99 zP~cd7xFU}hQ`j+oy2eMQ^4w`%#(pWA-kRG`YneAw`NfPm$SXpWoy2okx!z& z5LoO_J^g%l17`Q$P#hPLva?(;n-)Jc&Ff;(>tF}}s^ZdgsQTkGm2vM>^f(z6?2ER$koh9oHE z4e4G=%6A#QmsXN*-j8LgIiVrjd*DeE#qh3D7;D)jY8=-_7K2-*%HFu}=)nL<=x|e` z2F5=KB!I)Ti~Y6k40Zq?PrJI`eDlNpN*Nda0 z6))J4S{?^m_JlX=$v)nDKWDLV*>lhrXQ*{~Bb9fvZyo!CFcMKEnH!RFnT1nwh+JK*Zl@f4=S4iLo4wEhUwyt>rov@OccFJ;D%(+? z-F@p`Cy%omhDTzz1aIl3zAB?gv0yVpQq0UEV_r~Md2ZjSag}H(y)o+{0cpEz>5VMX z?pLT!Sx#ghWUaR`o8#$Tow+l0y%e`vFyEcbF>jbYq8yGX=Z(xhJ;YtFxpDO6-GlIb zoV)KNg%wm6Hpas_R{$g2xMq^lc+goy1#g()cG_B_Oj@#<5I zOk`B2Oi1jJ4QTxG<>O?)TPY!z4e8hNL&&SMH^|Ydllo1$b{W<0or(fiPqh~pB!%xD z3)RlVj=HlJ@<=MBo)8RFrS*5F?K#G0@XoibcoUx`$&_VnAz}pI=-?qv+EJs;4X1}ycGsD*D0{csh*TNeD z`acp4(a9`$J0A+v7}~n~%$cpRMfVQ0@jPzt@;$4$Kdh0p*T-t&hIspDm5OTH!bc~D z^C(LLd~+-#;wx6ibC=X{@|)bDBOkTNZw!!ew(>@cgDFFrp! z5Jugw!Ek#Z_2K8>yJ{XF50~HBlk{5->U3mLNrVX4Ge}PNZ%Q=nWbD!7&~S?SD#=VadP;}O z3|}iYG_Jf!$0BD->XHrrm9GL{j~&y)@_fCW7!?-hniBXVZO=!gH!{C$`g4OY`L-WXA=!RaREUJzv=wcUH&hqVMieoHs_|TmmiUX-j=le#)ZDTxo8w(Sl(RtIZ!!?;<&W_<~vM zZ0FLX-jQR+inGl%aJ`56rCe;D_BT3Noa_0xi4)(8)vVutMfyt6MVF42MOw~&=Ba8r znW?=*SBSIT#;J%CZQjRsGVF5IQa{ZZ5eaJpm--KpO?#<6FAyIP_q$E8m>sU#Wn;r1 zpVDOz?6ZYroL!E6$AG!s=a@3DlU7X+f)Xcdtb}E5-xjjt3wuj_5Wn1A^^~mlUcIlj zcF$XB{*LD`sc^gb?S zfmsuyf|Z@*PLh&SEf4(nHK%KTy{U3{#XAuGSeKfi1IOOE_=>LEMjhYaCZnWta zaD7JtgXKX?x|(Ca@q6uCuaO;PQR7b2$CqF|>klw<7v#7UtCRGP>J?iIEqU z!fynU52amah)b&$tR|12i_ZpF7Y>DwWiDIzqb6gmr3@Ee*4~M^zjsgCbP*l@Zf>oH zd$(WK${D71CovMeXnRTKeq&?)X`zP#U+gFrX!@3yiMXCFHw$EAl#Ynd#jOq>z-4^S zq=Odc=7tR!qV=_$_MF_?uq~x>-FJ8--;rkQ)fhd!eFu;9;*c+k-J8mrg8JbW|kE7mSkn?OFp#b{PKb%7`0uNr(~)FfCY zK^yPm&OPVUD_HhjFQ%mAssZPd=w zH6oQaiC9{)Hk{b9%{~-ptW~ZE>tE^Xtq6IfKe37P*D5ZdCOQnYZ!VI;Jxk=f>NN+TqV9@Y7wBah2Tn z*cNmCs;QhGhUva0wi;h0@1Vm?gu7fn zBrDsXm27`b>eyLws?EJq&U@}N;Hv0EI;c;oL`OtfOVXvtc(=t)8CloNPNnJh<7AR8 zCbP{vj%6{z?Ch8`b}FqZ^D-R%^xm8+IF9Rzm|}<6yN7HN9s4Iq zD0B>FDYC4Wbj(jnWAe?O7c)-M?LKpep=ytrbIuYMacJ&|(NjXb)}c|E?B&tn?ALF8 zy!L5mj@s~u*JsD_6NWFIHkaViN#aL%<<-ltYNt5<19Pcd_5L6YE>9njKCz{Nll3Bo6e864ziw_N#3#Vjv zPk2w!x=T{2Nb}N_MCa!wSF_^da`{bZE-jbzsKLAqh1|eFqdB7JWb#_;nu&br)tK^1 z%A9gCn2nxlI^C!MJ^pXRb`Du9TAVQ)+W_rSS>-pqTff?PF7c|@3-6>jJrXLm2vWKRzH zdQyXKWRFXSS(SM4(0f0ZuY>nw<%_#0&dvB7jLBJaziuH0VCwyDGp+g6M;aaMt=*k!E~j^12bPMkPlJwv_~z7j@Y3I3!W7`XN1 zy6$@>*`Q0#*AMOZe8a9TZZT`(W^$32N%7GLtJKQZv}bWsr}OUljo&g7diZc3>2@>Y zU8W~OPoCiqUZKFy*__c)U%YkqTx{j7lz^$bVbludhKu`1PUYm>+Q@%_;m!)tP0U`V zti>`8U{+P~X0Z5?yXi)E=j6s97EE{uvyhNVVjljT44VkuRvN)>mV|rT=x8_5R{N5g zJ$`I$Mk>zUM?C$ob3@~?9QC7o&uYFA`5(XX$$7MKqvG(H-bbfLi=6J;gK_CcMLoie z8)H-)6z0myt8xdNZsn>a$Jv}B)xGc(??I8@6-q*p+xy6>Lp|_-=;O!SQC)F8*s{jR z?+&>J>TWNcf#!0B&zJn0K{eM51d`USMo@S=TV+hT7C^ ziBn>m+N-;q&FHSPU7uyIQ#_YiAJ?HHM}ldsn{y772#1A}O(rn(6n;ykyP_R&TT5nl zJx`&C%(6iVrds1u@k6T$38Php$)*P@BWle4>BauHQp>5neEDKX5!$G=sc&@CPPv>Z zhpTgK-k5eya*kzEDmL09%Gt}g6BkTmrcyE9L-j}9Og{=rGh;~I1pLEgL)v*C<=bX* zbDs#~7I^t7^Q;X&HRE35?ouY#UAZyrrnBUMr*gf?)E+XP8SK~?D&TPh>LizD2Uh*Ewgt8V<8R$+9wSPCQz^HFK)rxNc;K3RgX7jhwsj zRY_Bhg+)I{tUI%5+uZ6@AhSMxN|nMZW)n^NA`NqY%hDT40Y?prJS|OPm)Gv&ugWf0 z=(%h)H|EP&BuS!4vedxGseawYr0Dwo{d-F%zPL28(9?Ar z0(&Sdb0~;=i%GJH0!OO#-zt5P5}KwAt`=|Dhbi#z`lfw6{y3Lv9qG{5ScW00MOR#1 z?`a+zy}|uqV2ZY_l!`9e$x$p&_R!{Vt>iZvU5>}7R}lzuvw_D3~pq6_abndG*|f9g(+O^=J=a?^G2s@ zr1%a>`RE_Hm2Eoe`D){le$k#TqC2;n>-S>ihy@ragM&YX_?=t&_*&`6kwZhFwHjd? z0&2ftnrL7eitSZm`KkU(mKOe7SBsZL%i`|bZ+^vX|A2Dwggm{J?^&`s?m9vEw8s8o zhs1$0j@(Rb>V~LWdPkL4KYuPA&3m5=-(JEe_^B>D^Xjv0npK5dQm@}XVpqF+;nJX_ zLVuN)ruYXg`A`XIoWI@yt~U`LAB5?e^sGllZgLI^9pK~Kw0X6Mw|~O=a#&^ZF(L}9 zuNxwk6;F zu2z_o_F?y;wR|YKu*CUWfPs~0YS+eb;_^3^KD?G&V>+5zW_3XFeC-|)Wk=27K$Cao9#a&Kul+!72iF-aO70tlL-*qZ;Jej*giE|&Fg0WA$ zQBvRT^b3NoW2bBq29;S886qDnFfvvMg~ozAC(JRTyMX{pbChIvQlgV_g*=B&XVwCC zgh!hzt9TQC$h;bPSIjXx9WvvyL{nWvPs)h6L!@(n&l~2!kkC(>@paVXFNz8ex?Y#x zC4|YpE)1jW>60`pmM$&0XEu#S6WKXej{BQT+~vXK_*+Ga1ho=<)$S~o^cLk-{TBQZ ziuRRa-`B|`$D4<&ZEkz+obux&QGT2lJ6*F)tUixfH?m+NK3aK_RqITeS;K>>Ma~wg zoOtQLsl(|7hfJ+E?WTV1WN^GY{L%~ZjyNVe!BB-F7rLNV)upvxs2L)zZ%w!s{OMv? zCSzo18yOW9+aYFuy(N!*D)DOk0u##|>5H50hjAs!klhK)?~-5*B(m+)+e6en$v8Hy zr+LDvd_34mFj8Cl!l?P`LXF=AlbTuwE&fhFM!Kq*i4@gr@iTN3mgG;iz_)f|y)HqI zQM#T#-|!&;aneVWmsGe4MWTrqnci4_z~FEBVelnHF{`T!Q`Xs!$D-e}k_*y}lI&s5{qYkK#wmlWm!;!>o1n|B?>KmOX#u-S=? zmi}Pmxh>6MQDOHecWp|xWLC}?xqEGgK2G$&&8iaWl*#LYIX75{w{CjQLbKHwpKrRV z&a})Y)z5$Rrq+#gt;YFRuU`4)o?V0RM=keVcJ0_9>D(_t zEG%(kTfn`u{Bf)>NpW+6tZJ5}rpm;87NGqQm-y zT!tD44%ia8y7_F>9M)7}8A&-_w0n;7mB{|u`OMTC54-2n0>4SHHk@vdeX?4U$GkdG zZu&AAEJuXl6Dj5BDQoyy%Nj&pI6OQ=%ED+$U%J_KmV`oi*Di+}UUYfGD%Z_7U0pC5 zYqpv;a~x$LmB$}Xq`viR?u?1@#s_pnj8h85*q&9|gA!?G6+^YD_ku%5WoUE51utDX zETZzQ`B)b*arY%lXNUQ7lq7p>dMMz}!J447KdnruSNz-v9i7lVKHdfH3^GxTOYdwbPI z;%+N8!Bg>{4pyH9%VICtFDOtMf{;mo#p@+gCDjjgs)E6!Y{LDO^}&V%+g@A}xV%Z@I>E7b5cW&>3 z`|Ay9-_{@CWfk?n;M??XVi-7e4il-|_M8;kx~%A9+85Ltj&JmTc@00TJY&4FPk+cs zU~2d-#chl^Q@6aTA4T)vP57|*6z;a11KYiLhwBtHDMFVR@n&^5F~0D1TEsD|`=Qfx zqx#30rQIGcM)&SL51*gPyKb@T`E&j_4hzZ_{pOw{I)RY z55$#}I=gps?h(C`WbIgyt>VaYIpT%EP0X>R^F(oh1uDb=^Zd46w9C`Bdj+_Nxa7k2 z#JZXiNAhc*qR4Eqw`UJmXA<`z>b$*`Z-Z2g`^FngD*n9+j|Ihd^t}-5H^Lq!qxBj- zELhU*kdUN^|%(k1dU<|Qy z8pkYHmT4#~9hB*I!{5-*W0Uy6b?gEwt5oIl%-&vFMvl#mGD$bE=Nj3nYjL<|*T%E@wg*fr3jFUL5+vQq6jipB29q~y3V+NpmnclmUW-_b zIKbj^{z1kD;%7b7Vwh_#D>=-(#|GGF6{B_b^Ghv8M}$9G#@0(`N_%*youGa?me&ZP zl;&)zt}9qra^kboun$-d9&};2V2m9vu;1dl?e0AV3yFhLQsuT-EVia^f49OzsT~ij z$rOgNglSYJ#iTJrPC{oqUTqueo$lJ@O?|C+(>7BIPLqKNiaJf+z##C#Z<84D<@9&j z_q{I(uxfneln3w^kxz!`rN~h8>oMJUc&a)3Zt-*n=_zk2G6q@`{kd4%MAJstZZt^aikkDm9JG0R59 zahL(B&GdXa&5gnio6|$2yRutua*|MUQ*b9Fym+1~L)Hun5=~YdB z_P&iO^zs$Sb4HVVhBJMawi|CZ-)^eYYW2v>r*+}A;+!3xl@>#t-Mh6abN_kGZ-re{ zhmT~PIn2u|AFZ}Rv^RRoiF(RyEUb20G1gR6C(J7uZypt(->}^q^Nj9{R4(NqiHmM0 zNbtQ={Yplo+g{(O6Tq( z_ng4&PC?Qf^a|kJbsQU-n#9gAG_L4&#D@meUcnFrB;6(6R<-Gv7nf>&d!U_NBF$Sj zwd+1XGFM(O^6*fVJifj2MsCotDk|3*G7% z;MA^96ITM?V}z{goL7lhtcit4AKNo-V__?r*+ycxla1|@kilj417uEx5%dvcQy~J{ z6ar=24()u#8*M3ehQ?KP#jZNp1M|#X>Cp1Yn*lU2L+mfjY_40(bCc0p78l6GW`Aif zbXQ9BGkaUw*Szlt{ty->hII$|S~Qv9f<%uIl`wyxD01;^X_A9IXMbbK_bV9L@sXKwteSLrSqoEaV^7| znubzDUHcS2)ykX@7Z(rSWvC&-SfdjBiInjHu}B%&Ry(A~Xz;1uV!Z@su=dgk|Ki*<8{t^N> zH$|^Du=Ug)foMhtot2BuyB`V4%Qx}f8;z~k;`zXR%!kc(mBdM2TKKir6P2fyaz_P{ zUJ5)sVCfMC^71Q8<`x?H4Ci)D+UTEs*llpObRfXb1U%@CpxY-E8k&`rWv>(JvVGUx z_Wfl06c(-}xRYeI2EDR;l%tfV$7)O&U?wQGfq0Zd;Kb0Cl&qcthiZu{l1EFbswN(= zcvJkl8+mwkh*XL>?BB?{ap|y%f|;pf%7vKu2a>YRF;K1z>1#A!tdzKJ zu93(+B;=pf-dn>o^# z6kolLPB~uF#ev=T0+KWhu*LdY`T!pv^MT{XSvfhY zx^kt5gk4E8GZJuSg3>ca&;13udCA6WqA5(zu0GH6)i^i2>6Qz8=IWN0L`XUF^jWVF2pYL=Z!J@Y9c$0_QFvewaU1#NTrtUbb3#m_dzLsNw#3F z^QTUox=^GcAt5PQSvNWtzhU!XL)zxCrw$#usf|rdP20|8*XqQd^gI8YX8h@P4ceBy zX}5faDmoQ1Sut4uCcyFJVg7bH%tU9#QkhTR|xwOSjc&;s1y zGfq~V%{QavL$5~0^J+z!KX~6ZZje62BEfKV!L0J0=)n=|ufzJy`?f5)bX>$l9o(;X zHBPeqs0D+<({rgkCi-@hJMg;Jkav3ot_cV>Jx<*)ku9GT7%N!N@!+%l*j>|XojK? z6)iKWnFZJ!u8|qJ;gn%Mp-&E_<2tn3NG<;BiS*N+d=|#TpaFior0#F90Bc zg&6%0vvn&aDd7YBa|jkLSX5wvZ@Ytk|L+}V&YanC;R4?UK|w*4iy|WW7ez%~M1_T2 zgarj%g!y5CH98l+DCTnU;zfNyK_L}%J-YAz9;*M`@}*0cowPKy#;h%@fSr{!urf6T zMvor@J#B5Eaqk|ur>qQAZ{G%LN=iUoO^xt9`ainP-r5?V`|jUYA4Bc@XKMd@SIElB z#aUTeE&6=;06aZBz#C_0@Y2ri5BvzX@~vCn@#|=407HF!U}9th`)dW9UcLnGuCCyn ziwiI{Fw{j74<*r2c>QjjF0z zwkM>4aEFJ4fRFzE1l}Y32!jX2kn{O7_}bVAD$2$|dC3?k$X)tgvNOj(CH($tQxnMj zoDDuetj@0-31hd8AMu006WErj>fP-BGsJ6m%gSD-d-~+*7?P7fUtfTDkFXRL%W#i!v>k@BgdHcMUFAihYvE*g~0Eko7tHvhjj1H zttQ1R!oCi|`%zy!2<;*4{$5@nz{iJB8yP(tL-haKe#px!(pi{Wj3FK)yr^wdqmrMK z3))&HfrW9$3^RR1H{1U7xg#vC;GdL(jJXR;bf3O)FjWm%Jja8Ys!5Qan@8Y1!v1ry zv$Y#TIR2-7xN+kaovpPE0XxEv#v6@6XwWCn($WKbK6K48(T5HE6TJWK8fN;aQFf;C z0hgC}$d7LzA~cLJ&Oi6T-rjx;;rXBR!Q9;ZJ9dO0VUGw42OVwG;QXnio+B*HtN#wy z@BiaD(Fs)br@+N4{ebge+aKeE}qMz6o`q8`lAmP7S?0`6u-W{LH3$_dk}CV zxy*rcuB2!l9A*w1{vF#tIlp#m1Q^(1fsO?h+c8xTw&RlF#S)k{(jBzBke%b6btf7 z@nC#%5tup80TtazaD?^G`NGary?lh_>qN4x+-t0sLV`LP4^H@cp}SfSx&Q zL})0K!%#Smk>GPi7HDsq0*9CqXMV?p&Uuax03NP>aGawDa2@UfT#w>*%Zk^<6_ zlL^K1gBSMi@EaHy#wEqZ0#wlTIa!}USH~bYb~tS4udt)$08Nuw zkn|Z3mLPUiT>a+3tq0?OiG7{UL59zBqUYyVTbc$zQ9%LhM=n98&>n+u{#74f!s239 zdOFC?%mf8_`JlP689X!0>R)g3@9J~BqX6OjtA0q!PZMN*YG#puy}NIb!21h)-~KIr zL<_F5UC;G#aLs53RpsSyPb?vn__+AR-|=f}>pJCRWq~}npA_cj!~Lin)K(8bS#0^Y zbk6a1gPRYgft1`7xO!t6h=@)C0fDu`cYXpqc#Z`j@wo52f8#$7)E-U!+ctmZ69-fE za8bb|fT0smTUA9U6=h`r;r+P}?>*j+p)o?Gw5SNQHn)H)ViA2mx3&J+*J}cSAXmRnRr=}5jpHIMF3@R(y7TB2^|5)RnJ{kn; z$J>uMVC6OsB9a$CY{mjuU0wgrTJ7+D9(ab#gIVknp+<97P`LLWV_)YN+}{Svibe_e z*T(?Kx48JFEocn%^d327Wn_SCC_e=J#U;SZB&m1({`LAScRR2)9|j-ZjRSArX#y{E zO4j5#HE;13@NM18g#VXRF8~wAIVeXn;QYCs|1ow%n~6T8&(#qNnjrtHD=MIDmw~e4 zVx;4-Bm8!D_7&-=sQ{JFaPHRE)xk9KFZw0)AWAoU44m@#~1FCvc0PO+m?fg$`c9zCfk+U-^Z7nSX+{J~302OU*9T9}z z^Sx(pa(p~UPD}(Dun(0LmH5A+QILxzfE*fJ0?%GxK}`Ar(6^ZbX+QCPWPF9dcO>@@ zEwSLf(F_n4?E~DLf9|(`MdR+O^=&90nQ3Vt3-bAqp1uac9~%=3b+a%+ ziG}^JwTk*f_HWC70~6yvgaqM9$yo$CkjFpI+ro+^Lf>9{;lSv`+Js(&Qv=P1^!!EO z5sU+m;9iXGM+NB-0)qc&FX(>bI07=^zM2g8S5%%nHYDJWhWcLUr%!|u6&?X@$c6r~ zZmO&FedlrWS3Ch@ER>%|wsYUVU;ofIxB_e--_bar{`}Q}iUoPk?!d4ISG;>?r5mfq4HQy zkAOcWDjJ0Si~o^O$CJGD=@0w@ydBWLFbwTiJfRR6}6ZFk+$opt0KPtBa|Im3v z`8vVK$Pb)xakId}bsl_y^5F^b;c$QQcfC)Gi>rjOKyw1knFV-`j=a)EVB<0iPI3O{ zwH3*aqs;(FjfnxVP%kFPkHMP!M@2*ubmb`6uUI%2OrM4RF@L!^+Q8)G+WZ|IT>_Dz zP!|6+A4{s2Kxo1Oz%TrL9}wR5o)yA)eF(vUZv!hJJZS-#T2FyH3ccWp$iJ5%sLORn zeCk@0e>et7upj#Wk{@qRZ^HVYh~_oi2f{)k{&M~F^_)O3fXnMqFg3YC!0Qu^C&+hs z-4Y0jMfSoY3Bf#=_AD2lNa^3HVVTISFc^ZTx$ar1z zGGR|ca`9JVu>!k>`swJ61J;f+;3ZrG)b9^`$B+6TbNR1zJ8q7=F0^+MaKbh8Gu#98 z_4En*uaS|lQ!cbsa*_TF?E|#8ojwu$i~hiUq>Vu5u2L_7_v;<_+K2~TU5g+lZH=dh zw?&mpprU>W+FPpthhGH)!z%#Em?xAQg#GceF+y8vO8r1dvG*7Js1L&DJAYY^kUjQ9 zcW5OaV#`K)8Z79uhK4pl|G9PRHV^VcAv*{4u^84?=6=8I0b&AO1UjL?Q|r(PbyC6% zz|OA8On3hZ`0#NKxcK1+@_}Szy`X(7yLb^yOu_ZYWBd=y2={uqDfg`n__2yu1QI|3rImaL}i*a;VdlL*2g;+BtA67CD$3R*)Q>0@IuXuet$HC0ZpYyt=3J1`>zTWQ7^(CRT^@w$U^0bF*JE(xXE&K9? zP**|y8R1>Wj%p}FbkK*l*icggP-%oZbZOz26%OXc6>-5e+4;HsN7@6>U$y}4;~(}6 z>PSDdZ-e}Q%y0A^(wpA7j-ii#9DTiuz(D8MIgIG6;}<$#K2iqxT?6f3R1jYg&Y!Wb ze|B=$GQBb@7)f3LGLval`i8dO@L zuN&3kB3?s?A3wLh{`raiAZUQ{^0N+VVLS{FUw=MOzpPA#!QjA;J^Yvd!v=gltj+72 za^JwQL)mkV_D!H3$^ydO0$Bstq0vfP~m-Fa_5aw9h5Q&-@IJ@VTRX0a(C3tgQUGPY(|-5$?IK+y_L?H?Q25 zufaCMSOSs(R1kJ#e<6Io^ZfU7UthoMj@DLyN>_V3=jNW$gFsHkfAnX(fA<-!jrLZgwunN;d;X{!cKYdxbB=PdqnF8*PKKIta%X@gB)e1H_H67k&9MhH(5-%)ejf z=;%mSkY6y?)7eRw2g8uY#5mfIX29(1EGR20pD}zC)GsBTi~Fa2k(H=j6gnR?;P@hA zxEr=RJ~jqMhK4}jw{HZwX@P48DsY`2L-c>g^xvFEMMY%~LF{M_AbMyF5Pp~v3FhbL zVLc1=gwkox_c8r{qrH837WE&N zsmaMT{IK11+4%<7i>Sz`e>_+JX@A_`x!;5FPweEx#2@%^I2>45SOAOA*{}?a-xavv zul{ROK=mp-N8h9Wpe2>kyY zKLPVU#ElzqvO3C z)%`F2t@9J!$bk5`&ToQJHQf}p_2)b;5`^lHJT6A~od7KVTX|eC2TNW?O3Lo4v`q9> zDXHu$mo8;r5)&iTSEZ%1ugP46-^mb?xmE+vG^K?qLmEvB%e7Wcj^9fMyj_LE~ zKwn1(+*eg4#hId6m#l`EBXBVMV(L{Mm5U{fTj~#Io&AP3JxSrT(?;Fg_#@<*Q^B&oa#ou#c{Jnet%qOb&PkeyBscb|W6`v2DurKXP+?)aV>`b*w zf8|^I{X29W<6gfw#=X9J0;jrXbF%tCP(Z+U9C{D+{+18-@7;gy19LtQ-%#E~WLP_v zjWO&Of70*t(7Br41W?r(|0TEM5aXAbeY+g*u`^Y4CdZEv{NyMH4Eg)j??3oM9z;bi z()s)NEutK;Sm;+zO{tzae4yYj<6%EzIDN7U7{9`T{4zYyHktV)M}~vBewluklRAup zb{6CgLf=mkNP)4okl;^?h~Cd*VPb3&hjJHC9zbPT;|d3B{N&GcPIC5w)7(R_48S<~ zC=eE&0Q`ItKuvc76jv?4RcQ$r*v$UI19blyhF3TEPk)m|&-m_3d1Cm~3FY0O{DGX$#lPg6Apf?scsG!_J_J}%9 z2BPAVKuL23`uFhwJHG^s9A^J*JO#-l%z^7_sOtlD(6@k!j<${j;(_BU_^=oB!J?cK zb+wT1@`mEhz26o=5A;u3xXuycf;~OUP(d7uwtWr9NgEH=-u$K6T$Uhf?8YZX9WsHKIaH=-X8V*)6S8Xg+{i|-lv)R6DP z5XPfjd~t+WBBCD+eaGNrKK=ODGfN-+C?Gy zD2@^q8Uo(9czw^SLvgF{kSWmLzeI?an>x*XR|{?4&V$6y3!t(A#!uq$z!dWTq4_L$ z@OTnP$qxRl9H4a)t=Y(rnh5)BV{S>HkMiR_1$_k1jaJZ0Y^&hR-Ec;>ui=muH!uHoz!=B6d9dDRd6~;G^PXNVkQT%OvEYSE%U(PB) zG59n{&(h4CApdTzZz@m>=5u=b3O8r!{QC9Iuiz^!gVuazZSAoAu(eo3e%T`EANs*_ z6obrw{eS%)%8BdjFaD|PF!qG{g4%?6x%H2<8|P6j0OEnEu?b=RTUuHSZ-(n9-ux)Cd>omgZwLBh|t-! z`N^=yGcq%!iVzPefqQ_V;S&io|Im?_owJBy2pOqqb4OX5S0yiY6X;h}tgShTaXa_x|GRTXnXbIFbg>2cu%HirMU+2gcD)VclXQ9gBaV=fIt#{s%E>@+ z#dRJa9LvkAz~k+YSk-x+?8(9=!}$SY74X&I z0QsXO#0uwZ%rpCuUvteL+W>+-2K}x6w~iwrA)%rZ(nr2m=$l)9ZuIFN`Ht7|p;|&L zd>|{MVvdkM2mO&v&=(K$7c16j{HGf3N!iH%J~S`@ke{cfx^Bk!S?GwuwbI3(>HPdz zPO5h4`qjwc=*X;*G3e_XfWB|!k8X$K`6(#)Klb}~Or9S+pLch4FCzNLXNdeD`L?Iy|zr+~-TYCR5?gQN<0Qw*-R-tzWxf+n$0s1h=yP+E* z7rGACizNnw`KM+59#nV3c2Ik$UDQ6JgXj_H!m)cn`LiE`6oZc6pGVsbzvF`Czx89l z=d74jRa7lim6Sto-?));{p!`?Yf{q1ir23fE8n@3qRb3cl&z&DFwoT{_$5?s-vL_c>M%}h2wvFQLi^bjSejdm+`D`4ANfY^-McU3 z^y>BGCulQzLwhtfDjoy}mM$4TEt+_uUxhW$t-~7Xm5;x+Z(N89%O&_B&~?amH8U}d zfX~m6|6O08{VDG1=(vb%`{;;hxK~up^PR53!aWk^P5+wP&(2)GdiX%;%mdZ0*o2r$ z!ZSeV84*hhi!AtT$R9M|GZb8JTwE4Ez-N&X;#lfr8s@hwf~0I5{QlS68&0+g?C10@Lau9Mc*MwhAK>#DohSz+E(Ybf zuJHur7~F$;(|!F(pz&}9T#=pvl2TLPeegUXfBWxjT4lx7dGyR!4a^I$v$a=(`#IO= zj7;za>Qx$ds|h;fF{t+iLEYd}%se5lx4CmomrH;;a^hzk(0nrax6eYLG0)5HA>$`V~$1|W^>+a^31oJ~JLxO{096j{Ajvo^_1@~1Pc;k;F*mJ0Tlz$bT zyk<`zJqjI2*Oa|8`dx$8Tyh2-vXgH?p_6}iv}ePC<$M`g_d%=^QG)Z7I^E);6}E7ZT;1K{%rPse~V)VGi>A||k= z>vJ$SgV*+D^T^J2fBViG=Gjm|`CLT#MCvN}^GG(4eYBq2T~!J9c9=7km_AR)>kf^@ zfri#4xTh|{yp$h0J<3N$IcY~(OJ_c(m4GjBKD~8&XO8BW*9XrqlqZuIn}g>)(YA{4 zpj?-#ig~zRtm&)h`3ZD<>sf#?<29L@g*iqj=D)5>A-~HbosxN!k5yh=vI=vCm{I#M zf8|I`MddQet1y0&KC1xnqkB*;TVnh)!7fC$2_C;@kRX~1uutefvgGGI4iJ8E!7tdd z;u=CuOmb3kIBI+S2n!8+(GK$;x}pB5r&WMo$AoGlgF)~f>h+c7YrcT_`4vL$2%=Y3 zG6&^+49H3}E~ck6ETdeY@{-a?nD?<~z3ufnEj29*>4iu?dtq0Ay(QmG;MF><2Wow= z{{w`AY`VKjYj)i|rQ*4gFU`xyj(|S2MSp*Pq4hR@u3_Ar{Bu@T);Fj>kByGPHKPe{ zZd^HcL$>vg+=ZKRovUiMOJ+a*f2|yCOcYme(HavI+y3-NquYg8r5jn#@G zq98=urakW#*mAcEyL-ps7ueXe)}mDsqb0poELKvKB4R@|Rg0;GP(Y3H*aQLjYD`2j{A=bP0fCn%e6EV=d@4}5dUcdYV)_xiO?Kb}|P*}WTd>4x9yF9WYZbz)o> zw4GC1TYK2!>G9)PC!TX^y5FNwopTU$-quU4*Wuaajtl8C8o`<3)T*kgwA)>`ouJPa z!pl?$dTwDuLxUB3F#fZ@kEsIIN6ldSsmbgOY9f0^O<`;yg^6N;9#R5Kco1il+E3GSZO(_V%$8q#?6v=xbovmlnD9?o{$CHoHb$>OPj zts5^5Y;iXATeGU}Y}>lO^W%boP9-hlTc)oW!^Qrwq2cEDGmegHYrP3F!X zc&v-K+N+Cb>zO;t`^YeVn9Q3!4C~qhag;~NzT#s4>Q$>=*Wka{{<){7s+y!M|Fb{* zmGbV$@RpIt@QZ57R=P&=HdK4!W1D&r#|LQxU<<4v1)H|iAw1Yki!fF$H~Z{u^ijol z4C9;KWZAM_lAO{9F?+-0lU-g_Ud)_Pdk1ms{InPJw*%J^{_B#Gj-P5yt9%^&+aOe! z*f-xN*}^@tZPy?t$=bHZD_h~xXRnrjGu0_5=0xA$E{IfORK{bfT0WqSMH zU=s$}oBr;TvLs^qkNpV0*?IaF!k2@sb52B~5A9>;ejOxxAg-_z>`53ePzLtQJzouw z4dCCMzD~o__E1vE3zAm6huJ z;TS599BEHU`lU_dnRRCef_{>yQ#^PO7z_HWrzJJ_{ZZcv&%acCe-Pf`aKs%ycI?Xg zYflAnpq&S4qMtGPRpx-N>DtueH(MJ2A|QACiY(7WSnYB;^5Ve1>~it$L)9OytGo4H z+EuV|b%2by;^(>Y_LD!Kzl%H%bV83^vHz>jLiyptJDZxCy1;JZT04aCO|D=GsbJAyh|G|X7pWD%(h{g7NQT7W zZWQ2F$d%l%p9rI300HLkTPPDKnjXyo`KbD)cPyfAMrGgc~? zY*4yF>r+%ZFIdDpIckw;vx$OkktisVXq7`Cg7Xm{6@$N!svP@zD{o%T<)@0-9L!jJ z+#7N0<74%)v1W6I-jWg0)M^qk?WRni9T`%ZBZ+2CmPLt`%vrp`nH9UFHi_1T9<9yB zlVdjo%SUI)phyr_mLOz^<9r757>$I?ne7rx-Poi`T&^9S4QEM~cn5FgGC4U|33DE- zUhD)=1zwg!&cRv7CYh$KSYTvKa)RK1xsgJ~Ow)FrHRG_2OoquSbBs1vd~Sy5Aoiz- z8={}+sv$Z!X6T(ET6+~BgX@B#4C=c+g-WIpVWp)~OJJ3)hEEtj6dcEvY*1+f3d-(iaax=MkuFs&^%MFF0hVfJ2d$$3Cpr+V4DthIMb?3H z6@vpo{er@lU66gcDBF2!=M=Sl>)GcwGwkO@n2H@;6?ThgU(c5g@ z=^}@7I0GGN1cdWAc7}G{>s;e3N!me=brGfE#h3Z0w`p4DX>IoUY0;OLyZUCYYu&GE zbHjd|Fy=*ex!cud!@A9Qa-#d?YE?NR5QDy0EtkgJ(!eXWNpF_hiW8(m^toYGIUUlF zY)wVK(?^3b^`N_sq@!chg_wO(S!FVg6AaM}7kDnAp8H2;>+ZLgp``VW58-^HY~J`b z=d&QP1~~o+On6&0B4jP_|H149NpmRZ$r0Wo^AodWwhi;<)VKCAwDw6cPneHiFFrgR WDG$?W01pA=y?fv89^U$a2jCC+KNh$E diff --git a/PythonForDelphi/Demos/Demo32/Unit1.dfm b/PythonForDelphi/Demos/Demo32/Unit1.dfm index 07eb931c8c3b275d5ebc328e617566a4e9a4d972..611e7d3a239f6e8cc917b7ad283596f77edce3fa 100644 GIT binary patch delta 119 zcmbOzdRmnCKNmxYn}3k6A%lUy?v1>s85vh?zR5U)b#eo{3}e{lx$IJmp6o6;Iev+` zscbw2l_eSZdB$dXDLFY@jsc!wsYS(^`FYG=nYn^e)1f>zW@9}w;n3n#pTy!4@4Wo- NJg5Z6=ItD}7y?R?a09NB Sa0eX$SF?@>8UeHM2-*QuE)*XC From 48861e51fd8180ea9581a13af8a4da38f5b7174e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 17 Oct 2017 15:56:38 +0300 Subject: [PATCH 018/123] Support for Python 3.7 added --- .../Components/Sources/Core/PythonEngine.pas | 13 +++++++++---- PythonForDelphi/Demos/Demo32/Unit1.dfm | Bin 2763 -> 2763 bytes 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 4970cb83..2356ebf4 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -126,7 +126,7 @@ interface end; const {$IFDEF MSWINDOWS} - PYTHON_KNOWN_VERSIONS: array[1..12] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..13] of TPythonVersionProp = ( (DllName: 'python23.dll'; RegVersion: '2.3'; APIVersion: 1012; CanUseLatest: True), (DllName: 'python24.dll'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), (DllName: 'python25.dll'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), @@ -138,10 +138,11 @@ 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), - (DllName: 'python36.dll'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True) ); + (DllName: 'python36.dll'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'python37.dll'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF LINUX} - PYTHON_KNOWN_VERSIONS: array[1..12] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..13] of TPythonVersionProp = ( (DllName: 'libpython2.3.so'; RegVersion: '2.3'; APIVersion: 1012; CanUseLatest: True), (DllName: 'libpython2.4.so'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), (DllName: 'libpython2.5.so'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), @@ -153,7 +154,8 @@ interface (DllName: 'libpython3.3.so'; RegVersion: '3.3'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.4.so'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.5.so'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True), - (DllName: 'libpython3.6.so'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True) ); + (DllName: 'libpython3.6.so'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True) + (DllName: 'libpython3.7.so'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF PYTHON23} COMPILED_FOR_PYTHON_VERSION_INDEX = 1; @@ -190,6 +192,9 @@ interface {$ENDIF} {$IFDEF PYTHON36} COMPILED_FOR_PYTHON_VERSION_INDEX = 12; +{$ENDIF} +{$IFDEF PYTHON36} + COMPILED_FOR_PYTHON_VERSION_INDEX = 13; {$ENDIF} PYT_METHOD_BUFFER_INCREASE = 10; PYT_MEMBER_BUFFER_INCREASE = 10; diff --git a/PythonForDelphi/Demos/Demo32/Unit1.dfm b/PythonForDelphi/Demos/Demo32/Unit1.dfm index 611e7d3a239f6e8cc917b7ad283596f77edce3fa..22a9750800dd63c0deea46967d07f95c11239778 100644 GIT binary patch delta 20 ccmX>tdRlbDP7X%%$-6id8O=A};dsvo08=gpp8x;= delta 20 ccmX>tdRlbDP7X%1$-6id8O=7|;dsvo08< Date: Tue, 17 Oct 2017 16:30:15 +0300 Subject: [PATCH 019/123] Support for Python 3.7 added --- .../Components/Sources/Core/Definition.Inc | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index 3e124961..3d96c9f0 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -322,21 +322,23 @@ // Note that the installer will let the user specify its default Python version, and // thus will edit this file. -{$IFNDEF PYTHON36} - {$IFNDEF PYTHON35} - {$IFNDEF PYTHON34} - {$IFNDEF PYTHON33} - {$IFNDEF PYTHON32} - {$IFNDEF PYTHON31} - {$IFNDEF PYTHON30} - {$IFNDEF PYTHON27} - {$IFNDEF PYTHON26} - {$IFNDEF PYTHON25} - {$IFNDEF PYTHON24} - {$IFNDEF PYTHON23} - {------} - {$DEFINE PYTHON27} - {------} +{$IFNDEF PYTHON37} + {$IFNDEF PYTHON36} + {$IFNDEF PYTHON35} + {$IFNDEF PYTHON34} + {$IFNDEF PYTHON33} + {$IFNDEF PYTHON32} + {$IFNDEF PYTHON31} + {$IFNDEF PYTHON30} + {$IFNDEF PYTHON27} + {$IFNDEF PYTHON26} + {$IFNDEF PYTHON25} + {$IFNDEF PYTHON24} + {$IFNDEF PYTHON23} + {------} + {$DEFINE PYTHON27} + {------} + {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} @@ -453,6 +455,21 @@ {$DEFINE PYTHON35_OR_HIGHER} {$DEFINE PYTHON36_OR_HIGHER} {$ENDIF} +{$IFDEF PYTHON37} + {$DEFINE PYTHON23_OR_HIGHER} + {$DEFINE PYTHON24_OR_HIGHER} + {$DEFINE PYTHON25_OR_HIGHER} + {$DEFINE PYTHON26_OR_HIGHER} + {$DEFINE PYTHON27_OR_HIGHER} + {$DEFINE PYTHON30_OR_HIGHER} + {$DEFINE PYTHON31_OR_HIGHER} + {$DEFINE PYTHON32_OR_HIGHER} + {$DEFINE PYTHON33_OR_HIGHER} + {$DEFINE PYTHON34_OR_HIGHER} + {$DEFINE PYTHON35_OR_HIGHER} + {$DEFINE PYTHON36_OR_HIGHER} + {$DEFINE PYTHON37_OR_HIGHER} +{$ENDIF} ///////////////////////////////////////////////////////////////////////////// // Misc From 2339440abf88aee5be8750e55c7e8aa9e21ae3ae Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 23 Oct 2017 01:05:06 +0300 Subject: [PATCH 020/123] Applied pull request 39 --- .../Components/Sources/Core/Definition.Inc | 48 +++++++++++++++++++ PythonForDelphi/Demos/readme.txt | 32 +++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 PythonForDelphi/Demos/readme.txt diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index 3d96c9f0..bcf4d98b 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -36,6 +36,9 @@ //{$DEFINE PYTHON32} //{$DEFINE PYTHON33} //{$DEFINE PYTHON34} +//{$DEFINE PYTHON35} +//{$DEFINE PYTHON36} +//{$DEFINE PYTHON37} ///////////////////////////////////////////////////////////////////////////// // Python for Delphi settings. Comment out the setting you want to enable. @@ -314,6 +317,51 @@ {$DEFINE DELPHIXE7_OR_HIGHER} {$DEFINE DELPHIXE8_OR_HIGHER} {$ENDIF} +{$IFDEF VER300} // Delphi 10 + {$DEFINE DELPHIXE8} + {$DEFINE DELPHI4_OR_HIGHER} + {$DEFINE DELPHI5_OR_HIGHER} + {$DEFINE DELPHI6_OR_HIGHER} + {$DEFINE DELPHI7_OR_HIGHER} + {$DEFINE DELPHI8_OR_HIGHER} + {$DEFINE DELPHI2005_OR_HIGHER} + {$DEFINE DELPHI2006_OR_HIGHER} + {$DEFINE DELPHI2007_OR_HIGHER} + {$DEFINE DELPHI2009_OR_HIGHER} + {$DEFINE DELPHI2010_OR_HIGHER} + {$DEFINE DELPHIXE_OR_HIGHER} + {$DEFINE DELPHIXE2_OR_HIGHER} + {$DEFINE DELPHIXE3_OR_HIGHER} + {$DEFINE DELPHIXE4_OR_HIGHER} + {$DEFINE DELPHIXE5_OR_HIGHER} + {$DEFINE DELPHIXE6_OR_HIGHER} + {$DEFINE DELPHIXE7_OR_HIGHER} + {$DEFINE DELPHIXE8_OR_HIGHER} + {$DEFINE DELPHI10_OR_HIGHER} +{$ENDIF} +{$IFDEF VER310} // Delphi 10.1 + {$DEFINE DELPHIXE8} + {$DEFINE DELPHI4_OR_HIGHER} + {$DEFINE DELPHI5_OR_HIGHER} + {$DEFINE DELPHI6_OR_HIGHER} + {$DEFINE DELPHI7_OR_HIGHER} + {$DEFINE DELPHI8_OR_HIGHER} + {$DEFINE DELPHI2005_OR_HIGHER} + {$DEFINE DELPHI2006_OR_HIGHER} + {$DEFINE DELPHI2007_OR_HIGHER} + {$DEFINE DELPHI2009_OR_HIGHER} + {$DEFINE DELPHI2010_OR_HIGHER} + {$DEFINE DELPHIXE_OR_HIGHER} + {$DEFINE DELPHIXE2_OR_HIGHER} + {$DEFINE DELPHIXE3_OR_HIGHER} + {$DEFINE DELPHIXE4_OR_HIGHER} + {$DEFINE DELPHIXE5_OR_HIGHER} + {$DEFINE DELPHIXE6_OR_HIGHER} + {$DEFINE DELPHIXE7_OR_HIGHER} + {$DEFINE DELPHIXE8_OR_HIGHER} + {$DEFINE DELPHI10_OR_HIGHER} + {$DEFINE DELPHI10.1_OR_HIGHER} +{$ENDIF} ///////////////////////////////////////////////////////////////////////////// // Python versions ///////////////////////////////////////////////////////////////////////////// diff --git a/PythonForDelphi/Demos/readme.txt b/PythonForDelphi/Demos/readme.txt new file mode 100644 index 00000000..8f7c3681 --- /dev/null +++ b/PythonForDelphi/Demos/readme.txt @@ -0,0 +1,32 @@ +Demo01 A simple Python evaluator +Demo02 Evaluate a Python expression +Demo03 Defining Python/Delphi vars +Demo04 Defining Python/Delphi vars (advanced case) +Demo05 Defining a new Module +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 +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. +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 +Demo19 C++ Builder: this is a replicate of the Delphi Demo05 +Demo20 C++ Builder: this is a replicate of the Delphi Demo08 +Demo21 Using Events in TPythonModule or TPythonType (Kylix ready) +Demo22 Using Threading, Windows Console and Command line arguments (Kylix ready) +Demo23 Using Threading and Delphi log window. (Kylix ready) +Demo24 Using TAtomPythonEngine (Deprecated since Delphi 6, See VarPyth instead) +Demo25 Using VarPyth.pas (Kylix ready) +Demo26 Demo8 revisited to allow the new Python type to be subclassed +Demo27 Container indexing +Demo28 Iterator (Kylix ready) +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) From 18e0858f96c02751d1a8982b19842002724dfdc5 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 23 Oct 2017 02:23:21 +0300 Subject: [PATCH 021/123] Delphi 10.2 --- .../Components/Sources/Core/Definition.Inc | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index bcf4d98b..8b83a1d0 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -318,7 +318,7 @@ {$DEFINE DELPHIXE8_OR_HIGHER} {$ENDIF} {$IFDEF VER300} // Delphi 10 - {$DEFINE DELPHIXE8} + {$DEFINE DELPHI10} {$DEFINE DELPHI4_OR_HIGHER} {$DEFINE DELPHI5_OR_HIGHER} {$DEFINE DELPHI6_OR_HIGHER} @@ -337,10 +337,33 @@ {$DEFINE DELPHIXE6_OR_HIGHER} {$DEFINE DELPHIXE7_OR_HIGHER} {$DEFINE DELPHIXE8_OR_HIGHER} - {$DEFINE DELPHI10_OR_HIGHER} + {$DEFINE DELPHIX10_OR_HIGHER} {$ENDIF} {$IFDEF VER310} // Delphi 10.1 - {$DEFINE DELPHIXE8} + {$DEFINE DELPHI10.1} + {$DEFINE DELPHI4_OR_HIGHER} + {$DEFINE DELPHI5_OR_HIGHER} + {$DEFINE DELPHI6_OR_HIGHER} + {$DEFINE DELPHI7_OR_HIGHER} + {$DEFINE DELPHI8_OR_HIGHER} + {$DEFINE DELPHI2005_OR_HIGHER} + {$DEFINE DELPHI2006_OR_HIGHER} + {$DEFINE DELPHI2007_OR_HIGHER} + {$DEFINE DELPHI2009_OR_HIGHER} + {$DEFINE DELPHI2010_OR_HIGHER} + {$DEFINE DELPHIXE_OR_HIGHER} + {$DEFINE DELPHIXE2_OR_HIGHER} + {$DEFINE DELPHIXE3_OR_HIGHER} + {$DEFINE DELPHIXE4_OR_HIGHER} + {$DEFINE DELPHIXE5_OR_HIGHER} + {$DEFINE DELPHIXE6_OR_HIGHER} + {$DEFINE DELPHIXE7_OR_HIGHER} + {$DEFINE DELPHIXE8_OR_HIGHER} + {$DEFINE DELPHI10_OR_HIGHER} + {$DEFINE DELPHI10.1_OR_HIGHER} +{$ENDIF} +{$IFDEF VER320} // Delphi 10.2 + {$DEFINE DELPHI10.2} {$DEFINE DELPHI4_OR_HIGHER} {$DEFINE DELPHI5_OR_HIGHER} {$DEFINE DELPHI6_OR_HIGHER} @@ -361,6 +384,7 @@ {$DEFINE DELPHIXE8_OR_HIGHER} {$DEFINE DELPHI10_OR_HIGHER} {$DEFINE DELPHI10.1_OR_HIGHER} + {$DEFINE DELPHI10.2_OR_HIGHER} {$ENDIF} ///////////////////////////////////////////////////////////////////////////// // Python versions From bf1c1f8524eb47162b5144709c654ce0ab345082 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 23 Oct 2017 03:04:11 +0300 Subject: [PATCH 022/123] Patch 32 partially applied --- PythonForDelphi/Components/P4DFpc.lpk | 66 +++++ PythonForDelphi/Components/P4DFpc.pas | 22 ++ .../Sources/Core/MethodCallBack.pas | 4 +- .../Components/Sources/Core/PythonEngine.pas | 8 +- PythonForDelphi/Components/p4dlaz.lpk | 213 ++++++--------- PythonForDelphi/Components/p4dlaz.pas | 52 ++-- PythonForDelphi/Demos/FPC/Demo06/Project1.lpi | 124 ++++----- PythonForDelphi/Demos/FPC/Demo06/Project1.lpr | 2 +- PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm | 4 +- PythonForDelphi/Demos/FPC/Demo31/Project1.lpi | 257 +++++------------- PythonForDelphi/Demos/FPC/Demo31/Project1.lpr | 10 +- PythonForDelphi/Demos/FPC/Demo31/Unit1.pas | 18 +- PythonForDelphi/Demos/FPC/Demo31/Unit2.lfm | 14 +- PythonForDelphi/Demos/FPC/Demo31/Unit2.pas | 2 +- 14 files changed, 355 insertions(+), 441 deletions(-) create mode 100644 PythonForDelphi/Components/P4DFpc.lpk create mode 100644 PythonForDelphi/Components/P4DFpc.pas diff --git a/PythonForDelphi/Components/P4DFpc.lpk b/PythonForDelphi/Components/P4DFpc.lpk new file mode 100644 index 00000000..688c17ef --- /dev/null +++ b/PythonForDelphi/Components/P4DFpc.lpk @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ExternHelp Items="Count"/> + + + diff --git a/PythonForDelphi/Components/P4DFpc.pas b/PythonForDelphi/Components/P4DFpc.pas new file mode 100644 index 00000000..c82e424b --- /dev/null +++ b/PythonForDelphi/Components/P4DFpc.pas @@ -0,0 +1,22 @@ +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit P4DFpc; + +interface + +uses + PythonEngine, MethodCallBack, TinyWideStrings, VarPyth, WrapDelphiClasses, + WrapDelphiTypes, LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('PythonEngine', @PythonEngine.Register); +end; + +initialization + RegisterPackage('P4DFpc', @Register); +end. diff --git a/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas b/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas index 845252de..50801ed9 100644 --- a/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas +++ b/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas @@ -179,8 +179,8 @@ procedure GetCodeMem(var ptr: PByte; size: integer); {$IFDEF MSWINDOWS} page:=VirtualAlloc(nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); {$ELSE} - //page := GetMem(PageSize); - page := mmap(Pointer($10000000), PageSize, PROT_NONE, MAP_PRIVATE or MAP_ANON, -1, 0); + page := GetMem(PageSize); + //page := mmap(Pointer($10000000), PageSize, PROT_NONE, MAP_PRIVATE or MAP_ANON, -1, 0); mprotect(page, PageSize, PROT_READ or PROT_WRITE or PROT_EXEC); {$ENDIF} page^.next:=CodeMemPages; diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 2356ebf4..c52e0fc7 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -72,7 +72,7 @@ interface {$ENDIF} {$IFDEF LINUX} Types, - Libc, + dynlibs, {$ENDIF} Classes, SysUtils, @@ -3389,8 +3389,12 @@ function TDynamicDll.Import(const funcname: AnsiString; canFail : Boolean = True begin Result := GetProcAddress( FDLLHandle, PAnsiChar(funcname) ); if (Result = nil) and canFail then begin + {$IFDEF MSWINDOWS} E := EDllImportError.CreateFmt('Error %d: could not map symbol "%s"', [GetLastError, funcname]); E.ErrorCode := GetLastError; + {$ELSE} + E := EDllImportError.CreateFmt('Error: could not map symbol "%s"', [funcname]); + {$ENDIF} E.WrongFunc := funcname; raise E; end; @@ -3459,7 +3463,7 @@ procedure TDynamicDll.Quit; {$ENDIF} {$IFDEF LINUX} WriteLn(ErrOutput, GetQuitMessage); - __exit( 1 ); + Halt( 1 ); {$ENDIF} end; end; diff --git a/PythonForDelphi/Components/p4dlaz.lpk b/PythonForDelphi/Components/p4dlaz.lpk index e364ad4b..afdb8f03 100644 --- a/PythonForDelphi/Components/p4dlaz.lpk +++ b/PythonForDelphi/Components/p4dlaz.lpk @@ -1,128 +1,85 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PythonForDelphi/Components/p4dlaz.pas b/PythonForDelphi/Components/p4dlaz.pas index 1e56778f..7980a0cb 100644 --- a/PythonForDelphi/Components/p4dlaz.pas +++ b/PythonForDelphi/Components/p4dlaz.pas @@ -1,27 +1,25 @@ -{ This file was automatically created by Lazarus. Do not edit! - This source is only used to compile and install the package. - } - -unit P4DLaz; - -interface - -uses - PythonEngine, PythonGUIInputOutput, MethodCallBack, WrapDelphiWindows, - TinyWideStrings, VarPyth, WrapDelphi, WrapDelphiActnList, WrapDelphiButtons, - WrapDelphiClasses, WrapDelphiComCtrls, WrapDelphiControls, - WrapDelphiExtCtrls, WrapDelphiForms, WrapDelphiGraphics, WrapDelphiGrids, - WrapDelphiStdCtrls, WrapDelphiTypes, WrapDelphiVCL, LazarusPackageIntf; - -implementation -{$R Sources\Core\PythonEngine.dcr} -procedure Register; -begin - RegisterUnit('PythonEngine', @PythonEngine.Register); - RegisterUnit('PythonGUIInputOutput', @PythonGUIInputOutput.Register); - RegisterUnit('WrapDelphi', @WrapDelphi.Register); -end; - -initialization - RegisterPackage('P4DLaz', @Register); -end. +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit P4DLaz; + +interface + +uses + PythonEngine, PythonGUIInputOutput, MethodCallBack, TinyWideStrings, + VarPyth, WrapDelphi, WrapDelphiButtons, WrapDelphiClasses, + WrapDelphiControls, WrapDelphiTypes, LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('PythonEngine', @PythonEngine.Register); + RegisterUnit('PythonGUIInputOutput', @PythonGUIInputOutput.Register); + RegisterUnit('WrapDelphi', @WrapDelphi.Register); +end; + +initialization + RegisterPackage('P4DLaz', @Register); +end. diff --git a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi index 4b4bfea4..f740b927 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi +++ b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi @@ -1,4 +1,4 @@ - + @@ -7,7 +7,6 @@ - @@ -26,7 +25,7 @@ - + @@ -38,14 +37,11 @@ - + - - - - + @@ -56,11 +52,8 @@ - - - - + @@ -68,17 +61,12 @@ - - - - - - + @@ -87,142 +75,147 @@ - + + + + + + + + + + + - - - + + - + - + - - + - + - + - + - + - + - - + - + - + - + - + - + - + - - + - + - + - + - + - + - + - + - + - - + - - + + - - + + - - + + - + @@ -239,14 +232,17 @@ - - - - - - + + + + + + + + + diff --git a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpr b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpr index b2943a89..0d555335 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpr +++ b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpr @@ -7,7 +7,7 @@ Forms, Interfaces, {$ENDIF} {$IFDEF LINUX} - QForms, + Forms, Interfaces, {$ENDIF} Unit1 in 'Unit1.pas' {Form1}; diff --git a/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm b/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm index 94a42c35..314e7128 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm +++ b/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm @@ -10,7 +10,7 @@ object Form1: TForm1 Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' - LCLVersion = '0.9.30.2' + LCLVersion = '1.5' object Splitter1: TSplitter Cursor = crVSplit Left = 0 @@ -91,7 +91,7 @@ object Form1: TForm1 end object Edit1: TEdit Left = 368 - Height = 21 + Height = 24 Top = 32 Width = 161 TabOrder = 4 diff --git a/PythonForDelphi/Demos/FPC/Demo31/Project1.lpi b/PythonForDelphi/Demos/FPC/Demo31/Project1.lpi index 8952b830..9645cf5e 100644 --- a/PythonForDelphi/Demos/FPC/Demo31/Project1.lpi +++ b/PythonForDelphi/Demos/FPC/Demo31/Project1.lpi @@ -1,4 +1,4 @@ - + @@ -11,7 +11,6 @@ - @@ -41,15 +40,12 @@ - + - - - - - + + @@ -61,10 +57,7 @@ - - - - + @@ -77,11 +70,8 @@ - - - - - + + @@ -90,82 +80,63 @@ - - + - - - - + - - - + - - - + - + - - - + - - - - + - - - - + - - - - + @@ -174,8 +145,7 @@ - - + @@ -184,50 +154,39 @@ - - - + - - - + - + - - - + - - - - + - - - + @@ -236,188 +195,120 @@ - - - + - - - + - - - + - + - - - - + - - - - + - - - + - + + + + + + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -434,12 +325,6 @@ - - - - - - diff --git a/PythonForDelphi/Demos/FPC/Demo31/Project1.lpr b/PythonForDelphi/Demos/FPC/Demo31/Project1.lpr index 5f275f4a..e0602e45 100644 --- a/PythonForDelphi/Demos/FPC/Demo31/Project1.lpr +++ b/PythonForDelphi/Demos/FPC/Demo31/Project1.lpr @@ -1,18 +1,12 @@ program Project1; -{$I Definition.Inc} +{.$I Definition.Inc} uses Interfaces, Forms, Unit1 in 'Unit1.pas' {Form1}, - WrapDelphiExtCtrls in '..\..\Components\Sources\Core\WrapDelphiExtCtrls.pas', WrapDelphiTypes in '..\..\Components\Sources\Core\WrapDelphiTypes.pas', - Unit2 in 'Unit2.pas' {TestForm}, - WrapDelphiWindows in '..\..\Components\Sources\Core\WrapDelphiWindows.pas', - WrapDelphiComCtrls in '..\..\Components\Sources\Core\WrapDelphiComCtrls.pas', - WrapDelphiGrids in '..\..\Components\Sources\Core\WrapDelphiGrids.pas', - WrapDelphiGraphics in '..\..\Components\Sources\Core\WrapDelphiGraphics.pas', - WrapDelphiButtons in '..\..\Components\Sources\Core\WrapDelphiButtons.pas'; + Unit2 in 'Unit2.pas' {TestForm}; {$R *.res} diff --git a/PythonForDelphi/Demos/FPC/Demo31/Unit1.pas b/PythonForDelphi/Demos/FPC/Demo31/Unit1.pas index 739fbc8d..e3ce24bf 100644 --- a/PythonForDelphi/Demos/FPC/Demo31/Unit1.pas +++ b/PythonForDelphi/Demos/FPC/Demo31/Unit1.pas @@ -1,18 +1,12 @@ unit Unit1; -{$I Definition.Inc} +{.$I Definition.Inc} interface uses - SysUtils, Classes, -{$IFDEF MSWINDOWS} - Windows, Messages, Graphics, Controls, Forms, Dialogs, + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput, WrapDelphi, ActnList; type @@ -47,12 +41,8 @@ implementation Uses TypInfo, -{$IFNDEF FPC} - ObjAuto, -{$ENDIF} Variants, - VarPyth, - WrapDelphiVCL; + VarPyth; ////////////////////////////////////////////////////////////////////////// @@ -79,7 +69,7 @@ function TTestBase.DoubleDValue : double; type {$TYPEINFO ON} {$IFNDEF FPC}{$METHODINFO ON}{$ENDIF} -TTestClass = class(TTestBase, IFreeNotification, IInterface) +TTestClass = class(TTestBase, IFreeNotification) private fSValue : string; fIValue : integer; diff --git a/PythonForDelphi/Demos/FPC/Demo31/Unit2.lfm b/PythonForDelphi/Demos/FPC/Demo31/Unit2.lfm index a8c7317d..75d6772b 100644 --- a/PythonForDelphi/Demos/FPC/Demo31/Unit2.lfm +++ b/PythonForDelphi/Demos/FPC/Demo31/Unit2.lfm @@ -5,20 +5,20 @@ object TestForm: TTestForm Width = 614 ClientHeight = 341 ClientWidth = 614 - LCLVersion = '0.9.30.2' + LCLVersion = '1.5' object CheckBox1: TCheckBox Left = 96 - Height = 19 + Height = 22 Top = 16 - Width = 78 + Width = 91 Caption = 'CheckBox1' TabOrder = 0 end object CheckBox2: TCheckBox Left = 96 - Height = 19 + Height = 22 Top = 56 - Width = 78 + Width = 91 Caption = 'CheckBox2' Checked = True State = cbChecked @@ -35,7 +35,7 @@ object TestForm: TTestForm end object Edit1: TEdit Left = 96 - Height = 23 + Height = 25 Top = 96 Width = 121 TabOrder = 3 @@ -47,7 +47,9 @@ object TestForm: TTestForm Top = 48 Width = 249 ItemHeight = 0 + ScrollWidth = 247 TabOrder = 4 + TopIndex = -1 end object btnAdd: TButton Left = 104 diff --git a/PythonForDelphi/Demos/FPC/Demo31/Unit2.pas b/PythonForDelphi/Demos/FPC/Demo31/Unit2.pas index 197f5e9a..b9928255 100644 --- a/PythonForDelphi/Demos/FPC/Demo31/Unit2.pas +++ b/PythonForDelphi/Demos/FPC/Demo31/Unit2.pas @@ -5,7 +5,7 @@ interface uses - Windows, Messages, SysUtils, + SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; From 9cb1623ac5b37e1238a451acde20e00b0f2eac3d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 23 Oct 2017 04:29:09 +0300 Subject: [PATCH 023/123] Pull request 38 --- PythonForDelphi/Components/PythonVCL_XE2.dpk | 2 +- .../Components/Sources/VCL/pyDB.pas | 4 +- .../Components/Sources/VCL/pyDBTables.pas | 4 +- PythonForDelphi/Components/up4dlaz.pas | 28 + PythonForDelphi/Demos/Demo10/Example2.py | 2 +- PythonForDelphi/Demos/Demo10/pyDB.pas | 585 ++++++++++++------ PythonForDelphi/Demos/Demo10/pyDBTables.pas | 214 +++++-- PythonForDelphi/Demos/Demo29/Unit1.dfm | 2 +- PythonForDelphi/Demos/Demo31/Unit1.pas | 2 +- 9 files changed, 588 insertions(+), 255 deletions(-) create mode 100644 PythonForDelphi/Components/up4dlaz.pas diff --git a/PythonForDelphi/Components/PythonVCL_XE2.dpk b/PythonForDelphi/Components/PythonVCL_XE2.dpk index b2a06d00..bec9d58a 100644 --- a/PythonForDelphi/Components/PythonVCL_XE2.dpk +++ b/PythonForDelphi/Components/PythonVCL_XE2.dpk @@ -30,7 +30,7 @@ requires rtl, vcl, dbrtl, - bdertl, +// bdertl, Python_XE2; contains diff --git a/PythonForDelphi/Components/Sources/VCL/pyDB.pas b/PythonForDelphi/Components/Sources/VCL/pyDB.pas index 0e109e53..f64604c7 100644 --- a/PythonForDelphi/Components/Sources/VCL/pyDB.pas +++ b/PythonForDelphi/Components/Sources/VCL/pyDB.pas @@ -1630,7 +1630,7 @@ function TPyDataset.Repr : PPyObject; // Sequence services -function TPyDataset.SqLength : Integer; +function TPyDataset.SqLength : NativeInt; begin if CheckDataset then Result := Dataset.RecordCount @@ -1638,7 +1638,7 @@ function TPyDataset.SqLength : Integer; Result := -1; end; -function TPyDataset.SqItem( idx : Integer ) : PPyObject; +function TPyDataset.SqItem( idx : NativeInt ) : PPyObject; begin if CheckDataset then begin diff --git a/PythonForDelphi/Components/Sources/VCL/pyDBTables.pas b/PythonForDelphi/Components/Sources/VCL/pyDBTables.pas index 747f1801..46232d48 100644 --- a/PythonForDelphi/Components/Sources/VCL/pyDBTables.pas +++ b/PythonForDelphi/Components/Sources/VCL/pyDBTables.pas @@ -68,7 +68,6 @@ TPyBDEDataset = class(TPyDataset) procedure OnUpdateRecord( Dataset : TDataset; UpdateKind: TUpdateKind; var ua:TUpdateAction); end; - {********************************************************************* * Interface of TDBDataset * *********************************************************************} @@ -97,7 +96,6 @@ TPyDBDataset = class(TPyBDEDataset) {********************************************************************* * Interface of TTable * *********************************************************************} - TPyTable = class(TPyDBDataset) // Constructors & Destructors @@ -1742,5 +1740,7 @@ procedure CreateComponents( AOwner : TComponent ); gQueryType := TPythonQuery.Create(AOwner); end; +{$EndIf} +{$EndIf} end. diff --git a/PythonForDelphi/Components/up4dlaz.pas b/PythonForDelphi/Components/up4dlaz.pas new file mode 100644 index 00000000..1f2dee6b --- /dev/null +++ b/PythonForDelphi/Components/up4dlaz.pas @@ -0,0 +1,28 @@ +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit uP4DLaz; + +interface + +uses + PythonEngine, PythonGUIInputOutput, MethodCallBack, WrapDelphiWindows, + TinyWideStrings, VarPyth, WrapDelphi, WrapDelphiActnList, WrapDelphiButtons, + WrapDelphiClasses, WrapDelphiComCtrls, WrapDelphiControls, + WrapDelphiExtCtrls, WrapDelphiForms, WrapDelphiGraphics, WrapDelphiGrids, + WrapDelphiStdCtrls, WrapDelphiTypes, WrapDelphiVCL, LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('PythonEngine', @PythonEngine.Register); + RegisterUnit('PythonGUIInputOutput', @PythonGUIInputOutput.Register); + RegisterUnit('WrapDelphi', @WrapDelphi.Register); + RegisterUnit('uP4DLaz', @uP4DLaz.Register); +end; + +initialization + RegisterPackage('P4DLaz', @Register); +end. diff --git a/PythonForDelphi/Demos/Demo10/Example2.py b/PythonForDelphi/Demos/Demo10/Example2.py index 18e02925..6f699b6f 100644 --- a/PythonForDelphi/Demos/Demo10/Example2.py +++ b/PythonForDelphi/Demos/Demo10/Example2.py @@ -65,7 +65,7 @@ def PrintDocOf( inst ): if type(inst).__doc__: print type(inst).__doc__ print "Methods:" - for i in inst.__methods__: + for i in inst.__members__: doc = getattr(inst, i).__doc__ if doc: print " ", doc diff --git a/PythonForDelphi/Demos/Demo10/pyDB.pas b/PythonForDelphi/Demos/Demo10/pyDB.pas index 5893136f..00c17cf3 100644 --- a/PythonForDelphi/Demos/Demo10/pyDB.pas +++ b/PythonForDelphi/Demos/Demo10/pyDB.pas @@ -1,5 +1,23 @@ +{$I Definition.Inc} + unit pyDB; +{------------------------------------------------------------------------------- + $Header: /P4D/PythonForDelphi/Components/Sources/VCL/pyDB.pas 1 03-04-09 19:25 Morgan $ + Copyright © MMM Inc. 2003 - All Rights Reserved. + ------------------------------------------------------------------------------ + Author: Morgan Martinet + + Description: + + ------------------------------------------------------------------------------ + $Log: /P4D/PythonForDelphi/Components/Sources/VCL/pyDB.pas $ + * + * 1 03-04-09 19:25 Morgan + * initial check-in + +-------------------------------------------------------------------------------} + interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, @@ -10,6 +28,15 @@ TCallBackSplit = record self: TObject; end; +{********************************************************************* + * DB module * + *********************************************************************} + TPythonDB = class(TPythonModule) + public + constructor Create( AOwner : TComponent ); override; + procedure Initialize; override; + end; + {********************************************************************* * Shared object * *********************************************************************} @@ -99,6 +126,11 @@ TPyField = class(TCommon) procedure OnValidate( Sender : TField ); end; + TPythonField = class( TPythonType) + public + constructor Create( AOwner : TComponent ); override; + end; + {********************************************************************* * Interface of TDataset * *********************************************************************} @@ -148,8 +180,8 @@ TPyDataset = class(TCommon) function Repr : PPyObject; override; // Sequence services - function SqLength : Integer; override; - function SqItem( idx : Integer ) : PPyObject; override; + function SqLength : NativeInt; override; + function SqItem( idx : NativeInt ) : PPyObject; override; // Class methods class procedure RegisterMethods( PythonType : TPythonType ); override; @@ -216,6 +248,11 @@ TPyDataset = class(TCommon) procedure OnPostError ( Dataset : TDataset; E: EDatabaseError; var Action: TDataAction ); end; + TPythonDataset = class( TPythonType) + public + constructor Create( AOwner : TComponent ); override; + end; + {********************************************************************* * Interface of TVarArg * *********************************************************************} @@ -236,26 +273,116 @@ TVarArg = class(TPyObject) function Repr : PPyObject; override; end; + TPythonVarArg = class( TPythonType) + public + constructor Create( AOwner : TComponent ); override; + end; + {********************************************************************* * Global functions * *********************************************************************} - procedure Initialize( Owner : TEngineClient ); + procedure CreateComponents( AOwner : TComponent ); procedure SetEvent( var EventSlot : PPyObject; Event : PPyObject; const EventName, ClassName : String ); function SetDatasetEvent( EventSlot : PPyObject; dsEvent : TDataSetNotifyEvent ) : TDataSetNotifyEvent; function SetDatasetErrorEvent( EventSlot : PPyObject; dsEvent : TDataSetErrorEvent ) : TDataSetErrorEvent; procedure ClearEvent( var EventSlot : PPyObject ); function ReturnEvent( Event : PPyObject ) : PPyObject; procedure ExecuteEvent( Event : PPyObject; Args : array of Const ); + function NewDataset( aDataset : TDataset; IsOwner : Boolean ) : PPyObject; {******************************************************************** * Global variables * *********************************************************************} var + gDatasetType : TPythonType; gFieldType : TPythonType; gVarArgType : TPythonType; + gDBModule : TPythonModule; + implementation +{********************************************************************* + * DB module * + *********************************************************************} + +constructor TPythonDB.Create( AOwner : TComponent ); +begin + inherited; + ModuleName := 'DB'; + Name := 'modDB'; + with DocString do + begin + Add( 'This module contains several Object Types that' ); + Add( 'will let you work with the Borland BDE and access' ); + Add( 'a database.' ); + Add( '' ); + end; + with Errors.Add do + Name := 'DBError'; +end; + +procedure TPythonDB.Initialize; +begin + inherited; + // Values for type TTableType + SetVarFromVariant( 'ttDefault', 0 ); + SetVarFromVariant( 'ttParadox', 1 ); + SetVarFromVariant( 'ttDBase', 2 ); + SetVarFromVariant( 'ttASCII', 3 ); + // Values for type TDatasetState + SetVarFromVariant( 'dsInactive', 0 ); + SetVarFromVariant( 'dsBrowse', 1 ); + SetVarFromVariant( 'dsEdit', 2 ); + SetVarFromVariant( 'dsInsert', 3 ); + SetVarFromVariant( 'dsSetKey', 4 ); + SetVarFromVariant( 'dsCalcFields', 5 ); + SetVarFromVariant( 'dsFilter', 6 ); + SetVarFromVariant( 'dsNewValue', 7 ); + SetVarFromVariant( 'dsOldValue', 8 ); + SetVarFromVariant( 'dsCurValue', 9 ); + // Values for type TFieldType + SetVarFromVariant( 'ftUnknown', 0 ); + SetVarFromVariant( 'ftString', 1 ); + SetVarFromVariant( 'ftSmallint', 2 ); + SetVarFromVariant( 'ftInteger', 3 ); + SetVarFromVariant( 'ftWord', 4 ); + SetVarFromVariant( 'ftBoolean', 5 ); + SetVarFromVariant( 'ftFloat', 6 ); + SetVarFromVariant( 'ftCurrency', 7 ); + SetVarFromVariant( 'ftBCD', 8 ); + SetVarFromVariant( 'ftDate', 9 ); + SetVarFromVariant( 'ftTime', 10 ); + SetVarFromVariant( 'ftDateTime', 11 ); + SetVarFromVariant( 'ftBytes', 12 ); + SetVarFromVariant( 'ftVarBytes', 13 ); + SetVarFromVariant( 'ftAutoInc', 14 ); + SetVarFromVariant( 'ftBlob', 15 ); + SetVarFromVariant( 'ftMemo', 16 ); + SetVarFromVariant( 'ftGraphic', 17 ); + SetVarFromVariant( 'ftFmtMemo', 18 ); + SetVarFromVariant( 'ftParadoxOle', 19 ); + SetVarFromVariant( 'ftDBaseOle', 20 ); + SetVarFromVariant( 'ftTypedBinary', 21 ); + SetVarFromVariant( 'ftCursor', 22 ); + // Values for type TFieldKind + SetVarFromVariant( 'fkData', 0 ); + SetVarFromVariant( 'fkCalculated', 1 ); + SetVarFromVariant( 'fkLookup', 2 ); + SetVarFromVariant( 'fkInternalCalc', 3 ); + // Values for type TLocateOption + SetVarFromVariant( 'loCaseInsensitive', 0 ); + SetVarFromVariant( 'loPartialKey', 1 ); + // Values for type TDataAction + SetVarFromVariant( 'daFail', 0 ); + SetVarFromVariant( 'daAbort', 1 ); + SetVarFromVariant( 'daRetry', 2 ); + // Values for type TUpdateKind + SetVarFromVariant( 'ukModify', 0 ); + SetVarFromVariant( 'ukInsert', 1 ); + SetVarFromVariant( 'ukDelete', 2 ); +end; + {********************************************************************* * Shared object * *********************************************************************} @@ -342,7 +469,7 @@ procedure TCommon.AppendProp( List : PPyObject; const prop : String ); begin with GetPythonEngine do begin - obj := PyString_FromString(PAnsiChar(prop)); + obj := PyString_FromString(PAnsiChar(AnsiString(prop))); PyList_Append( List, obj ); Py_XDecRef(obj); end; @@ -351,8 +478,8 @@ procedure TCommon.AppendProp( List : PPyObject; const prop : String ); function TCommon.GetAttr(key : PAnsiChar) : PPyObject; begin try - if (CompareText( key, '__properties__' ) = 0) or - (CompareText( key, '__members__' ) = 0) then + if (CompareText( string(key), '__properties__' ) = 0) or + (CompareText( string(key), '__members__' ) = 0) then Result := GetProperties else Result := inherited GetAttr(key); @@ -367,8 +494,8 @@ function TCommon.GetAttr(key : PAnsiChar) : PPyObject; procedure TCommon.RaiseDBError( E : Exception ); begin - if GetModule <> nil then - GetModule.RaiseError( 'DBError', E.Message ); + if gDBModule <> nil then + gDBModule.RaiseError( 'DBError', AnsiString(E.Message) ); end; function TCommon.EventBelongsToObject( Event : TCallbackSplit ) : Boolean; @@ -437,103 +564,103 @@ function TPyField.GetAttr(key : PAnsiChar) : PPyObject; Exit; end; try - if CompareText( key, 'Alignment' ) = 0 then + if CompareText( string(key), 'Alignment' ) = 0 then Result := VariantAsPyObject( Integer(FField.Alignment) ) - else if CompareText( key, 'AsBoolean' ) = 0 then + else if CompareText( string(key), 'AsBoolean' ) = 0 then Result := VariantAsPyObject( FField.AsBoolean ) - else if CompareText( key, 'AsDateTime' ) = 0 then + else if CompareText( string(key), 'AsDateTime' ) = 0 then Result := VariantAsPyObject( FField.AsDateTime ) - else if CompareText( key, 'AsFloat' ) = 0 then + else if CompareText( string(key), 'AsFloat' ) = 0 then Result := VariantAsPyObject( FField.AsFloat ) - else if CompareText( key, 'AsInteger' ) = 0 then + else if CompareText( string(key), 'AsInteger' ) = 0 then Result := VariantAsPyObject( FField.AsInteger ) - else if CompareText( key, 'AsString' ) = 0 then + else if CompareText( string(key), 'AsString' ) = 0 then Result := VariantAsPyObject( FField.AsString ) - else if CompareText( key, 'CanModify' ) = 0 then + else if CompareText( string(key), 'CanModify' ) = 0 then Result := VariantAsPyObject( FField.CanModify ) - else if CompareText( key, 'ConstraintErrorMessage' ) = 0 then + else if CompareText( string(key), 'ConstraintErrorMessage' ) = 0 then Result := VariantAsPyObject( FField.ConstraintErrorMessage ) - else if CompareText( key, 'CurValue' ) = 0 then + else if CompareText( string(key), 'CurValue' ) = 0 then Result := VariantAsPyObject( FField.CurValue ) - else if CompareText( key, 'CustomConstraint' ) = 0 then + else if CompareText( string(key), 'CustomConstraint' ) = 0 then Result := VariantAsPyObject( FField.CustomConstraint ) - else if CompareText( key, 'DataSize' ) = 0 then + else if CompareText( string(key), 'DataSize' ) = 0 then Result := VariantAsPyObject( FField.DataSize ) - else if CompareText( key, 'DataType' ) = 0 then + else if CompareText( string(key), 'DataType' ) = 0 then Result := VariantAsPyObject( FField.DataType ) - else if CompareText( key, 'DefaultExpression' ) = 0 then + else if CompareText( string(key), 'DefaultExpression' ) = 0 then Result := VariantAsPyObject( FField.DefaultExpression ) - else if CompareText( key, 'DisplayLabel' ) = 0 then + else if CompareText( string(key), 'DisplayLabel' ) = 0 then Result := VariantAsPyObject( FField.DisplayLabel ) - else if CompareText( key, 'DisplayName' ) = 0 then + else if CompareText( string(key), 'DisplayName' ) = 0 then Result := VariantAsPyObject( FField.DisplayName ) - else if CompareText( key, 'DisplayText' ) = 0 then + else if CompareText( string(key), 'DisplayText' ) = 0 then Result := VariantAsPyObject( FField.DisplayText ) - else if CompareText( key, 'DisplayWidth' ) = 0 then + else if CompareText( string(key), 'DisplayWidth' ) = 0 then Result := VariantAsPyObject( FField.DisplayWidth ) - else if CompareText( key, 'EditMask' ) = 0 then + else if CompareText( string(key), 'EditMask' ) = 0 then Result := VariantAsPyObject( FField.EditMask ) - else if CompareText( key, 'FieldKind' ) = 0 then + else if CompareText( string(key), 'FieldKind' ) = 0 then Result := VariantAsPyObject( FField.FieldKind ) - else if CompareText( key, 'FieldName' ) = 0 then + else if CompareText( string(key), 'FieldName' ) = 0 then Result := VariantAsPyObject( FField.FieldName) - else if CompareText( key, 'FieldNo' ) = 0 then + else if CompareText( string(key), 'FieldNo' ) = 0 then Result := VariantAsPyObject( FField.FieldNo ) - else if CompareText( key, 'HasConstraints' ) = 0 then + else if CompareText( string(key), 'HasConstraints' ) = 0 then Result := VariantAsPyObject( FField.HasConstraints ) - else if CompareText( key, 'ImportedConstraint' ) = 0 then + else if CompareText( string(key), 'ImportedConstraint' ) = 0 then Result := VariantAsPyObject( FField.ImportedConstraint ) - else if CompareText( key, 'Index' ) = 0 then + else if CompareText( string(key), 'Index' ) = 0 then Result := VariantAsPyObject( FField.Index ) - else if CompareText( key, 'IsBlob' ) = 0 then + else if CompareText( string(key), 'IsBlob' ) = 0 then Result := VariantAsPyObject( FField.IsBlob) - else if CompareText( key, 'IsIndexField' ) = 0 then + else if CompareText( string(key), 'IsIndexField' ) = 0 then Result := VariantAsPyObject( FField.IsIndexField ) - else if CompareText( key, 'IsNull' ) = 0 then + else if CompareText( string(key), 'IsNull' ) = 0 then Result := VariantAsPyObject( FField.IsNull ) - else if CompareText( key, 'KeyFields' ) = 0 then + else if CompareText( string(key), 'KeyFields' ) = 0 then Result := VariantAsPyObject( FField.KeyFields ) - else if CompareText( key, 'Lookup' ) = 0 then + else if CompareText( string(key), 'Lookup' ) = 0 then Result := VariantAsPyObject( FField.Lookup ) - else if CompareText( key, 'LookupCache' ) = 0 then + else if CompareText( string(key), 'LookupCache' ) = 0 then Result := VariantAsPyObject( FField.LookupCache ) - else if CompareText( key, 'LookupDataset' ) = 0 then + else if CompareText( string(key), 'LookupDataset' ) = 0 then Result := ReturnNone - else if CompareText( key, 'LookupKeyFields' ) = 0 then + else if CompareText( string(key), 'LookupKeyFields' ) = 0 then Result := VariantAsPyObject( FField.LookupKeyFields ) - else if CompareText( key, 'LookupList' ) = 0 then + else if CompareText( string(key), 'LookupList' ) = 0 then Result := ReturnNone - else if CompareText( key, 'LookupResultField' ) = 0 then + else if CompareText( string(key), 'LookupResultField' ) = 0 then Result := VariantAsPyObject( FField.LookupResultField ) - else if CompareText( key, 'NewValue' ) = 0 then + else if CompareText( string(key), 'NewValue' ) = 0 then Result := VariantAsPyObject( FField.NewValue ) - else if CompareText( key, 'Offset' ) = 0 then + else if CompareText( string(key), 'Offset' ) = 0 then Result := VariantAsPyObject( FField.Offset ) - else if CompareText( key, 'OldValue' ) = 0 then + else if CompareText( string(key), 'OldValue' ) = 0 then Result := VariantAsPyObject( FField.OldValue ) - else if CompareText( key, 'Origin' ) = 0 then + else if CompareText( string(key), 'Origin' ) = 0 then Result := VariantAsPyObject( FField.Origin ) - else if CompareText( key, 'ReadOnly' ) = 0 then + else if CompareText( string(key), 'ReadOnly' ) = 0 then Result := VariantAsPyObject( FField.ReadOnly ) - else if CompareText( key, 'Required' ) = 0 then + else if CompareText( string(key), 'Required' ) = 0 then Result := VariantAsPyObject( FField.Required ) - else if CompareText( key, 'Size' ) = 0 then + else if CompareText( string(key), 'Size' ) = 0 then Result := VariantAsPyObject( FField.Size ) - else if CompareText( key, 'Text' ) = 0 then + else if CompareText( string(key), 'Text' ) = 0 then Result := VariantAsPyObject( FField.Text ) - else if CompareText( key, 'ValidChars' ) = 0 then + else if CompareText( string(key), 'ValidChars' ) = 0 then Result := ReturnNone - else if CompareText( key, 'Value' ) = 0 then + else if CompareText( string(key), 'Value' ) = 0 then Result := VariantAsPyObject( FField.Value ) - else if CompareText( key, 'Visible' ) = 0 then + else if CompareText( string(key), 'Visible' ) = 0 then Result := VariantAsPyObject( FField.Visible ) - else if CompareText( key, 'OnChange' ) = 0 then + else if CompareText( string(key), 'OnChange' ) = 0 then Result := ReturnEvent( FOnChange ) - else if CompareText( key, 'OnGetText' ) = 0 then + else if CompareText( string(key), 'OnGetText' ) = 0 then Result := ReturnEvent( FOnGetText ) - else if CompareText( key, 'OnSetText' ) = 0 then + else if CompareText( string(key), 'OnSetText' ) = 0 then Result := ReturnEvent( FOnSetText ) - else if CompareText( key, 'OnValidate' ) = 0 then + else if CompareText( string(key), 'OnValidate' ) = 0 then Result := ReturnEvent( FOnValidate ) else Result := inherited GetAttr(key); @@ -555,216 +682,216 @@ function TPyField.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; if not CheckField then Exit; try - if CompareText( key, 'Alignment' ) = 0 then + if CompareText( string(key), 'Alignment' ) = 0 then begin FField.Alignment := TAlignment(PyObjectAsVariant( value )); Result := 0; end - else if CompareText( key, 'AsBoolean' ) = 0 then + else if CompareText( string(key), 'AsBoolean' ) = 0 then begin FField.AsBoolean := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'AsDateTime' ) = 0 then + else if CompareText( string(key), 'AsDateTime' ) = 0 then begin FField.AsDateTime := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'AsFloat' ) = 0 then + else if CompareText( string(key), 'AsFloat' ) = 0 then begin FField.AsFloat := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'AsInteger' ) = 0 then + else if CompareText( string(key), 'AsInteger' ) = 0 then begin FField.AsInteger := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'AsString' ) = 0 then + else if CompareText( string(key), 'AsString' ) = 0 then begin FField.AsString := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'CanModify' ) = 0 then + else if CompareText( string(key), 'CanModify' ) = 0 then begin Result := 0; end - else if CompareText( key, 'ConstraintErrorMessage' ) = 0 then + else if CompareText( string(key), 'ConstraintErrorMessage' ) = 0 then begin FField.ConstraintErrorMessage := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'CurValue' ) = 0 then + else if CompareText( string(key), 'CurValue' ) = 0 then begin Result := 0; end - else if CompareText( key, 'CustomConstraint' ) = 0 then + else if CompareText( string(key), 'CustomConstraint' ) = 0 then begin FField.CustomConstraint := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'DataSize' ) = 0 then + else if CompareText( string(key), 'DataSize' ) = 0 then begin Result := 0; end - else if CompareText( key, 'DataType' ) = 0 then + else if CompareText( string(key), 'DataType' ) = 0 then begin Result := 0; end - else if CompareText( key, 'DefaultExpression' ) = 0 then + else if CompareText( string(key), 'DefaultExpression' ) = 0 then begin FField.DefaultExpression := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'DisplayLabel' ) = 0 then + else if CompareText( string(key), 'DisplayLabel' ) = 0 then begin FField.DisplayLabel := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'DisplayName' ) = 0 then + else if CompareText( string(key), 'DisplayName' ) = 0 then begin Result := 0; end - else if CompareText( key, 'DisplayText' ) = 0 then + else if CompareText( string(key), 'DisplayText' ) = 0 then begin Result := 0; end - else if CompareText( key, 'DisplayWidth' ) = 0 then + else if CompareText( string(key), 'DisplayWidth' ) = 0 then begin FField.DisplayWidth := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'EditMask' ) = 0 then + else if CompareText( string(key), 'EditMask' ) = 0 then begin FField.EditMask := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'FieldKind' ) = 0 then + else if CompareText( string(key), 'FieldKind' ) = 0 then begin FField.FieldKind := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'FieldName' ) = 0 then + else if CompareText( string(key), 'FieldName' ) = 0 then begin FField.FieldName:= PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'FieldNo' ) = 0 then + else if CompareText( string(key), 'FieldNo' ) = 0 then begin Result := 0; end - else if CompareText( key, 'HasConstraints' ) = 0 then + else if CompareText( string(key), 'HasConstraints' ) = 0 then begin Result := 0; end - else if CompareText( key, 'ImportedConstraint' ) = 0 then + else if CompareText( string(key), 'ImportedConstraint' ) = 0 then begin FField.ImportedConstraint := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'Index' ) = 0 then + else if CompareText( string(key), 'Index' ) = 0 then begin FField.Index := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'IsBlob' ) = 0 then + else if CompareText( string(key), 'IsBlob' ) = 0 then begin Result := 0; end - else if CompareText( key, 'IsIndexField' ) = 0 then + else if CompareText( string(key), 'IsIndexField' ) = 0 then begin Result := 0; end - else if CompareText( key, 'IsNull' ) = 0 then + else if CompareText( string(key), 'IsNull' ) = 0 then begin Result := 0; end - else if CompareText( key, 'KeyFields' ) = 0 then + else if CompareText( string(key), 'KeyFields' ) = 0 then begin FField.KeyFields := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'Lookup' ) = 0 then + else if CompareText( string(key), 'Lookup' ) = 0 then begin FField.Lookup := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'LookupCache' ) = 0 then + else if CompareText( string(key), 'LookupCache' ) = 0 then begin FField.LookupCache := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'LookupDataset' ) = 0 then + else if CompareText( string(key), 'LookupDataset' ) = 0 then begin Result := 0; end - else if CompareText( key, 'LookupKeyFields' ) = 0 then + else if CompareText( string(key), 'LookupKeyFields' ) = 0 then begin FField.LookupKeyFields := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'LookupList' ) = 0 then + else if CompareText( string(key), 'LookupList' ) = 0 then begin Result := 0; end - else if CompareText( key, 'LookupResultField' ) = 0 then + else if CompareText( string(key), 'LookupResultField' ) = 0 then begin FField.LookupResultField := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'NewValue' ) = 0 then + else if CompareText( string(key), 'NewValue' ) = 0 then begin FField.NewValue := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'Offset' ) = 0 then + else if CompareText( string(key), 'Offset' ) = 0 then begin Result := 0; end - else if CompareText( key, 'OldValue' ) = 0 then + else if CompareText( string(key), 'OldValue' ) = 0 then begin Result := 0; end - else if CompareText( key, 'Origin' ) = 0 then + else if CompareText( string(key), 'Origin' ) = 0 then begin FField.Origin := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'ReadOnly' ) = 0 then + else if CompareText( string(key), 'ReadOnly' ) = 0 then begin FField.ReadOnly := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'Required' ) = 0 then + else if CompareText( string(key), 'Required' ) = 0 then begin FField.Required := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'Size' ) = 0 then + else if CompareText( string(key), 'Size' ) = 0 then begin FField.Size := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'Text' ) = 0 then + else if CompareText( string(key), 'Text' ) = 0 then begin FField.Text := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'ValidChars' ) = 0 then + else if CompareText( string(key), 'ValidChars' ) = 0 then begin Result := 0; end - else if CompareText( key, 'Value' ) = 0 then + else if CompareText( string(key), 'Value' ) = 0 then begin FField.Value := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'Visible' ) = 0 then + else if CompareText( string(key), 'Visible' ) = 0 then begin FField.Visible := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'OnChange' ) = 0 then + else if CompareText( string(key), 'OnChange' ) = 0 then begin SetEvent( FOnChange, Value, 'OnChange', 'TField' ); if Assigned(FOnChange) then @@ -773,7 +900,7 @@ function TPyField.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; FField.OnChange := nil; Result := 0; end - else if CompareText( key, 'OnGetText' ) = 0 then + else if CompareText( string(key), 'OnGetText' ) = 0 then begin SetEvent( FOnGetText, Value, 'OnGetText', 'TField' ); if Assigned(FOnGetText) then @@ -782,7 +909,7 @@ function TPyField.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; FField.OnGetText := nil; Result := 0; end - else if CompareText( key, 'OnSetText' ) = 0 then + else if CompareText( string(key), 'OnSetText' ) = 0 then begin SetEvent( FOnSetText, Value, 'OnSetText', 'TField' ); if Assigned(FOnSetText) then @@ -791,7 +918,7 @@ function TPyField.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; FField.OnSetText := nil; Result := 0; end - else if CompareText( key, 'OnValidate' ) = 0 then + else if CompareText( string(key), 'OnValidate' ) = 0 then begin SetEvent( FOnValidate, Value, 'OnValidate', 'TField' ); if Assigned(FOnValidate) then @@ -987,7 +1114,7 @@ function TPyField.DoIsValidChar( args : PPyObject ) : PPyObject; begin if PyArg_ParseTuple( args, 's:TField.IsValidChar',@s ) <> 0 then begin - str := s; + str := string(s); if Length(str) > 0 then c := str[1] else @@ -1074,6 +1201,20 @@ procedure TPyField.OnValidate( Sender : TField ); ExecuteEvent( FOnValidate, [GetSelf] ); end; +constructor TPythonField.Create( AOwner : TComponent ); +begin + inherited; + Name := 'typeField'; + TypeName := 'TField'; + Module := gDBModule; + TypeFlags := TypeFlags + [tpfBaseType]; + PyObjectClass := TPyField; + with DocString do + begin + Add( 'The TField type implements the Delphi TField VCL Object inside Python.' ); + Add( 'The properties and methods are the same as in Delphi.' ); + end; +end; {********************************************************************* * Implementation of TDataset * @@ -1189,75 +1330,75 @@ function TPyDataset.GetAttr(key : PAnsiChar) : PPyObject; Exit; end; try - if CompareText( key, 'Active' ) = 0 then + if CompareText( string(key), 'Active' ) = 0 then Result := VariantAsPyObject( Dataset.Active ) - else if CompareText( key, 'BOF' ) = 0 then + else if CompareText( string(key), 'BOF' ) = 0 then Result := VariantAsPyObject( Dataset.BOF ) - else if CompareText( key, 'CanModify' ) = 0 then + else if CompareText( string(key), 'CanModify' ) = 0 then Result := VariantAsPyObject( Dataset.CanModify ) - else if CompareText( key, 'EOF' ) = 0 then + else if CompareText( string(key), 'EOF' ) = 0 then Result := VariantAsPyObject( Dataset.EOF ) - else if CompareText( key, 'FieldCount' ) = 0 then + else if CompareText( string(key), 'FieldCount' ) = 0 then Result := VariantAsPyObject( Dataset.FieldCount ) - else if CompareText( key, 'Filter' ) = 0 then + else if CompareText( string(key), 'Filter' ) = 0 then Result := VariantAsPyObject( Dataset.Filter ) - else if CompareText( key, 'Filtered' ) = 0 then + else if CompareText( string(key), 'Filtered' ) = 0 then Result := VariantAsPyObject( Dataset.Filtered ) - else if CompareText( key, 'Found' ) = 0 then + else if CompareText( string(key), 'Found' ) = 0 then Result := VariantAsPyObject( Dataset.Found ) - else if CompareText( key, 'Modified' ) = 0 then + else if CompareText( string(key), 'Modified' ) = 0 then Result := VariantAsPyObject( Dataset.Modified ) - else if CompareText( key, 'RecNo' ) = 0 then + else if CompareText( string(key), 'RecNo' ) = 0 then Result := VariantAsPyObject( Dataset.RecNo ) - else if CompareText( key, 'RecordCount' ) = 0 then + else if CompareText( string(key), 'RecordCount' ) = 0 then Result := VariantAsPyObject( Dataset.RecordCount ) - else if CompareText( key, 'RecordSize' ) = 0 then + else if CompareText( string(key), 'RecordSize' ) = 0 then Result := VariantAsPyObject( Dataset.RecordSize ) - else if CompareText( key, 'State' ) = 0 then + else if CompareText( string(key), 'State' ) = 0 then Result := VariantAsPyObject( Integer(Dataset.State) ) - else if CompareText( key, 'AfterClose' ) = 0 then + else if CompareText( string(key), 'AfterClose' ) = 0 then Result := ReturnEvent( FAfterClose ) - else if CompareText( key, 'AfterOpen' ) = 0 then + else if CompareText( string(key), 'AfterOpen' ) = 0 then Result := ReturnEvent( FAfterOpen ) - else if CompareText( key, 'AfterScroll' ) = 0 then + else if CompareText( string(key), 'AfterScroll' ) = 0 then Result := ReturnEvent( FAfterScroll ) - else if CompareText( key, 'BeforeClose' ) = 0 then + else if CompareText( string(key), 'BeforeClose' ) = 0 then Result := ReturnEvent( FBeforeClose ) - else if CompareText( key, 'BeforeOpen' ) = 0 then + else if CompareText( string(key), 'BeforeOpen' ) = 0 then Result := ReturnEvent( FBeforeOpen ) - else if CompareText( key, 'BeforeScroll' ) = 0 then + else if CompareText( string(key), 'BeforeScroll' ) = 0 then Result := ReturnEvent( FBeforeScroll ) - else if CompareText( key, 'AfterCancel' ) = 0 then + else if CompareText( string(key), 'AfterCancel' ) = 0 then Result := ReturnEvent( FAfterCancel) - else if CompareText( key, 'AfterDelete' ) = 0 then + else if CompareText( string(key), 'AfterDelete' ) = 0 then Result := ReturnEvent( FAfterDelete) - else if CompareText( key, 'AfterEdit' ) = 0 then + else if CompareText( string(key), 'AfterEdit' ) = 0 then Result := ReturnEvent( FAfterEdit) - else if CompareText( key, 'AfterInsert' ) = 0 then + else if CompareText( string(key), 'AfterInsert' ) = 0 then Result := ReturnEvent( FAfterInsert) - else if CompareText( key, 'AfterPost' ) = 0 then + else if CompareText( string(key), 'AfterPost' ) = 0 then Result := ReturnEvent( FAfterPost) - else if CompareText( key, 'BeforeCancel' ) = 0 then + else if CompareText( string(key), 'BeforeCancel' ) = 0 then Result := ReturnEvent( FBeforeCancel) - else if CompareText( key, 'BeforeDelete' ) = 0 then + else if CompareText( string(key), 'BeforeDelete' ) = 0 then Result := ReturnEvent( FBeforeDelete) - else if CompareText( key, 'BeforeEdit' ) = 0 then + else if CompareText( string(key), 'BeforeEdit' ) = 0 then Result := ReturnEvent( FBeforeEdit) - else if CompareText( key, 'BeforeInsert' ) = 0 then + else if CompareText( string(key), 'BeforeInsert' ) = 0 then Result := ReturnEvent( FBeforeInsert) - else if CompareText( key, 'BeforePost' ) = 0 then + else if CompareText( string(key), 'BeforePost' ) = 0 then Result := ReturnEvent( FBeforePost) - else if CompareText( key, 'OnCalcFields' ) = 0 then + else if CompareText( string(key), 'OnCalcFields' ) = 0 then Result := ReturnEvent( FOnCalcFields) - else if CompareText( key, 'OnDeleteError' ) = 0 then + else if CompareText( string(key), 'OnDeleteError' ) = 0 then Result := ReturnEvent( FOnDeleteError) - else if CompareText( key, 'OnEditError' ) = 0 then + else if CompareText( string(key), 'OnEditError' ) = 0 then Result := ReturnEvent( FOnEditError) - else if CompareText( key, 'OnFilterRecord' ) = 0 then + else if CompareText( string(key), 'OnFilterRecord' ) = 0 then Result := ReturnEvent( FOnFilterRecord) - else if CompareText( key, 'OnNewRecord' ) = 0 then + else if CompareText( string(key), 'OnNewRecord' ) = 0 then Result := ReturnEvent( FOnNewRecord) - else if CompareText( key, 'OnPostError' ) = 0 then + else if CompareText( string(key), 'OnPostError' ) = 0 then Result := ReturnEvent( FOnPostError) else Result := inherited GetAttr(key); @@ -1279,177 +1420,177 @@ function TPyDataset.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; if not CheckDataset then Exit; try - if CompareText( key, 'Active' ) = 0 then + if CompareText( string(key), 'Active' ) = 0 then begin Dataset.Active := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'BOF' ) = 0 then + else if CompareText( string(key), 'BOF' ) = 0 then begin Result := 0; end - else if CompareText( key, 'CanModify' ) = 0 then + else if CompareText( string(key), 'CanModify' ) = 0 then begin Result := 0; end - else if CompareText( key, 'EOF' ) = 0 then + else if CompareText( string(key), 'EOF' ) = 0 then begin Result := 0; end - else if CompareText( key, 'FieldCount' ) = 0 then + else if CompareText( string(key), 'FieldCount' ) = 0 then begin Result := 0; end - else if CompareText( key, 'Filter' ) = 0 then + else if CompareText( string(key), 'Filter' ) = 0 then begin Dataset.Filter := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'Filtered' ) = 0 then + else if CompareText( string(key), 'Filtered' ) = 0 then begin Dataset.Filtered := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'Found' ) = 0 then + else if CompareText( string(key), 'Found' ) = 0 then begin Result := 0; end - else if CompareText( key, 'Modified' ) = 0 then + else if CompareText( string(key), 'Modified' ) = 0 then begin Result := 0; end - else if CompareText( key, 'RecNo' ) = 0 then + else if CompareText( string(key), 'RecNo' ) = 0 then begin Dataset.RecNo := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'RecordCount' ) = 0 then + else if CompareText( string(key), 'RecordCount' ) = 0 then begin Result := 0; end - else if CompareText( key, 'RecordSize' ) = 0 then + else if CompareText( string(key), 'RecordSize' ) = 0 then begin Result := 0; end - else if CompareText( key, 'State' ) = 0 then + else if CompareText( string(key), 'State' ) = 0 then begin Result := 0; end - else if CompareText( key, 'AfterClose' ) = 0 then + else if CompareText( string(key), 'AfterClose' ) = 0 then begin SetEvent( FAfterClose, Value, 'AfterClose', 'TDataset' ); Dataset.AfterClose := SetDatasetEvent( FAfterClose, AfterClose ); Result := 0; end - else if CompareText( key, 'AfterOpen' ) = 0 then + else if CompareText( string(key), 'AfterOpen' ) = 0 then begin SetEvent( FAfterOpen, Value, 'AfterOpen', 'TDataset' ); Dataset.AfterOpen := SetDatasetEvent( FAfterOpen, AfterOpen ); Result := 0; end - else if CompareText( key, 'AfterScroll' ) = 0 then + else if CompareText( string(key), 'AfterScroll' ) = 0 then begin SetEvent( FAfterScroll, Value, 'AfterScroll', 'TDataset' ); Dataset.AfterScroll := SetDatasetEvent( FAfterScroll, AfterScroll ); Result := 0; end - else if CompareText( key, 'BeforeClose' ) = 0 then + else if CompareText( string(key), 'BeforeClose' ) = 0 then begin SetEvent( FBeforeClose, Value, 'BeforeClose', 'TDataset' ); Dataset.BeforeClose := SetDatasetEvent( FBeforeClose, BeforeClose ); Result := 0; end - else if CompareText( key, 'BeforeOpen' ) = 0 then + else if CompareText( string(key), 'BeforeOpen' ) = 0 then begin SetEvent( FBeforeOpen, Value, 'BeforeOpen', 'TDataset' ); Dataset.BeforeOpen := SetDatasetEvent( FBeforeOpen, BeforeOpen ); Result := 0; end - else if CompareText( key, 'BeforeScroll' ) = 0 then + else if CompareText( string(key), 'BeforeScroll' ) = 0 then begin SetEvent( FBeforeScroll, Value, 'BeforeScroll', 'TDataset' ); Dataset.BeforeScroll := SetDatasetEvent( FBeforeScroll, BeforeScroll ); Result := 0; end - else if CompareText( key, 'AfterCancel' ) = 0 then + else if CompareText( string(key), 'AfterCancel' ) = 0 then begin SetEvent( FAfterCancel, Value, 'AfterCancel', 'TDataset' ); Dataset.AfterCancel := SetDatasetEvent( FAfterCancel, AfterCancel); Result := 0; end - else if CompareText( key, 'AfterDelete' ) = 0 then + else if CompareText( string(key), 'AfterDelete' ) = 0 then begin SetEvent( FAfterDelete, Value, 'AfterDelete', 'TDataset' ); Dataset.AfterDelete := SetDatasetEvent( FAfterDelete, AfterDelete); Result := 0; end - else if CompareText( key, 'AfterEdit' ) = 0 then + else if CompareText( string(key), 'AfterEdit' ) = 0 then begin SetEvent( FAfterEdit, Value, 'AfterEdit', 'TDataset' ); Dataset.AfterEdit := SetDatasetEvent( FAfterEdit, AfterEdit); Result := 0; end - else if CompareText( key, 'AfterInsert' ) = 0 then + else if CompareText( string(key), 'AfterInsert' ) = 0 then begin SetEvent( FAfterInsert, Value, 'AfterInsert', 'TDataset' ); Dataset.AfterInsert := SetDatasetEvent( FAfterInsert, AfterInsert); Result := 0; end - else if CompareText( key, 'AfterPost' ) = 0 then + else if CompareText( string(key), 'AfterPost' ) = 0 then begin SetEvent( FAfterPost, Value, 'AfterPost', 'TDataset' ); Dataset.AfterPost := SetDatasetEvent( FAfterPost, AfterPost); Result := 0; end - else if CompareText( key, 'BeforeCancel' ) = 0 then + else if CompareText( string(key), 'BeforeCancel' ) = 0 then begin SetEvent( FBeforeCancel, Value, 'BeforeCancel', 'TDataset' ); Dataset.BeforeCancel := SetDatasetEvent( FBeforeCancel, BeforeCancel); Result := 0; end - else if CompareText( key, 'BeforeDelete' ) = 0 then + else if CompareText( string(key), 'BeforeDelete' ) = 0 then begin SetEvent( FBeforeDelete, Value, 'BeforeDelete', 'TDataset' ); Dataset.BeforeDelete := SetDatasetEvent( FBeforeDelete, BeforeDelete); Result := 0; end - else if CompareText( key, 'BeforeEdit' ) = 0 then + else if CompareText( string(key), 'BeforeEdit' ) = 0 then begin SetEvent( FBeforeEdit, Value, 'BeforeEdit', 'TDataset' ); Dataset.BeforeEdit := SetDatasetEvent( FBeforeEdit, BeforeEdit); Result := 0; end - else if CompareText( key, 'BeforeInsert' ) = 0 then + else if CompareText( string(key), 'BeforeInsert' ) = 0 then begin SetEvent( FBeforeInsert, Value, 'BeforeInsert', 'TDataset' ); Dataset.BeforeInsert := SetDatasetEvent( FBeforeInsert, BeforeInsert); Result := 0; end - else if CompareText( key, 'BeforePost' ) = 0 then + else if CompareText( string(key), 'BeforePost' ) = 0 then begin SetEvent( FBeforePost, Value, 'BeforePost', 'TDataset' ); Dataset.BeforePost := SetDatasetEvent( FBeforePost, BeforePost); Result := 0; end - else if CompareText( key, 'OnCalcFields' ) = 0 then + else if CompareText( string(key), 'OnCalcFields' ) = 0 then begin SetEvent( FOnCalcFields, Value, 'OnCalcFields', 'TDataset' ); Dataset.OnCalcFields := SetDatasetEvent( FOnCalcFields, OnCalcFields); Result := 0; end - else if CompareText( key, 'OnDeleteError' ) = 0 then + else if CompareText( string(key), 'OnDeleteError' ) = 0 then begin SetEvent( FOnDeleteError, Value, 'OnDeleteError', 'TDataset' ); Dataset.OnDeleteError := SetDatasetErrorEvent( FOnDeleteError, OnDeleteError ); Result := 0; end - else if CompareText( key, 'OnEditError' ) = 0 then + else if CompareText( string(key), 'OnEditError' ) = 0 then begin SetEvent( FOnEditError, Value, 'OnEditError', 'TDataset' ); Dataset.OnEditError := SetDatasetErrorEvent( FOnEditError, OnEditError ); Result := 0; end - else if CompareText( key, 'OnFilterRecord' ) = 0 then + else if CompareText( string(key), 'OnFilterRecord' ) = 0 then begin SetEvent( FOnFilterRecord, Value, 'OnFilterRecord', 'TDataset' ); if Assigned(FOnFilterRecord) then @@ -1458,13 +1599,13 @@ function TPyDataset.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; Dataset.OnFilterRecord := nil; Result := 0; end - else if CompareText( key, 'OnNewRecord' ) = 0 then + else if CompareText( string(key), 'OnNewRecord' ) = 0 then begin SetEvent( FOnNewRecord, Value, 'OnNewRecord', 'TDataset' ); Dataset.OnNewRecord := SetDatasetEvent( FOnNewRecord, OnNewRecord); Result := 0; end - else if CompareText( key, 'OnPostError' ) = 0 then + else if CompareText( string(key), 'OnPostError' ) = 0 then begin SetEvent( FOnPostError, Value, 'OnPostError', 'TDataset' ); Dataset.OnPostError := SetDatasetErrorEvent( FOnPostError, OnPostError ); @@ -1489,7 +1630,7 @@ function TPyDataset.Repr : PPyObject; // Sequence services -function TPyDataset.SqLength : Integer; +function TPyDataset.SqLength : NativeInt; begin if CheckDataset then Result := Dataset.RecordCount @@ -1497,7 +1638,7 @@ function TPyDataset.SqLength : Integer; Result := -1; end; -function TPyDataset.SqItem( idx : Integer ) : PPyObject; +function TPyDataset.SqItem( idx : NativeInt ) : PPyObject; begin if CheckDataset then begin @@ -1514,7 +1655,7 @@ function TPyDataset.SqItem( idx : Integer ) : PPyObject; begin Result := nil; with GetPythonEngine do - PyErr_SetString (PyExc_IndexError^, PAnsiChar(Format('Index %d out of range (%d,%d)',[idx, 0, Dataset.RecordCount-1]))); + PyErr_SetString (PyExc_IndexError^, PAnsiChar(AnsiString(Format('Index %d out of range (%d,%d)',[idx, 0, Dataset.RecordCount-1])))); Exit; end; try @@ -1604,7 +1745,7 @@ function TPyDataset.FieldNamesAsTuple : PPyObject; Result := PyTuple_New(Dataset.FieldCount); for i := 0 to Dataset.FieldCount - 1 do with Dataset.Fields[i] do - PyTuple_SetItem( Result, i, PyString_FromString( PAnsiChar(FieldName) ) ); + PyTuple_SetItem( Result, i, VariantAsPyObject(Variant(FieldName)) ); end; end; @@ -1625,6 +1766,7 @@ function TPyDataset.FieldsAsDict : PPyObject; var i : Integer; obj : PPyObject; + _fieldName : PPyObject; begin with GetPythonEngine do begin @@ -1633,8 +1775,10 @@ function TPyDataset.FieldsAsDict : PPyObject; with Dataset.Fields[i] do begin obj := VariantAsPyObject( AsVariant ); - PyDict_SetItemString( Result, PAnsiChar(FieldName), obj ); + _fieldName := VariantAsPyObject(Variant(FieldName)); + PyDict_SetItem( Result, _fieldName, obj ); Py_XDecRef(obj); + Py_XDecRef(_fieldName); end; end; end; @@ -2194,7 +2338,7 @@ function TPyDataset.DoFields( args : PPyObject ) : PPyObject; else begin Result := nil; - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Value out of range : %d', [idx]))); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Value out of range : %d', [idx])))); end; end else // the arguments were not right @@ -2235,7 +2379,7 @@ function TPyDataset.DoFieldByName( args : PPyObject ) : PPyObject; else begin Result := nil; - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Unknown field "%s"', [String(s)]))); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown field "%s"', [String(s)])))); end; end else // the arguments were not right @@ -2549,6 +2693,24 @@ procedure TPyDataset.OnPostError( Dataset : TDataset; E: EDatabaseError; var Act end; end; +constructor TPythonDataset.Create( AOwner : TComponent ); +begin + inherited; + Name := 'typeDataset'; + TypeName := 'TDataset'; + Services.Sequence := [ssLength, ssItem]; + Module := gDBModule; + TypeFlags := TypeFlags + [tpfBaseType]; + PyObjectClass := TPyDataset; + with DocString do + begin + Add( 'The TDataset type implements the Delphi TDataset VCL Object inside Python.' ); + Add( 'The properties and methods are the same as in Delphi.' ); + Add( 'A TDataset can not be instancied, because it''s a virtual class.' ); + Add( 'It''s used as an interface to any Dataset subclass.'); + end; +end; + {********************************************************************* * Implementation of TVarArg * @@ -2581,7 +2743,7 @@ function TVarArg.GetAttr(key : PAnsiChar) : PPyObject; begin with GetPythonEngine do begin - if CompareText( key, 'Value' ) = 0 then + if CompareText( string(key), 'Value' ) = 0 then begin Result := FValue; if not Assigned(Result) then @@ -2597,7 +2759,7 @@ function TVarArg.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; begin with GetPythonEngine do begin - if CompareText( key, 'Value' ) = 0 then + if CompareText( string(key), 'Value' ) = 0 then begin Py_XDecRef(FValue); FValue := value; @@ -2612,20 +2774,38 @@ function TVarArg.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; function TVarArg.Repr : PPyObject; begin with GetPythonEngine do - Result := PyString_FromString( PAnsiChar(PyObjectAsString(FValue)) ); + Result := PyString_FromString( PAnsiChar(AnsiString(PyObjectAsString(FValue))) ); +end; + +constructor TPythonVarArg.Create( AOwner : TComponent ); +begin + inherited; + Name := 'typeVarArg'; + TypeName := 'VarArg'; + Module := gDBModule; + PyObjectClass := TVarArg; + with DocString do + begin + Add( 'a VarArg object contains a single property Value,' ); + Add( 'which you can read and write in order to change' ); + Add( 'an argument in an Event.' ); + Add( 'if you try to print the VarArg, it will print the Value' ); + Add( 'property.' ); + end; end; {********************************************************************* * Global functions * *********************************************************************} -var - Initialized : Boolean = False; -procedure Initialize( Owner : TEngineClient ); +procedure CreateComponents( AOwner : TComponent ); begin - if pyDB.Initialized then + if Assigned(gDBModule) then Exit; - pyDB.Initialized := True; + gDBModule := TPythonDB.Create(AOwner); + gDatasetType := TPythonDataset.Create(AOwner); + gFieldType := TPythonField.Create(AOwner); + gVarArgType := TPythonVarArg.Create(AOwner); end; procedure SetEvent( var EventSlot : PPyObject; Event : PPyObject; const EventName, ClassName : String ); @@ -2708,5 +2888,26 @@ procedure ExecuteEvent( Event : PPyObject; Args : array of Const ); end; end; +function NewDataset( aDataset : TDataset; IsOwner : Boolean ) : PPyObject; +begin + if not Assigned(gDBModule) then + begin + CreateComponents(nil); + gDBModule.Engine := GetPythonEngine; + gDBModule.Initialize; + gDatasetType.Engine := GetPythonEngine; + gDatasetType.Initialize; + gFieldType.Engine := GetPythonEngine; + gFieldType.Initialize; + gVarArgType.Engine := GetPythonEngine; + gVarArgType.Initialize; + end; + Result := gDatasetType.CreateInstance; + with PythonToDelphi(Result) as TPyDataset do + begin + FSharedObject.Owner := IsOwner; + FSharedObject.Data := aDataset; + end; +end; end. diff --git a/PythonForDelphi/Demos/Demo10/pyDBTables.pas b/PythonForDelphi/Demos/Demo10/pyDBTables.pas index d5fd9a41..6a709bf3 100644 --- a/PythonForDelphi/Demos/Demo10/pyDBTables.pas +++ b/PythonForDelphi/Demos/Demo10/pyDBTables.pas @@ -1,15 +1,40 @@ +{$I Definition.Inc} + unit pyDBTables; -interface +{------------------------------------------------------------------------------- + $Header: /P4D/PythonForDelphi/Components/Sources/VCL/pyDBTables.pas 1 03-04-09 19:25 Morgan $ + Copyright © MMM Inc. 2003 - All Rights Reserved. + ------------------------------------------------------------------------------ + Author: Morgan Martinet -{$I Definition.Inc} + Description: + + ------------------------------------------------------------------------------ + $Log: /P4D/PythonForDelphi/Components/Sources/VCL/pyDBTables.pas $ + * + * 1 03-04-09 19:25 Morgan + * initial check-in + +-------------------------------------------------------------------------------} + +interface uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Variants, PythonEngine, StdCtrls, ExtCtrls, ComCtrls, DB, DBTables, pyDB; type +{********************************************************************* + * DBTables module * + *********************************************************************} + TPythonDBTables = class(TPythonModule) + public + constructor Create( AOwner : TComponent ); override; + procedure Initialize; override; + end; + {********************************************************************* * Interface of TBDEDataset * *********************************************************************} @@ -43,7 +68,6 @@ TPyBDEDataset = class(TPyDataset) procedure OnUpdateRecord( Dataset : TDataset; UpdateKind: TUpdateKind; var ua:TUpdateAction); end; - {********************************************************************* * Interface of TDBDataset * *********************************************************************} @@ -72,7 +96,6 @@ TPyDBDataset = class(TPyBDEDataset) {********************************************************************* * Interface of TTable * *********************************************************************} - TPyTable = class(TPyDBDataset) // Constructors & Destructors @@ -126,6 +149,11 @@ TPyTable = class(TPyDBDataset) function DoFindNearest( args : PPyObject ) : PPyObject; cdecl; end; + TPythonTable = class( TPythonType) + public + constructor Create( AOwner : TComponent ); override; + end; + {********************************************************************* * Interface of TQuery * *********************************************************************} @@ -155,18 +183,66 @@ TPyQuery = class(TPyDBDataset) function DoExecSQL( args : PPyObject ) : PPyObject; cdecl; end; + TPythonQuery = class( TPythonType) + public + constructor Create( AOwner : TComponent ); override; + end; + {********************************************************************* * Global functions * *********************************************************************} - procedure Initialize( Owner : TEngineClient ); + procedure CreateComponents( AOwner : TComponent ); {******************************************************************** * Global variables * *********************************************************************} -//var +var + gDBTablesModule : TPythonModule; + gTableType : TPythonType; + gQueryType : TPythonType; implementation +{********************************************************************* + * DBTables module * + *********************************************************************} + +constructor TPythonDBTables.Create( AOwner : TComponent ); +begin + inherited; + ModuleName := 'DBTables'; + Name := 'modDBTables'; + with DocString do + begin + Add( 'This module contains several Object Types that' ); + Add( 'will let you work with the Borland BDE and access' ); + Add( 'a database.' ); + Add( '' ); + Add( 'CreateTTable() -> creates a TTable instance' ); + Add( 'CreateTQuery() -> creates a TQuery instance' ); + end; +end; + +procedure TPythonDBTables.Initialize; +begin + inherited; + // Values for type TLockType + SetVarFromVariant( 'ltReadLock', 0 ); + SetVarFromVariant( 'ltWriteLock', 1 ); + // Values for type TIndexOptions + SetVarFromVariant( 'ixPrimary', 0 ); + SetVarFromVariant( 'ixUnique', 1 ); + SetVarFromVariant( 'ixDescending', 2 ); + SetVarFromVariant( 'ixCaseInsensitive', 3 ); + SetVarFromVariant( 'ixExpression', 4 ); + // Values for type TUpdateAction + SetVarFromVariant( 'uaFail', 0 ); + SetVarFromVariant( 'uaAbort', 1 ); + SetVarFromVariant( 'uaSkip', 2 ); + SetVarFromVariant( 'uaRetry', 3 ); + SetVarFromVariant( 'uaApplied', 4 ); +end; + {********************************************************************* * Implementation of TBDEDataset * *********************************************************************} @@ -202,9 +278,9 @@ function TPyBDEDataset.GetAttr(key : PAnsiChar) : PPyObject; Exit; end; try - if CompareText( key, 'OnUpdateError' ) = 0 then + if CompareText( string(key), 'OnUpdateError' ) = 0 then Result := ReturnEvent( FOnUpdateError ) - else if CompareText( key, 'OnUpdateRecord' ) = 0 then + else if CompareText( string(key), 'OnUpdateRecord' ) = 0 then Result := ReturnEvent( FOnUpdateRecord ) else Result := inherited GetAttr(key); @@ -226,7 +302,7 @@ function TPyBDEDataset.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; if not CheckDataset then Exit; try - if CompareText( key, 'OnUpdateError' ) = 0 then + if CompareText( string(key), 'OnUpdateError' ) = 0 then begin SetEvent( FOnUpdateError, Value, 'OnUpdateError', 'TField' ); if Assigned(FOnUpdateError) then @@ -235,7 +311,7 @@ function TPyBDEDataset.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; BDEDataset.OnUpdateError := nil; Result := 0; end - else if CompareText( key, 'OnUpdateRecord' ) = 0 then + else if CompareText( string(key), 'OnUpdateRecord' ) = 0 then begin SetEvent( FOnUpdateRecord, Value, 'OnUpdateRecord', 'TField' ); if Assigned(FOnUpdateRecord) then @@ -293,7 +369,6 @@ procedure TPyBDEDataset.AppendProperties( List : PPyObject ); // Events //////////////// - procedure TPyBDEDataset.OnUpdateError( Dataset : TDataset; E: EDatabaseError; UpdateKind: TUpdateKind; var ua:TUpdateAction); var v : PPyObject; @@ -358,9 +433,9 @@ function TPyDBDataset.GetAttr(key : PAnsiChar) : PPyObject; Exit; end; try - if CompareText( key, 'DatabaseName' ) = 0 then + if CompareText( string(key), 'DatabaseName' ) = 0 then Result := VariantAsPyObject( DBDataset.DatabaseName ) - else if CompareText( key, 'SessionName' ) = 0 then + else if CompareText( string(key), 'SessionName' ) = 0 then Result := VariantAsPyObject( DBDataset.SessionName ) else Result := inherited GetAttr(key); @@ -382,12 +457,12 @@ function TPyDBDataset.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; if not CheckDataset then Exit; try - if CompareText( key, 'DatabaseName' ) = 0 then + if CompareText( string(key), 'DatabaseName' ) = 0 then begin DBDataset.DatabaseName := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'SessionName' ) = 0 then + else if CompareText( string(key), 'SessionName' ) = 0 then begin DBDataset.SessionName := PyObjectAsVariant( value ); Result := 0; @@ -467,15 +542,15 @@ function TPyTable.GetAttr(key : PAnsiChar) : PPyObject; Exit; end; try - if CompareText( key, 'IndexName' ) = 0 then + if CompareText( string(key), 'IndexName' ) = 0 then Result := VariantAsPyObject( Table.IndexName ) - else if CompareText( key, 'ReadOnly' ) = 0 then + else if CompareText( string(key), 'ReadOnly' ) = 0 then Result := VariantAsPyObject( Table.ReadOnly ) - else if CompareText( key, 'TableLevel' ) = 0 then + else if CompareText( string(key), 'TableLevel' ) = 0 then Result := VariantAsPyObject( Table.TableLevel ) - else if CompareText( key, 'TableName' ) = 0 then + else if CompareText( string(key), 'TableName' ) = 0 then Result := VariantAsPyObject( Table.TableName ) - else if CompareText( key, 'TableType' ) = 0 then + else if CompareText( string(key), 'TableType' ) = 0 then Result := VariantAsPyObject( Integer(Table.TableType) ) else Result := inherited GetAttr(key); @@ -497,27 +572,27 @@ function TPyTable.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; if not CheckDataset then Exit; try - if CompareText( key, 'IndexName' ) = 0 then + if CompareText( string(key), 'IndexName' ) = 0 then begin Table.IndexName := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'ReadOnly' ) = 0 then + else if CompareText( string(key), 'ReadOnly' ) = 0 then begin Table.ReadOnly := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'TableLevel' ) = 0 then + else if CompareText( string(key), 'TableLevel' ) = 0 then begin Table.TableLevel := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'TableName' ) = 0 then + else if CompareText( string(key), 'TableName' ) = 0 then begin Table.TableName := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'TableType' ) = 0 then + else if CompareText( string(key), 'TableType' ) = 0 then begin Table.TableType := TTableType(PyObjectAsVariant( value )); Result := 0; @@ -1018,7 +1093,7 @@ function TPyTable.DoAddIndex( args : PPyObject ) : PPyObject; cdecl; if CheckDataset and (PyArg_ParseTuple( args, 'ssO:TTable.AddIndex',@aName, @fields, @options ) <> 0) then begin // Do action - AddIndex( aName, fields, options ); + AddIndex( string(aName), string(fields), options ); // Finally, we return nothing Result := ReturnNone; end @@ -1046,7 +1121,7 @@ function TPyTable.DoCloseIndexFile( args : PPyObject ) : PPyObject; cdecl; if CheckDataset and (PyArg_ParseTuple( args, 's:TTable.CloseIndexFile',@aName ) <> 0) then begin // Do action - Table.CloseIndexFile( aName ); + Table.CloseIndexFile( string(aName) ); // Finally, we return nothing Result := ReturnNone; end @@ -1100,7 +1175,7 @@ function TPyTable.DoDeleteIndex( args : PPyObject ) : PPyObject; cdecl; if CheckDataset and (PyArg_ParseTuple( args, 's:TTable.DeleteIndex',@aName ) <> 0) then begin // Do action - Table.DeleteIndex( aName ); + Table.DeleteIndex( string(aName) ); // Finally, we return nothing Result := ReturnNone; end @@ -1204,7 +1279,7 @@ function TPyTable.DoOpenIndexFile( args : PPyObject ) : PPyObject; cdecl; if CheckDataset and (PyArg_ParseTuple( args, 's:TTable.OpenIndexFile',@aName ) <> 0) then begin // Do action - Table.OpenIndexFile( aName ); + Table.OpenIndexFile( string(aName) ); // Finally, we return nothing Result := ReturnNone; end @@ -1232,7 +1307,7 @@ function TPyTable.DoRenameTable( args : PPyObject ) : PPyObject; cdecl; if CheckDataset and (PyArg_ParseTuple( args, 's:TTable.RenameTable',@newName ) <> 0) then begin // Do action - Table.RenameTable( newName ); + Table.RenameTable( string(newName) ); // Finally, we return nothing Result := ReturnNone; end @@ -1380,6 +1455,21 @@ function TPyTable.DoFindNearest( args : PPyObject ) : PPyObject; cdecl; end; end; +constructor TPythonTable.Create( AOwner : TComponent ); +begin + inherited; + Name := 'typeTable'; + TypeName := 'TTable'; + Services.Sequence := [ssLength, ssItem]; + Module := gDBTablesModule; + TypeFlags := TypeFlags + [tpfBaseType]; + PyObjectClass := TPyTable; + with DocString do + begin + Add( 'The TTable type implements the Delphi TTable VCL Object inside Python.' ); + Add( 'The properties and methods are the same as in Delphi.' ); + end; +end; {********************************************************************* * Implementation of TQuery * @@ -1407,23 +1497,23 @@ function TPyQuery.GetAttr(key : PAnsiChar) : PPyObject; Exit; end; try - if CompareText( key, 'Constrained' ) = 0 then + if CompareText( string(key), 'Constrained' ) = 0 then Result := VariantAsPyObject( Query.Constrained ) - else if CompareText( key, 'Local' ) = 0 then + else if CompareText( string(key), 'Local' ) = 0 then Result := VariantAsPyObject( Query.Local) - else if CompareText( key, 'ParamCheck' ) = 0 then + else if CompareText( string(key), 'ParamCheck' ) = 0 then Result := VariantAsPyObject( Query.ParamCheck ) - else if CompareText( key, 'ParamCount' ) = 0 then + else if CompareText( string(key), 'ParamCount' ) = 0 then Result := VariantAsPyObject( Query.ParamCount ) - else if CompareText( key, 'Prepared' ) = 0 then + else if CompareText( string(key), 'Prepared' ) = 0 then Result := VariantAsPyObject( Query.Prepared ) - else if CompareText( key, 'RequestLive' ) = 0 then + else if CompareText( string(key), 'RequestLive' ) = 0 then Result := VariantAsPyObject( Query.RequestLive ) - else if CompareText( key, 'RowsAffected' ) = 0 then + else if CompareText( string(key), 'RowsAffected' ) = 0 then Result := VariantAsPyObject( Query.RowsAffected ) - else if CompareText( key, 'SQL' ) = 0 then + else if CompareText( string(key), 'SQL' ) = 0 then Result := StringsToPyList( Query.SQL) - else if CompareText( key, 'UniDirectional' ) = 0 then + else if CompareText( string(key), 'UniDirectional' ) = 0 then Result := VariantAsPyObject( Query.UniDirectional ) else Result := inherited GetAttr(key); @@ -1445,44 +1535,44 @@ function TPyQuery.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; if not CheckDataset then Exit; try - if CompareText( key, 'Constrained' ) = 0 then + if CompareText( string(key), 'Constrained' ) = 0 then begin Query.Constrained := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'Local' ) = 0 then + else if CompareText( string(key), 'Local' ) = 0 then begin Result := 0; end - else if CompareText( key, 'ParamCheck' ) = 0 then + else if CompareText( string(key), 'ParamCheck' ) = 0 then begin Query.ParamCheck := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'ParamCount' ) = 0 then + else if CompareText( string(key), 'ParamCount' ) = 0 then begin Result := 0; end - else if CompareText( key, 'Prepared' ) = 0 then + else if CompareText( string(key), 'Prepared' ) = 0 then begin Query.Prepared := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'RequestLive' ) = 0 then + else if CompareText( string(key), 'RequestLive' ) = 0 then begin Query.RequestLive := PyObjectAsVariant( value ); Result := 0; end - else if CompareText( key, 'RowsAffected' ) = 0 then + else if CompareText( string(key), 'RowsAffected' ) = 0 then begin Result := 0; end - else if CompareText( key, 'SQL' ) = 0 then + else if CompareText( string(key), 'SQL' ) = 0 then begin PyListToStrings( value, Query.SQL ); Result := 0; end - else if CompareText( key, 'UniDirectional' ) = 0 then + else if CompareText( string(key), 'UniDirectional' ) = 0 then begin Query.UniDirectional := PyObjectAsVariant( value ); Result := 0; @@ -1622,18 +1712,32 @@ function TPyQuery.DoExecSQL( args : PPyObject ) : PPyObject; end; end; +constructor TPythonQuery.Create( AOwner : TComponent ); +begin + inherited; + Name := 'typeQuery'; + TypeName := 'TQuery'; + Services.Sequence := [ssLength, ssItem]; + Module := gDBTablesModule; + PyObjectClass := TPyQuery; + with DocString do + begin + Add( 'The TQuery type implements the Delphi TQuery VCL Object inside Python.' ); + Add( 'The properties and methods are the same as in Delphi.' ); + end; +end; + {********************************************************************* * Global functions * *********************************************************************} -var - Initialized : Boolean = False; -procedure Initialize( Owner : TEngineClient ); +procedure CreateComponents( AOwner : TComponent ); begin - if pyDBTables.Initialized then + if Assigned(gDBTablesModule) then Exit; - pyDBTables.Initialized := True; + gDBTablesModule := TPythonDBTables.Create(AOwner); + gTableType := TPythonTable.Create(AOwner); + gQueryType := TPythonQuery.Create(AOwner); end; - end. diff --git a/PythonForDelphi/Demos/Demo29/Unit1.dfm b/PythonForDelphi/Demos/Demo29/Unit1.dfm index f557d9f9..8a17a093 100644 --- a/PythonForDelphi/Demos/Demo29/Unit1.dfm +++ b/PythonForDelphi/Demos/Demo29/Unit1.dfm @@ -89,7 +89,7 @@ object Form1: TForm1 AutoUnload = False DllName = 'python27.dll' APIVersion = 1013 - RegVersion = '2.7' + RegVersion = '3.4' UseLastKnownVersion = False IO = PythonGUIInputOutput1 Left = 168 diff --git a/PythonForDelphi/Demos/Demo31/Unit1.pas b/PythonForDelphi/Demos/Demo31/Unit1.pas index bc52f9a7..c8857dd4 100644 --- a/PythonForDelphi/Demos/Demo31/Unit1.pas +++ b/PythonForDelphi/Demos/Demo31/Unit1.pas @@ -13,7 +13,7 @@ interface {$IFDEF LINUX} QForms, QStdCtrls, QControls, QExtCtrls, {$ENDIF} - PythonEngine, PythonGUIInputOutput, WrapDelphi, ActnList, System.Actions; + PythonEngine, PythonGUIInputOutput, WrapDelphi, ActnList; type TForm1 = class(TForm) From eba2a9f9fa0b559dfb7bba190779a17da0b48871 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 24 Oct 2017 04:12:29 +0300 Subject: [PATCH 024/123] Fixed the discovery of 32 bit registered versions >= 3.4 (PEP514) --- .../Components/Sources/Core/PythonEngine.pas | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index c52e0fc7..d47b8418 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -9698,47 +9698,59 @@ function IsPythonVersionRegistered(PythonVersion : string; // The above convension was changed in Python 3.5. Now even for all user // installations the dll is located at the InstallPath. + // Also from version 3.5 onwards 32 bit version have a suffix -32 e.g. "3.6-32" + // See also PEP 514 var key: string; + VersionSuffix: string; MajorVersion : integer; MinorVersion : integer; begin Result := False; InstallPath := ''; AllUserInstall := False; + MajorVersion := StrToInt(PythonVersion[1]); + MinorVersion := StrToInt(PythonVersion[3]); + VersionSuffix := ''; +{$IFDEF CPUX86} + if (MajorVersion > 3) or ((MajorVersion = 3) and (MinorVersion >= 5)) then + VersionSuffix := '-32'; +{$ENDIF} + key := Format('\Software\Python\PythonCore\%s%s\InstallPath', [PythonVersion, VersionSuffix]); + + // First try HKEY_CURRENT_USER as per PEP514 try - key := Format('\Software\Python\PythonCore\%s\InstallPath', [PythonVersion]); with TRegistry.Create(KEY_READ and not KEY_NOTIFY) do try - RootKey := HKEY_LOCAL_MACHINE; - if KeyExists(key) then begin - AllUserInstall := True; + RootKey := HKEY_CURRENT_USER; + if OpenKey(Key, False) then begin + InstallPath := ReadString(''); Result := True; - MajorVersion := StrToInt(PythonVersion[1]); - MinorVersion := StrToInt(PythonVersion[3]); - if (MajorVersion > 3) or ((MajorVersion = 3) and (MinorVersion >= 5)) then - if OpenKey(Key, False) then - InstallPath := ReadString(''); + Exit; end; finally Free; end; except end; - // We do not seem to have an All User Python Installation. - // Check whether we have a current user installation - if not AllUserInstall then + + //Then try for an all user installation + try with TRegistry.Create(KEY_READ and not KEY_NOTIFY) do try - RootKey := HKEY_CURRENT_USER; + RootKey := HKEY_LOCAL_MACHINE; if OpenKey(Key, False) then begin - InstallPath := ReadString(''); + AllUserInstall := True; + if (MajorVersion > 3) or ((MajorVersion = 3) and (MinorVersion >= 5)) then + InstallPath := ReadString(''); Result := True; end; finally Free; end; + except + end; end; {$ENDIF} From 8a58cd90fe9a04bc3094544720a6521cb3130023 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 11 Dec 2017 02:18:24 +0200 Subject: [PATCH 025/123] DispInvoke Variant bug exists in more recent versions of Delphi. --- .../Components/Sources/Core/VarPyth.pas | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index d3eb8ce1..f313d041 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -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; @@ -934,7 +934,7 @@ procedure SetClearVarToEmptyParam(var V: TVarData); {$IFDEF USESYSTEMDISPINVOKE} procedure TPythonVariantType.DispInvoke(Dest: PVarData; const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); -{$IFDEF DELPHIXE2} +{$IFDEF DELPHIXE2_OR_HIGHER} // 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} +{$ENDIF DELPHIXE2_OR_HIGHER} procedure GetNamedParams; var @@ -1056,17 +1056,17 @@ TStringDesc = record if (CallDesc^.CallType = CPropertyGet) and (CallDesc^.ArgCount = 1) then begin NewCallDesc := CallDesc^; NewCallDesc.CallType := CDoMethod; - {$IFDEF DELPHIXE2} + {$IFDEF DELPHIXE2_OR_HIGHER} PatchedDispInvoke(Dest, Source, @NewCallDesc, Params); - {$ELSE DELPHIXE2} + {$ELSE DELPHIXE2_OR_HIGHER} inherited DispInvoke(Dest, Source, @NewCallDesc, Params); - {$ENDIF DELPHIXE2} + {$ENDIF DELPHIXE2_OR_HIGHER} end else - {$IFDEF DELPHIXE2} + {$IFDEF DELPHIXE2_OR_HIGHER} PatchedDispInvoke(Dest, Source, CallDesc, Params); - {$ELSE DELPHIXE2} + {$ELSE DELPHIXE2_OR_HIGHER} inherited; - {$ENDIF DELPHIXE2} + {$ENDIF DELPHIXE2_OR_HIGHER} finally if CallDesc^.NamedArgCount > 0 then SetLength(fNamedParams, 0); end; From 922cbbe51a4376493a6a9af112c52e1d620afc65 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 13 Dec 2017 03:12:47 +0200 Subject: [PATCH 026/123] Fixed CheckRegistry --- .../Components/Sources/Core/PythonEngine.pas | 55 +++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index d47b8418..7516faa8 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -4899,37 +4899,48 @@ procedure TPythonEngine.Notification( AComponent: TComponent; procedure TPythonEngine.CheckRegistry; {$IFDEF MSWINDOWS} var - key : String; - path : String; + key : string; + Path : string; + NewPath : string; + MajorVersion : integer; + MinorVersion : integer; + VersionSuffix: string; {$ENDIF} begin {$IFDEF MSWINDOWS} + if Assigned( FOnPathInitialization ) then try - with TRegistry.Create(KEY_READ and not KEY_NOTIFY) do + with TRegistry.Create(KEY_ALL_ACCESS and not KEY_NOTIFY) do try - //Access := KEY_READ; // works only with Delphi5 or greater + 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]); + 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 - // 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; + WriteString( '', NewPath ); end; + finally + CloseKey; + end; finally Free; end; From 508b0190781a66e587bd84c5c1683388ad3d53da Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 20 Dec 2017 00:24:49 +0200 Subject: [PATCH 027/123] Delphi Tokyo complains about the lack of the [REF} annotation in DispInvoke --- .../Components/Sources/Core/VarPyth.pas | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index f313d041..2b74265b 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -182,8 +182,13 @@ 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; + {$IFDEF DELPHIXE7_OR_HIGHER} + procedure DispInvoke(Dest: PVarData; + [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); + {$ELSE} + procedure DispInvoke(Dest: PVarData; + const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); + {$ENDIF} end; var @@ -931,9 +936,14 @@ procedure SetClearVarToEmptyParam(var V: TVarData); CPropertyGet = $02; CPropertySet = $04; -{$IFDEF USESYSTEMDISPINVOKE} +{$IFDEF DELPHIXE7_OR_HIGHER} procedure TPythonVariantType.DispInvoke(Dest: PVarData; - const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); + [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); +{$ELSE} +procedure TPythonVariantType.DispInvoke(Dest: PVarData; + const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); +{$ENDIF} +{$IFDEF USESYSTEMDISPINVOKE} {$IFDEF DELPHIXE2_OR_HIGHER} // Modified to correct memory leak QC102387 procedure PatchedDispInvoke(Dest: PVarData; @@ -1073,8 +1083,6 @@ TStringDesc = record end; {$ELSE USESYSTEMDISPINVOKE} -procedure TPythonVariantType.DispInvoke(Dest: PVarData; - const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); begin DoDispInvoke(Dest, Source, CallDesc, Params); end; From c7f6956ad5dc1c0185ecd21d8884c5a4a8433d13 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 20 Dec 2017 00:30:27 +0200 Subject: [PATCH 028/123] Correction in previous commit. --- PythonForDelphi/Components/Sources/Core/VarPyth.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index 2b74265b..4fc5fac2 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -184,10 +184,10 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) const Value: TVarData): Boolean; override; {$IFDEF DELPHIXE7_OR_HIGHER} procedure DispInvoke(Dest: PVarData; - [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); + [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; {$ELSE} procedure DispInvoke(Dest: PVarData; - const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); + const Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; {$ENDIF} end; From 3240a6ddfc86e4859aeb8c1309fad86ce4b8395e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 20 Dec 2017 07:06:28 +0200 Subject: [PATCH 029/123] Minor change to avoid compiler hints. --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 7516faa8..64910fb1 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -4902,8 +4902,10 @@ procedure TPythonEngine.CheckRegistry; key : string; Path : string; NewPath : string; +{$IFDEF CPUX86} MajorVersion : integer; MinorVersion : integer; +{$ENDIF} VersionSuffix: string; {$ENDIF} begin @@ -4912,10 +4914,10 @@ procedure TPythonEngine.CheckRegistry; try with TRegistry.Create(KEY_ALL_ACCESS and not KEY_NOTIFY) do try - MajorVersion := StrToInt(RegVersion[1]); - MinorVersion := StrToInt(RegVersion[3]); VersionSuffix := ''; {$IFDEF CPUX86} + MajorVersion := StrToInt(RegVersion[1]); + MinorVersion := StrToInt(RegVersion[3]); if (MajorVersion > 3) or ((MajorVersion = 3) and (MinorVersion >= 5)) then VersionSuffix := '-32'; {$ENDIF} From 9c2bd510e0acc9c883b7bf073728028d116ad26d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 21 Dec 2017 13:14:53 +0200 Subject: [PATCH 030/123] Issue #42 --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 64910fb1..a06d22f5 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -193,7 +193,7 @@ 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; From e37caaf8a2a3fcfb509aee73cc8225fc4669ccc7 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 24 Dec 2017 02:44:22 +0200 Subject: [PATCH 031/123] Fix: PyUnicode_AsWideString would return wrong length when used with Unicode strings containing characters outside BMP. --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index a06d22f5..8ff50429 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -1901,6 +1901,7 @@ TPythonInterface=class(TDynamicDll) PyUnicode_Decode:function (const s:PAnsiChar; size: NativeInt; const encoding : PAnsiChar; const errors: PAnsiChar):PPyObject; cdecl; PyUnicode_AsEncodedString:function (unicode:PPyObject; const encoding:PAnsiChar; const errors:PAnsiChar):PPyObject; cdecl; PyUnicode_FromOrdinal:function (ordinal:integer):PPyObject; cdecl; + PyUnicode_GetSize:function (unicode:PPyObject):NativeInt; cdecl; PyWeakref_GetObject: function ( ref : PPyObject) : PPyObject; cdecl; PyWeakref_NewProxy: function ( ob, callback : PPyObject) : PPyObject; cdecl; PyWeakref_NewRef: function ( ob, callback : PPyObject) : PPyObject; cdecl; @@ -3981,6 +3982,7 @@ procedure TPythonInterface.MapDll; PyUnicode_Decode :=Import(AnsiString(Format('PyUnicode%s_Decode',[GetUnicodeTypeSuffix]))); PyUnicode_AsEncodedString :=Import(AnsiString(Format('PyUnicode%s_AsEncodedString',[GetUnicodeTypeSuffix]))); PyUnicode_FromOrdinal :=Import(AnsiString(Format('PyUnicode%s_FromOrdinal',[GetUnicodeTypeSuffix]))); + PyUnicode_GetSize :=Import(AnsiString(Format('PyUnicode%s_GetSize',[GetUnicodeTypeSuffix]))); PyWeakref_GetObject :=Import('PyWeakref_GetObject'); PyWeakref_NewProxy :=Import('PyWeakref_NewProxy'); PyWeakref_NewRef :=Import('PyWeakref_NewRef'); @@ -6272,7 +6274,7 @@ function TPythonEngine.PyUnicode_AsWideString( obj : PPyObject ) : UnicodeString begin if PyUnicode_Check(obj) then begin - _size := PySequence_Length(obj); + _size := PyUnicode_GetSize(obj); if _size > 0 then begin {$IFDEF LINUX} From db25e5110b5aa8a2e5ce0848602b783286b715ba Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 18 Jan 2018 06:11:37 +0200 Subject: [PATCH 032/123] Merged back from https://github.com/hartmutdavid/python4delphi FireDAC wrapper and demo --- PythonForDelphi/Components/PythonVCL_D.dpk | 54 + PythonForDelphi/Components/Python_D.dpk | 58 + PythonForDelphi/Components/Python_d4.dof | 78 - PythonForDelphi/Components/Python_d5.dof | 85 - PythonForDelphi/Components/Python_d6.dof | 94 - .../Components/Sources/Core/PythonEngine.pas | 34 +- .../Components/Sources/Core/VarPyth.pas | 2 +- .../Components/Sources/VCL/pyDB.pas | 4 +- .../Components/Sources/VCL/pyDBFireDac.pas | 2788 +++++++++++++++++ PythonForDelphi/Demos/Demo10_FireDAC/Demo.ini | 26 + .../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 -> 9292 bytes .../Demos/Demo10_FireDAC/fmMain.pas | 489 +++ PythonForDelphi/Demos/readme.txt | 12 +- 23 files changed, 4294 insertions(+), 274 deletions(-) create mode 100644 PythonForDelphi/Components/PythonVCL_D.dpk create mode 100644 PythonForDelphi/Components/Python_D.dpk delete mode 100644 PythonForDelphi/Components/Python_d4.dof delete mode 100644 PythonForDelphi/Components/Python_d5.dof delete mode 100644 PythonForDelphi/Components/Python_d6.dof create mode 100644 PythonForDelphi/Components/Sources/VCL/pyDBFireDac.pas create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo.ini 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 diff --git a/PythonForDelphi/Components/PythonVCL_D.dpk b/PythonForDelphi/Components/PythonVCL_D.dpk new file mode 100644 index 00000000..08cebe6e --- /dev/null +++ b/PythonForDelphi/Components/PythonVCL_D.dpk @@ -0,0 +1,54 @@ +package PythonVCL_D; + +{$R *.res} +{$R 'Sources\VCL\PythonDatabase.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'VCL Components for Python'} +{$IMPLICITBUILD OFF} +{$IFDEF VER180}{$LIBSUFFIX '10'} {$ENDIF} +{$IFDEF VER200}{$LIBSUFFIX '12'} {$ENDIF} +{$IFDEF VER210}{$LIBSUFFIX '14'} {$ENDIF} +{$IFDEF VER220}{$LIBSUFFIX '15'} {$ENDIF} +{$IFDEF VER230}{$LIBSUFFIX '16'} {$ENDIF} +{$IFDEF VER240}{$LIBSUFFIX '17'} {$ENDIF} +{$IFDEF VER250}{$LIBSUFFIX '18'} {$ENDIF} +{$IFDEF VER260}{$LIBSUFFIX '19'} {$ENDIF} +{$IFDEF VER270}{$LIBSUFFIX '20'} {$ENDIF} +{$IFDEF VER280}{$LIBSUFFIX '21'} {$ENDIF} +{$IFDEF VER200}{$LIBSUFFIX '22'} {$ENDIF} +{$IFDEF VER300}{$LIBSUFFIX '23'} {$ENDIF} +{$IFDEF VER310}{$LIBSUFFIX '24'} {$ENDIF} +{$IFDEF VER320}{$LIBSUFFIX '25'} {$ENDIF} +{$IFDEF VER330}{$LIBSUFFIX '26'} {$ENDIF} + +requires + rtl, + vcl, + dbrtl, + Python_D; + +contains + PythonDatabase in 'Sources\VCL\PythonDatabase.pas', + pyDB in 'Sources\VCL\pyDB.pas', + pyDBTables in 'Sources\VCL\pyDBTables.pas'; +end. diff --git a/PythonForDelphi/Components/Python_D.dpk b/PythonForDelphi/Components/Python_D.dpk new file mode 100644 index 00000000..7b453740 --- /dev/null +++ b/PythonForDelphi/Components/Python_D.dpk @@ -0,0 +1,58 @@ +package Python_D; + +{$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} +{$IFDEF VER180}{$LIBSUFFIX '10'} {$ENDIF} +{$IFDEF VER200}{$LIBSUFFIX '12'} {$ENDIF} +{$IFDEF VER210}{$LIBSUFFIX '14'} {$ENDIF} +{$IFDEF VER220}{$LIBSUFFIX '15'} {$ENDIF} +{$IFDEF VER230}{$LIBSUFFIX '16'} {$ENDIF} +{$IFDEF VER240}{$LIBSUFFIX '17'} {$ENDIF} +{$IFDEF VER250}{$LIBSUFFIX '18'} {$ENDIF} +{$IFDEF VER260}{$LIBSUFFIX '19'} {$ENDIF} +{$IFDEF VER270}{$LIBSUFFIX '20'} {$ENDIF} +{$IFDEF VER280}{$LIBSUFFIX '21'} {$ENDIF} +{$IFDEF VER200}{$LIBSUFFIX '22'} {$ENDIF} +{$IFDEF VER300}{$LIBSUFFIX '23'} {$ENDIF} +{$IFDEF VER310}{$LIBSUFFIX '24'} {$ENDIF} +{$IFDEF VER320}{$LIBSUFFIX '25'} {$ENDIF} +{$IFDEF VER330}{$LIBSUFFIX '26'} {$ENDIF} + +requires + DesignIDE, + rtl, + vcl; + +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'; + +end. diff --git a/PythonForDelphi/Components/Python_d4.dof b/PythonForDelphi/Components/Python_d4.dof deleted file mode 100644 index 8ed55064..00000000 --- a/PythonForDelphi/Components/Python_d4.dof +++ /dev/null @@ -1,78 +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=Components for Python -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages= -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -[Version Info] -IncludeVerInfo=1 -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/Components/Python_d5.dof b/PythonForDelphi/Components/Python_d5.dof deleted file mode 100644 index dca18cf5..00000000 --- a/PythonForDelphi/Components/Python_d5.dof +++ /dev/null @@ -1,85 +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=Components for Python -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;MyKardexComponents;MultiLinePalette -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -[Version Info] -IncludeVerInfo=1 -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:\WINNT\System32\ip50_d5.bpl=InfoPower 2000 for Delphi 5 -$(DELPHI)\Bin\dcltee50.bpl=TeeChart 5.0 Components -$(DELPHI)\Bin\dcltqr50.bpl=TeeChart 5.0 for QuickReport Components Design Package -$(DELPHI)\Bin\dcldss50.bpl=Borland Decision Cube Components -$(DELPHI)\Bin\dclite50.bpl=Borland Integrated Translation Environment -$(DELPHI)\Bin\dclOffice2k50.bpl=Microsoft Office 2000 Automation Components diff --git a/PythonForDelphi/Components/Python_d6.dof b/PythonForDelphi/Components/Python_d6.dof deleted file mode 100644 index 670bffd4..00000000 --- a/PythonForDelphi/Components/Python_d6.dof +++ /dev/null @@ -1,94 +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=Components for Python -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath= -Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;MyKardexComponents;MultiLinePalette -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang= -RootDir= -[Version Info] -IncludeVerInfo=1 -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:\WINNT\System32\ip50_d5.bpl=InfoPower 2000 for Delphi 5 -c:\program files\borland\delphi6\Bin\dcltee50.bpl=TeeChart 5.0 Components -c:\program files\borland\delphi6\Bin\dcltqr50.bpl=TeeChart 5.0 for QuickReport Components Design Package -c:\program files\borland\delphi6\Bin\dcldss50.bpl=Borland Decision Cube Components -c:\program files\borland\delphi6\Bin\dclite50.bpl=Borland Integrated Translation Environment -c:\program files\borland\delphi6\Bin\dclOffice2k50.bpl=Microsoft Office 2000 Automation Components diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 8ff50429..7f17c725 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -31,7 +31,7 @@ (* Stefan Hoffmeister (Stefan.Hoffmeister@Econos.de) *) (* Michiel du Toit (micdutoit@hsbfn.com) - Lazarus Port *) (* Chris Nicolai (nicolaitanes@gmail.com) *) -(* Kiriakos Vlahos (kvlahos@london.edu) *) +(* Kiriakos Vlahos (pyscripter@gmail.com) *) (* Andrey Gruzdev (andrey.gruzdev@gmail.com) *) (**************************************************************************) (* This source code is distributed with no WARRANTY, for no reason or use.*) @@ -196,9 +196,9 @@ interface {$IFDEF PYTHON37} COMPILED_FOR_PYTHON_VERSION_INDEX = 13; {$ENDIF} - PYT_METHOD_BUFFER_INCREASE = 10; - PYT_MEMBER_BUFFER_INCREASE = 10; - PYT_GETSET_BUFFER_INCREASE = 10; + PYT_METHOD_BUFFER_INCREASE = 100; + PYT_MEMBER_BUFFER_INCREASE = 100; + PYT_GETSET_BUFFER_INCREASE = 100; METH_VARARGS = $0001; METH_KEYWORDS = $0002; @@ -2634,6 +2634,7 @@ TPythonModule = class(TMethodsContainer) procedure SetVar( const varName : AnsiString; value : PPyObject ); function GetVar( const varName : AnsiString ) : PPyObject; procedure DeleteVar( const varName : AnsiString ); + procedure ClearVars; procedure SetVarFromVariant( const varName : AnsiString; const value : Variant ); function GetVarAsVariant( const varName: AnsiString ) : Variant; @@ -4616,13 +4617,17 @@ 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; + 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 @@ -7586,6 +7591,17 @@ 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; +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; + 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 4fc5fac2..3490ce51 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -2197,7 +2197,7 @@ function TPythonData.GetAsAnsiString: AnsiString; if Assigned(PyObject) and GetPythonEngine.PyString_CheckExact(PyObject) then Result := GetPythonEngine.PyString_AsString(PyObject) else - result := GetAsString; + Result := AnsiString(GetAsString); end; function TPythonData.GetAsString: String; diff --git a/PythonForDelphi/Components/Sources/VCL/pyDB.pas b/PythonForDelphi/Components/Sources/VCL/pyDB.pas index f64604c7..00c17cf3 100644 --- a/PythonForDelphi/Components/Sources/VCL/pyDB.pas +++ b/PythonForDelphi/Components/Sources/VCL/pyDB.pas @@ -180,8 +180,8 @@ TPyDataset = class(TCommon) function Repr : PPyObject; override; // Sequence services - function SqLength : Integer; override; - function SqItem( idx : Integer ) : PPyObject; override; + function SqLength : NativeInt; override; + function SqItem( idx : NativeInt ) : PPyObject; override; // Class methods class procedure RegisterMethods( PythonType : TPythonType ); override; diff --git a/PythonForDelphi/Components/Sources/VCL/pyDBFireDac.pas b/PythonForDelphi/Components/Sources/VCL/pyDBFireDac.pas new file mode 100644 index 00000000..5463e0ea --- /dev/null +++ b/PythonForDelphi/Components/Sources/VCL/pyDBFireDac.pas @@ -0,0 +1,2788 @@ +{$REGION 'Licence'} +{ +Very important: We need text buffer for AnsiString's +==============================================================================} +{$ENDREGION} +unit pyDBFireDac; + +interface + +uses + Classes, SysUtils, Variants, PythonEngine, WrapDelphi, WrapDelphiClasses, + Windows, System.AnsiStrings, System.Rtti, DB, + 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.Stan.ExprFuncs; + +type + +TPyDBDataset = class; + +TCallBackSplit = record + method: Pointer; + self: TObject; +end; + +TPyDBSharedObject = class +protected + FRefCount : Integer; + FData : TObject; + FOwner : Boolean; + procedure DoDecRef; + procedure SetData( value : TObject ); +public + constructor Create; + constructor CreateWith( value : TObject; isOwner : Boolean ); + destructor Destroy; override; + procedure IncRef; + procedure DecRef; + procedure FreeData; + property Data: TObject read FData write SetData; + property Owner: Boolean read FOwner write FOwner; +end; + +TPyDBCommon = class(TPyObject) + function GetProperties : PPyObject; + procedure AppendProperties( List : PPyObject ); virtual; + procedure AppendProp( List : PPyObject; const prop : String ); + function GetAttr(key : PAnsiChar) : PPyObject; override; + procedure RaiseDBError( E : Exception ); + function EventBelongsToObject( Event : TCallbackSplit ) : Boolean; +end; + +TPyDBField = class(TPyDBCommon) +private + m_arAnsiTextBuf: TArray; +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/Demo10_FireDAC/Demo.ini b/PythonForDelphi/Demos/Demo10_FireDAC/Demo.ini new file mode 100644 index 00000000..a815e5b7 --- /dev/null +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Demo.ini @@ -0,0 +1,26 @@ +[MSSQL_DB] +BaseDriverID=MSSQL +DriverID=MSSQL_2008 +ODBCDriver=SQL Server Native Client 11.0 +Server=XXX\YYY +Database=XXX +OSAuthent=No +User_Name=XXX +Password=XXX +MetaDefCatalog=XX +MetaDefSchema=XXX +ExtendedMetadata=True +VariantFormat=Binary +Encrypt=No +MARS=Yes + +[Ora_DB] +DriverID=OraXE +Database=localhost:1521/XE +User_Name=XXX +Password=YYY +CharacterSet=UTF8 + +[SQLite_DB] +DriverID=SQLite +Database=Demo.s3db diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dpr b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dpr new file mode 100644 index 00000000..4ecb4de1 --- /dev/null +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dpr @@ -0,0 +1,17 @@ +program Demo10; + +uses + Forms, + fmMain in 'fmMain.pas' {Main}, + PythonEngine in '..\..\Components\Sources\Core\PythonEngine.pas', + WrapDelphiClasses in '..\..\Components\Sources\Core\WrapDelphiClasses.pas', + pyDBFireDac in '..\..\Components\Sources\FireDAC\pyDBFireDac.pas', + WrapDelphi in '..\..\Components\Sources\Core\WrapDelphi.pas'; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TMain, Main); + Application.Run; +end. diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dproj b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dproj new file mode 100644 index 00000000..f51407e4 --- /dev/null +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dproj @@ -0,0 +1,583 @@ + + + {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..5fdd6a38 --- /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..8c8f0be2 --- /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..25c31409 --- /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..755d7d7f --- /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..20790300 --- /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..d01353423803c9fff5d06021c3436d55ffc80f17 GIT binary patch literal 9292 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 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..96641722 --- /dev/null +++ b/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.pas @@ -0,0 +1,489 @@ +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, + SynEditCodeFolding; + +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/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 From 5ff62d9e37557a1a7be52711082f280e1a2935e6 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 18 Jan 2018 14:41:33 +0200 Subject: [PATCH 033/123] Bug TPythonType.ReallocMethods. No need to increase size of PYT_METHOD_BUFFER_INCREASE etc. --- .../Components/Sources/Core/PythonEngine.pas | 7 +++---- PythonForDelphi/Demos/Demo10_FireDAC/Demo.s3db | Bin 0 -> 90112 bytes 2 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo.s3db diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 7f17c725..cc78aa0c 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -196,9 +196,9 @@ interface {$IFDEF PYTHON37} COMPILED_FOR_PYTHON_VERSION_INDEX = 13; {$ENDIF} - PYT_METHOD_BUFFER_INCREASE = 100; - PYT_MEMBER_BUFFER_INCREASE = 100; - PYT_GETSET_BUFFER_INCREASE = 100; + PYT_METHOD_BUFFER_INCREASE = 10; + PYT_MEMBER_BUFFER_INCREASE = 10; + PYT_GETSET_BUFFER_INCREASE = 10; METH_VARARGS = $0001; METH_KEYWORDS = $0002; @@ -8260,7 +8260,6 @@ procedure TPythonType.ReallocMembers; procedure TPythonType.ReallocMethods; begin inherited; -exit; if tpfBaseType in TypeFlags then FType.tp_methods := MethodsData; end; diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo.s3db b/PythonForDelphi/Demos/Demo10_FireDAC/Demo.s3db new file mode 100644 index 0000000000000000000000000000000000000000..1108b97775135eeeee0476db9edb09de10712ab4 GIT binary patch literal 90112 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�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�AZLM`1^y8&fY-U~AYc9f-i=qd>>#a9*g;|?*g+>L9bh-xcsVH@ zSjoZ9fflsvfJ8d``NEy;XS84k{3>bf&rtGS_B;jm?&Ls=O}4k35-(?u*?0q`UQR1> zwuiGJY!9t?*&bTjusvdd%i+9;{eZ(a;W=K%Me9kzve)4pVb5V;EGe2v2um~`evBzs79 zl01c^7nL@!$2oi(<2Fz$;_T}f7iW7pT!u;UUXooTmyrx&ax=RY1I^1x!kXRTY+^5P zc!a|bIo!?xm>g8O81#Ry3Q<-#*a)?o5{_9Tb#?WSnFh$wrc}9CkR%*wY*y!niVgqTNvjgpI>l%5LJYALB~TBe|4hm}D(U zAaEQ`c#i=Gpc66l4NRJP8cMZ~WCzJ+lE8;JoC^CM29yZNYK)TD^%#&AlUzWu026>u zS=1Lz4D*92OtmD{eM#aUHOgj zj`D``s`Anob^%Nvm}8`EI*ivT1NY$SS^wolA_n6^*Md>Cjkr(=3CEYJ~v z)_@H@t+ew2zTHWoTA+nskIr!?-b7c9V?Z8tbD(W4@+eRg7`d23C5H+Q3pvon5P1|9 z(x?d(0s`$bkVlCTlt*d%i98Bi7N!9Yg8=Le!XyqQ9DuFBNZ@}EWDY>eVF(uS2t^!# zLc$Pm3JAc;Ah-|&>l6;O`#`XwJVd)a1dBFU2o~)h5G>%eFoOr7@GT%95P)$(0QLrf PHeD3HHJyj1ahUpF#e-8o literal 0 HcmV?d00001 From 7788b1822a9d1cec53e5fbd166dca482ee9872ae Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 21 Jan 2018 03:50:27 +0200 Subject: [PATCH 034/123] Added WrapFireDAC based on https://github.com/hartmutdavid --- .../Components/Sources/Core/Definition.Inc | 2 +- .../pyDBFireDac.pas => Core/WrapFireDAC.pas} | 1436 ++++++----------- .../Demos/Demo10_FireDAC/Demo.s3db | Bin 90112 -> 90112 bytes .../Demos/Demo10_FireDAC/Demo10.dpr | 6 +- .../Demos/Demo10_FireDAC/Demo10.dproj | 23 +- .../Demos/Demo10_FireDAC/Demo10.res | Bin 3200 -> 59204 bytes .../Demos/Demo10_FireDAC/Demo10_Icon.ico | Bin 766 -> 0 bytes .../Demos/Demo10_FireDAC/Demo10_Icon1.ico | Bin 766 -> 0 bytes .../Demos/Demo10_FireDAC/Example1.py | 2 +- .../Demos/Demo10_FireDAC/Example4.py | 8 +- .../Demos/Demo10_FireDAC/fmMain.dfm | Bin 9292 -> 7665 bytes .../Demos/Demo10_FireDAC/fmMain.pas | 251 +-- PythonForDelphi/Demos/Demo32/Unit1.dfm | Bin 2763 -> 4106 bytes PythonForDelphi/Demos/readme.txt | 68 +- 14 files changed, 529 insertions(+), 1267 deletions(-) rename PythonForDelphi/Components/Sources/{VCL/pyDBFireDac.pas => Core/WrapFireDAC.pas} (54%) delete mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon.ico delete mode 100644 PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon1.ico diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index 8b83a1d0..ff835eb6 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -28,7 +28,7 @@ //{$DEFINE PYTHON23} //{$DEFINE PYTHON24} -//{$DEFINE PYTHON25} +{$DEFINE PYTHON25} //{$DEFINE PYTHON26} //{$DEFINE PYTHON27} //{$DEFINE PYTHON30} diff --git a/PythonForDelphi/Components/Sources/VCL/pyDBFireDac.pas b/PythonForDelphi/Components/Sources/Core/WrapFireDAC.pas similarity index 54% rename from PythonForDelphi/Components/Sources/VCL/pyDBFireDac.pas rename to PythonForDelphi/Components/Sources/Core/WrapFireDAC.pas index 5463e0ea..5994c99b 100644 --- a/PythonForDelphi/Components/Sources/VCL/pyDBFireDac.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapFireDAC.pas @@ -1,9 +1,10 @@ {$REGION 'Licence'} { -Very important: We need text buffer for AnsiString's + Wrapper classes for FireDec TFDTable and TFDQuery + Original Code by https://github.com/hartmutdavid ==============================================================================} {$ENDREGION} -unit pyDBFireDac; +unit WrapFireDAC; interface @@ -18,139 +19,75 @@ interface type -TPyDBDataset = class; - -TCallBackSplit = record - method: Pointer; - self: TObject; -end; - -TPyDBSharedObject = class -protected - FRefCount : Integer; - FData : TObject; - FOwner : Boolean; - procedure DoDecRef; - procedure SetData( value : TObject ); -public - constructor Create; - constructor CreateWith( value : TObject; isOwner : Boolean ); - destructor Destroy; override; - procedure IncRef; - procedure DecRef; - procedure FreeData; - property Data: TObject read FData write SetData; - property Owner: Boolean read FOwner write FOwner; -end; +{ + Published properties and events are supported automaitcally + by the WrapDelphi infrastructure. There is no need + to exposed them here. +} -TPyDBCommon = class(TPyObject) +TPyDBCommon = class(TPyDelphiComponent) function GetProperties : PPyObject; procedure AppendProperties( List : PPyObject ); virtual; procedure AppendProp( List : PPyObject; const prop : String ); - function GetAttr(key : PAnsiChar) : PPyObject; override; + function GetAttrO(key: PPyObject) : PPyObject; override; procedure RaiseDBError( E : Exception ); - function EventBelongsToObject( Event : TCallbackSplit ) : Boolean; end; TPyDBField = class(TPyDBCommon) private - m_arAnsiTextBuf: TArray; + function GetDelphiObject: TField; + procedure SetDelphiObject(const Value: TField); 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; + function GetAttrO(key: PPyObject) : PPyObject; override; + function SetAttrO(key, value: PPyObject) : Integer; override; + + class function DelphiObjectClass : TClass; 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; + property DelphiObject: TField read GetDelphiObject write SetDelphiObject; 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; + function GetContainer: TFDDataset; 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; + class procedure SetupType( 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; + function GetAttrO(key: PPyObject) : PPyObject; override; + function SetAttrO(key, value: PPyObject) : Integer; override; // // Methods function Do_Fields( args : PPyObject ): PPyObject; cdecl; @@ -171,32 +108,20 @@ TPyDBDataset = class (TPyDelphiPersistent) 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); +TPyFireDACRegistration = class(TRegisteredUnit) +public + function Name(): String; override; + procedure RegisterWrappers(aPyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; end; -procedure TPyDBSharedObject.DecRef; -begin - if not Assigned(Self) then - Exit; - DoDecRef; - if (FRefCount = 0) then - Free; -end; +function SqlTimeToVarDate(V : Variant) : Variant; -procedure TPyDBSharedObject.FreeData; -begin - if Owner and Assigned(FData) then - FData.Free; - FData := nil; -end; +implementation +Uses + Data.SqlTimSt; // ----------------------- TPyDBCommon ----------------------------------------- function TPyDBCommon.GetProperties : PPyObject; @@ -417,20 +203,23 @@ procedure TPyDBCommon.AppendProp( List : PPyObject; const prop : String ); obj : PPyObject; begin with GetPythonEngine do begin - obj := PyString_FromString(PAnsiChar(AnsiString(prop))); + obj := PyUnicode_FromWideString(prop); PyList_Append( List, obj ); Py_XDecRef(obj); end; end; -function TPyDBCommon.GetAttr(key : PAnsiChar) : PPyObject; +function TPyDBCommon.GetAttrO(key: PPyObject) : PPyObject; +Var + SKey : string; begin try - if (CompareText( String(key), '__properties__' ) = 0) or - (CompareText( String(key), '__members__' ) = 0) then + SKey := LowerCase(GetPythonEngine.PyString_AsDelphiString(Key)); + if (SKey = '__properties__' ) or + (SKey = '__members__' ) then Result := GetProperties else - Result := inherited GetAttr(key); + Result := inherited GetAttrO(key); except // Remap Delphi exception to a Python exception on E : Exception do begin RaiseDBError( E ); @@ -445,52 +234,20 @@ procedure TPyDBCommon.RaiseDBError( E : Exception ); 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 ); +class function TPyDBField.DelphiObjectClass: TClass; begin - inherited; - SetLength(m_arAnsiTextBuf,0); -end; - -constructor TPyDBField.CreateWith( PythonType : TPythonType; args : PPyObject ); -begin - inherited; - SetLength(m_arAnsiTextBuf,0); + Result := TField; 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; +function TPyDBField.GetAttrO(key: PPyObject) : PPyObject; +{ TODO : Remove published properties } var - l_pAnsiChar: PAnsiChar; - l_sUpperKey, l_sStr: String; + l_sUpperKey: String; begin with GetPythonEngine do begin if not CheckField then begin @@ -498,115 +255,98 @@ function TPyDBField.GetAttr(key : PAnsiChar) : PPyObject; 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 + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'ALIGNMENT' then + Result := VariantAsPyObject( Integer(DelphiObject.Alignment) ) + else if l_sUpperKey = 'ASBOOLEAN' then + Result := VariantAsPyObject( DelphiObject.AsBoolean ) + else if l_sUpperKey = 'ASDATETIME' then + Result := VariantAsPyObject( DelphiObject.AsDateTime ) + else if l_sUpperKey = 'ASFLOAT' then + Result := VariantAsPyObject( DelphiObject.AsFloat ) + else if l_sUpperKey = 'ASINTEGER' then + Result := VariantAsPyObject( DelphiObject.AsInteger ) + else if l_sUpperKey = 'ASSTRING' then + Result := VariantAsPyObject( DelphiObject.AsString ) + else if l_sUpperKey = 'CANMODIFY' then + Result := VariantAsPyObject( DelphiObject.CanModify ) + else if l_sUpperKey = 'ConstraintErrorMessage' then + Result := VariantAsPyObject( DelphiObject.ConstraintErrorMessage ) + else if l_sUpperKey = 'CurValue' then + Result := VariantAsPyObject( DelphiObject.CurValue ) + else if l_sUpperKey = 'CustomConstraint' then + Result := VariantAsPyObject( DelphiObject.CustomConstraint ) + else if l_sUpperKey = 'DATASIZE' then + Result := VariantAsPyObject( DelphiObject.DataSize ) + else if l_sUpperKey = 'DATATYPE' then + Result := VariantAsPyObject( DelphiObject.DataType ) + else if l_sUpperKey = 'DefaultExpression' then + Result := VariantAsPyObject( DelphiObject.DefaultExpression ) + else if l_sUpperKey = 'DISPLAYLABEL' then + Result := VariantAsPyObject( DelphiObject.DisplayLabel ) + else if l_sUpperKey = 'DISPLAYNAME' then + Result := VariantAsPyObject( DelphiObject.DisplayName ) + else if l_sUpperKey = 'DISPLAYTEXT' then + Result := VariantAsPyObject( DelphiObject.DisplayText ) + else if l_sUpperKey = 'DISPLAYWIDTH' then + Result := VariantAsPyObject( DelphiObject.DisplayWidth ) + else if l_sUpperKey = 'EDITMASK' then + Result := VariantAsPyObject( DelphiObject.EditMask ) + else if l_sUpperKey = 'FIELDKIND' then + Result := VariantAsPyObject( DelphiObject.FieldKind ) + else if l_sUpperKey = 'FIELDNAME' then + Result := VariantAsPyObject( DelphiObject.FieldName) + else if l_sUpperKey = 'FIELDNO' then + Result := VariantAsPyObject( DelphiObject.FieldNo ) + else if l_sUpperKey = 'HASCONSTRAINTS' then + Result := VariantAsPyObject( DelphiObject.HasConstraints ) + else if l_sUpperKey = 'IMPORTEDCONSTRAINT' then + Result := VariantAsPyObject( DelphiObject.ImportedConstraint ) + else if l_sUpperKey = 'INDEX' then + Result := VariantAsPyObject( DelphiObject.Index ) + else if l_sUpperKey = 'ISBLOB' then + Result := VariantAsPyObject( DelphiObject.IsBlob) + else if l_sUpperKey = 'ISINDEXFIELD' then + Result := VariantAsPyObject( DelphiObject.IsIndexField ) + else if l_sUpperKey = 'ISNULL' then + Result := VariantAsPyObject( DelphiObject.IsNull ) + else if l_sUpperKey = 'KEYFFIELDS' then + Result := VariantAsPyObject( DelphiObject.KeyFields ) + else if l_sUpperKey = 'LOOKUP' then + Result := VariantAsPyObject( DelphiObject.Lookup ) + else if l_sUpperKey = 'LOOKUPCACHE' then + Result := VariantAsPyObject( DelphiObject.LookupCache ) + else if l_sUpperKey = 'LOOKUPKeyFields' then + Result := VariantAsPyObject( DelphiObject.LookupKeyFields ) + else if l_sUpperKey = 'LOOKUPLIST' then Result := ReturnNone - else if CompareText(l_sUpperKey, 'LOOKUPKeyFields' ) = 0 then - Result := VariantAsPyObject( FField.LookupKeyFields ) - else if CompareText(l_sUpperKey, 'LOOKUPLIST' ) = 0 then + else if l_sUpperKey = 'LOOKUPRESULTFIELD' then + Result := VariantAsPyObject( DelphiObject.LookupResultField ) + else if l_sUpperKey = 'NEWVALUE' then + Result := VariantAsPyObject( DelphiObject.NewValue ) + else if l_sUpperKey = 'OFFSET' then + Result := VariantAsPyObject( DelphiObject.Offset ) + else if l_sUpperKey = 'OLDVALUE' then + Result := VariantAsPyObject( DelphiObject.OldValue ) + else if l_sUpperKey = 'ORIGIN' then + Result := VariantAsPyObject( DelphiObject.Origin ) + else if l_sUpperKey = 'READONLY' then + Result := VariantAsPyObject( DelphiObject.ReadOnly ) + else if l_sUpperKey = 'REQUIRED' then + Result := VariantAsPyObject( DelphiObject.Required ) + else if l_sUpperKey = 'SIZE' then + Result := VariantAsPyObject( DelphiObject.Size ) + else if l_sUpperKey = 'TEXT' then + Result := VariantAsPyObject( DelphiObject.Text ) + else if l_sUpperKey = 'VALIDCHARS' 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 if l_sUpperKey = 'VALUE' then begin + Result := VariantAsPyObject( SqlTimeToVarDate(DelphiObject.Value) ); + end + else if l_sUpperKey = 'VISIBLE' then + Result := VariantAsPyObject( DelphiObject.Visible ) else - Result := inherited GetAttr(key); + Result := inherited GetAttrO(key); except on E : Exception do begin RaiseDBError( E ); @@ -616,7 +356,13 @@ function TPyDBField.GetAttr(key : PAnsiChar) : PPyObject; end; end; -function TPyDBField.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; +function TPyDBField.GetDelphiObject: TField; +begin + Result := TField(inherited DelphiObject); +end; + +function TPyDBField.SetAttrO(key, value: PPyObject) : Integer; +{ TODO : Remove published properties } var l_sUpperKey: String; begin @@ -625,205 +371,170 @@ function TPyDBField.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; 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 ); + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'ALIGNMENT' then begin + DelphiObject.Alignment := TAlignment(PyObjectAsVariant( value )); Result := 0; end - else if CompareText(l_sUpperKey, 'ASSTRING' ) = 0 then begin - FField.AsString := PyObjectAsVariant( value ); + else if l_sUpperKey = 'ASBOOLEAN' then begin + DelphiObject.AsBoolean := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'CANMODIFY' ) = 0 then begin + else if l_sUpperKey = 'ASDATETIME' then begin + DelphiObject.AsDateTime := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'CONSTRAINTERRORMESSAGE' ) = 0 then begin - FField.ConstraintErrorMessage := PyObjectAsVariant( value ); + else if l_sUpperKey = 'ASFLOAT' then begin + DelphiObject.AsFloat := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'CURVALUE' ) = 0 then begin + else if l_sUpperKey = 'ASINTEGER' then begin + DelphiObject.AsInteger := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'CUSTOMCONSTRAINT' ) = 0 then begin - FField.CustomConstraint := PyObjectAsVariant( value ); + else if l_sUpperKey = 'ASSTRING' then begin + DelphiObject.AsString := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'DATASIZE' ) = 0 then begin + else if l_sUpperKey = 'CANMODIFY' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'DATATYPE' ) = 0 then begin + else if l_sUpperKey = 'CONSTRAINTERRORMESSAGE' then begin + DelphiObject.ConstraintErrorMessage := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'DEFAULTEXPRESSION' ) = 0 then begin - FField.DefaultExpression := PyObjectAsVariant( value ); + else if l_sUpperKey = 'CURVALUE' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'DISPLAYLABEL' ) = 0 then begin - FField.DisplayLabel := PyObjectAsVariant( value ); + else if l_sUpperKey = 'CUSTOMCONSTRAINT' then begin + DelphiObject.CustomConstraint := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'DISPLAYNAME' ) = 0 then begin + else if l_sUpperKey = 'DATASIZE' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'DISPLAYTEXT' ) = 0 then begin + else if l_sUpperKey = 'DATATYPE' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'DISPLAYWIDTH' ) = 0 then begin - FField.DisplayWidth := PyObjectAsVariant( value ); + else if l_sUpperKey = 'DEFAULTEXPRESSION' then begin + DelphiObject.DefaultExpression := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'EDITMASK' ) = 0 then begin - FField.EditMask := PyObjectAsVariant( value ); + else if l_sUpperKey = 'DISPLAYLABEL' then begin + DelphiObject.DisplayLabel := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'FIELDKIND' ) = 0 then begin - FField.FieldKind := PyObjectAsVariant( value ); + else if l_sUpperKey = 'DISPLAYNAME' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'FIELDNAME' ) = 0 then begin - FField.FieldName:= PyObjectAsVariant( value ); + else if l_sUpperKey = 'DISPLAYTEXT' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'FIELDNO' ) = 0 then begin + else if l_sUpperKey = 'DISPLAYWIDTH' then begin + DelphiObject.DisplayWidth := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'HASCONSTRAINTS' ) = 0 then begin + else if l_sUpperKey = 'EDITMASK' then begin + DelphiObject.EditMask := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'IMPORTEDCONSTRAINT' ) = 0 then begin - FField.ImportedConstraint := PyObjectAsVariant( value ); + else if l_sUpperKey = 'FIELDKIND' then begin + DelphiObject.FieldKind := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'INDEX' ) = 0 then begin - FField.Index := PyObjectAsVariant( value ); + else if l_sUpperKey = 'FIELDNAME' then begin + DelphiObject.FieldName:= PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'ISBLOB' ) = 0 then begin + else if l_sUpperKey = 'FIELDNO' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'ISINDEXFIELD' ) = 0 then begin + else if l_sUpperKey = 'HASCONSTRAINTS' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'ISNULL' ) = 0 then begin + else if l_sUpperKey = 'IMPORTEDCONSTRAINT' then begin + DelphiObject.ImportedConstraint := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'KEYFIELDS' ) = 0 then begin - FField.KeyFields := PyObjectAsVariant( value ); + else if l_sUpperKey = 'INDEX' then begin + DelphiObject.Index := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'LOOKUP' ) = 0 then begin - FField.Lookup := PyObjectAsVariant( value ); + else if l_sUpperKey = 'ISBLOB' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'LOOKUPCACHE' ) = 0 then begin - FField.LookupCache := PyObjectAsVariant( value ); + else if l_sUpperKey = 'ISINDEXFIELD' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'LOOKUPDATASET' ) = 0 then begin + else if l_sUpperKey = 'ISNULL' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'LOOKUPKEYFIELDS' ) = 0 then begin - FField.LookupKeyFields := PyObjectAsVariant( value ); + else if l_sUpperKey = 'KEYFIELDS' then begin + DelphiObject.KeyFields := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'LOOKUPLIST' ) = 0 then begin + else if l_sUpperKey = 'LOOKUP' then begin + DelphiObject.Lookup := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'LOOKUPRESULTFIELD' ) = 0 then begin - FField.LookupResultField := PyObjectAsVariant( value ); + else if l_sUpperKey = 'LOOKUPCACHE' then begin + DelphiObject.LookupCache := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'NEWVALUE' ) = 0 then begin - FField.NewValue := PyObjectAsVariant( value ); + else if l_sUpperKey = 'LOOKUPKEYFIELDS' then begin + DelphiObject.LookupKeyFields := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'OFFSET' ) = 0 then begin + else if l_sUpperKey = 'LOOKUPLIST' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'OLDVALUE' ) = 0 then begin + else if l_sUpperKey = 'LOOKUPRESULTFIELD' then begin + DelphiObject.LookupResultField := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'ORIGIN' ) = 0 then begin - FField.Origin := PyObjectAsVariant( value ); + else if l_sUpperKey = 'NEWVALUE' then begin + DelphiObject.NewValue := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'READONLY' ) = 0 then begin - FField.ReadOnly := PyObjectAsVariant( value ); + else if l_sUpperKey = 'OFFSET' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'REQUIRED' ) = 0 then begin - FField.Required := PyObjectAsVariant( value ); + else if l_sUpperKey = 'OLDVALUE' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'SIZE' ) = 0 then begin - FField.Size := PyObjectAsVariant( value ); + else if l_sUpperKey = 'ORIGIN' then begin + DelphiObject.Origin := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'TEXT' ) = 0 then begin - FField.Text := PyObjectAsVariant( value ); + else if l_sUpperKey = 'READONLY' then begin + DelphiObject.ReadOnly := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'VALIDCHARS' ) = 0 then begin + else if l_sUpperKey = 'REQUIRED' then begin + DelphiObject.Required := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'VALUE' ) = 0 then begin - FField.Value := PyObjectAsVariant( value ); + else if l_sUpperKey = 'SIZE' then begin + DelphiObject.Size := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'VISIBLE' ) = 0 then begin - FField.Visible := PyObjectAsVariant( value ); + else if l_sUpperKey = 'TEXT' then begin + DelphiObject.Text := 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; + else if l_sUpperKey = 'VALIDCHARS' then begin 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; + else if l_sUpperKey = 'VALUE' then begin + DelphiObject.Value := PyObjectAsVariant( value ); 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; + else if l_sUpperKey = 'VISIBLE' then begin + DelphiObject.Visible := PyObjectAsVariant( value ); Result := 0; end else - Result := inherited SetAttr(key, value); + Result := inherited SetAttrO(key, value); except on E : Exception do begin RaiseDBError( E ); @@ -833,29 +544,29 @@ function TPyDBField.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; end; end; -function TPyDBField.Repr: PPyObject; +procedure TPyDBField.SetDelphiObject(const Value: TField); begin - Result := inherited Repr; + inherited DelphiObject := Value; 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; + 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 + if not Assigned(DelphiObject) then begin Result := False; with GetPythonEngine do PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('No field defined !') ); @@ -921,7 +632,7 @@ function TPyDBField.Do_Clear( args : PPyObject ) : PPyObject; Adjust(@Self); // <- adjust the transmitted self argument try if CheckField then begin - FField.Clear; + DelphiObject.Clear; Result := ReturnNone; end else @@ -941,7 +652,7 @@ function TPyDBField.Do_FocusControl( args : PPyObject ) : PPyObject; Adjust(@Self); // <- adjust the transmitted self argument try if CheckField then begin - FField.FocusControl; + DelphiObject.FocusControl; Result := ReturnNone; end else @@ -971,7 +682,7 @@ function TPyDBField.Do_IsValidChar( args : PPyObject ) : PPyObject; c := Char(str[1]) else c := #0; - Result := VariantAsPyObject( FField.IsValidChar( c ) ) + Result := VariantAsPyObject( DelphiObject.IsValidChar( c ) ) end else Result := nil; @@ -993,7 +704,7 @@ function TPyDBField.Do_RefreshLookupList( args : PPyObject ) : PPyObject; Adjust(@Self); // <- adjust the transmitted self argument try if CheckField then begin - FField.RefreshLookupList; + DelphiObject.RefreshLookupList; Result := ReturnNone; end else @@ -1007,117 +718,25 @@ function TPyDBField.Do_RefreshLookupList( args : PPyObject ) : PPyObject; 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; + Result := TFDDataset; end; -function TDSRowsAccess.GetContainer: TPyDBDataset; +function TDSRowsAccess.GetContainer: TFDDataset; begin - Result := TPyDBDataset(inherited Container); + Result := TFDDataset(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; + l_oDataset := GetContainer; if (aIndex >= 0) and (aIndex < l_oDataset.RecordCount) then begin with GetPythonEngine do begin try @@ -1125,7 +744,7 @@ function TDSRowsAccess.GetItem(aIndex: Integer): PPyObject; 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 ) ); + PyTuple_SetItem( Result, i, VariantAsPyObject( SqlTimeToVarDate(Value) ) ); end; end; except @@ -1141,94 +760,19 @@ function TDSRowsAccess.GetSize: Integer; var l_oDataset: TFDDataset; begin - l_oDataset := GetContainer.GetDelphiObject; + l_oDataset := GetContainer; 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); @@ -1239,12 +783,12 @@ procedure TPyDBDataset.SetDelphiObject(const Value: TFDDataset); inherited DelphiObject := Value; end; -function TPyDBDataset.CreateContainerAccess : TContainerAccess; -var - l_ContainerAccessClass : TContainerAccessClass; + +class procedure TPyDBDataset.SetupType(PythonType: TPythonType); begin - l_ContainerAccessClass := TDSRowsAccess; - Result := l_ContainerAccessClass.Create(PyDelphiWrapper, self) + inherited; + PythonType.GenerateCreateFunction := True; + PythonType.Prefix := 'T'; end; class function TPyDBDataset.DelphiObjectClass : TClass; @@ -1284,11 +828,6 @@ class procedure TPyDBDataset.RegisterGetSets( PythonType : TPythonType ); 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; @@ -1323,7 +862,7 @@ class procedure TPyDBDataset.RegisterMethods( PythonType : TPythonType ); end; end; -function TPyDBDataset.GetAttr(key : PAnsiChar) : PPyObject; +function TPyDBDataset.GetAttrO(key: PPyObject) : PPyObject; var l_sUpperKey: String; l_oDataset: TFDDataset; @@ -1332,19 +871,19 @@ function TPyDBDataset.GetAttr(key : PAnsiChar) : PPyObject; with GetPythonEngine do begin try l_oDataset := DelphiObject; - l_sUpperKey := UpperCase(String(key)); - if CompareText(l_sUpperKey, 'BOF' ) = 0 then + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'BOF' then Result := VariantAsPyObject( l_oDataset.BOF ) - else if CompareText(l_sUpperKey, 'CANMODIFY' ) = 0 then + else if l_sUpperKey = 'CANMODIFY' then Result := VariantAsPyObject( l_oDataset.CanModify ) - else if CompareText(l_sUpperKey, 'EOF' ) = 0 then + else if l_sUpperKey = 'EOF' then Result := VariantAsPyObject( l_oDataset.EOF ) - else if CompareText( string(key), 'FIELDCOUNT' ) = 0 then + else if l_sUpperKey = 'FIELDCOUNT' then Result := VariantAsPyObject( l_oDataset.FieldCount ) - else if CompareText( string(key), 'RECNO' ) = 0 then + else if l_sUpperKey = 'RECNO' then Result := VariantAsPyObject( l_oDataset.RecNo ) else - Result := inherited GetAttr(key); + Result := inherited GetAttrO(key); except on E : Exception do begin RaiseDBError( E ); @@ -1354,7 +893,7 @@ function TPyDBDataset.GetAttr(key : PAnsiChar) : PPyObject; end; end; -function TPyDBDataset.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; +function TPyDBDataset.SetAttrO(key, value: PPyObject) : Integer; var l_sUpperKey: String; l_oDataset: TFDDataset; @@ -1363,30 +902,30 @@ function TPyDBDataset.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; with GetPythonEngine do begin try l_oDataset := DelphiObject; - l_sUpperKey := UpperCase(String(key)); - if CompareText(l_sUpperKey, 'FILTER' ) = 0 then begin + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'FILTER' then begin l_oDataset.Filter := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'FILTERED' ) = 0 then begin + else if l_sUpperKey = 'FILTERED' then begin l_oDataset.Filtered := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'BOF' ) = 0 then begin + else if l_sUpperKey = 'BOF' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'CanModify' ) = 0 then begin + else if l_sUpperKey = 'CanModify' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'EOF' ) = 0 then begin + else if l_sUpperKey = 'EOF' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'RECNO' ) = 0 then begin + else if l_sUpperKey = 'RECNO' then begin l_oDataset.RecNo := PyObjectAsVariant( value ); Result := 0; end else - Result := inherited SetAttr(key, value); + Result := inherited SetAttrO(key, value); except on E : Exception do begin RaiseDBError( E ); @@ -1407,8 +946,6 @@ procedure TPyDBDataset.RaiseDBError( E : Exception ); function TPyDBDataset.Do_Fields( args : PPyObject ): PPyObject; var idx : Integer; - fld : TField; - F : TPyDBField; l_oDataset: TFDDataset; begin with GetPythonEngine do begin @@ -1417,11 +954,8 @@ function TPyDBDataset.Do_Fields( args : PPyObject ): PPyObject; 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 + if (idx >= 0) and (idx < l_oDataset.FieldCount) then + Result := PyDelphiWrapper.Wrap(l_oDataset.Fields[idx]) else begin Result := nil; PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Value out of range : %d', [idx])))); @@ -1443,7 +977,6 @@ function TPyDBDataset.Do_FieldByName( args : PPyObject ) : PPyObject; l_sAStr: AnsiString; s : PAnsiChar; fld : TField; - F : TPyDBField; l_oDataset: TFDDataset; begin with GetPythonEngine do begin @@ -1454,11 +987,8 @@ function TPyDBDataset.Do_FieldByName( args : PPyObject ) : PPyObject; 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 + if Assigned(fld) then + Result := PyDelphiWrapper.Wrap(fld) else begin Result := nil; PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown field "%s"', [String(s)]))) ); @@ -1478,8 +1008,6 @@ function TPyDBDataset.Do_FieldByName( args : PPyObject ) : PPyObject; function TPyDBDataset.Do_FieldNamesAsTuple( args: PPyObject): PPyObject; var i : Integer; - l_sStr: String; - l_pAnsiChar: PAnsiChar; l_oDataset: TFDDataset; begin with GetPythonEngine do begin @@ -1487,14 +1015,9 @@ function TPyDBDataset.Do_FieldNamesAsTuple( args: PPyObject): PPyObject; 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; + for i := 0 to l_oDataset.FieldCount - 1 do + with l_oDataset.Fields[i] do + PyTuple_SetItem(Result, i, PyUnicode_FromWideString(FieldName)); except on E : Exception do begin RaiseDBError( E ); @@ -1507,8 +1030,6 @@ function TPyDBDataset.Do_FieldNamesAsTuple( args: PPyObject): PPyObject; function TPyDBDataset.Do_FieldsAsTuple( args: PPyObject): PPyObject; var i : Integer; - l_sStr: String; - l_pAnsiChar: PAnsiChar; l_oDataset: TFDDataset; begin Result := nil; @@ -1517,16 +1038,9 @@ function TPyDBDataset.Do_FieldsAsTuple( args: PPyObject): PPyObject; 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 ) ); + PyTuple_SetItem( Result, i, + VariantAsPyObject( SqlTimeToVarDate(l_oDataset.Fields[i].AsVariant )) ); end; except on E : Exception do begin @@ -1538,10 +1052,8 @@ function TPyDBDataset.Do_FieldsAsTuple( args: PPyObject): PPyObject; function TPyDBDataset.Do_FieldsAsDict( args: PPyObject): PPyObject; var - i : Integer; - l_sStr: String; - l_pAnsiChar: PAnsiChar; - l_oDataset: TFDDataset; + i : Integer; + l_oDataset: TFDDataset; obj : PPyObject; _fieldName : PPyObject; begin @@ -1552,7 +1064,7 @@ function TPyDBDataset.Do_FieldsAsDict( args: PPyObject): PPyObject; Result := PyDict_New; for i := 0 to l_oDataset.FieldCount - 1 do with l_oDataset.Fields[i] do begin - obj := VariantAsPyObject( AsVariant ); + obj := VariantAsPyObject( SqlTimeToVarDate(AsVariant) ); _fieldName := VariantAsPyObject(Variant(FieldName)); PyDict_SetItem( Result, _fieldName, obj ); Py_XDecRef(obj); @@ -1792,37 +1304,6 @@ function TPyDBDataset.Do_FindNearest( args : PPyObject ) : PPyObject; // ----------------------- 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); @@ -1838,6 +1319,13 @@ class function TPyDBTable.DelphiObjectClass: TClass; Result := TFDTable; end; +destructor TPyDBTable.Destroy; +begin + if Assigned(DelphiObject) then + DelphiObject.Active := False; + inherited; +end; + class procedure TPyDBTable.RegisterMethods( PythonType : TPythonType ); begin inherited; @@ -1877,19 +1365,6 @@ class procedure TPyDBTable.RegisterMethods( PythonType : TPythonType ); 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; @@ -1909,7 +1384,7 @@ function TPyDBTable.CheckActiveDBTable(aMustOpen: Boolean): Boolean; end; end; -function TPyDBTable.GetAttr(key : PAnsiChar) : PPyObject; +function TPyDBTable.GetAttrO(key: PPyObject) : PPyObject; var l_sUpperKey: String; l_sConnectionDefName, l_sDatabaseName: String; @@ -1921,15 +1396,15 @@ function TPyDBTable.GetAttr(key : PAnsiChar) : PPyObject; l_oConn := Nil; try l_oTable := DelphiObject; - l_sUpperKey := UpperCase(String(key)); - if CompareText(l_sUpperKey, 'CONNECTIONDEFNAME' ) = 0 then begin + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'CONNECTIONDEFNAME' 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 + else if l_sUpperKey = 'DATABASENAME' then begin l_oConn := DelphiObject.Connection; if Assigned(l_oConn) then l_sDatabaseName := l_oConn.Params.Database @@ -1937,31 +1412,31 @@ function TPyDBTable.GetAttr(key : PAnsiChar) : PPyObject; l_sDatabaseName := ''; Result := VariantAsPyObject( l_sDatabaseName ) end - else if CompareText(l_sUpperKey, 'TABLENAME' ) = 0 then + else if l_sUpperKey = 'TABLENAME'then Result := VariantAsPyObject( l_oTable.TableName ) - else if CompareText(l_sUpperKey, 'ACTIVE' ) = 0 then + else if l_sUpperKey = 'ACTIVE' then Result := VariantAsPyObject( l_oTable.Active ) - else if CompareText(l_sUpperKey, 'FILTER' ) = 0 then + else if l_sUpperKey = 'FILTER' then Result := VariantAsPyObject( l_oTable.Filter ) - else if CompareText(l_sUpperKey, 'FILTERED' ) = 0 then + else if l_sUpperKey = 'FILTERED' then Result := VariantAsPyObject( l_oTable.Filtered ) - else if CompareText(l_sUpperKey, 'STATE' ) = 0 then + else if l_sUpperKey = 'STATE' then Result := VariantAsPyObject( Integer(l_oTable.State) ) - else if CompareText(l_sUpperKey, 'MODIFIED' ) = 0 then + else if l_sUpperKey = 'MODIFIED' then Result := VariantAsPyObject( l_oTable.Modified ) - else if CompareText(l_sUpperKey, 'ISRANGED' ) = 0 then + else if l_sUpperKey = 'ISRANGED' then // Ermöglicht das Ermitteln des aktuellen Bereichsfilterungsmodus. Result := VariantAsPyObject( l_oTable.IsRanged ) - else if CompareText(l_sUpperKey, 'KEYEXCLUSIVE' ) = 0 then + else if l_sUpperKey = 'KEYEXCLUSIVE' 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 + else if l_sUpperKey = 'KEYFIELDCOUNT' 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 + else if l_sUpperKey = 'INDEXNAME' then Result := VariantAsPyObject( l_oTable.IndexName ) else - Result := inherited GetAttr(key); + Result := inherited GetAttrO(key); except on E : Exception do begin RaiseDBError( E ); @@ -1971,7 +1446,7 @@ function TPyDBTable.GetAttr(key : PAnsiChar) : PPyObject; end; end; -function TPyDBTable.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; +function TPyDBTable.SetAttrO(key, value: PPyObject) : Integer; var i: Integer; l_sUpperKey: String; @@ -1984,8 +1459,8 @@ function TPyDBTable.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; l_oConn := Nil; try l_oTable := DelphiObject; - l_sUpperKey := UpperCase(String(key)); - if CompareText(l_sUpperKey, 'CONNECTIONDEFNAME' ) = 0 then begin + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'CONNECTIONDEFNAME' then begin if CheckActiveDBTable(False) then begin l_sConnectionDefName := UpperCase(PyObjectAsVariant(value)); for i := 0 to FDManager.ConnectionCount-1 do begin @@ -2003,7 +1478,7 @@ function TPyDBTable.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; Result := 0; end; end - else if CompareText(l_sUpperKey, 'DATABASENAME' ) = 0 then begin + else if l_sUpperKey = 'DATABASENAME' then begin if CheckActiveDBTable(False) then begin l_sDatabaseName := PyObjectAsVariant( value ); l_oConn := DelphiObject.Connection; @@ -2013,50 +1488,50 @@ function TPyDBTable.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; Result := 0; end; end - else if CompareText(l_sUpperKey, 'TABLENAME' ) = 0 then begin + else if l_sUpperKey = 'TABLENAME' 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 + else if l_sUpperKey = 'ACTIVE' then begin l_oTable.Active := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'FILTER' ) = 0 then begin + else if l_sUpperKey = 'FILTER' then begin l_oTable.Filter := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'FILTERED' ) = 0 then begin + else if l_sUpperKey = 'FILTERED' then begin l_oTable.Filtered := PyObjectAsVariant( value ); Result := 0; end - else if CompareText(l_sUpperKey, 'STATE' ) = 0 then begin + else if l_sUpperKey = 'STATE' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'MODIFIED' ) = 0 then begin + else if l_sUpperKey = 'MODIFIED' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'ISRANGED' ) = 0 then begin + else if l_sUpperKey = 'ISRANGED' then begin Result := 0; end - else if CompareText(l_sUpperKey, 'KEYEXCLUSIVE' ) = 0 then begin + else if l_sUpperKey = 'KEYEXCLUSIVE' 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 + else if l_sUpperKey = 'KEYFIELDCOUNT' 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 + else if l_sUpperKey = 'INDEXNAME' 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); + Result := inherited SetAttrO(key, value); except on E : Exception do begin RaiseDBError( E ); @@ -2420,37 +1895,6 @@ function TPyDBTable.Do_GetIndexNames( args : PPyObject ) : PPyObject; // --------------------- 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); @@ -2466,34 +1910,28 @@ class function TPyDBQuery.DelphiObjectClass : TClass; 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 ); +destructor TPyDBQuery.Destroy; begin - inherited; - //-- PythonType.AddMember( 'Active', mtInt, NativeInt(@TPyDBTable(nil).x), mfDefault, 'Active'); + if Assigned(DelphiObject) then + DelphiObject.Active := False; + inherited; end; -class procedure TPyDBQuery.RegisterGetSets( PythonType : TPythonType ); +class procedure TPyDBQuery.RegisterMethods( PythonType : TPythonType ); begin - inherited; - //-- PythonType.AddGetSet(PAnsiChar('Active'), @TPyDBTable.Get_Active, @TPyDBTable.Set_Active, - //-- PAnsiChar('Returns/Sets the Active'), nil); + 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; function TPyDBQuery.CheckActiveDBQuery(aMustOpen: Boolean): Boolean; @@ -2515,12 +1953,10 @@ function TPyDBQuery.CheckActiveDBQuery(aMustOpen: Boolean): Boolean; end; end; -function TPyDBQuery.GetAttr(key : PAnsiChar) : PPyObject; +function TPyDBQuery.GetAttrO(key: PPyObject) : PPyObject; var - i: Integer; - l_sUpperKey, l_sStr: String; + l_sUpperKey: String; l_sConnectionDefName, l_sDatabaseName: String; - l_pAnsiChar: PAnsiChar; l_oConn: TFDCustomConnection; l_oQuery: TFDQuery; begin @@ -2529,15 +1965,15 @@ function TPyDBQuery.GetAttr(key : PAnsiChar) : PPyObject; l_oConn := Nil; try l_oQuery := DelphiObject; - l_sUpperKey := UpperCase(String(key)); - if CompareText(l_sUpperKey, 'CONNECTIONDEFNAME' ) = 0 then begin + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'CONNECTIONDEFNAME' 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 + else if l_sUpperKey = 'DATABASENAME' then begin l_oConn := DelphiObject.Connection; if Assigned(l_oConn) then l_sDatabaseName := l_oConn.Params.Database @@ -2545,23 +1981,12 @@ function TPyDBQuery.GetAttr(key : PAnsiChar) : PPyObject; l_sDatabaseName := ''; Result := VariantAsPyObject( l_sDatabaseName ) end - else if CompareText(l_sUpperKey, 'PARAMCOUNT' ) = 0 then + else if l_sUpperKey = 'PARAMCOUNT' 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 + else if l_sUpperKey = 'PREPARED' 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); + Result := inherited GetAttrO(key); except on E : Exception do begin RaiseDBError( E ); @@ -2571,22 +1996,21 @@ function TPyDBQuery.GetAttr(key : PAnsiChar) : PPyObject; end; end; -function TPyDBQuery.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; +function TPyDBQuery.SetAttrO(key, value: PPyObject) : Integer; var - i, j: Integer; - l_sUpperKey, l_sText, l_sStr, l_sSql: String; + i: Integer; + l_sUpperKey: 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 + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'CONNECTIONDEFNAME' then begin if CheckActiveDBQuery(False) then begin l_sConnectionDefName := UpperCase(PyObjectAsVariant(value)); for i := 0 to FDManager.ConnectionCount-1 do begin @@ -2604,7 +2028,7 @@ function TPyDBQuery.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; Result := 0; end; end - else if CompareText(l_sUpperKey, 'DATABASENAME' ) = 0 then begin + else if l_sUpperKey = 'DATABASENAME' then begin if CheckActiveDBQuery(False) then begin l_sDatabaseName := PyObjectAsVariant( value ); l_oConn := DelphiObject.Connection; @@ -2614,39 +2038,15 @@ function TPyDBQuery.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; Result := 0; end; end - else if CompareText(l_sUpperKey, 'PARAMCOUNT' ) = 0 then begin + else if l_sUpperKey = 'PARAMCOUNT' 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 + else if l_sUpperKey = 'PREPARED' 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); + Result := inherited SetAttrO(key, value); except on E : Exception do begin RaiseDBError( E ); @@ -2753,36 +2153,106 @@ function TPyDBQuery.Do_ExecSQL( args : PPyObject ) : PPyObject; // ----------------------------------------------------------------------------- -initialization -begin - //-- RegisteredUnits.Add( TPyDSRowsRegistration.Create ); - //-- Classes.RegisterClasses([TPyDBTable]); +{ TPyDSRowsRegistration } + +procedure TPyFireDACRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + // Values for type TDatasetState + APyDelphiWrapper.DefineVar('dsInactive', 0); + APyDelphiWrapper.DefineVar('dsBrowse', 1); + APyDelphiWrapper.DefineVar('dsEdit', 2); + APyDelphiWrapper.DefineVar('dsInsert', 3); + APyDelphiWrapper.DefineVar('dsSetKey', 4); + APyDelphiWrapper.DefineVar('dsCalcFields', 5); + APyDelphiWrapper.DefineVar('dsFilter', 6); + APyDelphiWrapper.DefineVar('dsNewValue', 7); + APyDelphiWrapper.DefineVar('dsOldValue', 8); + APyDelphiWrapper.DefineVar('dsCurValue', 9); + // Values for type TFieldType + APyDelphiWrapper.DefineVar('ftUnknown', 0); + APyDelphiWrapper.DefineVar('ftString', 1); + APyDelphiWrapper.DefineVar('ftSmallint', 2); + APyDelphiWrapper.DefineVar('ftInteger', 3); + APyDelphiWrapper.DefineVar('ftWord', 4); + APyDelphiWrapper.DefineVar('ftBoolean', 5); + APyDelphiWrapper.DefineVar('ftFloat', 6); + APyDelphiWrapper.DefineVar('ftCurrency', 7); + APyDelphiWrapper.DefineVar('ftBCD', 8); + APyDelphiWrapper.DefineVar('ftDate', 9); + APyDelphiWrapper.DefineVar('ftTime', 10); + APyDelphiWrapper.DefineVar('ftDateTime', 11); + APyDelphiWrapper.DefineVar('ftBytes', 12); + APyDelphiWrapper.DefineVar('ftVarBytes', 13); + APyDelphiWrapper.DefineVar('ftAutoInc', 14); + APyDelphiWrapper.DefineVar('ftBlob', 15); + APyDelphiWrapper.DefineVar('ftMemo', 16); + APyDelphiWrapper.DefineVar('ftGraphic', 17); + APyDelphiWrapper.DefineVar('ftFmtMemo', 18); + APyDelphiWrapper.DefineVar('ftParadoxOle', 19); + APyDelphiWrapper.DefineVar('ftDBaseOle', 20); + APyDelphiWrapper.DefineVar('ftTypedBinary', 21); + APyDelphiWrapper.DefineVar('ftCursor', 22); + // Values for type TFieldKind + APyDelphiWrapper.DefineVar('fkData', 0); + APyDelphiWrapper.DefineVar('fkCalculated', 1); + APyDelphiWrapper.DefineVar('fkLookup', 2); + APyDelphiWrapper.DefineVar('fkInternalCalc', 3); + // Values for type TLocateOption + APyDelphiWrapper.DefineVar('loCaseInsensitive', 0); + APyDelphiWrapper.DefineVar('loPartialKey', 1); + // Values for type TLockType + APyDelphiWrapper.DefineVar('ltReadLock', 0); + APyDelphiWrapper.DefineVar('ltWriteLock', 1); + // Values for type TIndexOptions + APyDelphiWrapper.DefineVar('ixPrimary', 0); + APyDelphiWrapper.DefineVar('ixUnique', 1); + APyDelphiWrapper.DefineVar('ixDescending', 2); + APyDelphiWrapper.DefineVar('ixCaseInsensitive', 3); + APyDelphiWrapper.DefineVar('ixExpression', 4); + // Values for type TDataAction + APyDelphiWrapper.DefineVar('daFail', 0); + APyDelphiWrapper.DefineVar('daAbort', 1); + APyDelphiWrapper.DefineVar('daRetry', 2); + // Values for type TUpdateKind + APyDelphiWrapper.DefineVar('ukModify', 0); + APyDelphiWrapper.DefineVar('ukInsert', 1); + APyDelphiWrapper.DefineVar('ukDelete', 2); + // Values for type TUpdateAction + APyDelphiWrapper.DefineVar('uaFail', 0); + APyDelphiWrapper.DefineVar('uaAbort', 1); + APyDelphiWrapper.DefineVar('uaSkip', 2); + APyDelphiWrapper.DefineVar('uaRetry', 3); + APyDelphiWrapper.DefineVar('uaApplied', 4); +end; + +function TPyFireDACRegistration.Name: String; +begin + Result := 'FireDac'; +end; + +procedure TPyFireDACRegistration.RegisterWrappers( + aPyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDBDataset); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDBTable); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDBQuery); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDBField); +end; + +function SqlTimeToVarDate(V : Variant) : Variant; +begin + if VarIsSQLTimeStamp(V) or VarIsSQLTimeStampOffset(V) then + VarCast(Result, V, varDate) + else + Result := V; end; -finalization + +initialization 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; - } + RegisteredUnits.Add( TPyFireDACRegistration.Create ); end; end. diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo.s3db b/PythonForDelphi/Demos/Demo10_FireDAC/Demo.s3db index 1108b97775135eeeee0476db9edb09de10712ab4..b330da869964e4804382992b2af2d610df292f85 100644 GIT binary patch delta 472 zcmY*V%P(V57{BL3G!c)CN2yDg#6kq;oO^F?HIjN%TlJciZb&4S1g%FKkK0R`m>^N# z#%jjGYIeFXn@L78e+Kan*kCbcqwyWHn$7PlzTfNo+?z7@rtGwt&E)lAHgh%it(PSV zyoyyz(Z-FSX$57VM{+;5h+W_UFT^%Tfvs|%1+ec!8h9V-#s;&nvo;G{;`iEh;0CtW zC4pO5G(UsjsMl|T4B&bFk`j9wa*BD<@NQM%-Bipcdrj$Hy}KZ7bQ`xoN_=fhg0OI< zDFxib$zX>0an`p3)aTAeaVE|-XB1MRP zhK@aUrKV|3B}FVBkgRx>|5;KKpRUq6IyCQ4;@^v<;g7!S#U;r_pqq>C|F)o7Lt&TF zeuwvHgUCpR@Yjd~LSiVARJ98cmziipS19r_I#1|{trI%21@-ZVSdJviqgf?+9L=kR za`9Cnyu=-)Pmejwz&~S$l#(5Pw|pKyU^ZqZ98$ha91%A+>ChRb)`*&(I%Ia?Q~51R K{P1+Kzvdg^0F6rk delta 465 zcmYjNOD_Xa6rOtSNTb%Q~&T(#woZF&9KVf;TkFd+h(=HM%urgB4%_eSy^MF2EI;35YG52r#|)7!7BM4ioij zlLAHYDZM)@TBcY!|8?-$_?-~?ouI+A}Or67}-~iQbkefJYP@} z73AwOf9FwS(K4mARq;b{tVMJ0u4ZNh<7Nlr9si#Y6dZbE4(8m)Ht_g(e-`nk-=@rh zNF1A5P>4H(gFY~iVdn!=h-xB@XeXxS#m@;BC3AyV-GZ0FynKzDTtvc0(w6$nkWCo8 w5A9$|ZurmgZFq|qkR7p6`7yGGTzAyQH62?*YG!PQ7=`hY2NJzj+sUW#3oV?C%m4rY diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dpr b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dpr index 4ecb4de1..efe452ab 100644 --- a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dpr +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dpr @@ -2,11 +2,7 @@ program Demo10; uses Forms, - fmMain in 'fmMain.pas' {Main}, - PythonEngine in '..\..\Components\Sources\Core\PythonEngine.pas', - WrapDelphiClasses in '..\..\Components\Sources\Core\WrapDelphiClasses.pas', - pyDBFireDac in '..\..\Components\Sources\FireDAC\pyDBFireDac.pas', - WrapDelphi in '..\..\Components\Sources\Core\WrapDelphi.pas'; + fmMain in 'fmMain.pas' {Main}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dproj b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dproj index f51407e4..c270a21b 100644 --- a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dproj +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.dproj @@ -46,12 +46,6 @@ Base true - - true - Cfg_2 - true - true - true Cfg_2 @@ -115,9 +109,6 @@ DEBUG;USE_FASTMM4_LEAK_MONITOR;FullDebugMode;LogMemoryLeakDetailToFile;$(DCC_Define) - - Debug - true true @@ -127,11 +118,11 @@ 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 + $(BDS)\bin\delphi_PROJECTICON.ico @@ -140,10 +131,6 @@
Main
- - - - Cfg_2 Base @@ -198,15 +185,11 @@ - 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) + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components - False - False False True diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.res b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10.res index b51b21ff26650088b16b2936848703bee07aeb1f..3c461d33f4aa861f3c1d59733f592387f5405e46 100644 GIT binary patch literal 59204 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

&kH|a{QU9j0hR{0KHt_WA9M>c5$M1L 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 R;4jeY@UP=P&I^C;{XfdWl6e3C delta 979 zcmZuvF>BjU5I)OpZ9+j1I+8)oAJTdg!|>fY{a z_37H$bM^h-#re21_TD%2SFLihTH1WqJgTa1cMIwaN?upvvFdC!M H=6CTA7c5oq diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon.ico b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon.ico deleted file mode 100644 index 9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon1.ico b/PythonForDelphi/Demos/Demo10_FireDAC/Demo10_Icon1.ico deleted file mode 100644 index 9d0e1f36a6b4e9e59b3af7de42d9cf94b6d58e1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Example1.py b/PythonForDelphi/Demos/Demo10_FireDAC/Example1.py index 5fdd6a38..a791f159 100644 --- a/PythonForDelphi/Demos/Demo10_FireDAC/Example1.py +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Example1.py @@ -1,7 +1,7 @@ import DBFireDac # Create and open the table -T = DBFireDac.CreateFDTable() +T = DBFireDac.TFDTable(None) T.ConnectionDefName = "SQLite_DB" T.TableName = "Customer" T.Active = True #or use T.Open() diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/Example4.py b/PythonForDelphi/Demos/Demo10_FireDAC/Example4.py index 755d7d7f..b134a04f 100644 --- a/PythonForDelphi/Demos/Demo10_FireDAC/Example4.py +++ b/PythonForDelphi/Demos/Demo10_FireDAC/Example4.py @@ -1,11 +1,11 @@ import DBFireDac # Create and open the Query -Q = DBFireDac.CreateFDQuery() +Q = DBFireDac.TFDQuery(None) Q.ConnectionDefName = "SQLite_DB" -Q.SQL = [ -"select *", -" from ORDERS" ] +Q.SQL.Text = """select * +from ORDERS +""" Q.Open() # or Q.Active = True diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.dfm b/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.dfm index d01353423803c9fff5d06021c3436d55ffc80f17..f0bc771f2cd610e2c7f9d6e7018b2b4cd0263333 100644 GIT binary patch delta 787 zcmb`E!D|yi6vijJA)9VC*+?VCN-b><6@(%d0wM^JUER>M7PGZNFCBNEyMwzk%k0E9 zCwo*uP==m+^`a;N>CvMH{{t`LU!VuUle$T>pkC|o_q}i4eDA%F&bO=8UpjKv+MRWD zss3g5ZS|md&9L{9hBnUIR+&3G;cg2DtAJm== zEp12r9}SQ64<`*a+&4d+w8wZj);LrjX}1zV7)>h%uy$Xt4)uYGQ@|{a1B|E+sB%d}f%g=Mu@<;QESsYzdeUI`Q zKi4Y1DU3+jldopyrql^J^7Z^feM0I>B%dtA<(*@vBY!T$ad-TxgHYAo7>JNjn+Ak} z@h50j6s_YJN=7oathAQ>DAL;-ojbtOYS{tl&f?ZmXWT^Eez6)}Ta?qo7X*gGM;y*I-BFW-{vF>lwo+SzA5P^{CbJp(Ny=mAZvn4w%cdLnsu= z+N@_sDTX@7PX;0eQ><*#V~NcUcn+JU>Ym*cjL=S1|L}}?%jyDBd7wBB5!ZLX1u8fa z(o%=e@w)_BNwO%pCA8W44Qzo3<)jTrr(QL`j(78!=K~W2IKs4zT#)~DTaFp1Eje}p zVJ<`E?(ybTqiD&aH{`lm=wHefgB`MOnoA)AEWlj%+JPf4Y4FxBG=c3B8+f&bIk8I< zExrn3Q3xhSO+7MO{3r0)Ik_O1oGf9-F+NTM8`O8O4I6>m0#-6UN)7#$spWL33BLzG zZ73BvUjy0^U6b>M0N1FbKI_=`<^7fnUH0zjL1s$B`@j$?0N#&=w9xMWLs;q45Q{+_ z3*7VqCV4sjcqATu&E`n&Lzy@^((*R8y%4KeSf# z?_x|k!ZT^bnMC4EEJkR;mx(AGj_wKNSbyua+n6n~PIP1LYB;!XdQlcI(y_?X+H8AN zU@6cDBQ7<`NtL-L9i0HKA@i%fF0s3)=LN{d6v@}sR+_!Xh=4GbXpgmlA>kpri)jbU z8R>>uCx}}_Y?ssJT{*6r-;f=(kzl>p-ob+7MX@Qku;3nU?V8j zYoQMOFpvM(+aIU8Kcqcitnwz+?e?o1l`ri=c3VB=Cx&56$sW4;b7TJ(OvF;axW_8T z7m8cV+m-#4nYoqqJLRU$0I2pYlsh)NDfMF2!JO;va;Wqq`)%~#l3P4f%_Vy$%FMf; rTk6z5<*Ad&SBL(r82ZMDp3h%7pPSeDJ~N{1<@@D-b&I+yTa@uX+(S4U diff --git a/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.pas b/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.pas index 96641722..87cd283f 100644 --- a/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.pas +++ b/PythonForDelphi/Demos/Demo10_FireDAC/fmMain.pas @@ -12,27 +12,22 @@ interface 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, - SynEditCodeFolding; + WrapDelphi, WrapFireDac, SynEditHighlighter, SynHighlighterPython, SynEdit, + SynEditCodeFolding, sqlTimSt, FireDAC.VCLUI.Wait; 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; @@ -62,24 +57,16 @@ TMain = class(TForm) Panel2: TPanel; btnExecuteExample4: TButton; SynEditScript4: TSynEdit; + PyDelphiWrapper: TPyDelphiWrapper; 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; @@ -92,7 +79,6 @@ TMain = class(TForm) implementation - {$R *.DFM} @@ -152,10 +138,6 @@ 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); @@ -214,169 +196,15 @@ function TMain.DBConnectionClosedCheck(aConnectionDefName: String): Boolean; 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; +// pyDBFireDac.g_oDBModule := Sender as TPythonModule; with Sender as TPythonModule do begin with DocString do begin Add( 'This module contains several Object Types that' ); @@ -393,15 +221,6 @@ procedure TMain.modDBFireDacInitialization(Sender: TObject); 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 @@ -429,49 +248,39 @@ procedure TMain.btnExecuteExample1Click(Sender: TObject); 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; + // Instantiate a new Python object TPyTable + pyObj := PyDelphiWrapper.Wrap(tblCustomer); + 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; 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; + // connect the Datasource2 to the Python Table + l_oTable := TFDTable.Create(Self); + l_oTable.TableName := 'Customer'; + l_oTable.Connection := Connection; + Datasource2.Dataset := l_oTable; + l_oTable.Open(); + + pyObj := PyDelphiWrapper.Wrap(l_oTable, soOwned); + 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; end; procedure TMain.btnExecuteExample4Click(Sender: TObject); @@ -485,5 +294,9 @@ procedure TMain.btnExecuteExample4Click(Sender: TObject); end; end; +initialization + ReportMemoryLeaksOnShutdown := True; +finalization + CheckSynchronize; end. diff --git a/PythonForDelphi/Demos/Demo32/Unit1.dfm b/PythonForDelphi/Demos/Demo32/Unit1.dfm index 22a9750800dd63c0deea46967d07f95c11239778..25978023b4cf56dcc27d837c0b0dd6f418302b73 100644 GIT binary patch literal 4106 zcmd5wzO?WL`n?0Un(G1=y&)|= ziQKMmd3e-!d+)ipT{+!@KCQ30v9ru*DM!q7FPXaKox2M*~YfZA7SR!CtjH?C6E zv$Kfhq8!I^y*l!nv0y{;pOkFi6~-G=`b3*+^6SMXQrxU=dqY;{P`5UB?nQ`1T6r!Vv48l(Z&F9c-wEJ4K@oSa2jbGx&1Baifs{fKc)=!x4bzfIcuVm3Dx;H#cls9krrf)}QXkx(GY=+-o_ z^#l5Wm>*p6$dkT&i^6XcpY0adb8MC{tcG^tH|NySsTxm(98*1N~< zI*IuNd=exO;tTLCc;JH|@eFgj=Raw~3zfKsyPKWe-^~1GZsz_jdO^E;bXfDAtp8T@ zyr9>9f`YbGqgu}1mk;Q`WdHE8fsC`idbw9DGQ(^ygZ3#qADZlsOLtDFGW}3V&KpEk zkBB&@+26g=UTD|_ZAxK4<>wCRNY?x&i4BtiIq+Ola;f}6$QwqqNk~`Qu)W$G5~Zo} z*Pgf9d&dXCX>)(?sNV{TPHWGshWr&1k-QA(m07V0=TT;*V5OI2L{aImkNZSu+^32S z-1#0e;m|J*;uE46IpfqV_sxXU74KG;M@>bEpai=zb&sl!2#1;1 z#l&!Gvg8$le$1IMaANvWv(#lAb3aX)`(nymCX1S5r6K%$s7~ym+#YA=!p{*7WS3f3 zfEY647~ju$UM@&TbWARS|MC`i_Gd2z%M;$@j0#gaV1nvu-zX-|^%7cPqgX0~bxcOL zJ-E`ioLo+l zil3E}MVsII?g@q-?NiPrzLbhbn~(nOfb;C`O`hTZ=9)wN@F5Ou(O`o0_$&zxGocL; zAw};c=BBK^3k$`#nj`>!dILjij-iMto46U#^DLr`l*GiHgu)6gWBmB>=OCa5Y%om- zW_lrQb#xEo*+EbdY-^&7a_}|KI@-9d7Sh0$IH@4ml9<~0{|&pOeDV-~BgZ%-0xQBa z#Z)P&@Ic8?62-&}rNBB=EH>CkyotU_<9z(iR~c=lSgpjShGKZrWEm|RHL0VIaq6AT zRI5QE%P%Cy41sRTxS`tM%`)=oRY+q~M+iuVZ`H-=a6Z6Ee8Bg0oULuNVl`C)y4qAY zvx!MHAqcyPW=0eG+F4pC1RF>NUk-_>OR4t5($fd@HZ>^Ql>)9E*;E=#uDBr}9>glP)K0URy4BZHV zoa%^MgGi?DAl*yRUMtr&rknns!&g?jWChno2M+D`_-meXblcjXL&WFVIyp1=cF>+LF&iRdgetsyE6}FmsSo>GM^ zRqJza4rMgvQ*WG5L(WD2x{pPtwQepaUm>zZt8XnW+qL4nvI|xdz?krTYMRO1_0nC1 zSqr#f(|XT-QTBkFfD53W=hERq*!R4 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 -Demo19 C++ Builder: this is a replicate of the Delphi Demo05 -Demo20 C++ Builder: this is a replicate of the Delphi Demo08 -Demo21 Using Events in TPythonModule or TPythonType (Kylix ready) -Demo22 Using Threading, Windows Console and Command line arguments (Kylix ready) -Demo23 Using Threading and Delphi log window. (Kylix ready) -Demo24 Using TAtomPythonEngine (Deprecated since Delphi 6, See VarPyth instead) -Demo25 Using VarPyth.pas (Kylix ready) -Demo26 Demo8 revisited to allow the new Python type to be subclassed -Demo27 Container indexing -Demo28 Iterator (Kylix ready) -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 +Demo01 A simple Python evaluator +Demo02 Evaluate a Python expression +Demo03 Defining Python/Delphi vars +Demo04 Defining Python/Delphi vars (advanced case) +Demo05 Defining a new Module +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 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. (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 +Demo19 C++ Builder: this is a replicate of the Delphi Demo05 +Demo20 C++ Builder: this is a replicate of the Delphi Demo08 +Demo21 Using Events in TPythonModule or TPythonType (Kylix ready) +Demo22 Using Threading, Windows Console and Command line arguments (Kylix ready) +Demo23 Using Threading and Delphi log window. (Kylix ready) +Demo24 Using TAtomPythonEngine (Deprecated since Delphi 6, See VarPyth instead) +Demo25 Using VarPyth.pas (Kylix ready) +Demo26 Demo8 revisited to allow the new Python type to be subclassed +Demo27 Container indexing +Demo28 Iterator (Kylix ready) +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 From 88c06f11e70d471fc5dfd3b1e7e446c09eb5ab9a Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 22 Jan 2018 00:50:00 +0200 Subject: [PATCH 035/123] Compatibility with both Lazarus and (hopefully) Delphi Linux --- PythonForDelphi/Components/P4DFpc.lpk | 66 ------ PythonForDelphi/Components/P4DFpc.pas | 22 -- .../Sources/Core/MethodCallBack.pas | 6 +- .../Components/Sources/Core/PythonEngine.pas | 23 ++- .../Components/Sources/Core/VarPyth.pas | 18 +- .../Components/Sources/Core/WrapDelphi.pas | 4 +- PythonForDelphi/Components/p4dlaz.lpk | 169 ++++++++-------- PythonForDelphi/Components/p4dlaz.pas | 51 ++--- PythonForDelphi/Components/up4dlaz.pas | 28 --- PythonForDelphi/Demos/FPC/Demo06/Project1.lpi | 190 +++++------------- PythonForDelphi/Demos/FPC/Demo06/Project1.res | Bin 138128 -> 138932 bytes PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm | 37 ++-- PythonForDelphi/Demos/FPC/Demo06/Unit1.pas | 5 +- 13 files changed, 207 insertions(+), 412 deletions(-) delete mode 100644 PythonForDelphi/Components/P4DFpc.lpk delete mode 100644 PythonForDelphi/Components/P4DFpc.pas delete mode 100644 PythonForDelphi/Components/up4dlaz.pas diff --git a/PythonForDelphi/Components/P4DFpc.lpk b/PythonForDelphi/Components/P4DFpc.lpk deleted file mode 100644 index 688c17ef..00000000 --- a/PythonForDelphi/Components/P4DFpc.lpk +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_ExternHelp Items="Count"/> - - - diff --git a/PythonForDelphi/Components/P4DFpc.pas b/PythonForDelphi/Components/P4DFpc.pas deleted file mode 100644 index c82e424b..00000000 --- a/PythonForDelphi/Components/P4DFpc.pas +++ /dev/null @@ -1,22 +0,0 @@ -{ This file was automatically created by Lazarus. Do not edit! - This source is only used to compile and install the package. - } - -unit P4DFpc; - -interface - -uses - PythonEngine, MethodCallBack, TinyWideStrings, VarPyth, WrapDelphiClasses, - WrapDelphiTypes, LazarusPackageIntf; - -implementation - -procedure Register; -begin - RegisterUnit('PythonEngine', @PythonEngine.Register); -end; - -initialization - RegisterPackage('P4DFpc', @Register); -end. diff --git a/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas b/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas index 50801ed9..44cfbd8e 100644 --- a/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas +++ b/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas @@ -179,10 +179,10 @@ procedure GetCodeMem(var ptr: PByte; size: integer); {$IFDEF MSWINDOWS} page:=VirtualAlloc(nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); {$ELSE} - page := GetMem(PageSize); - //page := mmap(Pointer($10000000), PageSize, PROT_NONE, MAP_PRIVATE or MAP_ANON, -1, 0); + //page := GetMem(PageSize); + page := mmap(Pointer($10000000), PageSize, PROT_NONE, MAP_PRIVATE or MAP_ANON, -1, 0); mprotect(page, PageSize, PROT_READ or PROT_WRITE or PROT_EXEC); - {$ENDIF} + {$ENDIF} page^.next:=CodeMemPages; CodeMemPages:=page; // init pointer to end of page diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index cc78aa0c..2ce8f55b 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -67,12 +67,17 @@ interface uses + Types, {$IFDEF MSWINDOWS} Windows, -{$ENDIF} -{$IFDEF LINUX} - Types, +{$ELSE} +{$IFDEF FPC} dynlibs, +{$ELSE} +{$IFDEF LINUX} + Libc, +{$ENDIF} +{$ENDIF} {$ENDIF} Classes, SysUtils, @@ -3462,10 +3467,13 @@ procedure TDynamicDll.Quit; {$IFDEF MSWINDOWS} MessageBox( GetActiveWindow, PChar(GetQuitMessage), 'Error', MB_TASKMODAL or MB_ICONSTOP ); ExitProcess( 1 ); -{$ENDIF} -{$IFDEF LINUX} +{$ELSE} WriteLn(ErrOutput, GetQuitMessage); +{$IFDEF FPC} Halt( 1 ); +{$ELSE} + __exit(1); +{$ENDIF} {$ENDIF} end; end; @@ -3512,7 +3520,7 @@ constructor TPythonInterface.Create(AOwner: TComponent); procedure TPythonInterface.AfterLoad; begin inherited; - FIsPython3000 := Pos('PYTHON3', UpperCase(DLLName)) = 1; + FIsPython3000 := Pos('PYTHON3', UpperCase(DLLName)) > 0; FMajorVersion := StrToInt(DLLName[7 {$IFDEF LINUX}+3{$ENDIF}]); FMinorVersion := StrToInt(DLLName[8{$IFDEF LINUX}+4{$ENDIF}]); @@ -3529,8 +3537,7 @@ procedure TPythonInterface.AfterLoad; if FatalMsgDlg then {$IFDEF MSWINDOWS} MessageBox( GetActiveWindow, PChar(E.Message), 'Error', MB_TASKMODAL or MB_ICONSTOP ); -{$ENDIF} -{$IFDEF LINUX} +{$ELSE} WriteLn( ErrOutput, E.Message ); {$ENDIF} if FatalAbort then Quit; diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index 3490ce51..7fb3013c 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -127,9 +127,9 @@ TNamedParamDesc = record {$IFDEF DELPHIXE2_OR_HIGHER} {$DEFINE USESYSTEMDISPINVOKE} //Delphi 2010 DispInvoke is buggy {$ENDIF} -{$IF DEFINED(FPC_FULLVERSION) and (FPC_FULLVERSION >= 20500)} - {$DEFINE USESYSTEMDISPINVOKE} -{$IFEND} +{$.IF DEFINED(FPC_FULLVERSION) and (FPC_FULLVERSION >= 20500)} + {.$DEFINE USESYSTEMDISPINVOKE} +{.$IFEND} { Python variant type handler } TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) @@ -146,7 +146,7 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) procedure PythonObjectToVarData( var Dest : TVarData; AObject : PPyObject; APythonAtomCompatible : Boolean ); procedure PyhonVarDataCreate( var Dest : TVarData; AObject : PPyObject ); {$IFNDEF USESYSTEMDISPINVOKE} - procedure DoDispInvoke(Dest: PVarData; const Source: TVarData; + procedure DoDispInvoke(Dest: PVarData; var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); virtual; function GetPropertyWithArg(var Dest: TVarData; const V: TVarData; const AName: AnsiString; AArg : TVarData): Boolean; virtual; @@ -180,14 +180,14 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) const Arguments: TVarDataArray): Boolean; override; function GetProperty(var Dest: TVarData; const V: TVarData; const AName: string): Boolean; override; - function SetProperty(const V: TVarData; const AName: string; + function SetProperty({$IFDEF FPC}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; const Value: TVarData): Boolean; override; {$IFDEF DELPHIXE7_OR_HIGHER} procedure DispInvoke(Dest: PVarData; [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; {$ELSE} procedure DispInvoke(Dest: PVarData; - const Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; + var Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; {$ENDIF} end; @@ -941,7 +941,7 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData; [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); {$ELSE} procedure TPythonVariantType.DispInvoke(Dest: PVarData; - const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); + var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); {$ENDIF} {$IFDEF USESYSTEMDISPINVOKE} {$IFDEF DELPHIXE2_OR_HIGHER} @@ -1088,7 +1088,7 @@ TStringDesc = record end; procedure TPythonVariantType.DoDispInvoke(Dest: PVarData; - const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); + var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); type PParamRec = ^TParamRec; TParamRec = array[0..3] of LongInt; @@ -1863,7 +1863,7 @@ function TPythonVariantType.RightPromotion(const V: TVarData; Result := False; end; -function TPythonVariantType.SetProperty(const V: TVarData; +function TPythonVariantType.SetProperty({$IFDEF FPC}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; const Value: TVarData): Boolean; var _newValue : PPyObject; diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas index 5e632be7..7e074d6a 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas @@ -1106,12 +1106,12 @@ function PythonToSet(ASet : PPyObject; APropInfo: PPropInfo) : Integer; {$IFDEF FPC} function GetPropValue(Instance: TObject; PropInfo: PPropInfo): Variant; begin - Result := Variants.GetPropValue(Instance, PropInfo^.Name); + Result := Variants.GetPropValue(Instance, PropInfo, False); end; procedure SetPropValue(Instance: TObject; PropInfo: PPropInfo; const Value: Variant); begin - Variants.SetPropValue(Instance, PropInfo^.Name, Value); + Variants.SetPropValue(Instance, PropInfo, Value); end; {$ENDIF} diff --git a/PythonForDelphi/Components/p4dlaz.lpk b/PythonForDelphi/Components/p4dlaz.lpk index afdb8f03..c910748b 100644 --- a/PythonForDelphi/Components/p4dlaz.lpk +++ b/PythonForDelphi/Components/p4dlaz.lpk @@ -1,85 +1,84 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ExternHelp Items="Count"/> + + + diff --git a/PythonForDelphi/Components/p4dlaz.pas b/PythonForDelphi/Components/p4dlaz.pas index 7980a0cb..de2e1a12 100644 --- a/PythonForDelphi/Components/p4dlaz.pas +++ b/PythonForDelphi/Components/p4dlaz.pas @@ -1,25 +1,26 @@ -{ This file was automatically created by Lazarus. Do not edit! - This source is only used to compile and install the package. - } - -unit P4DLaz; - -interface - -uses - PythonEngine, PythonGUIInputOutput, MethodCallBack, TinyWideStrings, - VarPyth, WrapDelphi, WrapDelphiButtons, WrapDelphiClasses, - WrapDelphiControls, WrapDelphiTypes, LazarusPackageIntf; - -implementation - -procedure Register; -begin - RegisterUnit('PythonEngine', @PythonEngine.Register); - RegisterUnit('PythonGUIInputOutput', @PythonGUIInputOutput.Register); - RegisterUnit('WrapDelphi', @WrapDelphi.Register); -end; - -initialization - RegisterPackage('P4DLaz', @Register); -end. +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit P4DLaz; + +{$warn 5023 off : no warning about unused units} +interface + +uses + PythonEngine, PythonGUIInputOutput, MethodCallBack, VarPyth, WrapDelphi, + WrapDelphiButtons, WrapDelphiClasses, WrapDelphiControls, WrapDelphiTypes, + LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('PythonEngine', @PythonEngine.Register); + RegisterUnit('PythonGUIInputOutput', @PythonGUIInputOutput.Register); + RegisterUnit('WrapDelphi', @WrapDelphi.Register); +end; + +initialization + RegisterPackage('P4DLaz', @Register); +end. diff --git a/PythonForDelphi/Components/up4dlaz.pas b/PythonForDelphi/Components/up4dlaz.pas deleted file mode 100644 index 1f2dee6b..00000000 --- a/PythonForDelphi/Components/up4dlaz.pas +++ /dev/null @@ -1,28 +0,0 @@ -{ This file was automatically created by Lazarus. Do not edit! - This source is only used to compile and install the package. - } - -unit uP4DLaz; - -interface - -uses - PythonEngine, PythonGUIInputOutput, MethodCallBack, WrapDelphiWindows, - TinyWideStrings, VarPyth, WrapDelphi, WrapDelphiActnList, WrapDelphiButtons, - WrapDelphiClasses, WrapDelphiComCtrls, WrapDelphiControls, - WrapDelphiExtCtrls, WrapDelphiForms, WrapDelphiGraphics, WrapDelphiGrids, - WrapDelphiStdCtrls, WrapDelphiTypes, WrapDelphiVCL, LazarusPackageIntf; - -implementation - -procedure Register; -begin - RegisterUnit('PythonEngine', @PythonEngine.Register); - RegisterUnit('PythonGUIInputOutput', @PythonGUIInputOutput.Register); - RegisterUnit('WrapDelphi', @WrapDelphi.Register); - RegisterUnit('uP4DLaz', @uP4DLaz.Register); -end; - -initialization - RegisterPackage('P4DLaz', @Register); -end. diff --git a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi index f740b927..21a8b55f 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi +++ b/PythonForDelphi/Demos/FPC/Demo06/Project1.lpi @@ -1,7 +1,7 @@ - + @@ -11,7 +11,6 @@ - @@ -31,19 +30,18 @@ - - + - - - + + + @@ -52,25 +50,25 @@ - - - + + + + - + - - - - - + + + + @@ -78,147 +76,49 @@ - - - - + + - - + - + - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -239,8 +139,8 @@ - - + + diff --git a/PythonForDelphi/Demos/FPC/Demo06/Project1.res b/PythonForDelphi/Demos/FPC/Demo06/Project1.res index 7c6cf3e4be6fa881cb2f2caa9bda693328155c28..877868cb4251927ab961b2295948c0d753ecb7cd 100644 GIT binary patch delta 823 zcmaKq&u-H|5XK!MK?N!|q#n270*8rry}R~qyjHVG8( z1E6s>)y3SQx0$OH0@#$?Nm&-N%IG&Ebfgb@A54G=VLSrDSqO}#92B<(Fc#VvLp8Pd zV-NYm-DSP(Uv_i{mvTZyA{B5gYpzW+2oq>f0b@7_xRq43-2brRX6&-j%T!)gw-4?!j;^en0n(W@grz?l0R zD_sq@U=-^zJDjVT8NO5#XJY?vymsX<_FIY9HaFror7iV!dOhGwo=g@)&-*;?ei?T= K7vt_dx%UV7hV#S# delta 62 zcmdn8mt(?qjtL4(;>;73{%Ar33({?G%Rq diff --git a/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm b/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm index 314e7128..c02dca2b 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm +++ b/PythonForDelphi/Demos/FPC/Demo06/Unit1.lfm @@ -1,30 +1,32 @@ object Form1: TForm1 Left = 233 - Height = 337 + Height = 500 Top = 175 - Width = 528 + Width = 800 + ActiveControl = Button1 Caption = 'Demo of Python' - ClientHeight = 337 - ClientWidth = 528 + ClientHeight = 500 + ClientWidth = 800 Color = clBtnFace Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' - LCLVersion = '1.5' + LCLVersion = '1.8.0.6' + Visible = False object Splitter1: TSplitter Cursor = crVSplit Left = 0 Height = 3 Top = 145 - Width = 528 + Width = 800 Align = alTop ResizeAnchor = akTop end object Memo1: TMemo Left = 0 - Height = 121 + Height = 284 Top = 148 - Width = 528 + Width = 800 Align = alClient Lines.Strings = ( 'import sys' @@ -46,15 +48,15 @@ object Form1: TForm1 object Panel1: TPanel Left = 0 Height = 68 - Top = 269 - Width = 528 + Top = 432 + Width = 800 Align = alBottom BevelOuter = bvNone ClientHeight = 68 - ClientWidth = 528 + ClientWidth = 800 TabOrder = 0 object Button1: TButton - Left = 6 + Left = 40 Height = 25 Top = 8 Width = 115 @@ -90,19 +92,18 @@ object Form1: TForm1 TabOrder = 3 end object Edit1: TEdit - Left = 368 - Height = 24 - Top = 32 - Width = 161 + Left = 500 + Height = 20 + Top = 8 + Width = 150 TabOrder = 4 - Text = 'Edit1' end end object Memo2: TMemo Left = 0 Height = 145 Top = 0 - Width = 528 + Width = 800 Align = alTop Lines.Strings = ( 'Memo2' diff --git a/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas b/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas index 76f79034..85b22e63 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas +++ b/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas @@ -16,7 +16,11 @@ interface PythonEngine, PythonGUIInputOutput; type + + { TForm1 } + TForm1 = class(TForm) + Edit1: TEdit; PythonEngine1: TPythonEngine; Memo1: TMemo; PythonType1: TPythonType; @@ -30,7 +34,6 @@ TForm1 = class(TForm) SaveDialog1: TSaveDialog; PythonDelphiVar1: TPythonDelphiVar; Button4: TButton; - Edit1: TEdit; PythonGUIInputOutput1: TPythonGUIInputOutput; Memo2: TMemo; procedure Button1Click(Sender: TObject); From 50abdad887dc6c5af8e6b05b56e52bb9d831baf3 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 22 Jan 2018 20:57:36 +0200 Subject: [PATCH 036/123] Create README.md --- PythonVCL/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 PythonVCL/README.md diff --git a/PythonVCL/README.md b/PythonVCL/README.md new file mode 100644 index 00000000..d590c226 --- /dev/null +++ b/PythonVCL/README.md @@ -0,0 +1 @@ +** THIS FOLDER CONTAINS DATED STUFF WHICH IS NO LONGER SUPPORTED ** From e662122e11cd8827acf17885dc27d76ff7b90224 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 22 Jan 2018 20:59:16 +0200 Subject: [PATCH 037/123] Create README.md --- Install/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Install/README.md diff --git a/Install/README.md b/Install/README.md new file mode 100644 index 00000000..144b296f --- /dev/null +++ b/Install/README.md @@ -0,0 +1 @@ +** THIS FOLDER IS FOR THE P4D INSTALLER WHICH IS CURRENTLY NOT SUPPORTED ** From 06f33aaef01f83ba3fbb537fcef9aa66b4be350a Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 22 Jan 2018 21:10:06 +0200 Subject: [PATCH 038/123] Update Readme.txt --- PythonForDelphi/Readme.txt | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/PythonForDelphi/Readme.txt b/PythonForDelphi/Readme.txt index e7245f0d..f252a003 100644 --- a/PythonForDelphi/Readme.txt +++ b/PythonForDelphi/Readme.txt @@ -62,6 +62,8 @@ INSTALLATION: 1) Install the core components ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + For recent versions of Delphi, install the "Python_d" package located in the + Components folder and add the folder "...\Components\Sources\Core". For Delphi 3, install the "Python_d3" package located in the Components folder and add the folder "...\Components\Sources\Core". @@ -81,6 +83,9 @@ INSTALLATION: 2) Install the VCL components (this is optional) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + For recent versions of Delphi, install the "PythonVCL_d" package located in the + Components folder and add the folder "...\Components\Sources\Core". + For Delphi 3, install the "PythonVCL_d3" package located in the Components folder and add the folder "...\Components\Sources\VCL". @@ -120,14 +125,6 @@ NOTE: Don't forget to look at the tutorial file (tutorial.txt) which introduces the demos. - Visit the site http://starship.python.net/crew/mhammond/ and get the last version - of Pythonwin. It's a really good Python IDE, that you must have for serious - Python programming and debugging ! - -UPDATE: -~~~~~~~ - You'll find the latest version at http://mmm-experts.com/ - DISTRIBUTION: ~~~~~~~~~~~~~ You are free to distribute your applications built with Python for Delphi, From a4fd2b47df0701f634e08accd353b79ea2e74490 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 22 Jan 2018 21:12:37 +0200 Subject: [PATCH 039/123] --- PythonForDelphi/Components/Sources/Core/VarPyth.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index 7fb3013c..38458e11 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -127,7 +127,7 @@ TNamedParamDesc = record {$IFDEF DELPHIXE2_OR_HIGHER} {$DEFINE USESYSTEMDISPINVOKE} //Delphi 2010 DispInvoke is buggy {$ENDIF} -{$.IF DEFINED(FPC_FULLVERSION) and (FPC_FULLVERSION >= 20500)} +{.$IF DEFINED(FPC_FULLVERSION) and (FPC_FULLVERSION >= 20500)} {.$DEFINE USESYSTEMDISPINVOKE} {.$IFEND} From c654c83e2719c9512478b1df74c8320c3cfc2c00 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 25 Jan 2018 02:09:50 +0200 Subject: [PATCH 040/123] Added new support unit PythonVersions.pas --- .../Sources/Core/PythonVersions.pas | 322 ++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 PythonForDelphi/Components/Sources/Core/PythonVersions.pas diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas new file mode 100644 index 00000000..a6c77ece --- /dev/null +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -0,0 +1,322 @@ +{----------------------------------------------------------------------------- + Unit Name: PythonVersions + Author: Kiriakos + Date: PyScripter + Purpose: Discover and get info about Python versions + Part of the Python for Delphi library + + History: +-----------------------------------------------------------------------------} + +unit PythonVersions; + +interface +Uses + Classes; + +type + + TPythonVersion = record + private + FDisplayName: string; + FHelpFile: string; + function GetDLLName: string; + function GetSysArchitecture:string; + function GetIsPython3K: Boolean; + function GetHelpFile: string; + function GetDisplayName: string; + public + IsRegistered: Boolean; + IsAllUsers: Boolean; + SysVersion: string; + Version: string; + DLLPath: string; + InstallPath: string; + PythonPath: string; + procedure AssignTo(PythonEngine: TPersistent); + property DLLName: string read GetDLLName; + property SysArchitecture: string read GetSysArchitecture; + property IsPython3K: Boolean read GetIsPython3K; + property HelpFile: string read GetHelpFile write FHelpFile; + property DisplayName: string read GetDisplayName write FDisplayName; + end; + + TPythonVersions = array of TPythonVersion; + + (* Compares two Version strings and returns -1, 0, 1 depending on result *) + function CompareVersions(const A, B : String) : Integer; + + + {$IFDEF MSWINDOWS} + (* Checks whether a Python version is registered and returns the related info *) + function GetRegisterPythonVersion(SysVersion: string; + out PythonVersion: TPythonVersion): Boolean; + (* Returns all registered Python versions *) + function GetRegisteredPythonVersions : TPythonVersions; + (* Returns the highest numbered registered Python version *) + function GetLatestRegisteredPythonVersion(PythonVersion: TPythonVersion): Boolean; + {$ENDIF} + +implementation + +Uses + {$IFDEF MSWINDOWS} + Windows, + {$ENDIF} + SysUtils, + Math, + Registry, + PythonEngine; + +{ TPythonVersion } + +function TPythonVersion.GetDLLName: string; +begin + {$IFDEF MSWINDOWS} + Result := 'python' + SysVersion[1] + SysVersion[3] + '.dll'; + {$ELSE} + Result := 'libpython' + SysVersion + '.so'; + {$ENDIF} +end; + +function TPythonVersion.GetSysArchitecture: string; +begin + Result := ''; + {$IFDEF CPUX64} + Result := '64bit'; + {$ENDIF} + {$IFDEF CPU64} + Result := '64bit'; + {$ENDIF} + {$IFDEF CPU64bits} + Result := '64bit'; + {$ENDIF} + if Result = '' then + Result := '32bit'; +end; + +procedure TPythonVersion.AssignTo(PythonEngine: TPersistent); +begin + if PythonEngine is TPythonEngine then begin + TPythonEngine(PythonEngine).UseLastKnownVersion := False; + TPythonEngine(PythonEngine).RegVersion := SysVersion; + TPythonEngine(PythonEngine).DllName := DLLName; + TPythonEngine(PythonEngine).DllPath := DLLPath; + end; +end; + +function TPythonVersion.GetDisplayName: string; +begin + Result := FDisplayName; + if Result = '' then + Result := Format('Python %s (%s)', [SysVersion, SysArchitecture]); +end; + +function TPythonVersion.GetHelpFile: string; +var + PythonHelpFilePath: string; + Res: Integer; + SR: TSearchRec; +begin + Result := FHelpFile; + // for unregistered Python + if (Result = '') and (InstallPath <> '') then + begin + PythonHelpFilePath := InstallPath + '\Doc\python*.chm'; + Res := FindFirst(PythonHelpFilePath, faAnyFile, SR); + if Res = 0 then + Result := InstallPath + '\Doc\' + SR.Name; + FindClose(SR); + end; +end; + +function TPythonVersion.GetIsPython3K: Boolean; +begin + try + Result := StrToInt(SysVersion[1]) >= 3; + except + Result := False; + end; +end; + +function CompareVersions(const A, B : String) : Integer; +var + i : Integer; + _delta : Integer; + _version1 : TStringList; + _version2 : TStringList; + _version : TStringList; +begin + Result := 0; + _version1 := TStringList.Create; + try + _version1.Delimiter := '.'; + _version1.DelimitedText := A; + _version2 := TStringList.Create; + try + _version2.Delimiter := '.'; + _version2.DelimitedText := B; + for i := 0 to Min(_version1.Count, _version2.Count)-1 do + begin + try + _delta := StrToInt(_version1[i]) - StrToInt(_version2[i]); + except + _delta := CompareText(_version1[i], _version2[i]); + end; + if _delta <> 0 then + begin + if _delta > 0 then + Result := 1 + else + Result := -1; + Break; + end; + end; + // if we have an equality but the 2 versions don't have the same number of parts + // then check the remaining parts of the stronger version, and if it contains + // something different from 0, it will win. + if Result = 0 then + if _version1.Count <> _version2.Count then + begin + if _version1.Count > _version2.Count then + _version := _version1 + else + _version := _version2; + for i := Min(_version1.Count, _version2.Count) to _version.Count-1 do + begin + if StrToIntDef(_version[i], -1) <> 0 then + begin + if _version1.Count > _version2.Count then + Result := 1 + else + Result := -1; + Break; + end; + end; + end; + finally + _version2.Free; + end; + finally + _version1.Free; + end; +end; + +{$IFDEF MSWINDOWS} +function GetRegisterPythonVersion(SysVersion: string; + out PythonVersion: TPythonVersion): Boolean; + // Python provides for All user and Current user installations + // All User installations place the Python DLL in the Windows System directory + // and write registry info to HKEY_LOCAL_MACHINE + // Current User installations place the DLL in the install path and + // the registry info in HKEY_CURRENT_USER. + // Hence, for Current user installations we need to try and find the install path + // since it may not be on the system path. + + // The above convension was changed in Python 3.5. Now even for all user + // installations the dll is located at the InstallPath. + // Also from version 3.5 onwards 32 bit version have a suffix -32 e.g. "3.6-32" + // See also PEP 514 + + function ReadFromRegistry(Root: HKEY; key: string): Boolean; + begin + Result := False; + try + with TRegistry.Create(KEY_READ and not KEY_NOTIFY) do + try + RootKey := Root; + if OpenKey(Key + '\InstallPath', False) then begin + PythonVersion.InstallPath := ReadString(''); + if PythonVersion.IsAllUsers and (CompareVersions(SysVersion, '3.5') < 0) then + PythonVersion.DLLPath := '' + else + PythonVersion.DLLPath := PythonVersion.InstallPath; + CloseKey; + end; + Result := PythonVersion.InstallPath <> ''; + if not Result then Exit; + + if OpenKey(Key, False) then begin + PythonVersion.DisplayName := ReadString('DisplayName'); + PythonVersion.Version := ReadString('Version'); + CloseKey; + end; + if OpenKey(Key + '\PythonPath', False) then begin + PythonVersion.PythonPath := ReadString(''); + CloseKey; + end; + if OpenKey(Key + '\Help\Main Python Documentation', False) then begin + PythonVersion.HelpFile := ReadString(''); + CloseKey; + end; + finally + Free; + end; + except + end; + + end; + +var + key: string; + VersionSuffix: string; +begin + // Initialize PythohVersion + Finalize(PythonVersion); + FillChar(PythonVersion, SizeOf(TPythonVersion), 0); + + VersionSuffix := ''; +{$IFDEF CPUX86} + if CompareVersions(SysVersion, '3.5') >= 0 then + VersionSuffix := '-32'; +{$ENDIF} + key := Format('\Software\Python\PythonCore\%s%s', [SysVersion, VersionSuffix]); + + + PythonVersion.SysVersion := SysVersion; + // First try HKEY_CURRENT_USER as per PEP514 + PythonVersion.IsAllUsers := False; + Result := ReadFromRegistry(HKEY_CURRENT_USER, key); + + //Then try for an all user installation + if not Result then begin + PythonVersion.IsAllUsers := True; + Result := ReadFromRegistry(HKEY_LOCAL_MACHINE, key); + end; + + PythonVersion.IsRegistered := Result; +end; + +function GetRegisteredPythonVersions : TPythonVersions; +Var + Count: Integer; + I: Integer; + PythonVersion : TPythonVersion; +begin + Count := 0; + SetLength(Result, High(PYTHON_KNOWN_VERSIONS) - COMPILED_FOR_PYTHON_VERSION_INDEX + 1); + for I := High(PYTHON_KNOWN_VERSIONS) downto COMPILED_FOR_PYTHON_VERSION_INDEX do + if GetRegisterPythonVersion(PYTHON_KNOWN_VERSIONS[I].RegVersion, PythonVersion) then + begin + Result[Count] := PythonVersion; + Inc(Count); + end; + SetLength(Result, Count); +end; + +function GetLatestRegisteredPythonVersion(PythonVersion: TPythonVersion): Boolean; +Var + I: Integer; +begin + Result := False; + for I := High(PYTHON_KNOWN_VERSIONS) downto COMPILED_FOR_PYTHON_VERSION_INDEX do + begin + Result := GetRegisterPythonVersion(PYTHON_KNOWN_VERSIONS[I].RegVersion, PythonVersion); + if Result then break; + end; +end; + +{$ENDIF} + + +end. From 1a047528fdb5a475ac0d7624c2d59887c94baf3a Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 27 Jan 2018 14:24:33 +0200 Subject: [PATCH 041/123] Py_UseClassExceptionsFlag removed in Python 3.7 Not used since Python 2. --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 2ce8f55b..237617dd 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -31,7 +31,7 @@ (* Stefan Hoffmeister (Stefan.Hoffmeister@Econos.de) *) (* Michiel du Toit (micdutoit@hsbfn.com) - Lazarus Port *) (* Chris Nicolai (nicolaitanes@gmail.com) *) -(* Kiriakos Vlahos (pyscripter@gmail.com) *) +(* Kiriakos Vlahos (pyscripter@gmail.com) *) (* Andrey Gruzdev (andrey.gruzdev@gmail.com) *) (**************************************************************************) (* This source code is distributed with no WARRANTY, for no reason or use.*) @@ -3581,9 +3581,9 @@ procedure TPythonInterface.MapDll; Py_InteractiveFlag := Import('Py_InteractiveFlag'); Py_OptimizeFlag := Import('Py_OptimizeFlag'); Py_NoSiteFlag := Import('Py_NoSiteFlag'); - Py_UseClassExceptionsFlag := Import('Py_UseClassExceptionsFlag'); Py_FrozenFlag := Import('Py_FrozenFlag'); if not IsPython3000 then begin + Py_UseClassExceptionsFlag := Import('Py_UseClassExceptionsFlag'); Py_TabcheckFlag := Import('Py_TabcheckFlag'); Py_UnicodeFlag := Import('Py_UnicodeFlag'); end; @@ -4723,9 +4723,9 @@ procedure TPythonEngine.AssignPyFlags; SetFlag(Py_InteractiveFlag, pfInteractive in FPyFlags); SetFlag(Py_OptimizeFlag, pfOptimize in FPyFlags); SetFlag(Py_NoSiteFlag, pfNoSite in FPyFlags); - SetFlag(Py_UseClassExceptionsFlag, pfUseClassExceptionsFlag in FPyFlags); SetFlag(Py_FrozenFlag, pfFrozenFlag in FPyFlags); if not IsPython3000 then begin + SetFlag(Py_UseClassExceptionsFlag, pfUseClassExceptionsFlag in FPyFlags); SetFlag(Py_UnicodeFlag, pfUnicode in FPyFlags); SetFlag(Py_TabcheckFlag, pfTabcheck in FPyFlags); end; From 2c446450a5a5b663fa7a8c644d9416852c3c416c Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 29 Jan 2018 01:21:34 +0200 Subject: [PATCH 042/123] Better version of CompareVersions --- .../Sources/Core/PythonVersions.pas | 97 ++++++++----------- 1 file changed, 38 insertions(+), 59 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index a6c77ece..8c981cd0 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -44,7 +44,7 @@ TPythonVersion = record TPythonVersions = array of TPythonVersion; (* Compares two Version strings and returns -1, 0, 1 depending on result *) - function CompareVersions(const A, B : String) : Integer; + function CompareVersions(A, B : String) : Integer; {$IFDEF MSWINDOWS} @@ -139,67 +139,46 @@ function TPythonVersion.GetIsPython3K: Boolean; end; end; -function CompareVersions(const A, B : String) : Integer; +function CompareVersions(A, B : String) : Integer; + + function GetNextNumber(var Version: string): Integer; + var + P: Integer; + S: string; + begin + P := Pos('.', Version); + if P > 0 then + begin + S := Copy(Version, 1, P - 1); + Version := Copy(Version, P + 1, Length(Version) - P); + end + else + begin + S := Version; + Version := ''; + end; + Result := StrToIntDef(S, 0) + end; + var - i : Integer; - _delta : Integer; - _version1 : TStringList; - _version2 : TStringList; - _version : TStringList; + N1, N2: Integer; begin Result := 0; - _version1 := TStringList.Create; - try - _version1.Delimiter := '.'; - _version1.DelimitedText := A; - _version2 := TStringList.Create; - try - _version2.Delimiter := '.'; - _version2.DelimitedText := B; - for i := 0 to Min(_version1.Count, _version2.Count)-1 do - begin - try - _delta := StrToInt(_version1[i]) - StrToInt(_version2[i]); - except - _delta := CompareText(_version1[i], _version2[i]); - end; - if _delta <> 0 then - begin - if _delta > 0 then - Result := 1 - else - Result := -1; - Break; - end; - end; - // if we have an equality but the 2 versions don't have the same number of parts - // then check the remaining parts of the stronger version, and if it contains - // something different from 0, it will win. - if Result = 0 then - if _version1.Count <> _version2.Count then - begin - if _version1.Count > _version2.Count then - _version := _version1 - else - _version := _version2; - for i := Min(_version1.Count, _version2.Count) to _version.Count-1 do - begin - if StrToIntDef(_version[i], -1) <> 0 then - begin - if _version1.Count > _version2.Count then - Result := 1 - else - Result := -1; - Break; - end; - end; - end; - finally - _version2.Free; - end; - finally - _version1.Free; - end; + repeat + N1 := GetNextNumber(A); + N2 := GetNextNumber(B); + if N2 > N1 then + begin + Result := 1; + Exit; + end + else + if N2 < N1 then + begin + Result := -1; + Exit; + end + until (A = '') and (B = ''); end; {$IFDEF MSWINDOWS} From fc4308618de95dd6f3a1047059f0072a318e7d08 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 30 Jan 2018 01:49:31 +0200 Subject: [PATCH 043/123] Changed CompareVersions to make it "Delphi compare" like. --- .../Components/Sources/Core/PythonVersions.pas | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index 8c981cd0..1fe8ab73 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -43,7 +43,11 @@ TPythonVersion = record TPythonVersions = array of TPythonVersion; - (* Compares two Version strings and returns -1, 0, 1 depending on result *) + (* + Compares two Version strings and returns -1, 0, 1 depending on result + The function result has the semantics of Delphi compare functions + -1: A is bigger (newer), 0: equal versions, 1: B is bigger (newer) + *) function CompareVersions(A, B : String) : Integer; @@ -206,7 +210,7 @@ function GetRegisterPythonVersion(SysVersion: string; RootKey := Root; if OpenKey(Key + '\InstallPath', False) then begin PythonVersion.InstallPath := ReadString(''); - if PythonVersion.IsAllUsers and (CompareVersions(SysVersion, '3.5') < 0) then + if PythonVersion.IsAllUsers and (CompareVersions(SysVersion, '3.5') > 0) then PythonVersion.DLLPath := '' else PythonVersion.DLLPath := PythonVersion.InstallPath; @@ -246,7 +250,7 @@ function GetRegisterPythonVersion(SysVersion: string; VersionSuffix := ''; {$IFDEF CPUX86} - if CompareVersions(SysVersion, '3.5') >= 0 then + if CompareVersions(SysVersion, '3.5') <= 0 then VersionSuffix := '-32'; {$ENDIF} key := Format('\Software\Python\PythonCore\%s%s', [SysVersion, VersionSuffix]); From bbd80bfe655372f736ffd63c7a12dc3946127765 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 30 Jan 2018 04:00:18 +0200 Subject: [PATCH 044/123] Fix for Python 3.7. Demo 34 added to demonstrate PythonVesions. --- .../Components/Sources/Core/PythonEngine.pas | 13 +- PythonForDelphi/Demos/Demo34/Project1.dpr | 20 + PythonForDelphi/Demos/Demo34/Project1.dproj | 558 ++++++++++++++++++ PythonForDelphi/Demos/Demo34/Project1.res | Bin 0 -> 3212 bytes .../Demos/Demo34/Project1_Icon.ico | Bin 0 -> 766 bytes PythonForDelphi/Demos/Demo34/Unit1.dfm | Bin 0 -> 3404 bytes PythonForDelphi/Demos/Demo34/Unit1.pas | 356 +++++++++++ PythonForDelphi/Demos/readme.txt | 1 + PythonForDelphi/Tutorial.txt | 9 + 9 files changed, 956 insertions(+), 1 deletion(-) create mode 100644 PythonForDelphi/Demos/Demo34/Project1.dpr create mode 100644 PythonForDelphi/Demos/Demo34/Project1.dproj create mode 100644 PythonForDelphi/Demos/Demo34/Project1.res create mode 100644 PythonForDelphi/Demos/Demo34/Project1_Icon.ico create mode 100644 PythonForDelphi/Demos/Demo34/Unit1.dfm create mode 100644 PythonForDelphi/Demos/Demo34/Unit1.pas diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 237617dd..e0c08f2e 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -838,9 +838,20 @@ interface tp_cache : PPyObject; tp_subclasses : PPyObject; tp_weaklist : PPyObject; + tp_del : PyDestructor; + tp_version_tag : NativeUInt; // Type attribute cache version tag. Added in version 2.6 + tp_finalize : PyDestructor; //More spares + tp_xxx1 : NativeInt; + tp_xxx2 : NativeInt; + tp_xxx3 : NativeInt; + tp_xxx4 : NativeInt; + tp_xxx5 : NativeInt; + tp_xxx6 : NativeInt; tp_xxx7 : NativeInt; - tp_xxx8 : LongInt; + tp_xxx8 : NativeInt; + tp_xxx9 : NativeInt; + tp_xxx10 : NativeInt; end; PPyMethodChain = ^PyMethodChain; diff --git a/PythonForDelphi/Demos/Demo34/Project1.dpr b/PythonForDelphi/Demos/Demo34/Project1.dpr new file mode 100644 index 00000000..f46c9722 --- /dev/null +++ b/PythonForDelphi/Demos/Demo34/Project1.dpr @@ -0,0 +1,20 @@ +program Project1; + +{$I Definition.Inc} + +uses + {$IFDEF MSWINDOWS} + Forms, + {$ENDIF } + {$IFDEF LINUX} + QForms, + {$ENDIF } + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/PythonForDelphi/Demos/Demo34/Project1.dproj b/PythonForDelphi/Demos/Demo34/Project1.dproj new file mode 100644 index 00000000..b4f73f07 --- /dev/null +++ b/PythonForDelphi/Demos/Demo34/Project1.dproj @@ -0,0 +1,558 @@ + + + {910E2A03-F875-4153-9E58-3434C6D9AB6F} + Project1.dpr + Debug + DCC32 + 18.3 + VCL + True + Win32 + 3 + 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 + + + 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= + + + 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) + + + 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 + + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + True + True + + + + + Project1.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/Demo34/Project1.res b/PythonForDelphi/Demos/Demo34/Project1.res new file mode 100644 index 0000000000000000000000000000000000000000..4aaa52b58fe7a050045830385e4d1dd561dc1ca3 GIT binary patch literal 3212 zcmbtX!B5*(82=b(K(&q@cGyn!q8+A5PVB@92?|hDS{g01Rbkz2lVd-Fx5UnD2ZE-F z>=ddVI93sd{v8NSAdN#0{UdhRVYl@LRjYcx_v|w`bc&efoAXTPdG6B}h%2&LLrk2ZLW_dKz$zMuiQ!s<#zPc3nId)<@{3~NmLu3T zj_zk_kXfRy#ICFgCI=a)138?#$+5r3{z>X%G^vjpHwN|bH8>>nTj(RgA8ufCaqAG_ zk2;-bz!kT2baaG~D|nIeA&drGqq^n7b8V*!!ArDAKC#+kN^lh0PP8) z@ug~2=#O8Vb~{~a2ElQpuXcAP+T%|)mty^KyS>|K@Ane@y`9tDr*HP3CHijn^l-oT z4ED5$wzRYT^v#?7-Yd*GZ_qtGI6T}F^D(aPJ~=!%==GjMj{uK@)84`BJviV7T)))A zY)|Nk8w9U=d%z2Q4CwXtBfYQ)PJoE@TyX2b)b?I)8}5>J67eVVslItEc`d?A)HKDd z{|v+M_g7P4=V&zSphD2MkBH{~BD#rSr{X@2Iq#$Y*MS}9{S-L#k+&H6!wXe58XjSM zb#F8b-;RgjyD5w}G0uNRgl7UT%};5W7R0l!Lbt_}5Mt4kp>x4c!w5;zm^c;u6phgH zk4c=BF#J3@OT*9F@_f5dmo}K^+paU4QqxLGVvgaOwzD>y`fl~ETue!RpgX2scO5pH z+G2ice(w6UvhMq=QLArBaNzi}sg~!=_{KVG=)T;r4bSymE07JhF{As9^oE*}8oFa! z%nu%)VH4&Yvyr>fNiGFuNdh;}GkUXGw+%f&Yn@xLRQ}@{1s@Gzfhs)(mB8kW|QB>#HxqUfS z4F@dNVX`K3OyqkjUO-{BsYK}L4G5R}+mMb| zmA>sZ8m=SXcAda;>;AwXsenRS;lF{V*{UJS-?FV$_h*I@DdbD}T0v7a%`hz0vy6V7~8q3!brV2h0dso%zWtC8+M(oF~6_FUM1Q)Z5Z<6s>3+r8 zKu)~DVkN0%FBp8ivnflj`)r_!mn+INlW?4mpqv?wwwy^8%}*Taw25l3*>$Yu>MWdr z^8+|1UB5P29xg&Im@I!O%d6{5sw_%1R(CfgoB)2Tm@fe<`K@Nt^#aLqJt;0D>9LJR zf+Wj`3idIAnGaT^iaDG5m1PxG)$-G_n%4@lmNW9Qp0}8+C`FSomNRpf@>?n+;&~tX z>C35ec{Nw8m2^38mOyRQOu5LirmSZ*P042SRw<`*>i1lD@p5KO&sy0c%gOm%tt4xj zrph(FWXNWrWNNym7g(Tu8cQb7+%BoW)*M2Rq_4*2yety%pTDazRp+iMIXNphyITkh3G%?BXCOq literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Demos/Demo34/Project1_Icon.ico b/PythonForDelphi/Demos/Demo34/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/Demo34/Unit1.dfm b/PythonForDelphi/Demos/Demo34/Unit1.dfm new file mode 100644 index 0000000000000000000000000000000000000000..d99467ee9ba6dfc40027f7fcfe5b62af32ac05d5 GIT binary patch literal 3404 zcmd5<-EJF26yDhNtnI`lX%&^W2&VBxZOJut%a3GHMC{rmkknSZO~O?e?~daU>z!q0 z9NTZeC9l8@5(x1yT<{`r4`*h)wyQRP+Dc_F*1KosoH^$^-^_mgEAM#i&e37bxxe{I z!EwB9`#$p8T#RZNbH8#x2P*x$llFL={?*Bxus{vd-4xoR?0l%wKdxOrrb6|6!NagY zMD>V7=QRDBQ`q$tyP!=TDHw7yhjheiZj;1{@d(-AnI;dpaC3gxP*I!sbfXQ^tIZ)1 zk}CJD$F276(*y6Uxwm`NYk7G)YJ4{Q@PtJHpLlet*3E#;D7Bt5Z%@dGqQYSh_edmh zj|w)h{#~a0p_?DX$3!sF52-cx)GVay&ecvBGzBG!c0@o$F58Lhs|(Y_$UYakY)V7f zrD8wwhpDggI*Ix61t;hA;*co?-pNDFz?iZq{*<8jS%P9JjhbU20g9|Ij*U}hH)Q9L zn;{_pUuaDsqR*5?e=p@Y8BYUhQC$uG%X7igKRfeaSrRrwMkDn)VE%Ij<}7qs@{q{? zf^gx0MO0RMO0ei$uAw{|#at*XXA)hH!KiQvo~svBNT5pjngbVFPiDnrWG%ORSWx1_ zS(k%PNy0$YJeKQd8^aaQ0d8|%>d|me!53h@t0lFhP{ALT(Y1L6am6^5;&G&>VIN@8yL&VYIi7G426ygW?y@K*qLY6q=Ho>% zD`ns!jyR4e4Kxg6NwKZ;^z;;yXg1=4zI>%Nx!c7hymH)s7U3&N{lK`L=Y1 zQG(6TP8nt35TSMS?sHQju3%cMiLIyUH6Ogu6#j|wSCp95QEjydL70Ty4P3!g2re)m zV7pyg4H6{fTNn6ZFiBf_TB!`gV+v1L7-AiRS|}Gzs7I$hjp49Zw8l7MBJpHMR2>(= zT@Lv~;u#-f1vc~GLnZ(w6~-H&B?8Vtn-ltIHT5Qe&jav&kve<@;5!!Jf#4(CIkP16 z<%?B6n};pZFhu85Jv%d&vok{%m`}{kHe2Yg)H(K^Z+G~r0M=Yx%9b`Mkv8^E-D!Guy76|@74RRL36TfPFIuv-?R z049EDUl+i=5gxJs1&`i?qYBQG%RXRrblvp9o`5^8Z^tBrF3nG>8>?ea;EE@->@{su?%zC76G*!yUo^TPI2oh)E%kFhaL_=im&*-G%wYl0{>ZI~g z$uzi9e3Wm{3mSIDu(Ms%zj(qUx?E=sf*+7R1UL72@J%gcQ^>|njpjl&Raj`#8=wxT zuM&38bqKCIj_WnXuxjMm9~&^;U3(_tmr2B%i->M(N`1(2nVRE*t^`T~Zz^)BXJ@ r9xEUX+_zt3tmU3Y%;y2!@8ohvWMZdgk^Qy*Wh_eR?`%sp0m8ol$A 0 then begin + cbPyVersions.ItemIndex := 0; + CreatePythonComponents; + end; +end; + + +// First, we need to initialize the property PyObjectClass with +// the class of our Type object +procedure TForm1.PythonType1Initialization(Sender: TObject); +begin + PythonType1.PyObjectClass := TPyPoint; +end; + +// We override the constructors + +constructor TPyPoint.Create( APythonType : TPythonType ); +begin + inherited; + x := 0; + y := 0; +end; + +// Don't call the Create constructor of TPyPoint, because +// we call the inherited constructor CreateWith that calls +// the Create constructor first, and because the constructors +// are virtual, TPyPoint.Create will be automatically be called. + +constructor TPyPoint.CreateWith( PythonType : TPythonType; args : PPyObject ); +begin + inherited; + with GetPythonEngine do + begin + if PyArg_ParseTuple( args, 'ii:CreatePoint',@x, @y ) = 0 then + exit; + end; +end; + +// Then we override the needed services + +function TPyPoint.Repr : PPyObject; +begin + with GetPythonEngine do + Result := VariantAsPyObject(Format('(%d, %d)',[x, y])); + // or Result := PyString_FromString( PAnsiChar(Format('(%d, %d)',[x, y])) ); +end; + +// get/set functions +function TPyPoint_GetName( obj : PPyObject; context : Pointer) : PPyObject; cdecl; +begin + with GetPythonEngine do + Result := PyString_FromString(PAnsiChar(AnsiString(TPyPoint(PythonToDelphi(obj)).Name))); +end; + +function TPyPoint_SetName( obj, value : PPyObject; context : Pointer) : integer; cdecl; +begin + with GetPythonEngine do + begin + if PyString_Check(value) then + begin + TPyPoint(PythonToDelphi(obj)).Name := PyObjectAsVariant(value); + Result := 0; + end + else + begin + Result := -1; + PyErr_SetString(PyExc_AttributeError^, 'attribute Name expected a string value'); + end; + end; +end; + +// Class methods +// We register the methods of our type + +class procedure TPyPoint.RegisterMethods( PythonType : TPythonType ); +begin + inherited; + with PythonType do + begin + AddMethod( 'OffsetBy', @TPyPoint.DoOffsetBy, 'Point.OffsetBy( dx, dy )' ); + AddMethod( 'RaiseError', @TPyPoint.DoRaiseError, 'Point.RaiseError()' ); + end; +end; + +class procedure TPyPoint.RegisterMembers( PythonType : TPythonType ); +begin + with PythonType do + begin + AddMember( 'x', mtInt, NativeInt(@TPyPoint(nil).x), mfDefault, 'x coordinate'); + AddMember( 'y', mtInt, NativeInt(@TPyPoint(nil).y), mfDefault, 'y coordinate'); + end; +end; + +class procedure TPyPoint.RegisterGetSets( PythonType : TPythonType ); +begin + with PythonType do + begin + AddGetSet('Name', TPyPoint_GetName, TPyPoint_SetName, 'Name of a point', nil); + end; +end; + +// Methods of TPyPoint +// They do the real actions on the object +// It's better to split the functions that interface +// Delphi to Python and the functions that do the +// real implementation. + +procedure TPyPoint.OffsetBy( dx, dy : Integer ); +begin + Inc( x, dx ); + Inc( y, dy ); +end; + +// Interface methods +// They will be called directly by Python, so we extract the +// python arguments and we call the method that will really do +// the action. + +function TPyPoint.DoOffsetBy( args : PPyObject ) : PPyObject; +var + dx, dy : Integer; +begin + with GetPythonEngine do + begin + // We adjust the transmitted self argument + Adjust(@Self); + // first we extract the arguments + if PyArg_ParseTuple( args, 'ii:Point.Offset',@dx, @dy ) <> 0 then + begin + // if it's ok, then we call the method that does the job + // with the correct arguments + OffsetBy( dx, dy ); + // Finally, we return nothing + Result := ReturnNone; + end + else // the arguments were not right + Result := nil; + end; +end; + +// Here's an example of how you can raise errors defined +// in the module linked to our type. +function TPyPoint.DoRaiseError( args : PPyObject ) : PPyObject; +begin + with GetPythonEngine do + begin + // We adjust the transmitted self argument + Adjust(@Self); + // This is a simple call: + //GetModule.RaiseError( 'PointError', 'this is an example of raising an error !' ); + // This is an advanced call: + // We provide the instance vars as a dictionary, so that we can intercept the + // error with "except" and extract informations from the error object. + // ArrayToPyDict needs a list of pairs: varName (string), varValue (anything) + GetModule.RaiseErrorObj( 'EBadPoint', 'this is an example of raising an error !', + ArrayToPyDict( ['a', 1, 'b', 2, 'c', 3] ) ); + Result := nil; + end; +end; + +///////////////////////////////////////////////// + + +procedure TForm1.Button1Click(Sender: TObject); +var + DelphiPoint : TPyPoint; + p : PPyObject; +begin + // Here's how you can create/read Python vars from Delphi with + // Delphi/Python objects. + + // You should ask to the TPythonType to create an instance of its type + // because it will do some initialization. You can use CreateInstanceWith + // if you want to transmit some Python arguments. + // We receive a Python object pointer + p := PythonType1.CreateInstance; + PythonEngine1.CheckError; + // Then we cast the python object to the right delphi type + DelphiPoint := TPyPoint( PythonToDelphi(p) ); + // We do some changes on the delphi object + DelphiPoint.X:=10; + DelphiPoint.Y:=20; + // Add variable "myPoint" in the module "spam". + // So you'll access to the var in the module called spam with: + // import spam + // print spam.myPoint + PythonModule1.SetVar( 'myPoint', p ); + PythonEngine1.Py_DecRef(p); + { + Of course, if you want to retrieve a Python var from a module, + just use the PythonModule1.GetVar or PythonModule1.GetVarAsVariant + Example: + p := PythonModule1.GetVar('myPoint'); + if Assigned(p) then + begin + DelphiPoint := PythonToDelphi(p) as TPyPoint; + ... + Py_XDecRef(p); + end; + + end; } + // Excecute the script + PythonEngine1.ExecStrings( memo1.Lines ); + // Add the following line at the end of the script: + // print spam.myPoint + + // Note, that you must not free the delphi point yourself. + // Instead use the GetPythonEngine.Py_XDECREF(obj) method, + // because the object may be used by another Python object. +end; + +end. diff --git a/PythonForDelphi/Demos/readme.txt b/PythonForDelphi/Demos/readme.txt index b3671c3d..6c159b23 100644 --- a/PythonForDelphi/Demos/readme.txt +++ b/PythonForDelphi/Demos/readme.txt @@ -32,3 +32,4 @@ 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 +Demo34 Dynamically creating, destroying and recreating PythonEngine. Uses PytonVersions diff --git a/PythonForDelphi/Tutorial.txt b/PythonForDelphi/Tutorial.txt index 55a1239e..9e2285f7 100644 --- a/PythonForDelphi/Tutorial.txt +++ b/PythonForDelphi/Tutorial.txt @@ -832,6 +832,15 @@ Enhanced Demo 11 showing how to properly interrupt running threads. -------------------------------------------------------------- +-------------------------------------------------------------- +34) Dynamically creating, destroying and recreating PythonEngine +-------------------------------------------------------------- +Demo 26 revisited to demonstrate the use of the new +PythonVersions.pas unit. It also shows how to create +destroy and recreate PythonEngine etc. using code without +the Visual components. +-------------------------------------------------------------- + That's all folks !!! Hope this helps to build cool Python/Delphi applications. From 98d357693d9302eff8949d8e01c33709d5629304 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 1 Feb 2018 12:48:35 +0100 Subject: [PATCH 045/123] Fix compiling with older fpc Versions --- .../Components/Sources/Core/VarPyth.pas | 15 ++++++++++----- .../Components/Sources/Core/WrapDelphi.pas | 8 ++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index 38458e11..2f594d99 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -41,6 +41,8 @@ interface +{$H+} + uses Variants, PythonEngine; @@ -180,14 +182,14 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) const Arguments: TVarDataArray): Boolean; override; function GetProperty(var Dest: TVarData; const V: TVarData; const AName: string): Boolean; override; - function SetProperty({$IFDEF FPC}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; + function SetProperty({$IF FPC_VERSION > 300}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; const Value: TVarData): Boolean; override; {$IFDEF DELPHIXE7_OR_HIGHER} procedure DispInvoke(Dest: PVarData; [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; {$ELSE} procedure DispInvoke(Dest: PVarData; - var Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; + {$IF FPC_VERSION > 300}var{$ELSE}const{$ENDIF}Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; {$ENDIF} end; @@ -941,7 +943,7 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData; [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); {$ELSE} procedure TPythonVariantType.DispInvoke(Dest: PVarData; - var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); + {$IF FPC_VERSION > 300}var{$ELSE}const{$ENDIF}Source: TVarData; CallDesc: PCallDesc; Params: Pointer); {$ENDIF} {$IFDEF USESYSTEMDISPINVOKE} {$IFDEF DELPHIXE2_OR_HIGHER} @@ -1083,8 +1085,11 @@ TStringDesc = record end; {$ELSE USESYSTEMDISPINVOKE} +var + aSource: tvardata; begin - DoDispInvoke(Dest, Source, CallDesc, Params); + aSource := Source; + DoDispInvoke(Dest, aSource, CallDesc, Params); end; procedure TPythonVariantType.DoDispInvoke(Dest: PVarData; @@ -1863,7 +1868,7 @@ function TPythonVariantType.RightPromotion(const V: TVarData; Result := False; end; -function TPythonVariantType.SetProperty({$IFDEF FPC}var{$ELSE}const{$ENDIF} V: TVarData; +function TPythonVariantType.SetProperty({$IF FPC_VERSION > 300}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; const Value: TVarData): Boolean; var _newValue : PPyObject; diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas index 7e074d6a..2342619b 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas @@ -1106,12 +1106,20 @@ function PythonToSet(ASet : PPyObject; APropInfo: PPropInfo) : Integer; {$IFDEF FPC} function GetPropValue(Instance: TObject; PropInfo: PPropInfo): Variant; begin + {$IF FPC_VERSION<300} + Result := Variants.GetPropValue(Instance, PropInfo^.Name); + {$ELSE} Result := Variants.GetPropValue(Instance, PropInfo, False); + {$ENDIF} end; procedure SetPropValue(Instance: TObject; PropInfo: PPropInfo; const Value: Variant); begin + {$IF FPC_VERSION<300} + Variants.SetPropValue(Instance, PropInfo^.Name, Value); + {$ELSE} Variants.SetPropValue(Instance, PropInfo, Value); + {$ENDIF} end; {$ENDIF} From 79c6a0c80d5638550c3708bfeff5bc9fd7ce477b Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 1 Feb 2018 12:53:31 +0100 Subject: [PATCH 046/123] Really fix it --- PythonForDelphi/Components/Sources/Core/VarPyth.pas | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index 2f594d99..2a41d135 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -41,8 +41,6 @@ interface -{$H+} - uses Variants, PythonEngine; @@ -182,14 +180,14 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) const Arguments: TVarDataArray): Boolean; override; function GetProperty(var Dest: TVarData; const V: TVarData; const AName: string): Boolean; override; - function SetProperty({$IF FPC_VERSION > 300}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; + function SetProperty({$IF FPC_FULLVERSION > 30000}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; const Value: TVarData): Boolean; override; {$IFDEF DELPHIXE7_OR_HIGHER} procedure DispInvoke(Dest: PVarData; [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; {$ELSE} procedure DispInvoke(Dest: PVarData; - {$IF FPC_VERSION > 300}var{$ELSE}const{$ENDIF}Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; + {$IF FPC_FULLVERSION > 30000}var{$ELSE}const{$ENDIF}Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; {$ENDIF} end; @@ -943,7 +941,7 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData; [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); {$ELSE} procedure TPythonVariantType.DispInvoke(Dest: PVarData; - {$IF FPC_VERSION > 300}var{$ELSE}const{$ENDIF}Source: TVarData; CallDesc: PCallDesc; Params: Pointer); + {$IF FPC_FULLVERSION > 30000}var{$ELSE}const{$ENDIF}Source: TVarData; CallDesc: PCallDesc; Params: Pointer); {$ENDIF} {$IFDEF USESYSTEMDISPINVOKE} {$IFDEF DELPHIXE2_OR_HIGHER} @@ -1868,7 +1866,7 @@ function TPythonVariantType.RightPromotion(const V: TVarData; Result := False; end; -function TPythonVariantType.SetProperty({$IF FPC_VERSION > 300}var{$ELSE}const{$ENDIF} V: TVarData; +function TPythonVariantType.SetProperty({$IF FPC_FULLVERSION > 30000}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; const Value: TVarData): Boolean; var _newValue : PPyObject; From 2937b562c29fa6b5e81ec8721b8d53e54ad18bb9 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 1 Feb 2018 13:04:06 +0100 Subject: [PATCH 047/123] Hopefully the last fix for different fpc versions --- PythonForDelphi/Components/Sources/Core/WrapDelphi.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas index 2342619b..0060fead 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas @@ -1106,7 +1106,7 @@ function PythonToSet(ASet : PPyObject; APropInfo: PPropInfo) : Integer; {$IFDEF FPC} function GetPropValue(Instance: TObject; PropInfo: PPropInfo): Variant; begin - {$IF FPC_VERSION<300} + {$IF FPC_FULLVERSION<30000} Result := Variants.GetPropValue(Instance, PropInfo^.Name); {$ELSE} Result := Variants.GetPropValue(Instance, PropInfo, False); @@ -1115,7 +1115,7 @@ function GetPropValue(Instance: TObject; PropInfo: PPropInfo): Variant; procedure SetPropValue(Instance: TObject; PropInfo: PPropInfo; const Value: Variant); begin - {$IF FPC_VERSION<300} + {$IF FPC_FULLVERSION<30000} Variants.SetPropValue(Instance, PropInfo^.Name, Value); {$ELSE} Variants.SetPropValue(Instance, PropInfo, Value); From 2058d1f81de5926c9c9d2179a14f2e51023b5354 Mon Sep 17 00:00:00 2001 From: Christian Ulrich Date: Thu, 1 Feb 2018 21:42:44 +0100 Subject: [PATCH 048/123] Fix compiling with fpc 3.0.0 in linux --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 +- PythonForDelphi/Components/Sources/Core/VarPyth.pas | 8 ++++---- PythonForDelphi/Components/Sources/Core/WrapDelphi.pas | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index e0c08f2e..7a70a24d 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -159,7 +159,7 @@ interface (DllName: 'libpython3.3.so'; RegVersion: '3.3'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.4.so'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.5.so'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True), - (DllName: 'libpython3.6.so'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True) + (DllName: 'libpython3.6.so'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.7.so'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF PYTHON23} diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index 2a41d135..d0391519 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -180,14 +180,14 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) const Arguments: TVarDataArray): Boolean; override; function GetProperty(var Dest: TVarData; const V: TVarData; const AName: string): Boolean; override; - function SetProperty({$IF FPC_FULLVERSION > 30000}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; + function SetProperty({$IF FPC_FULLVERSION >= 30000}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; const Value: TVarData): Boolean; override; {$IFDEF DELPHIXE7_OR_HIGHER} procedure DispInvoke(Dest: PVarData; [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; {$ELSE} procedure DispInvoke(Dest: PVarData; - {$IF FPC_FULLVERSION > 30000}var{$ELSE}const{$ENDIF}Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; + {$IF FPC_FULLVERSION >= 30000}var{$ELSE}const{$ENDIF}Source: TVarData; CallDesc: PCallDesc; Params: Pointer);override; {$ENDIF} end; @@ -941,7 +941,7 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData; [Ref] const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); {$ELSE} procedure TPythonVariantType.DispInvoke(Dest: PVarData; - {$IF FPC_FULLVERSION > 30000}var{$ELSE}const{$ENDIF}Source: TVarData; CallDesc: PCallDesc; Params: Pointer); + {$IF FPC_FULLVERSION >= 30000}var{$ELSE}const{$ENDIF}Source: TVarData; CallDesc: PCallDesc; Params: Pointer); {$ENDIF} {$IFDEF USESYSTEMDISPINVOKE} {$IFDEF DELPHIXE2_OR_HIGHER} @@ -1866,7 +1866,7 @@ function TPythonVariantType.RightPromotion(const V: TVarData; Result := False; end; -function TPythonVariantType.SetProperty({$IF FPC_FULLVERSION > 30000}var{$ELSE}const{$ENDIF} V: TVarData; +function TPythonVariantType.SetProperty({$IF FPC_FULLVERSION >= 30000}var{$ELSE}const{$ENDIF} V: TVarData; const AName: string; const Value: TVarData): Boolean; var _newValue : PPyObject; diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas index 0060fead..c257127e 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas @@ -1106,7 +1106,7 @@ function PythonToSet(ASet : PPyObject; APropInfo: PPropInfo) : Integer; {$IFDEF FPC} function GetPropValue(Instance: TObject; PropInfo: PPropInfo): Variant; begin - {$IF FPC_FULLVERSION<30000} + {$IF FPC_FULLVERSION<=30000} Result := Variants.GetPropValue(Instance, PropInfo^.Name); {$ELSE} Result := Variants.GetPropValue(Instance, PropInfo, False); @@ -1115,7 +1115,7 @@ function GetPropValue(Instance: TObject; PropInfo: PPropInfo): Variant; procedure SetPropValue(Instance: TObject; PropInfo: PPropInfo; const Value: Variant); begin - {$IF FPC_FULLVERSION<30000} + {$IF FPC_FULLVERSION<=30000} Variants.SetPropValue(Instance, PropInfo^.Name, Value); {$ELSE} Variants.SetPropValue(Instance, PropInfo, Value); From 85c6f6a47b704ddb6619a72cc4f7863dc59f6b5a Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 2 Feb 2018 14:24:30 +0200 Subject: [PATCH 049/123] ApiVersion added in PythonVersions.pas --- .../Components/Sources/Core/PythonVersions.pas | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index 1fe8ab73..5eadf6bd 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -25,6 +25,7 @@ TPythonVersion = record function GetIsPython3K: Boolean; function GetHelpFile: string; function GetDisplayName: string; + function GetApiVersion: integer; public IsRegistered: Boolean; IsAllUsers: Boolean; @@ -39,6 +40,7 @@ TPythonVersion = record property IsPython3K: Boolean read GetIsPython3K; property HelpFile: string read GetHelpFile write FHelpFile; property DisplayName: string read GetDisplayName write FDisplayName; + property ApiVersion: integer read GetApiVersion; end; TPythonVersions = array of TPythonVersion; @@ -106,9 +108,18 @@ procedure TPythonVersion.AssignTo(PythonEngine: TPersistent); TPythonEngine(PythonEngine).RegVersion := SysVersion; TPythonEngine(PythonEngine).DllName := DLLName; TPythonEngine(PythonEngine).DllPath := DLLPath; + TPythonEngine(PythonEngine).APIVersion := ApiVersion; end; end; +function TPythonVersion.GetApiVersion: integer; +begin + if CompareVersions(SysVersion, 2.4) < 0 then + Result := 1013 + else + Result := 1012; +end; + function TPythonVersion.GetDisplayName: string; begin Result := FDisplayName; From e8b0abda6e38c6d4eb1585e8af06fa2e4561c93a Mon Sep 17 00:00:00 2001 From: Christian Ulrich Date: Sat, 3 Feb 2018 03:37:49 +0100 Subject: [PATCH 050/123] Fix compiling on arm --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 7a70a24d..8f426306 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -9720,6 +9720,7 @@ function PyType_HasFeature(AType : PPyTypeObject; AFlag : Integer) : Boolean; procedure MaskFPUExceptions(ExceptionsMasked : boolean; MatchPythonPrecision : Boolean); begin + {$IFNDEF CPUX86 OR CPUX86_64} if MatchPythonPrecision then begin if ExceptionsMasked then Set8087CW($1232 or $3F) @@ -9731,6 +9732,7 @@ procedure MaskFPUExceptions(ExceptionsMasked : boolean; else Set8087CW($1332); end; + {$ENDIF} end; {$IFDEF MSWINDOWS} From a4a033807dd87eaf5e739259e57b40e80416cb61 Mon Sep 17 00:00:00 2001 From: Christian Ulrich Date: Sat, 3 Feb 2018 09:09:27 +0100 Subject: [PATCH 051/123] Use CPUARm define for better Delphi Compatibility --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 8f426306..e9e7aa99 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -9720,7 +9720,7 @@ function PyType_HasFeature(AType : PPyTypeObject; AFlag : Integer) : Boolean; procedure MaskFPUExceptions(ExceptionsMasked : boolean; MatchPythonPrecision : Boolean); begin - {$IFNDEF CPUX86 OR CPUX86_64} + {$IFNDEF CPUARM} if MatchPythonPrecision then begin if ExceptionsMasked then Set8087CW($1232 or $3F) From f4510474d7a12594e07924e2f6ddf23a9ed5cf51 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 3 Feb 2018 13:07:55 +0200 Subject: [PATCH 052/123] Set8087CW not available in ARM processors --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index e0c08f2e..ce283a55 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -9720,6 +9720,7 @@ function PyType_HasFeature(AType : PPyTypeObject; AFlag : Integer) : Boolean; procedure MaskFPUExceptions(ExceptionsMasked : boolean; MatchPythonPrecision : Boolean); begin + {$IFNDEF CPUARM} if MatchPythonPrecision then begin if ExceptionsMasked then Set8087CW($1232 or $3F) @@ -9731,6 +9732,7 @@ procedure MaskFPUExceptions(ExceptionsMasked : boolean; else Set8087CW($1332); end; + {$ENDIF} end; {$IFDEF MSWINDOWS} From fba7787732b8bf8ad1cb78bbef02c5238b966006 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 15 Mar 2018 03:54:29 +0200 Subject: [PATCH 053/123] --- Unsupported/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Unsupported/README.md diff --git a/Unsupported/README.md b/Unsupported/README.md new file mode 100644 index 00000000..d590c226 --- /dev/null +++ b/Unsupported/README.md @@ -0,0 +1 @@ +** THIS FOLDER CONTAINS DATED STUFF WHICH IS NO LONGER SUPPORTED ** From 5662c1afb357c23732263c6ff3518c11a999d682 Mon Sep 17 00:00:00 2001 From: PyScripter Date: Thu, 15 Mar 2018 04:18:43 +0200 Subject: [PATCH 054/123] Resturcured directories --- .../Install}/AfterInstallPyScripter.txt | 0 .../Install}/Andy Bulka Tutorials.url | 0 .../Install}/BeforeInstallPyScripter.txt | 0 .../Install}/Copy of PythonForDelphi.wse | 0 {Install => Unsupported/Install}/Dll/P4D.dof | 0 {Install => Unsupported/Install}/Dll/P4D.dpr | 0 {Install => Unsupported/Install}/Dll/P4D.res | Bin .../Install}/Dll/PythonTitle.bmp | Bin .../Install}/Dll/Test/Project1.dof | 0 .../Install}/Dll/Test/Project1.dpr | 0 .../Install}/Dll/Test/Project1.res | Bin {Install => Unsupported/Install}/Dll/Test/Unit1.dfm | 0 {Install => Unsupported/Install}/Dll/Test/Unit1.pas | 0 .../Install}/Dll/fmDelphiInstall.dfm | 0 .../Install}/Dll/fmDelphiInstall.pas | 0 {Install => Unsupported/Install}/Dll/python.bmp | Bin {Install => Unsupported/Install}/Home Site.URL | 0 .../Install}/Mark Hammond Pythonwin.URL | 0 {Install => Unsupported/Install}/PyScripter.iss | 0 .../Install}/PyScripterForPython23.gi2 | 0 .../Install}/PyScripterForPython24.gi2 | 0 .../Install}/Python official site.URL | 0 .../Install}/PythonForDelphi.wse | 0 {Install => Unsupported/Install}/PythonTitle.bmp | Bin {Install => Unsupported/Install}/README.md | 0 {Install => Unsupported/Install}/ReadMe.txt | 0 .../Install}/Yahoo! Groups pythonfordelphi.url | 0 {Install => Unsupported/Install}/python.bmp | Bin .../PythonVCL}/Components/PythonVCL_d3.dpk | 0 .../PythonVCL}/Components/PythonVCL_d3.res | Bin .../Components/Sources/VCL/D3/Delphi_Classes.pas | 0 .../Components/Sources/VCL/D3/Delphi_Controls.pas | 0 .../Components/Sources/VCL/D3/Delphi_Dialogs.pas | 0 .../Components/Sources/VCL/D3/Delphi_ExtCtrls.pas | 0 .../Components/Sources/VCL/D3/Delphi_Forms.pas | 0 .../Components/Sources/VCL/D3/Delphi_Graphics.pas | 0 .../Components/Sources/VCL/D3/Delphi_Menus.pas | 0 .../Components/Sources/VCL/D3/Delphi_StdCtrls.pas | 0 .../Components/Sources/VCL/D3/Delphi_System.pas | 0 .../Components/Sources/VCL/D3/PyDelphiAssoc.pas | 0 .../Components/Sources/VCL/D3/PyRecords.pas | 0 .../Components/Sources/VCL/D3/PyVarArg.pas | 0 .../Components/Sources/VCL/D3/Py_Misc.pas | 0 .../Components/Sources/VCL/D3/PythonVclStd.dcr | Bin .../Components/Sources/VCL/D3/PythonVclStd.pas | 0 .../Components/Sources/VCL/D3/Python_Classes.pas | 0 .../Components/Sources/VCL/D3/Python_Controls.pas | 0 .../Components/Sources/VCL/D3/Python_Dialogs.pas | 0 .../Components/Sources/VCL/D3/Python_ExtCtrls.pas | 0 .../Components/Sources/VCL/D3/Python_Forms.pas | 0 .../Components/Sources/VCL/D3/Python_Graphics.pas | 0 .../Components/Sources/VCL/D3/Python_Menus.pas | 0 .../Components/Sources/VCL/D3/Python_StdCtrls.pas | 0 .../Components/Sources/VCL/D3/Python_System.pas | 0 .../Components/Sources/VCL/D4/Delphi_ActnList.pas | 0 .../Components/Sources/VCL/D4/Delphi_Classes.pas | 0 .../Components/Sources/VCL/D4/Delphi_Controls.pas | 0 .../Components/Sources/VCL/D4/Delphi_Dialogs.pas | 0 .../Components/Sources/VCL/D4/Delphi_ExtCtrls.pas | 0 .../Components/Sources/VCL/D4/Delphi_Forms.pas | 0 .../Components/Sources/VCL/D4/Delphi_Graphics.pas | 0 .../Components/Sources/VCL/D4/Delphi_ImgList.pas | 0 .../Components/Sources/VCL/D4/Delphi_Menus.pas | 0 .../Components/Sources/VCL/D4/Delphi_StdCtrls.pas | 0 .../Components/Sources/VCL/D4/Delphi_System.pas | 0 .../Components/Sources/VCL/D4/PyDelphiAssoc.pas | 0 .../Components/Sources/VCL/D4/PyRecords.pas | 0 .../Components/Sources/VCL/D4/PyVarArg.pas | 0 .../Components/Sources/VCL/D4/Py_Misc.pas | 0 .../Components/Sources/VCL/D4/PythonVclStd.pas | 0 .../Components/Sources/VCL/D4/Python_ActnList.pas | 0 .../Components/Sources/VCL/D4/Python_Classes.pas | 0 .../Components/Sources/VCL/D4/Python_Controls.pas | 0 .../Components/Sources/VCL/D4/Python_Dialogs.pas | 0 .../Components/Sources/VCL/D4/Python_ExtCtrls.pas | 0 .../Components/Sources/VCL/D4/Python_Forms.pas | 0 .../Components/Sources/VCL/D4/Python_Graphics.pas | 0 .../Components/Sources/VCL/D4/Python_ImgList.pas | 0 .../Components/Sources/VCL/D4/Python_Menus.pas | 0 .../Components/Sources/VCL/D4/Python_StdCtrls.pas | 0 .../Components/Sources/VCL/D4/Python_System.pas | 0 .../PythonVCL}/Lib/delphi/D3/Classes.py | 0 .../PythonVCL}/Lib/delphi/D3/Controls.py | 0 .../PythonVCL}/Lib/delphi/D3/ExtCtrls.py | 0 .../PythonVCL}/Lib/delphi/D3/Forms.py | 0 .../PythonVCL}/Lib/delphi/D3/Graphics.py | 0 .../PythonVCL}/Lib/delphi/D3/Menus.py | 0 .../PythonVCL}/Lib/delphi/D3/StdCtrls.py | 0 .../PythonVCL}/Lib/delphi/D3/System.py | 0 .../PythonVCL}/Lib/delphi/D4/ActnList.py | 0 .../PythonVCL}/Lib/delphi/D4/Classes.py | 0 .../PythonVCL}/Lib/delphi/D4/Controls.py | 0 .../PythonVCL}/Lib/delphi/D4/Dialogs.py | 0 .../PythonVCL}/Lib/delphi/D4/ExtCtrls.py | 0 .../PythonVCL}/Lib/delphi/D4/Forms.py | 0 .../PythonVCL}/Lib/delphi/D4/Graphics.py | 0 .../PythonVCL}/Lib/delphi/D4/ImgList.py | 0 .../PythonVCL}/Lib/delphi/D4/Menus.py | 0 .../PythonVCL}/Lib/delphi/D4/StdCtrls.py | 0 .../PythonVCL}/Lib/delphi/D4/System.py | 0 .../PythonVCL}/PyDelphi/Childwin.dfm | Bin .../PythonVCL}/PyDelphi/Childwin.pas | 0 .../PyDelphi/Components used/Mruflist.pas | 0 .../PythonVCL}/PyDelphi/Lisp.py | 0 .../PythonVCL}/PyDelphi/MAIN.dfm | Bin .../PythonVCL}/PyDelphi/Main.pas | 0 .../PythonVCL}/PyDelphi/Misc.pas | 0 .../PythonVCL}/PyDelphi/NewMemoryManager.pas | 0 .../PythonVCL}/PyDelphi/PyDelphi.dof | 0 .../PythonVCL}/PyDelphi/PyDelphi.dpr | 0 .../PythonVCL}/PyDelphi/PyDelphi.ico | Bin .../PythonVCL}/PyDelphi/PyDelphi.res | Bin .../PythonVCL}/PyDelphi/PyDelphiForm.dfm | Bin .../PythonVCL}/PyDelphi/SetPath.py | 0 .../PythonVCL}/PyDelphi/To do.txt | 0 .../PythonVCL}/PyDelphi/fmAbout.dfm | Bin .../PythonVCL}/PyDelphi/fmAbout.pas | 0 .../PythonVCL}/PyDelphi/fmFind.dfm | Bin .../PythonVCL}/PyDelphi/fmFind.pas | 0 .../PythonVCL}/PyDelphi/fmOutput.dfm | Bin .../PythonVCL}/PyDelphi/fmOutput.pas | 0 .../PythonVCL}/PyDelphi/fmReplace.dfm | Bin .../PythonVCL}/PyDelphi/fmReplace.pas | 0 .../PythonVCL}/PyDelphi/fmTraceBack.dfm | Bin .../PythonVCL}/PyDelphi/fmTraceBack.pas | 0 .../PythonVCL}/PyDelphi/qrPrintText.dfm | Bin .../PythonVCL}/PyDelphi/qrPrintText.pas | 0 .../PythonVCL}/PyDelphi/test.py | 0 .../PythonVCL}/PyDelphi/test2.py | 0 {PythonVCL => Unsupported/PythonVCL}/README.md | 0 {PythonVCL => Unsupported/PythonVCL}/Readme.txt | 0 .../PythonVCL}/VCL Generator/ReadMe.txt | 0 .../PythonVCL}/VCL Generator/Standard_d3.prj | Bin .../PythonVCL}/VCL Generator/Standard_d4.prj | Bin .../PythonVCL}/VCL Generator/VCLGenerator.dof | 0 .../PythonVCL}/VCL Generator/VCLGenerator.dpr | 0 .../PythonVCL}/VCL Generator/VCLGenerator.res | Bin .../PythonVCL}/VCL Generator/fmAbout.dfm | Bin .../PythonVCL}/VCL Generator/fmAbout.pas | 0 .../PythonVCL}/VCL Generator/fmMain.dfm | Bin .../PythonVCL}/VCL Generator/fmMain.pas | 0 .../PythonVCL}/VCL Generator/fmOptions.dfm | Bin .../PythonVCL}/VCL Generator/fmOptions.pas | 0 .../PythonVCL}/VCL Generator/fmSettings.dfm | Bin .../PythonVCL}/VCL Generator/fmSettings.pas | 0 .../PythonVCL}/VCL Generator/log.txt | 0 .../PythonVCL}/VCL Generator/options.dat | Bin .../PythonVCL}/VCL Generator/to do.txt | 0 .../PythonVCL}/VCL Generator/unHash.pas | 0 .../PythonVCL}/VCL Generator/unMisc.pas | 0 .../PythonVCL}/VCL Generator/unParser.pas | 0 .../PythonVCL}/VCL Generator/unUnitParser.pas | 0 152 files changed, 0 insertions(+), 0 deletions(-) rename {Install => Unsupported/Install}/AfterInstallPyScripter.txt (100%) rename {Install => Unsupported/Install}/Andy Bulka Tutorials.url (100%) rename {Install => Unsupported/Install}/BeforeInstallPyScripter.txt (100%) rename {Install => Unsupported/Install}/Copy of PythonForDelphi.wse (100%) rename {Install => Unsupported/Install}/Dll/P4D.dof (100%) rename {Install => Unsupported/Install}/Dll/P4D.dpr (100%) rename {Install => Unsupported/Install}/Dll/P4D.res (100%) rename {Install => Unsupported/Install}/Dll/PythonTitle.bmp (100%) rename {Install => Unsupported/Install}/Dll/Test/Project1.dof (100%) rename {Install => Unsupported/Install}/Dll/Test/Project1.dpr (100%) rename {Install => Unsupported/Install}/Dll/Test/Project1.res (100%) rename {Install => Unsupported/Install}/Dll/Test/Unit1.dfm (100%) rename {Install => Unsupported/Install}/Dll/Test/Unit1.pas (100%) rename {Install => Unsupported/Install}/Dll/fmDelphiInstall.dfm (100%) rename {Install => Unsupported/Install}/Dll/fmDelphiInstall.pas (100%) rename {Install => Unsupported/Install}/Dll/python.bmp (100%) rename {Install => Unsupported/Install}/Home Site.URL (100%) rename {Install => Unsupported/Install}/Mark Hammond Pythonwin.URL (100%) rename {Install => Unsupported/Install}/PyScripter.iss (100%) rename {Install => Unsupported/Install}/PyScripterForPython23.gi2 (100%) rename {Install => Unsupported/Install}/PyScripterForPython24.gi2 (100%) rename {Install => Unsupported/Install}/Python official site.URL (100%) rename {Install => Unsupported/Install}/PythonForDelphi.wse (100%) rename {Install => Unsupported/Install}/PythonTitle.bmp (100%) rename {Install => Unsupported/Install}/README.md (100%) rename {Install => Unsupported/Install}/ReadMe.txt (100%) rename {Install => Unsupported/Install}/Yahoo! Groups pythonfordelphi.url (100%) rename {Install => Unsupported/Install}/python.bmp (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/PythonVCL_d3.dpk (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/PythonVCL_d3.res (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Delphi_Classes.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Delphi_Controls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Delphi_Dialogs.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Delphi_ExtCtrls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Delphi_Forms.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Delphi_Graphics.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Delphi_Menus.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Delphi_StdCtrls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Delphi_System.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/PyDelphiAssoc.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/PyRecords.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/PyVarArg.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Py_Misc.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/PythonVclStd.dcr (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/PythonVclStd.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Python_Classes.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Python_Controls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Python_Dialogs.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Python_ExtCtrls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Python_Forms.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Python_Graphics.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Python_Menus.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Python_StdCtrls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D3/Python_System.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_ActnList.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_Classes.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_Controls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_Dialogs.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_ExtCtrls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_Forms.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_Graphics.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_ImgList.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_Menus.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_StdCtrls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Delphi_System.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/PyDelphiAssoc.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/PyRecords.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/PyVarArg.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Py_Misc.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/PythonVclStd.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_ActnList.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_Classes.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_Controls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_Dialogs.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_ExtCtrls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_Forms.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_Graphics.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_ImgList.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_Menus.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_StdCtrls.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Components/Sources/VCL/D4/Python_System.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D3/Classes.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D3/Controls.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D3/ExtCtrls.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D3/Forms.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D3/Graphics.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D3/Menus.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D3/StdCtrls.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D3/System.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/ActnList.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/Classes.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/Controls.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/Dialogs.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/ExtCtrls.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/Forms.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/Graphics.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/ImgList.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/Menus.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/StdCtrls.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/Lib/delphi/D4/System.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/Childwin.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/Childwin.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/Components used/Mruflist.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/Lisp.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/MAIN.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/Main.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/Misc.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/NewMemoryManager.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/PyDelphi.dof (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/PyDelphi.dpr (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/PyDelphi.ico (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/PyDelphi.res (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/PyDelphiForm.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/SetPath.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/To do.txt (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/fmAbout.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/fmAbout.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/fmFind.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/fmFind.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/fmOutput.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/fmOutput.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/fmReplace.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/fmReplace.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/fmTraceBack.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/fmTraceBack.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/qrPrintText.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/qrPrintText.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/test.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/PyDelphi/test2.py (100%) rename {PythonVCL => Unsupported/PythonVCL}/README.md (100%) rename {PythonVCL => Unsupported/PythonVCL}/Readme.txt (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/ReadMe.txt (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/Standard_d3.prj (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/Standard_d4.prj (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/VCLGenerator.dof (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/VCLGenerator.dpr (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/VCLGenerator.res (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/fmAbout.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/fmAbout.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/fmMain.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/fmMain.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/fmOptions.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/fmOptions.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/fmSettings.dfm (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/fmSettings.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/log.txt (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/options.dat (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/to do.txt (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/unHash.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/unMisc.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/unParser.pas (100%) rename {PythonVCL => Unsupported/PythonVCL}/VCL Generator/unUnitParser.pas (100%) diff --git a/Install/AfterInstallPyScripter.txt b/Unsupported/Install/AfterInstallPyScripter.txt similarity index 100% rename from Install/AfterInstallPyScripter.txt rename to Unsupported/Install/AfterInstallPyScripter.txt diff --git a/Install/Andy Bulka Tutorials.url b/Unsupported/Install/Andy Bulka Tutorials.url similarity index 100% rename from Install/Andy Bulka Tutorials.url rename to Unsupported/Install/Andy Bulka Tutorials.url diff --git a/Install/BeforeInstallPyScripter.txt b/Unsupported/Install/BeforeInstallPyScripter.txt similarity index 100% rename from Install/BeforeInstallPyScripter.txt rename to Unsupported/Install/BeforeInstallPyScripter.txt diff --git a/Install/Copy of PythonForDelphi.wse b/Unsupported/Install/Copy of PythonForDelphi.wse similarity index 100% rename from Install/Copy of PythonForDelphi.wse rename to Unsupported/Install/Copy of PythonForDelphi.wse diff --git a/Install/Dll/P4D.dof b/Unsupported/Install/Dll/P4D.dof similarity index 100% rename from Install/Dll/P4D.dof rename to Unsupported/Install/Dll/P4D.dof diff --git a/Install/Dll/P4D.dpr b/Unsupported/Install/Dll/P4D.dpr similarity index 100% rename from Install/Dll/P4D.dpr rename to Unsupported/Install/Dll/P4D.dpr diff --git a/Install/Dll/P4D.res b/Unsupported/Install/Dll/P4D.res similarity index 100% rename from Install/Dll/P4D.res rename to Unsupported/Install/Dll/P4D.res diff --git a/Install/Dll/PythonTitle.bmp b/Unsupported/Install/Dll/PythonTitle.bmp similarity index 100% rename from Install/Dll/PythonTitle.bmp rename to Unsupported/Install/Dll/PythonTitle.bmp diff --git a/Install/Dll/Test/Project1.dof b/Unsupported/Install/Dll/Test/Project1.dof similarity index 100% rename from Install/Dll/Test/Project1.dof rename to Unsupported/Install/Dll/Test/Project1.dof diff --git a/Install/Dll/Test/Project1.dpr b/Unsupported/Install/Dll/Test/Project1.dpr similarity index 100% rename from Install/Dll/Test/Project1.dpr rename to Unsupported/Install/Dll/Test/Project1.dpr diff --git a/Install/Dll/Test/Project1.res b/Unsupported/Install/Dll/Test/Project1.res similarity index 100% rename from Install/Dll/Test/Project1.res rename to Unsupported/Install/Dll/Test/Project1.res diff --git a/Install/Dll/Test/Unit1.dfm b/Unsupported/Install/Dll/Test/Unit1.dfm similarity index 100% rename from Install/Dll/Test/Unit1.dfm rename to Unsupported/Install/Dll/Test/Unit1.dfm diff --git a/Install/Dll/Test/Unit1.pas b/Unsupported/Install/Dll/Test/Unit1.pas similarity index 100% rename from Install/Dll/Test/Unit1.pas rename to Unsupported/Install/Dll/Test/Unit1.pas diff --git a/Install/Dll/fmDelphiInstall.dfm b/Unsupported/Install/Dll/fmDelphiInstall.dfm similarity index 100% rename from Install/Dll/fmDelphiInstall.dfm rename to Unsupported/Install/Dll/fmDelphiInstall.dfm diff --git a/Install/Dll/fmDelphiInstall.pas b/Unsupported/Install/Dll/fmDelphiInstall.pas similarity index 100% rename from Install/Dll/fmDelphiInstall.pas rename to Unsupported/Install/Dll/fmDelphiInstall.pas diff --git a/Install/Dll/python.bmp b/Unsupported/Install/Dll/python.bmp similarity index 100% rename from Install/Dll/python.bmp rename to Unsupported/Install/Dll/python.bmp diff --git a/Install/Home Site.URL b/Unsupported/Install/Home Site.URL similarity index 100% rename from Install/Home Site.URL rename to Unsupported/Install/Home Site.URL diff --git a/Install/Mark Hammond Pythonwin.URL b/Unsupported/Install/Mark Hammond Pythonwin.URL similarity index 100% rename from Install/Mark Hammond Pythonwin.URL rename to Unsupported/Install/Mark Hammond Pythonwin.URL diff --git a/Install/PyScripter.iss b/Unsupported/Install/PyScripter.iss similarity index 100% rename from Install/PyScripter.iss rename to Unsupported/Install/PyScripter.iss diff --git a/Install/PyScripterForPython23.gi2 b/Unsupported/Install/PyScripterForPython23.gi2 similarity index 100% rename from Install/PyScripterForPython23.gi2 rename to Unsupported/Install/PyScripterForPython23.gi2 diff --git a/Install/PyScripterForPython24.gi2 b/Unsupported/Install/PyScripterForPython24.gi2 similarity index 100% rename from Install/PyScripterForPython24.gi2 rename to Unsupported/Install/PyScripterForPython24.gi2 diff --git a/Install/Python official site.URL b/Unsupported/Install/Python official site.URL similarity index 100% rename from Install/Python official site.URL rename to Unsupported/Install/Python official site.URL diff --git a/Install/PythonForDelphi.wse b/Unsupported/Install/PythonForDelphi.wse similarity index 100% rename from Install/PythonForDelphi.wse rename to Unsupported/Install/PythonForDelphi.wse diff --git a/Install/PythonTitle.bmp b/Unsupported/Install/PythonTitle.bmp similarity index 100% rename from Install/PythonTitle.bmp rename to Unsupported/Install/PythonTitle.bmp diff --git a/Install/README.md b/Unsupported/Install/README.md similarity index 100% rename from Install/README.md rename to Unsupported/Install/README.md diff --git a/Install/ReadMe.txt b/Unsupported/Install/ReadMe.txt similarity index 100% rename from Install/ReadMe.txt rename to Unsupported/Install/ReadMe.txt diff --git a/Install/Yahoo! Groups pythonfordelphi.url b/Unsupported/Install/Yahoo! Groups pythonfordelphi.url similarity index 100% rename from Install/Yahoo! Groups pythonfordelphi.url rename to Unsupported/Install/Yahoo! Groups pythonfordelphi.url diff --git a/Install/python.bmp b/Unsupported/Install/python.bmp similarity index 100% rename from Install/python.bmp rename to Unsupported/Install/python.bmp diff --git a/PythonVCL/Components/PythonVCL_d3.dpk b/Unsupported/PythonVCL/Components/PythonVCL_d3.dpk similarity index 100% rename from PythonVCL/Components/PythonVCL_d3.dpk rename to Unsupported/PythonVCL/Components/PythonVCL_d3.dpk diff --git a/PythonVCL/Components/PythonVCL_d3.res b/Unsupported/PythonVCL/Components/PythonVCL_d3.res similarity index 100% rename from PythonVCL/Components/PythonVCL_d3.res rename to Unsupported/PythonVCL/Components/PythonVCL_d3.res diff --git a/PythonVCL/Components/Sources/VCL/D3/Delphi_Classes.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Classes.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Delphi_Classes.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Classes.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Delphi_Controls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Controls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Delphi_Controls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Controls.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Delphi_Dialogs.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Dialogs.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Delphi_Dialogs.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Dialogs.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Delphi_ExtCtrls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_ExtCtrls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Delphi_ExtCtrls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_ExtCtrls.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Delphi_Forms.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Forms.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Delphi_Forms.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Forms.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Delphi_Graphics.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Graphics.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Delphi_Graphics.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Graphics.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Delphi_Menus.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Menus.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Delphi_Menus.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_Menus.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Delphi_StdCtrls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_StdCtrls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Delphi_StdCtrls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_StdCtrls.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Delphi_System.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_System.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Delphi_System.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Delphi_System.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/PyDelphiAssoc.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/PyDelphiAssoc.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/PyDelphiAssoc.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/PyDelphiAssoc.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/PyRecords.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/PyRecords.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/PyRecords.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/PyRecords.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/PyVarArg.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/PyVarArg.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/PyVarArg.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/PyVarArg.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Py_Misc.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Py_Misc.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Py_Misc.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Py_Misc.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/PythonVclStd.dcr b/Unsupported/PythonVCL/Components/Sources/VCL/D3/PythonVclStd.dcr similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/PythonVclStd.dcr rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/PythonVclStd.dcr diff --git a/PythonVCL/Components/Sources/VCL/D3/PythonVclStd.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/PythonVclStd.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/PythonVclStd.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/PythonVclStd.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Python_Classes.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Classes.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Python_Classes.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Classes.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Python_Controls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Controls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Python_Controls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Controls.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Python_Dialogs.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Dialogs.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Python_Dialogs.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Dialogs.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Python_ExtCtrls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_ExtCtrls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Python_ExtCtrls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_ExtCtrls.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Python_Forms.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Forms.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Python_Forms.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Forms.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Python_Graphics.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Graphics.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Python_Graphics.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Graphics.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Python_Menus.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Menus.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Python_Menus.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_Menus.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Python_StdCtrls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_StdCtrls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Python_StdCtrls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_StdCtrls.pas diff --git a/PythonVCL/Components/Sources/VCL/D3/Python_System.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_System.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D3/Python_System.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D3/Python_System.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_ActnList.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_ActnList.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_ActnList.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_ActnList.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_Classes.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Classes.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_Classes.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Classes.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_Controls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Controls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_Controls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Controls.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_Dialogs.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Dialogs.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_Dialogs.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Dialogs.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_ExtCtrls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_ExtCtrls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_ExtCtrls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_ExtCtrls.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_Forms.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Forms.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_Forms.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Forms.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_Graphics.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Graphics.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_Graphics.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Graphics.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_ImgList.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_ImgList.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_ImgList.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_ImgList.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_Menus.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Menus.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_Menus.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_Menus.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_StdCtrls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_StdCtrls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_StdCtrls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_StdCtrls.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Delphi_System.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_System.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Delphi_System.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Delphi_System.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/PyDelphiAssoc.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/PyDelphiAssoc.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/PyDelphiAssoc.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/PyDelphiAssoc.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/PyRecords.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/PyRecords.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/PyRecords.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/PyRecords.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/PyVarArg.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/PyVarArg.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/PyVarArg.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/PyVarArg.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Py_Misc.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Py_Misc.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Py_Misc.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Py_Misc.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/PythonVclStd.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/PythonVclStd.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/PythonVclStd.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/PythonVclStd.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_ActnList.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_ActnList.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_ActnList.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_ActnList.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_Classes.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Classes.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_Classes.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Classes.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_Controls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Controls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_Controls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Controls.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_Dialogs.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Dialogs.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_Dialogs.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Dialogs.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_ExtCtrls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_ExtCtrls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_ExtCtrls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_ExtCtrls.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_Forms.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Forms.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_Forms.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Forms.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_Graphics.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Graphics.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_Graphics.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Graphics.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_ImgList.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_ImgList.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_ImgList.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_ImgList.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_Menus.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Menus.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_Menus.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_Menus.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_StdCtrls.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_StdCtrls.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_StdCtrls.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_StdCtrls.pas diff --git a/PythonVCL/Components/Sources/VCL/D4/Python_System.pas b/Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_System.pas similarity index 100% rename from PythonVCL/Components/Sources/VCL/D4/Python_System.pas rename to Unsupported/PythonVCL/Components/Sources/VCL/D4/Python_System.pas diff --git a/PythonVCL/Lib/delphi/D3/Classes.py b/Unsupported/PythonVCL/Lib/delphi/D3/Classes.py similarity index 100% rename from PythonVCL/Lib/delphi/D3/Classes.py rename to Unsupported/PythonVCL/Lib/delphi/D3/Classes.py diff --git a/PythonVCL/Lib/delphi/D3/Controls.py b/Unsupported/PythonVCL/Lib/delphi/D3/Controls.py similarity index 100% rename from PythonVCL/Lib/delphi/D3/Controls.py rename to Unsupported/PythonVCL/Lib/delphi/D3/Controls.py diff --git a/PythonVCL/Lib/delphi/D3/ExtCtrls.py b/Unsupported/PythonVCL/Lib/delphi/D3/ExtCtrls.py similarity index 100% rename from PythonVCL/Lib/delphi/D3/ExtCtrls.py rename to Unsupported/PythonVCL/Lib/delphi/D3/ExtCtrls.py diff --git a/PythonVCL/Lib/delphi/D3/Forms.py b/Unsupported/PythonVCL/Lib/delphi/D3/Forms.py similarity index 100% rename from PythonVCL/Lib/delphi/D3/Forms.py rename to Unsupported/PythonVCL/Lib/delphi/D3/Forms.py diff --git a/PythonVCL/Lib/delphi/D3/Graphics.py b/Unsupported/PythonVCL/Lib/delphi/D3/Graphics.py similarity index 100% rename from PythonVCL/Lib/delphi/D3/Graphics.py rename to Unsupported/PythonVCL/Lib/delphi/D3/Graphics.py diff --git a/PythonVCL/Lib/delphi/D3/Menus.py b/Unsupported/PythonVCL/Lib/delphi/D3/Menus.py similarity index 100% rename from PythonVCL/Lib/delphi/D3/Menus.py rename to Unsupported/PythonVCL/Lib/delphi/D3/Menus.py diff --git a/PythonVCL/Lib/delphi/D3/StdCtrls.py b/Unsupported/PythonVCL/Lib/delphi/D3/StdCtrls.py similarity index 100% rename from PythonVCL/Lib/delphi/D3/StdCtrls.py rename to Unsupported/PythonVCL/Lib/delphi/D3/StdCtrls.py diff --git a/PythonVCL/Lib/delphi/D3/System.py b/Unsupported/PythonVCL/Lib/delphi/D3/System.py similarity index 100% rename from PythonVCL/Lib/delphi/D3/System.py rename to Unsupported/PythonVCL/Lib/delphi/D3/System.py diff --git a/PythonVCL/Lib/delphi/D4/ActnList.py b/Unsupported/PythonVCL/Lib/delphi/D4/ActnList.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/ActnList.py rename to Unsupported/PythonVCL/Lib/delphi/D4/ActnList.py diff --git a/PythonVCL/Lib/delphi/D4/Classes.py b/Unsupported/PythonVCL/Lib/delphi/D4/Classes.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/Classes.py rename to Unsupported/PythonVCL/Lib/delphi/D4/Classes.py diff --git a/PythonVCL/Lib/delphi/D4/Controls.py b/Unsupported/PythonVCL/Lib/delphi/D4/Controls.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/Controls.py rename to Unsupported/PythonVCL/Lib/delphi/D4/Controls.py diff --git a/PythonVCL/Lib/delphi/D4/Dialogs.py b/Unsupported/PythonVCL/Lib/delphi/D4/Dialogs.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/Dialogs.py rename to Unsupported/PythonVCL/Lib/delphi/D4/Dialogs.py diff --git a/PythonVCL/Lib/delphi/D4/ExtCtrls.py b/Unsupported/PythonVCL/Lib/delphi/D4/ExtCtrls.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/ExtCtrls.py rename to Unsupported/PythonVCL/Lib/delphi/D4/ExtCtrls.py diff --git a/PythonVCL/Lib/delphi/D4/Forms.py b/Unsupported/PythonVCL/Lib/delphi/D4/Forms.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/Forms.py rename to Unsupported/PythonVCL/Lib/delphi/D4/Forms.py diff --git a/PythonVCL/Lib/delphi/D4/Graphics.py b/Unsupported/PythonVCL/Lib/delphi/D4/Graphics.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/Graphics.py rename to Unsupported/PythonVCL/Lib/delphi/D4/Graphics.py diff --git a/PythonVCL/Lib/delphi/D4/ImgList.py b/Unsupported/PythonVCL/Lib/delphi/D4/ImgList.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/ImgList.py rename to Unsupported/PythonVCL/Lib/delphi/D4/ImgList.py diff --git a/PythonVCL/Lib/delphi/D4/Menus.py b/Unsupported/PythonVCL/Lib/delphi/D4/Menus.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/Menus.py rename to Unsupported/PythonVCL/Lib/delphi/D4/Menus.py diff --git a/PythonVCL/Lib/delphi/D4/StdCtrls.py b/Unsupported/PythonVCL/Lib/delphi/D4/StdCtrls.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/StdCtrls.py rename to Unsupported/PythonVCL/Lib/delphi/D4/StdCtrls.py diff --git a/PythonVCL/Lib/delphi/D4/System.py b/Unsupported/PythonVCL/Lib/delphi/D4/System.py similarity index 100% rename from PythonVCL/Lib/delphi/D4/System.py rename to Unsupported/PythonVCL/Lib/delphi/D4/System.py diff --git a/PythonVCL/PyDelphi/Childwin.dfm b/Unsupported/PythonVCL/PyDelphi/Childwin.dfm similarity index 100% rename from PythonVCL/PyDelphi/Childwin.dfm rename to Unsupported/PythonVCL/PyDelphi/Childwin.dfm diff --git a/PythonVCL/PyDelphi/Childwin.pas b/Unsupported/PythonVCL/PyDelphi/Childwin.pas similarity index 100% rename from PythonVCL/PyDelphi/Childwin.pas rename to Unsupported/PythonVCL/PyDelphi/Childwin.pas diff --git a/PythonVCL/PyDelphi/Components used/Mruflist.pas b/Unsupported/PythonVCL/PyDelphi/Components used/Mruflist.pas similarity index 100% rename from PythonVCL/PyDelphi/Components used/Mruflist.pas rename to Unsupported/PythonVCL/PyDelphi/Components used/Mruflist.pas diff --git a/PythonVCL/PyDelphi/Lisp.py b/Unsupported/PythonVCL/PyDelphi/Lisp.py similarity index 100% rename from PythonVCL/PyDelphi/Lisp.py rename to Unsupported/PythonVCL/PyDelphi/Lisp.py diff --git a/PythonVCL/PyDelphi/MAIN.dfm b/Unsupported/PythonVCL/PyDelphi/MAIN.dfm similarity index 100% rename from PythonVCL/PyDelphi/MAIN.dfm rename to Unsupported/PythonVCL/PyDelphi/MAIN.dfm diff --git a/PythonVCL/PyDelphi/Main.pas b/Unsupported/PythonVCL/PyDelphi/Main.pas similarity index 100% rename from PythonVCL/PyDelphi/Main.pas rename to Unsupported/PythonVCL/PyDelphi/Main.pas diff --git a/PythonVCL/PyDelphi/Misc.pas b/Unsupported/PythonVCL/PyDelphi/Misc.pas similarity index 100% rename from PythonVCL/PyDelphi/Misc.pas rename to Unsupported/PythonVCL/PyDelphi/Misc.pas diff --git a/PythonVCL/PyDelphi/NewMemoryManager.pas b/Unsupported/PythonVCL/PyDelphi/NewMemoryManager.pas similarity index 100% rename from PythonVCL/PyDelphi/NewMemoryManager.pas rename to Unsupported/PythonVCL/PyDelphi/NewMemoryManager.pas diff --git a/PythonVCL/PyDelphi/PyDelphi.dof b/Unsupported/PythonVCL/PyDelphi/PyDelphi.dof similarity index 100% rename from PythonVCL/PyDelphi/PyDelphi.dof rename to Unsupported/PythonVCL/PyDelphi/PyDelphi.dof diff --git a/PythonVCL/PyDelphi/PyDelphi.dpr b/Unsupported/PythonVCL/PyDelphi/PyDelphi.dpr similarity index 100% rename from PythonVCL/PyDelphi/PyDelphi.dpr rename to Unsupported/PythonVCL/PyDelphi/PyDelphi.dpr diff --git a/PythonVCL/PyDelphi/PyDelphi.ico b/Unsupported/PythonVCL/PyDelphi/PyDelphi.ico similarity index 100% rename from PythonVCL/PyDelphi/PyDelphi.ico rename to Unsupported/PythonVCL/PyDelphi/PyDelphi.ico diff --git a/PythonVCL/PyDelphi/PyDelphi.res b/Unsupported/PythonVCL/PyDelphi/PyDelphi.res similarity index 100% rename from PythonVCL/PyDelphi/PyDelphi.res rename to Unsupported/PythonVCL/PyDelphi/PyDelphi.res diff --git a/PythonVCL/PyDelphi/PyDelphiForm.dfm b/Unsupported/PythonVCL/PyDelphi/PyDelphiForm.dfm similarity index 100% rename from PythonVCL/PyDelphi/PyDelphiForm.dfm rename to Unsupported/PythonVCL/PyDelphi/PyDelphiForm.dfm diff --git a/PythonVCL/PyDelphi/SetPath.py b/Unsupported/PythonVCL/PyDelphi/SetPath.py similarity index 100% rename from PythonVCL/PyDelphi/SetPath.py rename to Unsupported/PythonVCL/PyDelphi/SetPath.py diff --git a/PythonVCL/PyDelphi/To do.txt b/Unsupported/PythonVCL/PyDelphi/To do.txt similarity index 100% rename from PythonVCL/PyDelphi/To do.txt rename to Unsupported/PythonVCL/PyDelphi/To do.txt diff --git a/PythonVCL/PyDelphi/fmAbout.dfm b/Unsupported/PythonVCL/PyDelphi/fmAbout.dfm similarity index 100% rename from PythonVCL/PyDelphi/fmAbout.dfm rename to Unsupported/PythonVCL/PyDelphi/fmAbout.dfm diff --git a/PythonVCL/PyDelphi/fmAbout.pas b/Unsupported/PythonVCL/PyDelphi/fmAbout.pas similarity index 100% rename from PythonVCL/PyDelphi/fmAbout.pas rename to Unsupported/PythonVCL/PyDelphi/fmAbout.pas diff --git a/PythonVCL/PyDelphi/fmFind.dfm b/Unsupported/PythonVCL/PyDelphi/fmFind.dfm similarity index 100% rename from PythonVCL/PyDelphi/fmFind.dfm rename to Unsupported/PythonVCL/PyDelphi/fmFind.dfm diff --git a/PythonVCL/PyDelphi/fmFind.pas b/Unsupported/PythonVCL/PyDelphi/fmFind.pas similarity index 100% rename from PythonVCL/PyDelphi/fmFind.pas rename to Unsupported/PythonVCL/PyDelphi/fmFind.pas diff --git a/PythonVCL/PyDelphi/fmOutput.dfm b/Unsupported/PythonVCL/PyDelphi/fmOutput.dfm similarity index 100% rename from PythonVCL/PyDelphi/fmOutput.dfm rename to Unsupported/PythonVCL/PyDelphi/fmOutput.dfm diff --git a/PythonVCL/PyDelphi/fmOutput.pas b/Unsupported/PythonVCL/PyDelphi/fmOutput.pas similarity index 100% rename from PythonVCL/PyDelphi/fmOutput.pas rename to Unsupported/PythonVCL/PyDelphi/fmOutput.pas diff --git a/PythonVCL/PyDelphi/fmReplace.dfm b/Unsupported/PythonVCL/PyDelphi/fmReplace.dfm similarity index 100% rename from PythonVCL/PyDelphi/fmReplace.dfm rename to Unsupported/PythonVCL/PyDelphi/fmReplace.dfm diff --git a/PythonVCL/PyDelphi/fmReplace.pas b/Unsupported/PythonVCL/PyDelphi/fmReplace.pas similarity index 100% rename from PythonVCL/PyDelphi/fmReplace.pas rename to Unsupported/PythonVCL/PyDelphi/fmReplace.pas diff --git a/PythonVCL/PyDelphi/fmTraceBack.dfm b/Unsupported/PythonVCL/PyDelphi/fmTraceBack.dfm similarity index 100% rename from PythonVCL/PyDelphi/fmTraceBack.dfm rename to Unsupported/PythonVCL/PyDelphi/fmTraceBack.dfm diff --git a/PythonVCL/PyDelphi/fmTraceBack.pas b/Unsupported/PythonVCL/PyDelphi/fmTraceBack.pas similarity index 100% rename from PythonVCL/PyDelphi/fmTraceBack.pas rename to Unsupported/PythonVCL/PyDelphi/fmTraceBack.pas diff --git a/PythonVCL/PyDelphi/qrPrintText.dfm b/Unsupported/PythonVCL/PyDelphi/qrPrintText.dfm similarity index 100% rename from PythonVCL/PyDelphi/qrPrintText.dfm rename to Unsupported/PythonVCL/PyDelphi/qrPrintText.dfm diff --git a/PythonVCL/PyDelphi/qrPrintText.pas b/Unsupported/PythonVCL/PyDelphi/qrPrintText.pas similarity index 100% rename from PythonVCL/PyDelphi/qrPrintText.pas rename to Unsupported/PythonVCL/PyDelphi/qrPrintText.pas diff --git a/PythonVCL/PyDelphi/test.py b/Unsupported/PythonVCL/PyDelphi/test.py similarity index 100% rename from PythonVCL/PyDelphi/test.py rename to Unsupported/PythonVCL/PyDelphi/test.py diff --git a/PythonVCL/PyDelphi/test2.py b/Unsupported/PythonVCL/PyDelphi/test2.py similarity index 100% rename from PythonVCL/PyDelphi/test2.py rename to Unsupported/PythonVCL/PyDelphi/test2.py diff --git a/PythonVCL/README.md b/Unsupported/PythonVCL/README.md similarity index 100% rename from PythonVCL/README.md rename to Unsupported/PythonVCL/README.md diff --git a/PythonVCL/Readme.txt b/Unsupported/PythonVCL/Readme.txt similarity index 100% rename from PythonVCL/Readme.txt rename to Unsupported/PythonVCL/Readme.txt diff --git a/PythonVCL/VCL Generator/ReadMe.txt b/Unsupported/PythonVCL/VCL Generator/ReadMe.txt similarity index 100% rename from PythonVCL/VCL Generator/ReadMe.txt rename to Unsupported/PythonVCL/VCL Generator/ReadMe.txt diff --git a/PythonVCL/VCL Generator/Standard_d3.prj b/Unsupported/PythonVCL/VCL Generator/Standard_d3.prj similarity index 100% rename from PythonVCL/VCL Generator/Standard_d3.prj rename to Unsupported/PythonVCL/VCL Generator/Standard_d3.prj diff --git a/PythonVCL/VCL Generator/Standard_d4.prj b/Unsupported/PythonVCL/VCL Generator/Standard_d4.prj similarity index 100% rename from PythonVCL/VCL Generator/Standard_d4.prj rename to Unsupported/PythonVCL/VCL Generator/Standard_d4.prj diff --git a/PythonVCL/VCL Generator/VCLGenerator.dof b/Unsupported/PythonVCL/VCL Generator/VCLGenerator.dof similarity index 100% rename from PythonVCL/VCL Generator/VCLGenerator.dof rename to Unsupported/PythonVCL/VCL Generator/VCLGenerator.dof diff --git a/PythonVCL/VCL Generator/VCLGenerator.dpr b/Unsupported/PythonVCL/VCL Generator/VCLGenerator.dpr similarity index 100% rename from PythonVCL/VCL Generator/VCLGenerator.dpr rename to Unsupported/PythonVCL/VCL Generator/VCLGenerator.dpr diff --git a/PythonVCL/VCL Generator/VCLGenerator.res b/Unsupported/PythonVCL/VCL Generator/VCLGenerator.res similarity index 100% rename from PythonVCL/VCL Generator/VCLGenerator.res rename to Unsupported/PythonVCL/VCL Generator/VCLGenerator.res diff --git a/PythonVCL/VCL Generator/fmAbout.dfm b/Unsupported/PythonVCL/VCL Generator/fmAbout.dfm similarity index 100% rename from PythonVCL/VCL Generator/fmAbout.dfm rename to Unsupported/PythonVCL/VCL Generator/fmAbout.dfm diff --git a/PythonVCL/VCL Generator/fmAbout.pas b/Unsupported/PythonVCL/VCL Generator/fmAbout.pas similarity index 100% rename from PythonVCL/VCL Generator/fmAbout.pas rename to Unsupported/PythonVCL/VCL Generator/fmAbout.pas diff --git a/PythonVCL/VCL Generator/fmMain.dfm b/Unsupported/PythonVCL/VCL Generator/fmMain.dfm similarity index 100% rename from PythonVCL/VCL Generator/fmMain.dfm rename to Unsupported/PythonVCL/VCL Generator/fmMain.dfm diff --git a/PythonVCL/VCL Generator/fmMain.pas b/Unsupported/PythonVCL/VCL Generator/fmMain.pas similarity index 100% rename from PythonVCL/VCL Generator/fmMain.pas rename to Unsupported/PythonVCL/VCL Generator/fmMain.pas diff --git a/PythonVCL/VCL Generator/fmOptions.dfm b/Unsupported/PythonVCL/VCL Generator/fmOptions.dfm similarity index 100% rename from PythonVCL/VCL Generator/fmOptions.dfm rename to Unsupported/PythonVCL/VCL Generator/fmOptions.dfm diff --git a/PythonVCL/VCL Generator/fmOptions.pas b/Unsupported/PythonVCL/VCL Generator/fmOptions.pas similarity index 100% rename from PythonVCL/VCL Generator/fmOptions.pas rename to Unsupported/PythonVCL/VCL Generator/fmOptions.pas diff --git a/PythonVCL/VCL Generator/fmSettings.dfm b/Unsupported/PythonVCL/VCL Generator/fmSettings.dfm similarity index 100% rename from PythonVCL/VCL Generator/fmSettings.dfm rename to Unsupported/PythonVCL/VCL Generator/fmSettings.dfm diff --git a/PythonVCL/VCL Generator/fmSettings.pas b/Unsupported/PythonVCL/VCL Generator/fmSettings.pas similarity index 100% rename from PythonVCL/VCL Generator/fmSettings.pas rename to Unsupported/PythonVCL/VCL Generator/fmSettings.pas diff --git a/PythonVCL/VCL Generator/log.txt b/Unsupported/PythonVCL/VCL Generator/log.txt similarity index 100% rename from PythonVCL/VCL Generator/log.txt rename to Unsupported/PythonVCL/VCL Generator/log.txt diff --git a/PythonVCL/VCL Generator/options.dat b/Unsupported/PythonVCL/VCL Generator/options.dat similarity index 100% rename from PythonVCL/VCL Generator/options.dat rename to Unsupported/PythonVCL/VCL Generator/options.dat diff --git a/PythonVCL/VCL Generator/to do.txt b/Unsupported/PythonVCL/VCL Generator/to do.txt similarity index 100% rename from PythonVCL/VCL Generator/to do.txt rename to Unsupported/PythonVCL/VCL Generator/to do.txt diff --git a/PythonVCL/VCL Generator/unHash.pas b/Unsupported/PythonVCL/VCL Generator/unHash.pas similarity index 100% rename from PythonVCL/VCL Generator/unHash.pas rename to Unsupported/PythonVCL/VCL Generator/unHash.pas diff --git a/PythonVCL/VCL Generator/unMisc.pas b/Unsupported/PythonVCL/VCL Generator/unMisc.pas similarity index 100% rename from PythonVCL/VCL Generator/unMisc.pas rename to Unsupported/PythonVCL/VCL Generator/unMisc.pas diff --git a/PythonVCL/VCL Generator/unParser.pas b/Unsupported/PythonVCL/VCL Generator/unParser.pas similarity index 100% rename from PythonVCL/VCL Generator/unParser.pas rename to Unsupported/PythonVCL/VCL Generator/unParser.pas diff --git a/PythonVCL/VCL Generator/unUnitParser.pas b/Unsupported/PythonVCL/VCL Generator/unUnitParser.pas similarity index 100% rename from PythonVCL/VCL Generator/unUnitParser.pas rename to Unsupported/PythonVCL/VCL Generator/unUnitParser.pas From 009669866217dddfde5f070e0743d614da4c2381 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 15 Mar 2018 04:48:51 +0200 Subject: [PATCH 055/123] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..bd34b125 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Dietmar Budelsky, Morgan Martinet, Kiriakos Vlahos + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 3d7b901db8985e3f48d4028e48222aa15d247162 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 15 Mar 2018 05:32:51 +0200 Subject: [PATCH 056/123] Delphinus support added (untested) --- Delphinus.Info.json | 9 ++ Delphinus.Install.json | 35 +++++++ PythonForDelphi/Components/P4DLogo.jpg | Bin 0 -> 7312 bytes PythonForDelphi/Components/Python_D.dproj | 111 ++++++++++++++++++++++ README.md | 2 + 5 files changed, 157 insertions(+) create mode 100644 Delphinus.Info.json create mode 100644 Delphinus.Install.json create mode 100644 PythonForDelphi/Components/P4DLogo.jpg create mode 100644 PythonForDelphi/Components/Python_D.dproj diff --git a/Delphinus.Info.json b/Delphinus.Info.json new file mode 100644 index 00000000..97733f20 --- /dev/null +++ b/Delphinus.Info.json @@ -0,0 +1,9 @@ +{ + "id": "{CDB2CEA7-8130-428D-ABBC-C4EA6B567989}", + "name": "Python4Delphi", + "picture": "PythonForDelphi\\Components\\P4DLogo.jpg", + "license_type": "MIT", + "license_file": "LICENCE", + "platforms": "Win32;Win64", + "compiler_min": 10 +} \ No newline at end of file diff --git a/Delphinus.Install.json b/Delphinus.Install.json new file mode 100644 index 00000000..59b16315 --- /dev/null +++ b/Delphinus.Install.json @@ -0,0 +1,35 @@ +{ + "search_pathes": + [ + { + "pathes": "PythonForDelphi\\Components\\Sources\Core", + "platforms": "Win32;Win64" + } + ], + + "browsing_pathes": + [ + { + "pathes": "PythonForDelphi\\Components\\Sources\Core", + "platforms": "Win32;Win64" + } + ], + + "source_folders": + [ + { + "folder": "PythonForDelphi", + "base": "", + "recursive": true, + "filter": "*;*.*" + }, + ], + + "projects": + [ + { + "project": "PythonForDelphi\\Components\\Python_D.dproj" + "compiler_min": 10 + }, + ] +} \ No newline at end of file diff --git a/PythonForDelphi/Components/P4DLogo.jpg b/PythonForDelphi/Components/P4DLogo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c9223ac6b5f06250480ac00b07e118a8d25bbde GIT binary patch literal 7312 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 YXxkNeX&cehFgLl^p|jH7&cucP0dn3`QUCw| literal 0 HcmV?d00001 diff --git a/PythonForDelphi/Components/Python_D.dproj b/PythonForDelphi/Components/Python_D.dproj new file mode 100644 index 00000000..7e33325f --- /dev/null +++ b/PythonForDelphi/Components/Python_D.dproj @@ -0,0 +1,111 @@ + + + {FDF413DD-FEB8-446B-AAC5-50DC046EBFCB} + Python_D.dpk + True + Debug + 1 + Package + VCL + 18.3 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + false + false + false + false + false + 00400000 + true + true + Python_D + Components for Python + true + 25 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) + 1032 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + + + 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 + + + RELEASE;$(DCC_Define) + 0 + false + 0 + + + DEBUG;$(DCC_Define) + false + true + + + + MainSource + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + Python_D.dpk + + + + False + False + False + True + False + + + 12 + + + + diff --git a/README.md b/README.md index c2cb10eb..1b61c1ce 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,5 @@ 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. + +Delphinus-Support From 3ca59a2b49ca5d53455db86323ea2b9424b5cb90 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 15 Mar 2018 06:34:05 +0200 Subject: [PATCH 057/123] Fix to Delphinus.Install.json --- Delphinus.Install.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Delphinus.Install.json b/Delphinus.Install.json index 59b16315..a9dac983 100644 --- a/Delphinus.Install.json +++ b/Delphinus.Install.json @@ -22,14 +22,13 @@ "base": "", "recursive": true, "filter": "*;*.*" - }, + } ], "projects": [ { "project": "PythonForDelphi\\Components\\Python_D.dproj" - "compiler_min": 10 - }, + } ] } \ No newline at end of file From f4d0f603f7fe8c2a0a16e3f66621dfedc19364d3 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 16 Mar 2018 02:55:33 +0200 Subject: [PATCH 058/123] Fixed json syntax --- Delphinus.Install.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Delphinus.Install.json b/Delphinus.Install.json index a9dac983..b89ba2f6 100644 --- a/Delphinus.Install.json +++ b/Delphinus.Install.json @@ -2,7 +2,7 @@ "search_pathes": [ { - "pathes": "PythonForDelphi\\Components\\Sources\Core", + "pathes": "PythonForDelphi\\Components\\Sources\\Core", "platforms": "Win32;Win64" } ], @@ -10,7 +10,7 @@ "browsing_pathes": [ { - "pathes": "PythonForDelphi\\Components\\Sources\Core", + "pathes": "PythonForDelphi\\Components\\Sources\\Core", "platforms": "Win32;Win64" } ], From 78b2a98fc105f6e327b6f82779b5b654b6d46920 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 16 Mar 2018 03:14:26 +0200 Subject: [PATCH 059/123] testing Delphinus --- Delphinus.Install.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Delphinus.Install.json b/Delphinus.Install.json index b89ba2f6..bb61e458 100644 --- a/Delphinus.Install.json +++ b/Delphinus.Install.json @@ -28,7 +28,8 @@ "projects": [ { - "project": "PythonForDelphi\\Components\\Python_D.dproj" + "project": "PythonForDelphi\\Components\\Python_D.dproj", + "compiler": 28 } ] } \ No newline at end of file From 4ad53bbcddb0f197855dc3febd4ef6fc0e57b24e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 16 Mar 2018 05:46:13 +0200 Subject: [PATCH 060/123] Try to get Delphinus to work --- Delphinus.Install.json | 3 +-- PythonForDelphi/Components/Python_D.dpk | 32 ++++++++++++----------- PythonForDelphi/Components/Python_D.dproj | 1 - 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Delphinus.Install.json b/Delphinus.Install.json index bb61e458..b89ba2f6 100644 --- a/Delphinus.Install.json +++ b/Delphinus.Install.json @@ -28,8 +28,7 @@ "projects": [ { - "project": "PythonForDelphi\\Components\\Python_D.dproj", - "compiler": 28 + "project": "PythonForDelphi\\Components\\Python_D.dproj" } ] } \ No newline at end of file diff --git a/PythonForDelphi/Components/Python_D.dpk b/PythonForDelphi/Components/Python_D.dpk index 7b453740..8e207927 100644 --- a/PythonForDelphi/Components/Python_D.dpk +++ b/PythonForDelphi/Components/Python_D.dpk @@ -28,21 +28,23 @@ package Python_D; {$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'Components for Python'} {$IMPLICITBUILD OFF} -{$IFDEF VER180}{$LIBSUFFIX '10'} {$ENDIF} -{$IFDEF VER200}{$LIBSUFFIX '12'} {$ENDIF} -{$IFDEF VER210}{$LIBSUFFIX '14'} {$ENDIF} -{$IFDEF VER220}{$LIBSUFFIX '15'} {$ENDIF} -{$IFDEF VER230}{$LIBSUFFIX '16'} {$ENDIF} -{$IFDEF VER240}{$LIBSUFFIX '17'} {$ENDIF} -{$IFDEF VER250}{$LIBSUFFIX '18'} {$ENDIF} -{$IFDEF VER260}{$LIBSUFFIX '19'} {$ENDIF} -{$IFDEF VER270}{$LIBSUFFIX '20'} {$ENDIF} -{$IFDEF VER280}{$LIBSUFFIX '21'} {$ENDIF} -{$IFDEF VER200}{$LIBSUFFIX '22'} {$ENDIF} -{$IFDEF VER300}{$LIBSUFFIX '23'} {$ENDIF} -{$IFDEF VER310}{$LIBSUFFIX '24'} {$ENDIF} -{$IFDEF VER320}{$LIBSUFFIX '25'} {$ENDIF} -{$IFDEF VER330}{$LIBSUFFIX '26'} {$ENDIF} +//{$IFDEF VER180}{$LIBSUFFIX '10'} {$ENDIF} +//{$IFDEF VER180}{$LIBSUFFIX '10'} {$ENDIF} +//{$IFDEF VER180}{$LIBSUFFIX '10'} {$ENDIF} +//{$IFDEF VER200}{$LIBSUFFIX '12'} {$ENDIF} +//{$IFDEF VER210}{$LIBSUFFIX '14'} {$ENDIF} +//{$IFDEF VER220}{$LIBSUFFIX '15'} {$ENDIF} +//{$IFDEF VER230}{$LIBSUFFIX '16'} {$ENDIF} +//{$IFDEF VER240}{$LIBSUFFIX '17'} {$ENDIF} +//{$IFDEF VER250}{$LIBSUFFIX '18'} {$ENDIF} +//{$IFDEF VER260}{$LIBSUFFIX '19'} {$ENDIF} +//{$IFDEF VER270}{$LIBSUFFIX '20'} {$ENDIF} +//{$IFDEF VER280}{$LIBSUFFIX '21'} {$ENDIF} +//{$IFDEF VER200}{$LIBSUFFIX '22'} {$ENDIF} +//{$IFDEF VER300}{$LIBSUFFIX '23'} {$ENDIF} +//{$IFDEF VER310}{$LIBSUFFIX '24'} {$ENDIF} +//{$IFDEF VER320}{$LIBSUFFIX '25'} {$ENDIF} +//{$IFDEF VER330}{$LIBSUFFIX '26'} {$ENDIF} requires DesignIDE, diff --git a/PythonForDelphi/Components/Python_D.dproj b/PythonForDelphi/Components/Python_D.dproj index 7e33325f..d9feb64c 100644 --- a/PythonForDelphi/Components/Python_D.dproj +++ b/PythonForDelphi/Components/Python_D.dproj @@ -40,7 +40,6 @@ Python_D Components for Python true - 25 Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) 1032 CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= From c802997d7fd723468e599e0edc2cfd993b5dcdea Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 17 Mar 2018 03:05:10 +0200 Subject: [PATCH 061/123] .gitignore added --- .gitignore | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..10ae397c --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Compiled source # +################### +*.dcu +*.obj +*.exe +*.bpl +*.bpi +*.dcp +*.rsm +*.stat +*.map + +# Generated source # +################### +*.hpp + +# Backup files # +################### +*.~* + +# IDE Files # +################### +*.dproj.local +*.groupproj.local +*.identcache +*.dsk +*.tvsconfig +*.otares +*.drc +*.rc +*.res +*.local + +# Output Folders # +################### +/Win32 +/Win64 +/OSX32 +/__history +*.bak +*.Patch +VirtualTreeView.zip +*.#00 +*.pch From 11e07afd304d028120fcb0b61e91cff94dde41d9 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 21 Mar 2018 00:14:56 +0200 Subject: [PATCH 062/123] Removed comments in package --- PythonForDelphi/Components/Python_D.dpk | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/PythonForDelphi/Components/Python_D.dpk b/PythonForDelphi/Components/Python_D.dpk index 8e207927..2c16994f 100644 --- a/PythonForDelphi/Components/Python_D.dpk +++ b/PythonForDelphi/Components/Python_D.dpk @@ -28,23 +28,6 @@ package Python_D; {$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'Components for Python'} {$IMPLICITBUILD OFF} -//{$IFDEF VER180}{$LIBSUFFIX '10'} {$ENDIF} -//{$IFDEF VER180}{$LIBSUFFIX '10'} {$ENDIF} -//{$IFDEF VER180}{$LIBSUFFIX '10'} {$ENDIF} -//{$IFDEF VER200}{$LIBSUFFIX '12'} {$ENDIF} -//{$IFDEF VER210}{$LIBSUFFIX '14'} {$ENDIF} -//{$IFDEF VER220}{$LIBSUFFIX '15'} {$ENDIF} -//{$IFDEF VER230}{$LIBSUFFIX '16'} {$ENDIF} -//{$IFDEF VER240}{$LIBSUFFIX '17'} {$ENDIF} -//{$IFDEF VER250}{$LIBSUFFIX '18'} {$ENDIF} -//{$IFDEF VER260}{$LIBSUFFIX '19'} {$ENDIF} -//{$IFDEF VER270}{$LIBSUFFIX '20'} {$ENDIF} -//{$IFDEF VER280}{$LIBSUFFIX '21'} {$ENDIF} -//{$IFDEF VER200}{$LIBSUFFIX '22'} {$ENDIF} -//{$IFDEF VER300}{$LIBSUFFIX '23'} {$ENDIF} -//{$IFDEF VER310}{$LIBSUFFIX '24'} {$ENDIF} -//{$IFDEF VER320}{$LIBSUFFIX '25'} {$ENDIF} -//{$IFDEF VER330}{$LIBSUFFIX '26'} {$ENDIF} requires DesignIDE, From cffb0477ba456ebe807545eca7bb64fcc2a20ec6 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 27 Mar 2018 16:19:10 +0300 Subject: [PATCH 063/123] Fix #50 --- Delphinus.Info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Delphinus.Info.json b/Delphinus.Info.json index 97733f20..944c5bf5 100644 --- a/Delphinus.Info.json +++ b/Delphinus.Info.json @@ -3,7 +3,7 @@ "name": "Python4Delphi", "picture": "PythonForDelphi\\Components\\P4DLogo.jpg", "license_type": "MIT", - "license_file": "LICENCE", + "license_file": "LICENSE", "platforms": "Win32;Win64", "compiler_min": 10 } \ No newline at end of file From cd581ae6e1e19ed551773d6cfded454af0d25d18 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 13 Apr 2018 16:56:56 +0300 Subject: [PATCH 064/123] Removed PYTHON23 PyInterpreterState and PyThreadState stuctures changed in recent Python versions Improved TPythonThread and updated Demos 11 and 33 TGUIPythonInputOutput should now work with threads if DelayWrites is set. Fixed complilation of PythonVersions.pas --- .../Components/Sources/Core/Definition.Inc | 22 +- .../Components/Sources/Core/PythonEngine.pas | 182 ++++++----- .../Sources/Core/PythonVersions.pas | 2 +- PythonForDelphi/Demos/Demo11/SortThds.pas | 6 +- PythonForDelphi/Demos/Demo11/ThSort.pas | 19 +- PythonForDelphi/Demos/Demo25/fmMain.pas | 6 - PythonForDelphi/Demos/Demo33/SortThds.pas | 46 +-- PythonForDelphi/Demos/Demo33/ThSort.pas | 32 +- PythonForDelphi/Demos/Demo33/ThrdDemo.dproj | 303 +++++++++++------- 9 files changed, 351 insertions(+), 267 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index ff835eb6..f09d714a 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -26,10 +26,9 @@ // modify the default Python version below, in the Python versions section. ///////////////////////////////////////////////////////////////////////////// -//{$DEFINE PYTHON23} //{$DEFINE PYTHON24} -{$DEFINE PYTHON25} -//{$DEFINE PYTHON26} +//{$DEFINE PYTHON25} +{$DEFINE PYTHON26`} //{$DEFINE PYTHON27} //{$DEFINE PYTHON30} //{$DEFINE PYTHON31} @@ -406,11 +405,9 @@ {$IFNDEF PYTHON26} {$IFNDEF PYTHON25} {$IFNDEF PYTHON24} - {$IFNDEF PYTHON23} {------} {$DEFINE PYTHON27} {------} - {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} @@ -425,33 +422,25 @@ {$ENDIF} -{$IFDEF PYTHON23} - {$DEFINE PYTHON23_OR_HIGHER} -{$ENDIF} {$IFDEF PYTHON24} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON25} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON26} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON27} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$DEFINE PYTHON27_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON30} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} @@ -459,7 +448,6 @@ {$DEFINE PYTHON30_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON31} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} @@ -468,7 +456,6 @@ {$DEFINE PYTHON31_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON32} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} @@ -478,7 +465,6 @@ {$DEFINE PYTHON32_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON33} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} @@ -489,7 +475,6 @@ {$DEFINE PYTHON33_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON34} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} @@ -501,7 +486,6 @@ {$DEFINE PYTHON34_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON35} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} @@ -514,7 +498,6 @@ {$DEFINE PYTHON35_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON36} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} @@ -528,7 +511,6 @@ {$DEFINE PYTHON36_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON37} - {$DEFINE PYTHON23_OR_HIGHER} {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index ce283a55..c1197741 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -121,8 +121,6 @@ interface PNativeInt = ^NativeInt; {$ENDIF} - - TPythonVersionProp = packed record DllName : String; RegVersion : String; @@ -131,9 +129,8 @@ interface end; const {$IFDEF MSWINDOWS} - PYTHON_KNOWN_VERSIONS: array[1..13] of TPythonVersionProp = - ( (DllName: 'python23.dll'; RegVersion: '2.3'; APIVersion: 1012; CanUseLatest: True), - (DllName: 'python24.dll'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), + PYTHON_KNOWN_VERSIONS: array[1..12] of TPythonVersionProp = + ( (DllName: 'python24.dll'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), (DllName: 'python25.dll'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python26.dll'; RegVersion: '2.6'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python27.dll'; RegVersion: '2.7'; APIVersion: 1013; CanUseLatest: True), @@ -147,9 +144,8 @@ interface (DllName: 'python37.dll'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF LINUX} - PYTHON_KNOWN_VERSIONS: array[1..13] of TPythonVersionProp = - ( (DllName: 'libpython2.3.so'; RegVersion: '2.3'; APIVersion: 1012; CanUseLatest: True), - (DllName: 'libpython2.4.so'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), + PYTHON_KNOWN_VERSIONS: array[1..12] of TPythonVersionProp = + ( (DllName: 'libpython2.4.so'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), (DllName: 'libpython2.5.so'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython2.6.so'; RegVersion: '2.6'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython2.7.so'; RegVersion: '2.7'; APIVersion: 1013; CanUseLatest: True), @@ -162,44 +158,41 @@ interface (DllName: 'libpython3.6.so'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True) (DllName: 'libpython3.7.so'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} -{$IFDEF PYTHON23} - COMPILED_FOR_PYTHON_VERSION_INDEX = 1; -{$ENDIF} {$IFDEF PYTHON24} - COMPILED_FOR_PYTHON_VERSION_INDEX = 2; + COMPILED_FOR_PYTHON_VERSION_INDEX = 1; {$ENDIF} {$IFDEF PYTHON25} - COMPILED_FOR_PYTHON_VERSION_INDEX = 3; + COMPILED_FOR_PYTHON_VERSION_INDEX = 2; {$ENDIF} {$IFDEF PYTHON26} - COMPILED_FOR_PYTHON_VERSION_INDEX = 4; + COMPILED_FOR_PYTHON_VERSION_INDEX = 3; {$ENDIF} {$IFDEF PYTHON27} - COMPILED_FOR_PYTHON_VERSION_INDEX = 5; + COMPILED_FOR_PYTHON_VERSION_INDEX = 4; {$ENDIF} {$IFDEF PYTHON30} - COMPILED_FOR_PYTHON_VERSION_INDEX = 6; + COMPILED_FOR_PYTHON_VERSION_INDEX = 5; {$ENDIF} {$IFDEF PYTHON31} - COMPILED_FOR_PYTHON_VERSION_INDEX = 7; + COMPILED_FOR_PYTHON_VERSION_INDEX = 6; {$ENDIF} {$IFDEF PYTHON32} - COMPILED_FOR_PYTHON_VERSION_INDEX = 8; + COMPILED_FOR_PYTHON_VERSION_INDEX = 7; {$ENDIF} {$IFDEF PYTHON33} - COMPILED_FOR_PYTHON_VERSION_INDEX = 9; + COMPILED_FOR_PYTHON_VERSION_INDEX = 8; {$ENDIF} {$IFDEF PYTHON34} - COMPILED_FOR_PYTHON_VERSION_INDEX = 10; + COMPILED_FOR_PYTHON_VERSION_INDEX = 9; {$ENDIF} {$IFDEF PYTHON35} - COMPILED_FOR_PYTHON_VERSION_INDEX = 11; + COMPILED_FOR_PYTHON_VERSION_INDEX = 10; {$ENDIF} {$IFDEF PYTHON36} - COMPILED_FOR_PYTHON_VERSION_INDEX = 12; + COMPILED_FOR_PYTHON_VERSION_INDEX = 11; {$ENDIF} {$IFDEF PYTHON37} - COMPILED_FOR_PYTHON_VERSION_INDEX = 13; + COMPILED_FOR_PYTHON_VERSION_INDEX = 12; {$ENDIF} PYT_METHOD_BUFFER_INCREASE = 10; PYT_MEMBER_BUFFER_INCREASE = 10; @@ -936,42 +929,78 @@ interface next : PPyInterpreterState; tstate_head : PPyThreadState; - modules : PPyObject; - sysdict : PPyObject; - builtins : PPyObject; +// The strucure has changed between versions beyond this point. +// Not safe to use members +// modules : PPyObject; +// sysdict : PPyObject; +// builtins : PPyObject; - checkinterval : integer; + //Spares + is_xxx1 : NativeInt; + is_xxx2 : NativeInt; + is_xxx3 : NativeInt; + is_xxx4 : NativeInt; + is_xxx5 : NativeInt; + is_xxx6 : NativeInt; + is_xxx7 : NativeInt; + is_xxx8 : NativeInt; + is_xxx9 : NativeInt; end; // Thread specific information PyThreadState = {$IFNDEF CPUX64}packed{$ENDIF} record + {prev : PPyThreadState; introduced in python 3.4} next : PPyThreadState; interp : PPyInterpreterState; + interp34 : PPyInterpreterState; - frame : PPyFrameObject; - recursion_depth: integer; - ticker : integer; - tracing : integer; - - sys_profilefn : Pointer; // c-functions for profile/trace - sys_tracefn : Pointer; - sys_profilefunc: PPyObject; - sys_tracefunc : PPyObject; - - curexc_type : PPyObject; - curexc_value : PPyObject; - curexc_traceback: PPyObject; - - exc_type : PPyObject; - exc_value : PPyObject; - exc_traceback : PPyObject; - - dict : PPyObject; - tick_counter :Integer; - gilstate_counter :Integer; - - async_exc :PPyObject; { Asynchronous exception to raise } - thread_id :LongInt; { Thread id where this tstate was created } +// The strucure has changed between versions beyond this point. +// Not safe to use members +// +// frame : PPyFrameObject; +// recursion_depth: integer; +// ticker : integer; +// tracing : integer; +// +// sys_profilefn : Pointer; // c-functions for profile/trace +// sys_tracefn : Pointer; +// sys_profilefunc: PPyObject; +// sys_tracefunc : PPyObject; +// +// curexc_type : PPyObject; +// curexc_value : PPyObject; +// curexc_traceback: PPyObject; +// +// exc_type : PPyObject; +// exc_value : PPyObject; +// exc_traceback : PPyObject; +// +// dict : PPyObject; +// tick_counter :Integer; +// gilstate_counter :Integer; +// +// async_exc :PPyObject; { Asynchronous exception to raise } +// thread_id :LongInt; { Thread id where this tstate was created } + //Spares + ts_xxx1 : NativeInt; + ts_xxx2 : NativeInt; + ts_xxx3 : NativeInt; + ts_xxx4 : NativeInt; + ts_xxx5 : NativeInt; + ts_xxx6 : NativeInt; + ts_xxx7 : NativeInt; + ts_xxx8 : NativeInt; + ts_xxx9 : NativeInt; + ts_xxx10 : NativeInt; + ts_xxx11 : NativeInt; + ts_xxx12 : NativeInt; + ts_xxx13 : NativeInt; + ts_xxx14 : NativeInt; + ts_xxx15 : NativeInt; + ts_xxx16 : NativeInt; + ts_xxx17 : NativeInt; + ts_xxx18 : NativeInt; + ts_xxx19 : NativeInt; { XXX signal handlers should also be here } end; @@ -3057,9 +3086,8 @@ TPyVar = class(TPyObject) {$HINTS OFF} TPythonThread = class(TThread) private - f_savethreadstate: PPyThreadState; - fInterpreterState: PPyInterpreterState; fThreadState: PPyThreadState; + f_savethreadstate: PPyThreadState; fThreadExecMode: TThreadExecMode; // Do not overwrite Execute! Use ExecuteWithPython instead! @@ -3075,12 +3103,8 @@ TPythonThread = class(TThread) procedure Py_Begin_Unblock_Threads; public - property InterpreterState: PPyInterpreterState read fInterpreterState - write fInterpreterState - default nil; - property ThreadState: PPyThreadState read fThreadState - write fThreadState; - property ThreadExecMode: TThreadExecMode read fThreadExecMode; + property ThreadState : PPyThreadState read fThreadState; + property ThreadExecMode: TThreadExecMode read fThreadExecMode write fThreadExecMode; end; {$HINTS ON} @@ -4863,10 +4887,17 @@ procedure TPythonEngine.SetInitScript(Value: TStrings); function TPythonEngine.GetInterpreterState: PPyInterpreterState; var res: PPyThreadState; + MajorVersion : integer; + MinorVersion : integer; begin + MajorVersion := StrToInt(RegVersion[1]); + MinorVersion := StrToInt(RegVersion[3]); if Assigned(PyThreadState_Get) then begin - res:= PyThreadState_Get; - Result := res^.interp; + res:= PyThreadState_Get(); + if (MajorVersion > 3) or ((MajorVersion = 3) and (MinorVersion >= 4)) then + Result := res^.interp34 + else + Result := res^.interp; end else Result := nil; end; @@ -9404,29 +9435,22 @@ procedure TPyVar.SetValueFromVariant( const value : Variant ); procedure TPythonThread.Execute; var - withinterp: Boolean; global_state : PPyThreadState; gilstate : PyGILState_STATE; begin - withinterp := Assigned( fInterpreterState); with GetPythonEngine do begin - if withinterp then + if fThreadExecMode = emNewState then begin - fThreadExecMode := emNewState; - fThreadState := PyThreadState_New( fInterpreterState); - if Assigned(fThreadState) then - begin - PyEval_AcquireThread(fThreadState); + gilstate := PyGILState_Ensure(); + try + fThreadState := GetThreadState; ExecuteWithPython; - PyEval_ReleaseThread( fThreadState); - PyThreadState_Clear( fThreadState); - PyThreadState_Delete( fThreadState); - end else - raise EPythonError.Create( 'Could not create a new thread state'); - end else {withinterp} + finally + PyGILState_Release(gilstate); + end; + end else {fThreadExecMode} begin - fThreadExecMode := emNewInterpreter; gilstate := PyGILState_Ensure(); global_state := PyThreadState_Get; PyThreadState_Swap(nil); @@ -9488,7 +9512,7 @@ function pyio_write(self, args : PPyObject) : PPyObject; if GetCurrentThreadId <> MainThreadId then with GetPythonEngine do begin - if RedirectIO and (IO <> nil) and (IO.ClassName <> 'TPythonInputOutput') then + if RedirectIO and (IO <> nil) and (IO.ClassName <> 'TPythonInputOutput') and not IO.DelayWrites then begin Result := GetPythonEngine.ReturnNone; Exit; @@ -9531,19 +9555,15 @@ function pyio_read(self, args : PPyObject) : PPyObject; if Assigned(IO) then if IO.UnicodeIO then begin Widetxt := IO.ReceiveUniData; - // KV!!!!!! if PyErr_Occurred <> nil then Result := nil else - // KV!!!!!! Result := PyUnicode_FromWideString(PWideChar(Widetxt)); end else begin txt := IO.ReceiveData; - // KV!!!!!! if PyErr_Occurred <> nil then Result := nil else - // KV!!!!!! Result := PyString_FromString(PAnsiChar(txt)); end else diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index 5eadf6bd..81190724 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -114,7 +114,7 @@ procedure TPythonVersion.AssignTo(PythonEngine: TPersistent); function TPythonVersion.GetApiVersion: integer; begin - if CompareVersions(SysVersion, 2.4) < 0 then + if CompareVersions(SysVersion, '2.4') < 0 then Result := 1013 else Result := 1012; diff --git a/PythonForDelphi/Demos/Demo11/SortThds.pas b/PythonForDelphi/Demos/Demo11/SortThds.pas index 268a2451..ef8add6e 100644 --- a/PythonForDelphi/Demos/Demo11/SortThds.pas +++ b/PythonForDelphi/Demos/Demo11/SortThds.pas @@ -38,7 +38,7 @@ TSortThread = class(TPythonThread) public property value[i: integer]: integer read getvalue; default; - constructor Create( ainterp: PPyInterpreterState; script: TStrings; + constructor Create( AThreadExecMode: TThreadExecMode; script: TStrings; module: TPythonModule; apyfuncname: string; Box: TPaintBox; var SortArray: array of Integer); @@ -56,7 +56,7 @@ procedure PaintLine(Canvas: TCanvas; I, Len: Integer); { TSortThread } -constructor TSortThread.Create( ainterp: PPyInterpreterState; script: TStrings; +constructor TSortThread.Create( AThreadExecMode: TThreadExecMode; script: TStrings; module: TPythonModule; apyfuncname: string; Box: TPaintBox; var SortArray: array of Integer); begin @@ -67,7 +67,7 @@ constructor TSortThread.Create( ainterp: PPyInterpreterState; script: TStrings; FSortArray := @SortArray; FSize := High(SortArray) - Low(SortArray) + 1; FreeOnTerminate := True; - InterpreterState := ainterp; + ThreadExecMode := AThreadExecMode; inherited Create(False); end; diff --git a/PythonForDelphi/Demos/Demo11/ThSort.pas b/PythonForDelphi/Demos/Demo11/ThSort.pas index 9b3fdf42..13f1f026 100644 --- a/PythonForDelphi/Demos/Demo11/ThSort.pas +++ b/PythonForDelphi/Demos/Demo11/ThSort.pas @@ -50,7 +50,7 @@ TThreadSortForm = class(TForm) ThreadsRunning: Integer; procedure RandomizeArrays; procedure ThreadDone(Sender: TObject); - procedure InitThreads(interp: PPyInterpreterState; script: TStrings); + procedure InitThreads(ThreadExecMode: TThreadExecMode; script: TStrings); function SortModule_GetValue( pself, args : PPyObject ) : PPyObject; cdecl; function SortModule_Swap( pself, args : PPyObject ) : PPyObject; cdecl; @@ -108,22 +108,21 @@ procedure TThreadSortForm.FormCreate(Sender: TObject); RandomizeArrays; end; -procedure TThreadSortForm.InitThreads(interp: PPyInterpreterState; script: TStrings); +procedure TThreadSortForm.InitThreads(ThreadExecMode: TThreadExecMode; script: TStrings); begin RandomizeArrays; ThreadsRunning := 3; with GetPythonEngine do begin - OwnThreadState := PyThreadState_Get; - PyEval_ReleaseThread(OwnThreadState); + OwnThreadState := PyEval_SaveThread; - with TSortThread.Create( interp, script, SortModule, 'SortFunc1', + with TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc1', BubbleSortBox, BubbleSortArray) do OnTerminate := ThreadDone; - with TSortThread.Create( interp, script, SortModule, 'SortFunc2', + with TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc2', SelectionSortBox, SelectionSortArray) do OnTerminate := ThreadDone; - with TSortThread.Create( interp, script, SortModule, 'SortFunc3', + with TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc3', QuickSortBox, QuickSortArray) do OnTerminate := ThreadDone; end; @@ -137,13 +136,13 @@ procedure TThreadSortForm.Start2BtnClick(Sender: TObject); with GetPythonEngine do begin ExecStrings(PythonMemo.Lines); - self.InitThreads(PyThreadState_Get.interp,nil); + self.InitThreads(emNewState,nil); end; end; procedure TThreadSortForm.StartBtnClick(Sender: TObject); begin - InitThreads(nil,PythonMemo.Lines); + InitThreads(emNewInterpreter,PythonMemo.Lines); //PythonEngine1.ExecStrings(PythonMemo.Lines); end; @@ -180,7 +179,7 @@ procedure TThreadSortForm.ThreadDone(Sender: TObject); Dec(ThreadsRunning); if ThreadsRunning = 0 then begin - GetPythonEngine.PyEval_AcquireThread(OwnThreadState); + GetPythonEngine.PyEval_RestoreThread(OwnThreadState); StartBtn.Enabled := True; Start2Btn.Enabled := True; ArraysRandom := False; diff --git a/PythonForDelphi/Demos/Demo25/fmMain.pas b/PythonForDelphi/Demos/Demo25/fmMain.pas index 2287db46..c9ae6539 100644 --- a/PythonForDelphi/Demos/Demo25/fmMain.pas +++ b/PythonForDelphi/Demos/Demo25/fmMain.pas @@ -270,14 +270,12 @@ procedure TMain.btnTestIntegersClick(Sender: TObject); Assert( b+1 = big+1 ); Assert( b*2 = big*2 ); Assert( b div 2 = big div 2 ); -{$IFDEF PYTHON23_OR_HIGHER} c := VarPythonCreate(True); Assert(VarIsBool(c)); Assert(VarIsTrue(c)); c := VarPythonCreate(False); Assert(VarIsBool(c)); Assert(not VarIsTrue(c)); -{$ENDIF} // Done! Log('Integer test was Ok.'); @@ -828,9 +826,7 @@ procedure TMain.btnTestMappingsClick(Sender: TObject); procedure TMain.btnTestDatesClick(Sender: TObject); var a, b, _timeMod : Variant; -{$IFDEF PYTHON23_OR_HIGHER} c : Variant; -{$ENDIF} _date, _date2 : TDateTime; _year, _month, _day : Word; _year2, _month2, _day2 : Word; @@ -876,7 +872,6 @@ procedure TMain.btnTestDatesClick(Sender: TObject); Assert( _min2 = _min ); Assert( _sec2 = _sec ); -{$IFDEF PYTHON23_OR_HIGHER} // test new datetime module _timeMod := Import('datetime'); // get the datetime module of Python //or _timeMod := DatetimeModule; // get the datetime module of Python @@ -1003,7 +998,6 @@ procedure TMain.btnTestDatesClick(Sender: TObject); finally GetPythonEngine.DatetimeConversionMode := dcmToTuple; end; -{$ENDIF} // Done! Log('Dates test was Ok.'); end; diff --git a/PythonForDelphi/Demos/Demo33/SortThds.pas b/PythonForDelphi/Demos/Demo33/SortThds.pas index cf0aad52..0fc817e4 100644 --- a/PythonForDelphi/Demos/Demo33/SortThds.pas +++ b/PythonForDelphi/Demos/Demo33/SortThds.pas @@ -7,10 +7,10 @@ interface uses Classes, {$IFDEF MSWINDOWS} - Graphics, ExtCtrls, + Graphics, ExtCtrls, Forms, {$ENDIF} {$IFDEF LINUX} - QGraphics, QExtCtrls, + QGraphics, QExtCtrls, QForms, {$ENDIF} PythonEngine; @@ -40,7 +40,7 @@ TSortThread = class(TPythonThread) public property value[i: integer]: integer read getvalue; default; - constructor Create( ainterp: PPyInterpreterState; script: TStrings; + constructor Create( AThreadExecMode: TThreadExecMode; script: TStrings; module: TPythonModule; apyfuncname: string; Box: TPaintBox; var SortArray: array of Integer); @@ -59,7 +59,7 @@ procedure PaintLine(Canvas: TCanvas; I, Len: Integer); { TSortThread } -constructor TSortThread.Create( ainterp: PPyInterpreterState; script: TStrings; +constructor TSortThread.Create( AThreadExecMode: TThreadExecMode; script: TStrings; module: TPythonModule; apyfuncname: string; Box: TPaintBox; var SortArray: array of Integer); begin @@ -70,7 +70,7 @@ constructor TSortThread.Create( ainterp: PPyInterpreterState; script: TStrings; FSortArray := @SortArray; FSize := High(SortArray) - Low(SortArray) + 1; FreeOnTerminate := True; - InterpreterState := ainterp; + ThreadExecMode := AThreadExecMode; inherited Create(False); end; @@ -88,6 +88,7 @@ procedure TSortThread.DoVisualSwap; var t: integer; pi,pj: pinteger; begin + Application.ProcessMessages; with FBox do begin Canvas.Pen.Color := clBtnFace; @@ -126,24 +127,25 @@ procedure TSortThread.ExecuteWithPython; var pyfunc: PPyObject; begin running := true; - with GetPythonEngine do - begin - if Assigned(FModule) and (ThreadExecMode = emNewInterpreter) then - FModule.InitializeForNewInterpreter; - if Assigned(fScript) then - ExecStrings(fScript); - pyfunc := FindFunction( ExecModule, fpyfuncname); - if Assigned(pyfunc) then - try - EvalFunction(pyfunc,[NativeInt(self),0,FSize]); - except - - end; - - Py_DecRef(pyfunc); - + try + with GetPythonEngine do + begin + if Assigned(FModule) and (ThreadExecMode = emNewInterpreter) then + FModule.InitializeForNewInterpreter; + if Assigned(fScript) then + ExecStrings(fScript); + pyfunc := FindFunction( ExecModule, fpyfuncname); + if Assigned(pyfunc) then + try + EvalFunction(pyfunc,[NativeInt(self),0,FSize]); + except + end; + + Py_DecRef(pyfunc); + end; + finally + running := false; end; - running := false; end; procedure TSortThread.Stop; diff --git a/PythonForDelphi/Demos/Demo33/ThSort.pas b/PythonForDelphi/Demos/Demo33/ThSort.pas index c2416687..20928c41 100644 --- a/PythonForDelphi/Demos/Demo33/ThSort.pas +++ b/PythonForDelphi/Demos/Demo33/ThSort.pas @@ -52,7 +52,7 @@ TThreadSortForm = class(TForm) ThreadsRunning: Integer; procedure RandomizeArrays; procedure ThreadDone(Sender: TObject); - procedure InitThreads(interp: PPyInterpreterState; script: TStrings); + procedure InitThreads(ThreadExecMode: TThreadExecMode; script: TStrings); function SortModule_GetValue( pself, args : PPyObject ) : PPyObject; cdecl; function SortModule_Swap( pself, args : PPyObject ) : PPyObject; cdecl; @@ -69,13 +69,11 @@ TThreadSortForm = class(TForm) implementation - - {$R *.dfm} type PSortArray = ^TSortArray; - TSortArray = array[0..176] of Integer; + TSortArray = array[0..200] of Integer; var ArraysRandom: Boolean; @@ -114,24 +112,23 @@ procedure TThreadSortForm.FormCreate(Sender: TObject); RandomizeArrays; end; -procedure TThreadSortForm.InitThreads(interp: PPyInterpreterState; script: TStrings); +procedure TThreadSortForm.InitThreads(ThreadExecMode: TThreadExecMode; script: TStrings); begin RandomizeArrays; ThreadsRunning := 3; with GetPythonEngine do begin - OwnThreadState := PyThreadState_Get; - PyEval_ReleaseThread(OwnThreadState); + OwnThreadState := PyEval_SaveThread; - Thread1 := TSortThread.Create( interp, script, SortModule, 'SortFunc1', + Thread1 := TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc1', BubbleSortBox, BubbleSortArray); Thread1.OnTerminate := ThreadDone; - Thread2 := TSortThread.Create( interp, script, SortModule, 'SortFunc2', + Thread2 := TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc2', SelectionSortBox, SelectionSortArray); Thread2.OnTerminate := ThreadDone; - Thread3 := TSortThread.Create( interp, script, SortModule, 'SortFunc3', + Thread3 := TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc3', QuickSortBox, QuickSortArray); Thread3.OnTerminate := ThreadDone; @@ -146,13 +143,13 @@ procedure TThreadSortForm.Start2BtnClick(Sender: TObject); with GetPythonEngine do begin ExecStrings(PythonMemo.Lines); - self.InitThreads(PyThreadState_Get.interp,nil); + self.InitThreads(emNewState,nil); end; end; procedure TThreadSortForm.StartBtnClick(Sender: TObject); begin - InitThreads(nil,PythonMemo.Lines); + InitThreads(emNewInterpreter,PythonMemo.Lines); //PythonEngine1.ExecStrings(PythonMemo.Lines); end; @@ -189,10 +186,13 @@ procedure TThreadSortForm.ThreadDone(Sender: TObject); Dec(ThreadsRunning); if ThreadsRunning = 0 then begin - GetPythonEngine.PyEval_AcquireThread(OwnThreadState); + GetPythonEngine.PyEval_RestoreThread(OwnThreadState); StartBtn.Enabled := True; Start2Btn.Enabled := True; ArraysRandom := False; + Thread1 := nil; + Thread2 := nil; + Thread3 := nil; end; end; @@ -247,9 +247,9 @@ procedure TThreadSortForm.SortModuleInitialization(Sender: TObject); procedure TThreadSortForm.Button1Click(Sender: TObject); begin - Thread1.Stop(); - Thread2.Stop(); - Thread3.Stop(); + if Assigned(Thread1) and not Thread1.Finished then Thread1.Stop(); + if Assigned(Thread2) and not Thread2.Finished then Thread2.Stop(); + if Assigned(Thread3) and not Thread3.Finished then Thread3.Stop(); end; procedure TThreadSortForm.FormCloseQuery(Sender: TObject; diff --git a/PythonForDelphi/Demos/Demo33/ThrdDemo.dproj b/PythonForDelphi/Demos/Demo33/ThrdDemo.dproj index 87805686..b59aa1ee 100644 --- a/PythonForDelphi/Demos/Demo33/ThrdDemo.dproj +++ b/PythonForDelphi/Demos/Demo33/ThrdDemo.dproj @@ -1,108 +1,195 @@ - - - {9e78092e-5a16-44b9-97bf-b879c252b4ba} - Debug - AnyCPU - DCC32 - ThrdDemo.exe - ThrdDemo.dpr - 12.0 - Debug - - - true - - - true - Base - true - - - true - Base - true - - - ThrdDemo.exe - - - 7.0 - False - False - 0 - RELEASE;$(DCC_Define) - - - 7.0 - DEBUG;JVCLThemesEnabled;COMPILER5_UP;PS_USESSUPPORT;$(DCC_Define) - C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_UnitSearchPath) - C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_ResourcePath) - C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_ObjPath) - C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_IncludePath) - - - Delphi.Personality.12 - - - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1049 - 1251 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - ThrdDemo.dpr - - - - 12 - - - - MainSource - - - -
ThreadSortForm
-
- - Base - - - Cfg_2 - Base - - - Cfg_1 - Base - -
- -
+ + + {9e78092e-5a16-44b9-97bf-b879c252b4ba} + Debug + DCC32 + ThrdDemo.exe + ThrdDemo.dpr + 18.4 + Debug + VCL + True + Win64 + 3 + 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 + + + ThrdDemo.exe + ThrdDemo + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1049 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 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 + + + $(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 + 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 + + + 7.0 + 0 + False + 0 + RELEASE;$(DCC_Define) + + + true + true + + + true + true + + + 7.0 + DEBUG;JVCLThemesEnabled;COMPILER5_UP;PS_USESSUPPORT;$(DCC_Define) + C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_UnitSearchPath) + C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_ResourcePath) + C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_ObjPath) + C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_IncludePath) + + + true + true + + + true + true + + + Delphi.Personality.12 + + + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + ThrdDemo.dpr + + + + True + True + + + 12 + + + + MainSource + + + +
ThreadSortForm
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + +
From 1a321482db03e906720ba76a30f4538cb258cfd7 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 24 Apr 2018 13:10:10 +0300 Subject: [PATCH 065/123] Removed compilation warnings. --- .../Components/Sources/Core/Definition.Inc | 4 +-- .../Components/Sources/Core/PythonEngine.pas | 6 ++-- .../Sources/Core/PythonVersions.pas | 35 +++++++++++++------ .../Components/Sources/Core/VarPyth.pas | 35 +++++++++---------- 4 files changed, 45 insertions(+), 35 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index f09d714a..e280b211 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -27,8 +27,8 @@ ///////////////////////////////////////////////////////////////////////////// //{$DEFINE PYTHON24} -//{$DEFINE PYTHON25} -{$DEFINE PYTHON26`} +{$DEFINE PYTHON25} +//{$DEFINE PYTHON26} //{$DEFINE PYTHON27} //{$DEFINE PYTHON30} //{$DEFINE PYTHON31} diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index c1197741..f0c960d0 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -6076,8 +6076,6 @@ function TPythonEngine.PyObjectAsVariant( obj : PPyObject ) : Variant; end; function TPythonEngine.VarRecAsPyObject( v : TVarRec ) : PPyObject; -var - buff : array [0..256] of AnsiChar; begin case v.VType of vtInteger: Result := PyInt_FromLong( v.VInteger ); @@ -6087,7 +6085,7 @@ function TPythonEngine.VarRecAsPyObject( v : TVarRec ) : PPyObject; vtString: begin if Assigned(v.VString) then - Result := PyString_FromString( StrPCopy( buff, v.VString^) ) + Result := PyString_FromString(PAnsiChar(AnsiString(v.VString^))) else Result := PyString_FromString( '' ); end; @@ -6213,7 +6211,7 @@ function TPythonEngine.ArrayToPyDict( items : array of const) : PPyObject; vtAnsiString: begin if Assigned(v.VAnsiString) then - Result := StrPas(PAnsiChar(Ansistring(v.VAnsiString))) + Result := Ansistring(v.VAnsiString) else Result := ''; end; diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index 81190724..82e2379c 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -20,12 +20,14 @@ TPythonVersion = record private FDisplayName: string; FHelpFile: string; + fSysArchitecture : string; function GetDLLName: string; - function GetSysArchitecture:string; + function ExpectedArchitecture:string; function GetIsPython3K: Boolean; function GetHelpFile: string; function GetDisplayName: string; function GetApiVersion: integer; + function GetSysArchitecture: string; public IsRegistered: Boolean; IsAllUsers: Boolean; @@ -55,12 +57,12 @@ TPythonVersion = record {$IFDEF MSWINDOWS} (* Checks whether a Python version is registered and returns the related info *) - function GetRegisterPythonVersion(SysVersion: string; + function GetRegisteredPythonVersion(SysVersion: string; out PythonVersion: TPythonVersion): Boolean; (* Returns all registered Python versions *) function GetRegisteredPythonVersions : TPythonVersions; (* Returns the highest numbered registered Python version *) - function GetLatestRegisteredPythonVersion(PythonVersion: TPythonVersion): Boolean; + function GetLatestRegisteredPythonVersion(out PythonVersion: TPythonVersion): Boolean; {$ENDIF} implementation @@ -85,7 +87,7 @@ function TPythonVersion.GetDLLName: string; {$ENDIF} end; -function TPythonVersion.GetSysArchitecture: string; +function TPythonVersion.ExpectedArchitecture: string; begin Result := ''; {$IFDEF CPUX64} @@ -154,6 +156,13 @@ function TPythonVersion.GetIsPython3K: Boolean; end; end; +function TPythonVersion.GetSysArchitecture: string; +begin + Result := fSysArchitecture; + if Result = '' then + Result := 'Unknown'; +end; + function CompareVersions(A, B : String) : Integer; function GetNextNumber(var Version: string): Integer; @@ -197,7 +206,7 @@ function CompareVersions(A, B : String) : Integer; end; {$IFDEF MSWINDOWS} -function GetRegisterPythonVersion(SysVersion: string; +function GetRegisteredPythonVersion(SysVersion: string; out PythonVersion: TPythonVersion): Boolean; // Python provides for All user and Current user installations // All User installations place the Python DLL in the Windows System directory @@ -233,6 +242,7 @@ function GetRegisterPythonVersion(SysVersion: string; if OpenKey(Key, False) then begin PythonVersion.DisplayName := ReadString('DisplayName'); PythonVersion.Version := ReadString('Version'); + PythonVersion.fSysArchitecture := ReadString('SysArchitecture'); CloseKey; end; if OpenKey(Key + '\PythonPath', False) then begin @@ -260,10 +270,10 @@ function GetRegisterPythonVersion(SysVersion: string; FillChar(PythonVersion, SizeOf(TPythonVersion), 0); VersionSuffix := ''; -{$IFDEF CPUX86} + {$IFDEF CPUX86} if CompareVersions(SysVersion, '3.5') <= 0 then VersionSuffix := '-32'; -{$ENDIF} + {$ENDIF} key := Format('\Software\Python\PythonCore\%s%s', [SysVersion, VersionSuffix]); @@ -276,6 +286,10 @@ function GetRegisterPythonVersion(SysVersion: string; if not Result then begin PythonVersion.IsAllUsers := True; Result := ReadFromRegistry(HKEY_LOCAL_MACHINE, key); + if PythonVersion.fSysArchitecture = '' then + // for all user installations we can be sure. + /// But not for local user installations + PythonVersion.fSysArchitecture := PythonVersion.ExpectedArchitecture; end; PythonVersion.IsRegistered := Result; @@ -290,7 +304,7 @@ function GetRegisteredPythonVersions : TPythonVersions; Count := 0; SetLength(Result, High(PYTHON_KNOWN_VERSIONS) - COMPILED_FOR_PYTHON_VERSION_INDEX + 1); for I := High(PYTHON_KNOWN_VERSIONS) downto COMPILED_FOR_PYTHON_VERSION_INDEX do - if GetRegisterPythonVersion(PYTHON_KNOWN_VERSIONS[I].RegVersion, PythonVersion) then + if GetRegisteredPythonVersion(PYTHON_KNOWN_VERSIONS[I].RegVersion, PythonVersion) then begin Result[Count] := PythonVersion; Inc(Count); @@ -298,14 +312,13 @@ function GetRegisteredPythonVersions : TPythonVersions; SetLength(Result, Count); end; -function GetLatestRegisteredPythonVersion(PythonVersion: TPythonVersion): Boolean; +function GetLatestRegisteredPythonVersion(out PythonVersion: TPythonVersion): Boolean; Var I: Integer; begin - Result := False; for I := High(PYTHON_KNOWN_VERSIONS) downto COMPILED_FOR_PYTHON_VERSION_INDEX do begin - Result := GetRegisterPythonVersion(PYTHON_KNOWN_VERSIONS[I].RegVersion, PythonVersion); + Result := GetRegisteredPythonVersion(PYTHON_KNOWN_VERSIONS[I].RegVersion, PythonVersion); if Result then break; end; end; diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index 38458e11..89137bd6 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -968,7 +968,7 @@ TStringDesc = record begin // Grab the identifier LArgCount := CallDesc^.ArgCount; - LIdent := FixupIdent(AnsiString(PAnsiChar(@CallDesc^.ArgTypes[LArgCount]))); + LIdent := FixupIdent(string(AnsiString(PAnsiChar(@CallDesc^.ArgTypes[LArgCount])))); FillChar(Strings, SizeOf(Strings), 0); VarParams := GetDispatchInvokeArgs(CallDesc, Params, Strings, true); @@ -1052,7 +1052,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(Length(LNamePtr)); fNamedParams[I].Index := I+LNamedArgStart; fNamedParams[I].Name := AnsiString(LNamePtr); end; @@ -1427,7 +1427,6 @@ function TPythonVariantType.EvalPython(const V: TVarData; _key, _value : PPyObject; _result : Integer; begin - Result := nil; with GetPythonEngine do begin PyErr_Clear; @@ -1438,21 +1437,21 @@ function TPythonVariantType.EvalPython(const V: TVarData; _value := VarDataToPythonObject(AValue); if not Assigned(_value) then raise Exception.Create(SCantConvertValueToPythonObject); - if PyList_Check(AObject) then - _result := PyList_SetItem( AObject, Variant(AKey), _value ) - else if PyTuple_Check(AObject) then - _result := PyTuple_SetItem( AObject, Variant(AKey), _value ) - else - try - if PySequence_Check(AObject) <> 0 then - _result := PySequence_SetItem(AObject, Variant(AKey), _value) - else - _result := PyObject_SetItem( AObject, _key, _value ); - finally - Py_XDecRef(_value); - end; // of try - CheckError; - Result := PyInt_FromLong(_result); + if PyList_Check(AObject) then + _result := PyList_SetItem( AObject, Variant(AKey), _value ) + else if PyTuple_Check(AObject) then + _result := PyTuple_SetItem( AObject, Variant(AKey), _value ) + else + try + if PySequence_Check(AObject) <> 0 then + _result := PySequence_SetItem(AObject, Variant(AKey), _value) + else + _result := PyObject_SetItem( AObject, _key, _value ); + finally + Py_XDecRef(_value); + end; // of try + CheckError; + Result := PyInt_FromLong(_result); finally Py_XDecRef(_key); end; // of try From 17a0a9dd585dc82dfc6f6048569058dfa5b61a14 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 25 Apr 2018 02:39:33 +0300 Subject: [PATCH 066/123] Removed Py_GetPlatform Added PythonExecutable to PythonVersions --- .../Components/Sources/Core/PythonEngine.pas | 6 ------ .../Components/Sources/Core/PythonVersions.pas | 11 +++++++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index f0c960d0..cae49ef4 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -2069,7 +2069,6 @@ TPythonInterface=class(TDynamicDll) procedure Py_XINCREF ( op: PPyObject); procedure Py_XDECREF ( op: PPyObject); - function Py_GetPlatform: PAnsiChar; cdecl; function PyCode_Addr2Line( co: PPyCodeObject; addrq : Integer ) : Integer; cdecl; function Py_GetBuildInfo: PAnsiChar; cdecl; function PyImport_ExecCodeModule( const AName : AnsiString; codeobject : PPyObject) : PPyObject; @@ -4125,11 +4124,6 @@ procedure TPythonInterface.Py_XDECREF(op: PPyObject); if op <> nil then Py_DECREF(op); end; -function TPythonInterface.Py_GetPlatform: PAnsiChar; cdecl; -begin - Py_GetPlatform := 'win32'; -end; - // This function is copied from compile.c because it was not // exported in the Dll function TPythonInterface.PyCode_Addr2Line( co: PPyCodeObject; addrq : Integer ) : Integer; cdecl; diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index 82e2379c..a790e044 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -28,6 +28,7 @@ TPythonVersion = record function GetDisplayName: string; function GetApiVersion: integer; function GetSysArchitecture: string; + function GetPythonExecutable: string; public IsRegistered: Boolean; IsAllUsers: Boolean; @@ -37,6 +38,7 @@ TPythonVersion = record InstallPath: string; PythonPath: string; procedure AssignTo(PythonEngine: TPersistent); + property PythonExecutable: string read GetPythonExecutable; property DLLName: string read GetDLLName; property SysArchitecture: string read GetSysArchitecture; property IsPython3K: Boolean read GetIsPython3K; @@ -156,6 +158,15 @@ function TPythonVersion.GetIsPython3K: Boolean; end; end; +function TPythonVersion.GetPythonExecutable: string; +begin + Result := IncludeTrailingPathDelimiter(InstallPath) + 'python.exe'; + if not FileExists(Result) then begin + Result := IncludeTrailingPathDelimiter(InstallPath) + 'Scripts\python.exe'; + if not FileExists(Result) then Result := ''; + end; +end; + function TPythonVersion.GetSysArchitecture: string; begin Result := fSysArchitecture; From c73cb711d97c946f1c04d252188d7638734e4340 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 1 May 2018 05:24:59 +0300 Subject: [PATCH 067/123] Removed warning. --- PythonForDelphi/Components/Sources/Core/WrapDelphi.pas | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas index 7e074d6a..1f019037 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas @@ -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 := ''; @@ -1554,7 +1554,7 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; else{$ENDIF} if Assigned(DelphiObject) and (Name <> '') then begin // Not a method, try a property. - PropInfo := GetPropInfo(DelphiObject, string(Name)); + PropInfo := GetPropInfo(DelphiObject, Name); if PropInfo <> nil then begin // we have a property From 126632fd13e6c28c88b07cfb487306ff8d6c6e7c Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 2 May 2018 05:34:40 +0300 Subject: [PATCH 068/123] Isx64 added (checking the platform of a dll) PythonVersionFromPath added --- .../Sources/Core/PythonVersions.pas | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index a790e044..381de13e 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -58,6 +58,8 @@ TPythonVersion = record {$IFDEF MSWINDOWS} + (* Checks whether a DLL was compiled for X64 *) + function Isx64(const FileName: string): Boolean; (* Checks whether a Python version is registered and returns the related info *) function GetRegisteredPythonVersion(SysVersion: string; out PythonVersion: TPythonVersion): Boolean; @@ -65,6 +67,7 @@ TPythonVersion = record function GetRegisteredPythonVersions : TPythonVersions; (* Returns the highest numbered registered Python version *) function GetLatestRegisteredPythonVersion(out PythonVersion: TPythonVersion): Boolean; + function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVersion): Boolean; {$ENDIF} implementation @@ -217,6 +220,27 @@ function CompareVersions(A, B : String) : Integer; end; {$IFDEF MSWINDOWS} +function Isx64(const FileName: string): Boolean; +var + Strm : TFileStream; + Header: TImageDosHeader; + ImageNtHeaders: TImageNtHeaders; +begin + Strm := TFileStream.Create(FileName, fmOpenRead); + try + Strm.ReadBuffer(Header, SizeOf(Header)); + if (Header.e_magic <> IMAGE_DOS_SIGNATURE) or (Header._lfanew = 0) then + Exit(False); + Strm.Position := Header._lfanew; + Strm.ReadBuffer(ImageNtHeaders, SizeOf(ImageNtHeaders)); + if ImageNtHeaders.Signature <> IMAGE_NT_SIGNATURE then + Exit(False); + Result := ImageNtHeaders.FileHeader.Machine <> IMAGE_FILE_MACHINE_I386; + finally + Strm.Free; + end; +end; + function GetRegisteredPythonVersion(SysVersion: string; out PythonVersion: TPythonVersion): Boolean; // Python provides for All user and Current user installations @@ -275,6 +299,7 @@ function GetRegisteredPythonVersion(SysVersion: string; var key: string; VersionSuffix: string; + APythonVersion: TPythonVersion; begin // Initialize PythohVersion Finalize(PythonVersion); @@ -303,6 +328,13 @@ function GetRegisteredPythonVersion(SysVersion: string; PythonVersion.fSysArchitecture := PythonVersion.ExpectedArchitecture; end; + if Result and (PythonVersion.fSysArchitecture = '') then begin + // We need to check it is the proper platform + Result := PythonVersionFromPath(PythonVersion.InstallPath, APythonVersion); + if Result then + PythonVersion.fSysArchitecture := PythonVersion.ExpectedArchitecture; + end; + PythonVersion.IsRegistered := Result; end; @@ -334,7 +366,67 @@ function GetLatestRegisteredPythonVersion(out PythonVersion: TPythonVersion): Bo end; end; -{$ENDIF} +function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVersion): Boolean; + function FindPythonDLL(APath : string): string; + Var + FindFileData: TWIN32FindData; + Handle : THandle; + DLLFileName: string; + begin + Result := ''; + Handle := FindFirstFile(PWideChar(Path+'\python??.dll'), FindFileData); + if Handle = INVALID_HANDLE_VALUE then Exit; // not python dll + DLLFileName:= FindFileData.cFileName; + // skip if python3.dll was found + if Length(DLLFileName) <> 12 then FindNextFile(Handle, FindFileData); + if Handle = INVALID_HANDLE_VALUE then Exit; + Windows.FindClose(Handle); + DLLFileName:= FindFileData.cFileName; + if Length(DLLFileName) = 12 then + Result := DLLFileName; + end; + +Var + DLLFileName: string; + DLLPath: string; + SysVersion: string; + I: integer; +begin + Result := False; + Finalize(PythonVersion); + FillChar(PythonVersion, SizeOf(TPythonVersion), 0); + DLLPath := ExcludeTrailingPathDelimiter(Path); + + PythonVersion.InstallPath := DLLPath; + + DLLFileName := FindPythonDLL(DLLPath); + if DLLFileName = '' then begin + DLLPath := DLLPath + '\Scripts'; + DLLFileName := FindPythonDLL(DLLPath); + end; + if DLLFileName = '' then Exit; + + // check if same platform + try + if {$IFDEF CPUX64}not {$ENDIF}Isx64(DLLPath+'\'+DLLFileName) then Exit; + except + Exit; + end; + PythonVersion.DLLPath := DLLPath; + SysVersion := Copy(DLLFileName, 7, 2); + Insert('.', SysVersion, 2); + + PythonVersion.SysVersion := SysVersion; + PythonVersion.fSysArchitecture := PythonVersion.ExpectedArchitecture; + + for I := High(PYTHON_KNOWN_VERSIONS) downto COMPILED_FOR_PYTHON_VERSION_INDEX do + if PYTHON_KNOWN_VERSIONS[I].RegVersion = SysVersion then begin + Result := True; + break; + end; +end; + +{$ENDIF} end. From 670fe324eb75e00bbd0f4b8b07b00f84e77f7c96 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 5 May 2018 19:15:18 +0300 Subject: [PATCH 069/123] Check the executable instead of the dll for X64. Check for venv --- .../Sources/Core/PythonVersions.pas | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index 381de13e..adcdd294 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -37,6 +37,7 @@ TPythonVersion = record DLLPath: string; InstallPath: string; PythonPath: string; + function Is_venv: Boolean; procedure AssignTo(PythonEngine: TPersistent); property PythonExecutable: string read GetPythonExecutable; property DLLName: string read GetDLLName; @@ -58,6 +59,8 @@ TPythonVersion = record {$IFDEF MSWINDOWS} + (* Checks whether an executable was compiled for X64 *) + function IsEXEx64(const EXEName: string): Boolean; (* Checks whether a DLL was compiled for X64 *) function Isx64(const FileName: string): Boolean; (* Checks whether a Python version is registered and returns the related info *) @@ -110,7 +113,8 @@ function TPythonVersion.ExpectedArchitecture: string; procedure TPythonVersion.AssignTo(PythonEngine: TPersistent); begin - if PythonEngine is TPythonEngine then begin + if PythonEngine is TPythonEngine then + begin TPythonEngine(PythonEngine).UseLastKnownVersion := False; TPythonEngine(PythonEngine).RegVersion := SysVersion; TPythonEngine(PythonEngine).DllName := DLLName; @@ -177,6 +181,16 @@ function TPythonVersion.GetSysArchitecture: string; Result := 'Unknown'; end; +function TPythonVersion.Is_venv: Boolean; +{ + Check weather this is python venv folder introduced in python 3.5 + Note: venv is different from virtualenv +} +begin + Result := not IsRegistered and (InstallPath <> DLLPath) and + FileExists(IncludeTrailingPathDelimiter(InstallPath) + 'pyvenv.cfg'); +end; + function CompareVersions(A, B : String) : Integer; function GetNextNumber(var Version: string): Integer; @@ -220,6 +234,15 @@ function CompareVersions(A, B : String) : Integer; end; {$IFDEF MSWINDOWS} +function IsEXEx64(const EXEName: string): Boolean; +var + BinaryType: DWORD; +begin + Result := FileExists(EXEName) and + GetBinaryType(PChar(ExeName), Binarytype) and + (BinaryType = SCS_64BIT_BINARY); +end; + function Isx64(const FileName: string): Boolean; var Strm : TFileStream; @@ -374,7 +397,7 @@ function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVer DLLFileName: string; begin Result := ''; - Handle := FindFirstFile(PWideChar(Path+'\python??.dll'), FindFileData); + Handle := FindFirstFile(PWideChar(APath+'\python??.dll'), FindFileData); if Handle = INVALID_HANDLE_VALUE then Exit; // not python dll DLLFileName:= FindFileData.cFileName; // skip if python3.dll was found @@ -408,7 +431,7 @@ function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVer // check if same platform try - if {$IFDEF CPUX64}not {$ENDIF}Isx64(DLLPath+'\'+DLLFileName) then Exit; + if {$IFDEF CPUX64}not {$ENDIF}IsEXEx64(DLLPath+'\python.exe') then Exit; except Exit; end; From e6607599147084a61dc832413867826ea43f0aab Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 5 May 2018 23:42:03 +0300 Subject: [PATCH 070/123] Is_conda and Is_virtualenv added. --- .../Sources/Core/PythonVersions.pas | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index adcdd294..195860df 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -38,6 +38,8 @@ TPythonVersion = record InstallPath: string; PythonPath: string; function Is_venv: Boolean; + function Is_virtualenv: Boolean; + function Is_conda: Boolean; procedure AssignTo(PythonEngine: TPersistent); property PythonExecutable: string read GetPythonExecutable; property DLLName: string read GetDLLName; @@ -132,10 +134,23 @@ function TPythonVersion.GetApiVersion: integer; end; function TPythonVersion.GetDisplayName: string; +Var + FormatStr: string; begin + if FDisplayName = '' then + begin + if Is_conda then + FormatStr := 'Conda %s (%s)' + else + FormatStr := 'Python %s (%s)'; + if Is_venv then + FormatStr := FormatStr + ' -venv' + else if Is_virtualenv then + FormatStr := FormatStr + ' -virtualenv'; + + FDisplayName := Format(FormatStr, [SysVersion, SysArchitecture]); + end; Result := FDisplayName; - if Result = '' then - Result := Format('Python %s (%s)', [SysVersion, SysArchitecture]); end; function TPythonVersion.GetHelpFile: string; @@ -178,7 +193,12 @@ function TPythonVersion.GetSysArchitecture: string; begin Result := fSysArchitecture; if Result = '' then - Result := 'Unknown'; + Result := 'Unknown platform'; +end; + +function TPythonVersion.Is_conda: Boolean; +begin + Result := FileExists(IncludeTrailingPathDelimiter(InstallPath) + 'scripts\conda.exe'); end; function TPythonVersion.Is_venv: Boolean; @@ -191,6 +211,12 @@ function TPythonVersion.Is_venv: Boolean; FileExists(IncludeTrailingPathDelimiter(InstallPath) + 'pyvenv.cfg'); end; +function TPythonVersion.Is_virtualenv: Boolean; +begin + Result := not IsRegistered and (InstallPath <> DLLPath) and + not FileExists(IncludeTrailingPathDelimiter(InstallPath) + 'pyvenv.cfg'); +end; + function CompareVersions(A, B : String) : Integer; function GetNextNumber(var Version: string): Integer; From 31b244bf63ecfb3813ca2733cd0e102b1adffb74 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 21 Aug 2018 16:57:47 +0300 Subject: [PATCH 071/123] Reimplemented MaskFPUExceptions #57 --- .../Components/Sources/Core/PythonEngine.pas | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index cae49ef4..4d148aa4 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3168,7 +3168,7 @@ procedure MaskFPUExceptions(ExceptionsMasked : boolean; implementation {$IFDEF MSWINDOWS} -uses Registry; +uses Math, Registry; {$ENDIF} @@ -9732,19 +9732,17 @@ function PyType_HasFeature(AType : PPyTypeObject; AFlag : Integer) : Boolean; procedure MaskFPUExceptions(ExceptionsMasked : boolean; MatchPythonPrecision : Boolean); begin - {$IFNDEF CPUARM} - if MatchPythonPrecision then begin - if ExceptionsMasked then - Set8087CW($1232 or $3F) - else - Set8087CW($1232); - end else begin - if ExceptionsMasked then - Set8087CW($1332 or $3F) + if ExceptionsMasked then + SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, + exOverflow, exUnderflow, exPrecision]) + else + SetExceptionMask([exDenormalized, exUnderflow, exPrecision]); +{$IFNDEF NEXTGEN} + if MatchPythonPrecision then + SetPrecisionMode(pmDouble) else - Set8087CW($1332); - end; - {$ENDIF} + SetPrecisionMode(pmExtended); +{$ENDIF !NEXTGEN} end; {$IFDEF MSWINDOWS} From da1179cd5bb5dc033f7e02fac90db2b4859c4edd Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 21 Aug 2018 17:18:16 +0300 Subject: [PATCH 072/123] #52 Py_FindMethod not available in Python 3.x --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 9 --------- PythonForDelphi/Demos/Demo06/Unit1.pas | 4 +--- PythonForDelphi/Demos/Demo07/Unit1.pas | 4 +--- PythonForDelphi/Demos/FPC/Demo06/Unit1.pas | 4 +--- 4 files changed, 3 insertions(+), 18 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 4d148aa4..f4714aa9 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -7800,15 +7800,6 @@ function TPyObject.GetAttr(key : PAnsiChar) : PPyObject; finally Py_XDecRef(PyKey); end; - -// // check for a method -// if IsPython3000 then -// // I think Python 3000 from beta 2 gets the methods from the tp_methods field -// Result := nil -// else -// Result := Py_FindMethod( PythonType.MethodsData, GetSelf, key); -// if not Assigned(Result) then -// PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Unknown attribute "%s"',[key]))); end; end; diff --git a/PythonForDelphi/Demos/Demo06/Unit1.pas b/PythonForDelphi/Demos/Demo06/Unit1.pas index f8df4802..a0043397 100644 --- a/PythonForDelphi/Demos/Demo06/Unit1.pas +++ b/PythonForDelphi/Demos/Demo06/Unit1.pas @@ -170,9 +170,7 @@ 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); + Result := PyObject_GenericGetAttr(obj, PyString_FromString(key)); if not Assigned(Result) then PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Unknown attribute "%s"',[key]))); end; diff --git a/PythonForDelphi/Demos/Demo07/Unit1.pas b/PythonForDelphi/Demos/Demo07/Unit1.pas index ff769141..070b3749 100644 --- a/PythonForDelphi/Demos/Demo07/Unit1.pas +++ b/PythonForDelphi/Demos/Demo07/Unit1.pas @@ -208,9 +208,7 @@ 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); + Result := PyObject_GenericGetAttr(obj, PyString_FromString(key)); if not Assigned(Result) then PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Unknown attribute "%s"',[key]))); end; diff --git a/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas b/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas index 85b22e63..28c90df9 100644 --- a/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas +++ b/PythonForDelphi/Demos/FPC/Demo06/Unit1.pas @@ -173,9 +173,7 @@ 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); + Result := PyObject_GenericGetAttr(obj, PyString_FromString(key)); if not Assigned(Result) then PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Unknown attribute "%s"',[key]))); end; From bd2fb42a56054b14399d478c79f56006cc7d83fd Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 21 Aug 2018 20:29:40 +0300 Subject: [PATCH 073/123] Removed Kylix stuff from demos --- PythonForDelphi/Demos/Demo01/Project1.dpr | 5 - PythonForDelphi/Demos/Demo01/Unit1.pas | 11 - PythonForDelphi/Demos/Demo01/Unit1.xfm | Bin 1449 -> 0 bytes PythonForDelphi/Demos/Demo02/Project1.dpr | 8 - PythonForDelphi/Demos/Demo02/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo02/Unit1.pas | 12 - 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.dpr | 8 - PythonForDelphi/Demos/Demo03/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo03/Unit1.pas | 5 - PythonForDelphi/Demos/Demo04/Project1.dof | 92 ------ PythonForDelphi/Demos/Demo04/Project1.dpr | 5 - PythonForDelphi/Demos/Demo04/Unit1.pas | 5 - PythonForDelphi/Demos/Demo05/Project1.dpr | 5 - PythonForDelphi/Demos/Demo05/Unit1.dfm | Bin 1630 -> 1629 bytes PythonForDelphi/Demos/Demo05/Unit1.pas | 5 - PythonForDelphi/Demos/Demo06/Project1.dof | 136 --------- PythonForDelphi/Demos/Demo06/Project1.dpr | 5 - PythonForDelphi/Demos/Demo06/Unit1.pas | 7 - PythonForDelphi/Demos/Demo07/Project1.conf | 32 -- PythonForDelphi/Demos/Demo07/Project1.dof | 87 ------ PythonForDelphi/Demos/Demo07/Project1.dpr | 5 - PythonForDelphi/Demos/Demo07/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo07/Unit1.pas | 9 +- PythonForDelphi/Demos/Demo08/Project1.conf | 32 -- PythonForDelphi/Demos/Demo08/Project1.dof | 88 ------ PythonForDelphi/Demos/Demo08/Project1.dpr | 5 - PythonForDelphi/Demos/Demo08/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo08/Unit1.pas | 9 +- PythonForDelphi/Demos/Demo09/Project1.conf | 32 -- PythonForDelphi/Demos/Demo09/Project1.dof | 150 --------- PythonForDelphi/Demos/Demo09/Project1.dpr | 8 - PythonForDelphi/Demos/Demo09/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo09/Unit1.pas | 7 - PythonForDelphi/Demos/Demo09/demodll.conf | 34 --- PythonForDelphi/Demos/Demo09/demodll.dof | 150 --------- PythonForDelphi/Demos/Demo09/demodll.kof | 61 ---- PythonForDelphi/Demos/Demo11/ThSort.pas | 5 - PythonForDelphi/Demos/Demo11/ThrdDemo.dpr | 8 - .../Demos/Demo16/Example1/Project1.dof | 93 ------ .../Demos/Demo16/Example1/Project1.dpr | 5 - .../Demos/Demo16/Example1/Unit1.pas | 7 - .../Demos/Demo16/Example2/Project1.dof | 93 ------ .../Demos/Demo16/Example2/Project1.dpr | 5 - .../Demos/Demo16/Example2/Unit1.pas | 8 - PythonForDelphi/Demos/Demo17/Project1.dof | 93 ------ PythonForDelphi/Demos/Demo17/Project1.dpr | 5 - PythonForDelphi/Demos/Demo17/Unit1.pas | 7 - PythonForDelphi/Demos/Demo21/Project1.dof | 93 ------ PythonForDelphi/Demos/Demo21/Project1.dpr | 5 - PythonForDelphi/Demos/Demo21/Unit1.pas | 7 - PythonForDelphi/Demos/Demo22/Project1.dof | 90 ------ PythonForDelphi/Demos/Demo22/Project1.dpr | 5 - PythonForDelphi/Demos/Demo22/Unit1.pas | 7 - PythonForDelphi/Demos/Demo23/Project1.dof | 90 ------ PythonForDelphi/Demos/Demo23/Project1.dpr | 5 - PythonForDelphi/Demos/Demo23/Unit1.pas | 7 - .../Demos/Demo25/VarPythUnitTest.dof | 150 --------- .../Demos/Demo25/VarPythUnitTest.dpr | 8 - .../Demos/Demo25/VarPythUnitTest.kof | 61 ---- PythonForDelphi/Demos/Demo25/fmMain.pas | 10 - PythonForDelphi/Demos/Demo25/fmMain.xfm | 289 ------------------ PythonForDelphi/Demos/Demo26/Project1.CW3 | 68 ----- PythonForDelphi/Demos/Demo26/Project1.conf | 32 -- PythonForDelphi/Demos/Demo26/Project1.dof | 243 --------------- PythonForDelphi/Demos/Demo26/Project1.dpr | 5 - PythonForDelphi/Demos/Demo26/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo26/Unit1.pas | 9 +- PythonForDelphi/Demos/Demo28/Project1.conf | 32 -- PythonForDelphi/Demos/Demo28/Project1.dof | 148 --------- PythonForDelphi/Demos/Demo28/Project1.dpr | 5 - PythonForDelphi/Demos/Demo28/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo28/Unit1.pas | 12 - PythonForDelphi/Demos/Demo28/Unit1.xfm | Bin 1449 -> 0 bytes PythonForDelphi/Demos/Demo30/Project1.conf | 32 -- PythonForDelphi/Demos/Demo30/Project1.dof | 148 --------- PythonForDelphi/Demos/Demo30/Project1.dpr | 5 - PythonForDelphi/Demos/Demo30/Project1.kof | 61 ---- PythonForDelphi/Demos/Demo30/Unit1.pas | 7 - PythonForDelphi/Demos/Demo30/Unit1.xfm | Bin 1449 -> 0 bytes PythonForDelphi/Demos/Demo31/Project1.dof | 136 --------- PythonForDelphi/Demos/Demo31/Unit1.pas | 5 - PythonForDelphi/Demos/Demo32/Project1.dpr | 5 - PythonForDelphi/Demos/Demo32/Unit1.pas | 11 - PythonForDelphi/Demos/Demo33/SortThds.pas | 5 - PythonForDelphi/Demos/Demo33/ThSort.pas | 5 - PythonForDelphi/Demos/Demo33/ThrdDemo.dpr | 3 - PythonForDelphi/Demos/Demo34/Project1.dpr | 5 - PythonForDelphi/Demos/Demo34/Unit1.pas | 5 - PythonForDelphi/Demos/FPC/Demo06/Unit1.pas | 9 +- 92 files changed, 8 insertions(+), 3708 deletions(-) delete mode 100644 PythonForDelphi/Demos/Demo01/Unit1.xfm 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/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/Demo16/Example1/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo16/Example2/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo17/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo21/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo22/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo23/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo25/VarPythUnitTest.dof delete mode 100644 PythonForDelphi/Demos/Demo25/VarPythUnitTest.kof delete mode 100644 PythonForDelphi/Demos/Demo25/fmMain.xfm delete mode 100644 PythonForDelphi/Demos/Demo26/Project1.CW3 delete mode 100644 PythonForDelphi/Demos/Demo26/Project1.conf delete mode 100644 PythonForDelphi/Demos/Demo26/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo26/Project1.kof delete mode 100644 PythonForDelphi/Demos/Demo28/Project1.conf delete mode 100644 PythonForDelphi/Demos/Demo28/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo28/Project1.kof delete mode 100644 PythonForDelphi/Demos/Demo28/Unit1.xfm delete mode 100644 PythonForDelphi/Demos/Demo30/Project1.conf delete mode 100644 PythonForDelphi/Demos/Demo30/Project1.dof delete mode 100644 PythonForDelphi/Demos/Demo30/Project1.kof delete mode 100644 PythonForDelphi/Demos/Demo30/Unit1.xfm delete mode 100644 PythonForDelphi/Demos/Demo31/Project1.dof diff --git a/PythonForDelphi/Demos/Demo01/Project1.dpr b/PythonForDelphi/Demos/Demo01/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo01/Project1.dpr +++ b/PythonForDelphi/Demos/Demo01/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo01/Unit1.pas b/PythonForDelphi/Demos/Demo01/Unit1.pas index d4a0d70b..75370c0b 100644 --- a/PythonForDelphi/Demos/Demo01/Unit1.pas +++ b/PythonForDelphi/Demos/Demo01/Unit1.pas @@ -6,13 +6,8 @@ interface uses Classes, SysUtils, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -38,18 +33,12 @@ TForm1 = class(TForm) end; - var Form1: TForm1; implementation -{$IFDEF MSWINDOWS} {$R *.DFM} -{$ENDIF} -{$IFDEF LINUX} -{$R *.xfm} -{$ENDIF} procedure TForm1.Button1Click(Sender: TObject); begin diff --git a/PythonForDelphi/Demos/Demo01/Unit1.xfm b/PythonForDelphi/Demos/Demo01/Unit1.xfm deleted file mode 100644 index 215ff8d171b9d384b2a0472f3d1c2c809404d874..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1449 zcmb`GPjAyO7{*;^aoTi6NN5LcIS&*qMcnD16)LthTEZs81uu15YpxwRZt0|bkqJHk zH~1JF`6h@@08X6s&suTfV)>2b=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!MnbMKaYndkxfO5-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.dpr b/PythonForDelphi/Demos/Demo03/Project1.dpr index 37535427..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo03/Project1.dpr +++ b/PythonForDelphi/Demos/Demo03/Project1.dpr @@ -1,17 +1,9 @@ -// JCL_DEBUG_EXPERT_GENERATEJDBG OFF -// JCL_DEBUG_EXPERT_INSERTJDBG OFF -// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} 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/Unit1.pas b/PythonForDelphi/Demos/Demo03/Unit1.pas index d7ebd2ae..42b46633 100644 --- a/PythonForDelphi/Demos/Demo03/Unit1.pas +++ b/PythonForDelphi/Demos/Demo03/Unit1.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type 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..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo04/Project1.dpr +++ b/PythonForDelphi/Demos/Demo04/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo04/Unit1.pas b/PythonForDelphi/Demos/Demo04/Unit1.pas index 291ed953..7dbe3f4c 100644 --- a/PythonForDelphi/Demos/Demo04/Unit1.pas +++ b/PythonForDelphi/Demos/Demo04/Unit1.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type diff --git a/PythonForDelphi/Demos/Demo05/Project1.dpr b/PythonForDelphi/Demos/Demo05/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo05/Project1.dpr +++ b/PythonForDelphi/Demos/Demo05/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo05/Unit1.dfm b/PythonForDelphi/Demos/Demo05/Unit1.dfm index 07c01b888de576db4874da3a7f1fa0de7e7c063e..58012c74bf83e11451ecbc7e3ed5b5f4f206c958 100644 GIT binary patch delta 198 zcmcb|bC-wrKNmxYn}3k6A%lT{??hfDb9U#%f|AVqJT^X;)ZBc9{4|At%94!yJRawq z%+$ORkJQZcj1uMmMs5f{JTs*vgIR!SV$@|ufysJ|8iKs86$Lq&$(bb(DG8>@VT{V$ z0!(aBtt%$CFm`e2FtS3mZkAx0&Ir`IfjMHc4GR~O9%pD?W^#T?s;56EXHa6fe`!fU aX$c1#gl1>;1v<-!#V0kbgvo({fdK#=bUDxf delta 178 zcmcc1bB~AjKNmxYn}3k6A%lT{-$Y&|Vb<`>l#&c)1tvC+)XemZ66SKoiTV-~(=Ibg zOtxawm|V=L%q;co=j6juVnIlZtU2<~#5_418cnT^@GV=2b zP4!Z8a=07=Ji}6piZk=`nBOyV1*N7#d2GyvdZwFIS-6-a*!)XN3Q9}ZS$$J;^Nm=1 MQqxM992giF0MDK>kN^Mx diff --git a/PythonForDelphi/Demos/Demo05/Unit1.pas b/PythonForDelphi/Demos/Demo05/Unit1.pas index 1b1909d9..1d315d7c 100644 --- a/PythonForDelphi/Demos/Demo05/Unit1.pas +++ b/PythonForDelphi/Demos/Demo05/Unit1.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type 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.dpr b/PythonForDelphi/Demos/Demo06/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo06/Project1.dpr +++ b/PythonForDelphi/Demos/Demo06/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo06/Unit1.pas b/PythonForDelphi/Demos/Demo06/Unit1.pas index a0043397..a228acf6 100644 --- a/PythonForDelphi/Demos/Demo06/Unit1.pas +++ b/PythonForDelphi/Demos/Demo06/Unit1.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -43,9 +38,7 @@ TForm1 = class(TForm) procedure PythonDelphiVar1GetData(Sender: TObject; var Data: Variant); procedure PythonDelphiVar1SetData(Sender: TObject; Data: Variant); private - { Déclarations privées } public - { Déclarations publiques } end; PyPointRec = record 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.dpr b/PythonForDelphi/Demos/Demo07/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo07/Project1.dpr +++ b/PythonForDelphi/Demos/Demo07/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} 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/Unit1.pas b/PythonForDelphi/Demos/Demo07/Unit1.pas index 070b3749..f8cbcb35 100644 --- a/PythonForDelphi/Demos/Demo07/Unit1.pas +++ b/PythonForDelphi/Demos/Demo07/Unit1.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -43,13 +38,13 @@ TForm1 = class(TForm) procedure PythonDelphiVar1GetData(Sender: TObject; var Data: Variant); procedure PythonDelphiVar1SetData(Sender: TObject; Data: Variant); private - { Déclarations privées } + { D�clarations priv�es } function spam_foo( pself, args : PPyObject ) : PPyObject; cdecl; function spam_CreatePoint( pself, args : PPyObject ) : PPyObject; cdecl; function spam_getdouble( pself, args : PPyObject ) : PPyObject; cdecl; function spam_getdouble2( pself, args : PPyObject ) : PPyObject; cdecl; public - { Déclarations publiques } + { D�clarations publiques } end; PyPointRec = record diff --git a/PythonForDelphi/Demos/Demo08/Project1.conf b/PythonForDelphi/Demos/Demo08/Project1.conf deleted file mode 100644 index 84e6d103..00000000 --- a/PythonForDelphi/Demos/Demo08/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/Demo08/Project1.dof b/PythonForDelphi/Demos/Demo08/Project1.dof deleted file mode 100644 index 2f62fbdb..00000000 --- a/PythonForDelphi/Demos/Demo08/Project1.dof +++ /dev/null @@ -1,88 +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=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; -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath=$(DELPHI)\Lib\Debug -Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;Indy50;VM;rbCIDE55;rbIDE55;rbRCL55;rbBDE55;rbDBDE55;rbDAD55;rbDIDE55;rbUSER55;rbDB55;rbADO55;rbIBE55 -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 -[Excluded Packages] -c:\program files\borland\delphi6\RBuilder\Lib\dclRBC61.bpl=ReportBuilder TeeChart 5.0 Components -c:\program files\borland\delphi6\RBuilder\Lib\dclRBE66.bpl=ReportBuilder Enterprise -c:\program files\borland\delphi6\RBuilder\Lib\dclRAP66.bpl=ReportBuilder RAP Language -c:\program files\borland\delphi6\RBuilder\Lib\dclDAD66.bpl=ReportBuilder Data Access Environment -c:\program files\borland\delphi6\RBuilder\Lib\dclRBU66.bpl=ReportBuilder Sample Components -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 6\Lib\dxPSdxDBTVLnkD6.bpl=ExpressPrinting System ReportLink for ExpressDBTree by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 6\Lib\dxPSdxInsLnkD6.bpl=ExpressPrinting System ReportLink for ExpressInspector by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 6\Lib\dxPSdxMVLnkD6.bpl=ExpressPrinting System ReportLink for ExpressMasterView by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 6\Lib\dxPSdxOCLnkD6.bpl=ExpressPrinting System ReportLinks for ExpressOrgChart by Developer Express Inc. -C:\Program Files\Developer Express Inc\ExpressPrinting System\Delphi 6\Lib\dxPSdxDBOCLnkD6.bpl=ExpressPrinting System ReportLinks for ExpressDBOrgChart by Developer Express Inc. -C:\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/Demo08/Project1.dpr b/PythonForDelphi/Demos/Demo08/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo08/Project1.dpr +++ b/PythonForDelphi/Demos/Demo08/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} 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/Unit1.pas b/PythonForDelphi/Demos/Demo08/Unit1.pas index cebfa3d8..a544e55d 100644 --- a/PythonForDelphi/Demos/Demo08/Unit1.pas +++ b/PythonForDelphi/Demos/Demo08/Unit1.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -29,9 +24,9 @@ TForm1 = class(TForm) procedure Button1Click(Sender: TObject); procedure PythonType1Initialization(Sender: TObject); private - { Déclarations privées } + { D�clarations priv�es } public - { Déclarations publiques } + { D�clarations publiques } end; // This is a Delphi class implementing a new Python type 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.dpr b/PythonForDelphi/Demos/Demo09/Project1.dpr index 37535427..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo09/Project1.dpr +++ b/PythonForDelphi/Demos/Demo09/Project1.dpr @@ -1,17 +1,9 @@ -// JCL_DEBUG_EXPERT_GENERATEJDBG OFF -// JCL_DEBUG_EXPERT_INSERTJDBG OFF -// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} 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/Unit1.pas b/PythonForDelphi/Demos/Demo09/Unit1.pas index bdd9ebd6..add003b0 100644 --- a/PythonForDelphi/Demos/Demo09/Unit1.pas +++ b/PythonForDelphi/Demos/Demo09/Unit1.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -26,9 +21,7 @@ TForm1 = class(TForm) Memo2: TMemo; procedure Button1Click(Sender: TObject); private - { Déclarations privées } public - { Déclarations publiques } end; var diff --git a/PythonForDelphi/Demos/Demo09/demodll.conf b/PythonForDelphi/Demos/Demo09/demodll.conf deleted file mode 100644 index bb7b1251..00000000 --- a/PythonForDelphi/Demos/Demo09/demodll.conf +++ /dev/null @@ -1,34 +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 --vn --vr --H+ --W+ --M --$M16384,1048576 --K$00400000 diff --git a/PythonForDelphi/Demos/Demo09/demodll.dof b/PythonForDelphi/Demos/Demo09/demodll.dof deleted file mode 100644 index 555135df..00000000 --- a/PythonForDelphi/Demos/Demo09/demodll.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=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= -[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/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/Demo11/ThSort.pas b/PythonForDelphi/Demos/Demo11/ThSort.pas index 13f1f026..6066f700 100644 --- a/PythonForDelphi/Demos/Demo11/ThSort.pas +++ b/PythonForDelphi/Demos/Demo11/ThSort.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine; type diff --git a/PythonForDelphi/Demos/Demo11/ThrdDemo.dpr b/PythonForDelphi/Demos/Demo11/ThrdDemo.dpr index e30aa5eb..1a995c75 100644 --- a/PythonForDelphi/Demos/Demo11/ThrdDemo.dpr +++ b/PythonForDelphi/Demos/Demo11/ThrdDemo.dpr @@ -1,17 +1,9 @@ -// JCL_DEBUG_EXPERT_GENERATEJDBG OFF -// JCL_DEBUG_EXPERT_INSERTJDBG OFF -// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF program ThrdDemo; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} ThSort in 'ThSort.pas' {ThreadSortForm}, SortThds in 'SortThds.pas'; diff --git a/PythonForDelphi/Demos/Demo16/Example1/Project1.dof b/PythonForDelphi/Demos/Demo16/Example1/Project1.dof deleted file mode 100644 index a3bc2aa7..00000000 --- a/PythonForDelphi/Demos/Demo16/Example1/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/Demo16/Example1/Project1.dpr b/PythonForDelphi/Demos/Demo16/Example1/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo16/Example1/Project1.dpr +++ b/PythonForDelphi/Demos/Demo16/Example1/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo16/Example1/Unit1.pas b/PythonForDelphi/Demos/Demo16/Example1/Unit1.pas index 16ae03b3..9f67b561 100644 --- a/PythonForDelphi/Demos/Demo16/Example1/Unit1.pas +++ b/PythonForDelphi/Demos/Demo16/Example1/Unit1.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -43,13 +38,11 @@ TForm1 = class(TForm) procedure PythonDelphiVar1ExtSetData(Sender: TObject; Data: PPyObject); procedure PythonDelphiVar1Change(Sender: TObject); private - { Déclarations privées } FProperties : PPyObject; function CreateProperties : PPyObject; procedure UpdateProperties( props : PPyObject ); public - { Déclarations publiques } end; var diff --git a/PythonForDelphi/Demos/Demo16/Example2/Project1.dof b/PythonForDelphi/Demos/Demo16/Example2/Project1.dof deleted file mode 100644 index a3bc2aa7..00000000 --- a/PythonForDelphi/Demos/Demo16/Example2/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/Demo16/Example2/Project1.dpr b/PythonForDelphi/Demos/Demo16/Example2/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo16/Example2/Project1.dpr +++ b/PythonForDelphi/Demos/Demo16/Example2/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo16/Example2/Unit1.pas b/PythonForDelphi/Demos/Demo16/Example2/Unit1.pas index 2a02289f..1c597e16 100644 --- a/PythonForDelphi/Demos/Demo16/Example2/Unit1.pas +++ b/PythonForDelphi/Demos/Demo16/Example2/Unit1.pas @@ -6,13 +6,8 @@ interface uses Classes, SysUtils, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -40,13 +35,10 @@ TForm1 = class(TForm) procedure Button1Click(Sender: TObject); procedure PythonModule1Initialization(Sender: TObject); private - { Déclarations privées } - function GetProperty(pSelf, Args : PPyObject) : PPyObject; cdecl; function SetProperty(pSelf, Args : PPyObject) : PPyObject; cdecl; function GetPropertyList(pSelf, Args : PPyObject) : PPyObject; cdecl; public - { Déclarations publiques } end; var 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.dpr b/PythonForDelphi/Demos/Demo17/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo17/Project1.dpr +++ b/PythonForDelphi/Demos/Demo17/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo17/Unit1.pas b/PythonForDelphi/Demos/Demo17/Unit1.pas index 56dc722a..524c0565 100644 --- a/PythonForDelphi/Demos/Demo17/Unit1.pas +++ b/PythonForDelphi/Demos/Demo17/Unit1.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} Variants, PythonEngine, PythonGUIInputOutput; type @@ -33,9 +28,7 @@ TForm1 = class(TForm) procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private - { Déclarations privées } public - { Déclarations publiques } end; diff --git a/PythonForDelphi/Demos/Demo21/Project1.dof b/PythonForDelphi/Demos/Demo21/Project1.dof deleted file mode 100644 index a3bc2aa7..00000000 --- a/PythonForDelphi/Demos/Demo21/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/Demo21/Project1.dpr b/PythonForDelphi/Demos/Demo21/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo21/Project1.dpr +++ b/PythonForDelphi/Demos/Demo21/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo21/Unit1.pas b/PythonForDelphi/Demos/Demo21/Unit1.pas index 12ec4ee9..340d6750 100644 --- a/PythonForDelphi/Demos/Demo21/Unit1.pas +++ b/PythonForDelphi/Demos/Demo21/Unit1.pas @@ -6,13 +6,8 @@ interface uses Classes, SysUtils, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -39,9 +34,7 @@ TForm1 = class(TForm) procedure PythonType1Events0Execute(Sender: TObject; PSelf, Args: PPyObject; var Result: PPyObject); private - { Déclarations privées } public - { Déclarations publiques } end; // This is a Delphi class implementing a new Python type diff --git a/PythonForDelphi/Demos/Demo22/Project1.dof b/PythonForDelphi/Demos/Demo22/Project1.dof deleted file mode 100644 index 3313f39c..00000000 --- a/PythonForDelphi/Demos/Demo22/Project1.dof +++ /dev/null @@ -1,90 +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;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;VM;MyKardexComponents -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang= -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\PythonForDelphi\Components\PythonVCL_d5.bpl=VCL Components for Python -d:\program files\borland\delphi6\Bin\dclite50.bpl=Borland Integrated Translation Environment diff --git a/PythonForDelphi/Demos/Demo22/Project1.dpr b/PythonForDelphi/Demos/Demo22/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo22/Project1.dpr +++ b/PythonForDelphi/Demos/Demo22/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo22/Unit1.pas b/PythonForDelphi/Demos/Demo22/Unit1.pas index cba6638a..5b758d30 100644 --- a/PythonForDelphi/Demos/Demo22/Unit1.pas +++ b/PythonForDelphi/Demos/Demo22/Unit1.pas @@ -6,13 +6,8 @@ interface uses Classes, SysUtils, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -30,9 +25,7 @@ TForm1 = class(TForm) procedure Button3Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private - { Déclarations privées } public - { Déclarations publiques } end; diff --git a/PythonForDelphi/Demos/Demo23/Project1.dof b/PythonForDelphi/Demos/Demo23/Project1.dof deleted file mode 100644 index 3313f39c..00000000 --- a/PythonForDelphi/Demos/Demo23/Project1.dof +++ /dev/null @@ -1,90 +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;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;VM;MyKardexComponents -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang= -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\PythonForDelphi\Components\PythonVCL_d5.bpl=VCL Components for Python -d:\program files\borland\delphi6\Bin\dclite50.bpl=Borland Integrated Translation Environment diff --git a/PythonForDelphi/Demos/Demo23/Project1.dpr b/PythonForDelphi/Demos/Demo23/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo23/Project1.dpr +++ b/PythonForDelphi/Demos/Demo23/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo23/Unit1.pas b/PythonForDelphi/Demos/Demo23/Unit1.pas index 18fe49cf..217bc3bf 100644 --- a/PythonForDelphi/Demos/Demo23/Unit1.pas +++ b/PythonForDelphi/Demos/Demo23/Unit1.pas @@ -6,13 +6,8 @@ interface uses Classes, SysUtils, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -33,9 +28,7 @@ TForm1 = class(TForm) procedure PythonInputOutput1SendData(Sender: TObject; const Data: String); private - { Déclarations privées } public - { Déclarations publiques } end; diff --git a/PythonForDelphi/Demos/Demo25/VarPythUnitTest.dof b/PythonForDelphi/Demos/Demo25/VarPythUnitTest.dof deleted file mode 100644 index d5f8ddef..00000000 --- a/PythonForDelphi/Demos/Demo25/VarPythUnitTest.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=0 -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=0 -SymbolPlatform=0 -UnitLibrary=0 -UnitPlatform=0 -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=$(DELPHI)\Lib\Debug -Packages=vcl;rtl;dbrtl;adortl;vcldb;vclx;bdertl;vcldbx;ibxpress;dsnap;cds;bdecds;qrpt;teeui;teedb;tee;dss;teeqr;visualclx;visualdbclx;dsnapcrba;dsnapcon;VclSmp;vclshlctrls;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;inetdb;nmfast;webdsnap;websnap;dbexpress;dbxcds;indy;dclOffice2k;dxcomnd6;EQTLD6;dxEdtrD6;ECQDBCD6;EQDBTLD6;EQGridD6;dxGrEdD6;dxExELD6;dxELibD6;dxBarD6;dxBarDBNavD6;dxBarExtItemsD6;dxBarExtDBItemsD6;dxsbD6;dxDBEdD6;dxInsD6;dxExRwD6;dxmdsd6;dxorgcD6;dxdborD6;dxPageControlD6;Python_d6;PythonVCL_d6 -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang= -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/Demo25/VarPythUnitTest.dpr b/PythonForDelphi/Demos/Demo25/VarPythUnitTest.dpr index 917b40f5..13933b07 100644 --- a/PythonForDelphi/Demos/Demo25/VarPythUnitTest.dpr +++ b/PythonForDelphi/Demos/Demo25/VarPythUnitTest.dpr @@ -1,15 +1,7 @@ -// JCL_DEBUG_EXPERT_GENERATEJDBG OFF -// JCL_DEBUG_EXPERT_INSERTJDBG OFF -// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF program VarPythUnitTest; uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} fmMain in 'fmMain.pas' {TMain}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo25/VarPythUnitTest.kof b/PythonForDelphi/Demos/Demo25/VarPythUnitTest.kof deleted file mode 100644 index 95425b51..00000000 --- a/PythonForDelphi/Demos/Demo25/VarPythUnitTest.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/Demo25/fmMain.pas b/PythonForDelphi/Demos/Demo25/fmMain.pas index c9ae6539..5c9a9f61 100644 --- a/PythonForDelphi/Demos/Demo25/fmMain.pas +++ b/PythonForDelphi/Demos/Demo25/fmMain.pas @@ -6,13 +6,8 @@ interface uses Classes, SysUtils, Variants, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, -{$ENDIF} -{$IFDEF LINUX} - QGraphics, QControls, QForms, QDialogs, QExtCtrls, QStdCtrls, QComCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput, Contnrs; type @@ -69,12 +64,7 @@ implementation uses VarPyth; -{$IFDEF MSWINDOWS} {$R *.dfm} -{$ENDIF} -{$IFDEF LINUX} -{$R *.xfm} -{$ENDIF} procedure TMain.Log( const AText : String ); begin diff --git a/PythonForDelphi/Demos/Demo25/fmMain.xfm b/PythonForDelphi/Demos/Demo25/fmMain.xfm deleted file mode 100644 index 76c766ef..00000000 --- a/PythonForDelphi/Demos/Demo25/fmMain.xfm +++ /dev/null @@ -1,289 +0,0 @@ -object Main: TMain - Left = 145 - Top = 76 - Width = 769 - Height = 561 - VertScrollBar.Range = 356 - ActiveControl = Memo1 - Caption = 'VarPyth unit tests' - Color = clButton - Font.Color = clText - Font.Height = 11 - Font.Name = 'MS Sans Serif' - Font.Pitch = fpVariable - Font.Style = [] - Font.Weight = 0 - ParentFont = False - OnCreate = FormCreate - PixelsPerInch = 96 - TextHeight = 13 - TextWidth = 5 - object Splitter1: TSplitter - Left = 0 - Top = 249 - Width = 769 - Height = 5 - Cursor = crVSplit - Align = alTop - end - object Memo1: TMemo - Left = 0 - Top = 0 - Width = 769 - Height = 249 - Align = alTop - TabOrder = 0 - end - object Panel1: TPanel - Left = 0 - Top = 459 - Width = 769 - Height = 102 - Align = alBottom - BevelOuter = bvNone - TabOrder = 1 - object ProgressBar1: TProgressBar - Left = 0 - Top = 86 - Width = 769 - Height = 16 - Align = alBottom - Visible = False - end - object Label1: TLabel - Left = 616 - Top = 59 - Width = 24 - Height = 13 - Caption = 'times' - end - object btnExecuteScript: TButton - Left = 8 - Top = 8 - Width = 89 - Height = 25 - Caption = 'E&xecute Script' - TabOrder = 0 - OnClick = btnExecuteScriptClick - end - object btnTestIntegers: TButton - Left = 128 - Top = 8 - Width = 75 - Height = 25 - Caption = 'Test Integers' - TabOrder = 1 - OnClick = btnTestIntegersClick - end - object btnTestFloats: TButton - Left = 216 - Top = 8 - Width = 75 - Height = 25 - Caption = 'Test Floats' - TabOrder = 2 - OnClick = btnTestFloatsClick - end - object btnTestSequences: TButton - Left = 392 - Top = 8 - Width = 89 - Height = 25 - Caption = 'Test Sequences' - TabOrder = 3 - OnClick = btnTestSequencesClick - end - object btnTestMappings: TButton - Left = 488 - Top = 8 - Width = 89 - Height = 25 - Caption = 'Test Mappings' - TabOrder = 4 - OnClick = btnTestMappingsClick - end - object btnTestObjects: TButton - Left = 664 - Top = 8 - Width = 75 - Height = 25 - Caption = 'Test Objects' - TabOrder = 5 - OnClick = btnTestObjectsClick - end - object btnTestStrings: TButton - Left = 304 - Top = 8 - Width = 75 - Height = 25 - Caption = 'Test Strings' - TabOrder = 6 - OnClick = btnTestStringsClick - end - object cbIntegers: TCheckBox - Left = 128 - Top = 33 - Width = 73 - Height = 17 - Caption = 'Included' - Checked = True - State = cbChecked - TabOrder = 7 - end - object cbFloats: TCheckBox - Left = 216 - Top = 33 - Width = 73 - Height = 17 - Caption = 'Included' - Checked = True - State = cbChecked - TabOrder = 8 - end - object cbStrings: TCheckBox - Left = 304 - Top = 33 - Width = 73 - Height = 17 - Caption = 'Included' - Checked = True - State = cbChecked - TabOrder = 9 - end - object cbSequences: TCheckBox - Left = 392 - Top = 33 - Width = 73 - Height = 17 - Caption = 'Included' - Checked = True - State = cbChecked - TabOrder = 10 - end - object cbMappings: TCheckBox - Left = 488 - Top = 33 - Width = 73 - Height = 17 - Caption = 'Included' - Checked = True - State = cbChecked - TabOrder = 11 - end - object cbObjects: TCheckBox - Left = 664 - Top = 33 - Width = 73 - Height = 17 - Caption = 'Included' - Checked = True - State = cbChecked - TabOrder = 12 - end - object btnRunSelectedTests: TButton - Left = 128 - Top = 56 - Width = 121 - Height = 25 - Caption = 'Run selected tests once' - TabOrder = 13 - OnClick = btnRunSelectedTestsClick - end - object edtTestCount: TEdit - Left = 568 - Top = 56 - Width = 41 - Height = 21 - TabOrder = 14 - Text = '1000' - end - object btnRunNTimes: TButton - Left = 400 - Top = 56 - Width = 163 - Height = 25 - Caption = 'Run selected tests n times' - TabOrder = 16 - OnClick = btnRunNTimesClick - end - object btnTestDates: TButton - Left = 584 - Top = 8 - Width = 75 - Height = 25 - Caption = 'Test Dates' - TabOrder = 18 - OnClick = btnTestDatesClick - end - object cbDates: TCheckBox - Left = 584 - Top = 33 - Width = 77 - Height = 17 - Caption = 'Included' - Checked = True - State = cbChecked - TabOrder = 17 - end - end - object Memo2: TMemo - Left = 0 - Top = 254 - Width = 769 - Height = 205 - Align = alClient - Lines.Strings = ( - 'class Foo:' - ' def __init__(Self):' - ' Self.Value = 0' - '' - ' def __del__(Self):' - ' print "delete", Self' - '' - ' def Inc(Self, AValue = 1):' - ' Self.Value = Self.Value + AValue' - '' - ' def GetSelf(Self):' - ' return Self' - '' - ' def GetValue(Self):' - ' return Self.Value' - '' - ' def SetABC(Self, A, B, C):' - ' Self.A = A' - ' Self.B = B' - ' Self.C = C' - '' - ' def Add(Self, AFooInst):' - ' Self.Value = Self.Value + AFooInst.Value' - '' - 'class Bar(Foo):' - ' def Inc(Self, AValue = 1):' - ' Self.Value = Self.Value - AValue' - 'def Add(a, b):' - ' return a + b' - '' - 'f = Foo()' - 'print "Created", f' - 'f.Inc()' - 'f.Inc(2)' - '' - 'b = Bar()' - 'b.Inc()' - 'b.Inc(2)') - TabOrder = 2 - end - object PythonEngine1: TPythonEngine - DllName = 'python15.dll' - APIVersion = 1007 - RegVersion = '1.5' - IO = PythonGUIInputOutput1 - Left = 192 - Top = 48 - end - object PythonGUIInputOutput1: TPythonGUIInputOutput - Output = Memo1 - Left = 232 - Top = 48 - end -end diff --git a/PythonForDelphi/Demos/Demo26/Project1.CW3 b/PythonForDelphi/Demos/Demo26/Project1.CW3 deleted file mode 100644 index ca5706f1..00000000 --- a/PythonForDelphi/Demos/Demo26/Project1.CW3 +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/PythonForDelphi/Demos/Demo26/Project1.conf b/PythonForDelphi/Demos/Demo26/Project1.conf deleted file mode 100644 index 84e6d103..00000000 --- a/PythonForDelphi/Demos/Demo26/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/Demo26/Project1.dof b/PythonForDelphi/Demos/Demo26/Project1.dof deleted file mode 100644 index 0395a90b..00000000 --- a/PythonForDelphi/Demos/Demo26/Project1.dof +++ /dev/null @@ -1,243 +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=$(DELPHI)\Lib\Debug -Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;Indy50;VM;rbCIDE55;rbIDE55;rbRCL55;rbBDE55;rbDBDE55;rbDAD55;rbDIDE55;rbUSER55;rbDB55;rbADO55;rbIBE55 -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 -[Excluded Packages] -c:\program files\borland\delphi7\RBuilder\Lib\dclRBC77.bpl=ReportBuilder TeeChart 4.04 Components -c:\program files\borland\delphi7\RBuilder\Lib\dclDAD77.bpl=ReportBuilder Data Access Environment -c:\program files\borland\delphi7\RBuilder\Lib\dclRBU77.bpl=ReportBuilder Sample Components -C:\Program Files\Borland\Delphi7\\RBuilder\Lib\dclRBE77.bpl=ReportBuilder Enterprise -C:\Program Files\Borland\Delphi7\\RBuilder\Lib\dclRAP77.bpl=ReportBuilder RAP Language -C:\Program Files\RemObjects Software\Pascal Script for Delphi\Dcu\D7\PascalScript_Core_D7.bpl=RemObjects Pascal Script - Core Package -c:\program files\borland\delphi7\Projects\Bpl\Tiger.bpl=Tiger Framework -c:\program files\borland\delphi7\Projects\Bpl\VirtualTreesD7D.bpl=Virtual Treeview design time package -c:\program files\borland\delphi7\Projects\Bpl\VirtualExplorerListviewExD7D.bpl=Virtual ExplorerListviewEx Designtime Package -C:\Program Files\Borland\Delphi7\Projects\Bpl\tb2k_d7.bpl=Toolbar2000 Components (Jordan Russell) -C:\Program Files\Borland\Delphi7\Projects\Bpl\tbx_d7.bpl=Toolbar2000 -- TBX Extensions (Alex Denisov) -C:\PROGRA~1\Borland\Delphi7\Projects\Bpl\JclDebugIdeD70.bpl=JCL Debug IDE extension for Delphi 7 -C:\PROGRA~1\Borland\Delphi7\Projects\Bpl\ProjectAnalyzerD70.bpl=JCL Project Analyzer for Delphi 7 -C:\PROGRA~1\Borland\Delphi7\Projects\Bpl\IdeOpenDlgFavoriteD70.bpl=JCL Open and Save IDE dialogs with favorite folders for Delphi 7 -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvAppFrmD7D.bpl=JVCL Application and Form Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvCoreD7D.bpl=JVCL Core Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvBandsD7D.bpl=JVCL Band Objects -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvBDED7D.bpl=JVCL BDE Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvDBD7D.bpl=JVCL Database Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvCmpD7D.bpl=JVCL Non-Visual Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvCryptD7D.bpl=JVCL Encryption and Compression Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvCtrlsD7D.bpl=JVCL Visual Controls -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvCustomD7D.bpl=JVCL Custom Controls -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvDlgsD7D.bpl=JVCL Dialog Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvDockingD7D.bpl=JVCL Docking Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvDotNetCtrlsD7D.bpl=JVCL DotNet Controls -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvEDID7D.bpl=JVCL EDI Components Designtime Package -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvGlobusD7D.bpl=JVCL Globus Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvHMID7D.bpl=JVCL HMI Controls design time unit -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvInspectorD7D.bpl=JVCL Inspector Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvInterpreterD7D.bpl=JVCL Interpreter Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvJansD7D.bpl=JVCL Jans Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvManagedThreadsD7D.bpl=JVCL Managed Threads -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvMMD7D.bpl=JVCL Multimedia and Image Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvNetD7D.bpl=JVCL Network Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvPageCompsD7D.bpl=JVCL Page Style Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvPluginD7D.bpl=JVCL Plugin Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvPrintPreviewD7D.bpl=JVCL Print Preview Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvStdCtrlsD7D.bpl=JVCL Standard Controls -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvSystemD7D.bpl=JVCL System Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvTimeFrameworkD7D.bpl=JVCL Time Framework -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvUIBD7D.bpl=JVCL Unified Interbase Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvValidatorsD7D.bpl=JVCL Validators and Error Provider Components -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvWizardD7D.bpl=JVCL Wizard Design Time Package -C:\Program Files\Borland\Delphi7\Projects\Bpl\JvXPCtrlsD7D.bpl=JVCL XP Controls -c:\program files\borland\delphi7\Projects\Bpl\ehs_d7.bpl=EC Software Help Suite -c:\program files\borland\delphi7\Projects\Bpl\tbxdsgn_d7.bpl=Toolbar2000 -- TBX Extensions Design Package (Alex Denisov) -C:\Program Files\Borland\Delphi7\Projects\Bpl\tb2kdsgn_d7.bpl=Toolbar2000 Design Package (Jordan Russell) -c:\program files\borland\delphi7\Projects\Bpl\TBXSwitcherItemDsgn_d7.bpl=(untitled) -c:\program files\borland\delphi7\Projects\Bpl\dclusr70.bpl=Borland User Components -c:\program files\borland\delphi7\Projects\Bpl\VirtualShellToolsD7D.bpl=Virtual Shell Tools Designtime Package -C:\Program Files\madCollection\madBasic\Delphi 7\madBasic_.bpl=madBasic 1.1k - www.madshi.net -C:\Program Files\madCollection\madBasic\Delphi 7\madHelp_.bpl=madHelp 1.1a - www.madshi.net -C:\Program Files\madCollection\madDisAsm\Delphi 7\madDisAsm_.bpl=madDisAsm 2.1b - www.madshi.net -C:\Program Files\madCollection\madExcept\Delphi 7\madExcept_.bpl=madExcept 2.7g - www.madshi.net -C:\Program Files\madCollection\madExcept\Delphi 7\madExceptVcl_.bpl=madExceptVcl 2.0c - www.madshi.net -C:\Program Files\madCollection\madExcept\Delphi 7\madExceptIde_.bpl=madExceptIde 1.0d - www.madshi.net -C:\Program Files\madCollection\madExcept\Delphi 7\madExceptWizard_.bpl=madExceptWizard 2.7e - www.madshi.net -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxLibraryVCLD7.bpl=Express Cross Platform Library (VCL Edition) by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxBarD7.bpl=ExpressBars by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxBarDBNavD7.bpl=ExpressBars DBNavigator by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxBarExtDBItemsD7.bpl=ExpressBars extended DB items by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxBarExtItemsD7.bpl=ExpressBars extended items by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxDockingD7.bpl=ExpressDocking Library by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxsbD7.bpl=ExpressSideBar by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxEditorsVCLD7.bpl=ExpressEditors Library 5 (VCL Edition) by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxExtEditorsVCLD7.bpl=ExpressExtendedEditors Library 5 (VCL Edition) by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxPageControlVCLD7.bpl=Express Cross Platform PageControl (VCL Edition) by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxGridVCLD7.bpl=ExpressQuantumGrid 5 (VCL Edition) by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxSchedulerVCLD7.bpl=ExpressScheduler (VCL Edition) by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxTreeListVCLD7.bpl=ExpressQuantumTreeList 4 (VCL Edition) by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxEdtrD7.bpl=Express inplace editors -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxELibD7.bpl=ExpressEditors Library by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxVerticalGridVCLD7.bpl=ExpressVerticalGrid (VCL Edition) by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxSpreadSheetVCLD7.bpl=ExpressSpreadSheet (VCL Edition) by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxNavBarD7.bpl=ExpressNavBar by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxWebD7.bpl=ExpressWeb Framework by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxWebPascalScriptD7.bpl=Pascal Script Engine for EWF by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxWebSnapD7.bpl=ExpressWebPage Module for WebSnap Application by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclcxWebTeeChartD7.bpl=WebTeeChart for EWF by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxMasterViewD7.bpl=ExpressMasterView by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxmdsD7.bpl=ExpressMemData by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxdbtrD7.bpl=ExpressDBTree by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxtrmdD7.bpl=ExpressTreePrintedDataSet by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxOrgCD7.bpl=ExpressOrgChart by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxDBOrD7.bpl=ExpressDBOrgChart by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxFlowChartD7.bpl=ExpressFlowChart by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxLayoutControlD7.bpl=ExpressLayout Control by Developer Express Inc. -C:\WINDOWS\system32\dxLayoutControldxEditAdaptersD7.bpl=ExpressLayoutControl Adapters for ExpressEditors Library by Developer Express Inc. -C:\WINDOWS\system32\dxLayoutControlcxEditAdaptersD7.bpl=ExpressLayoutControl Adapters for ExpressEditors Library 5 by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclECQDBCD7.bpl=ExpressQuantumDBControl by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclEQTLD7.bpl=ExpressQuantumTreeList by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dclEQDBTLD7.bpl=ExpressQuantumDBTreeList by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxInsD7.bpl=ExpressInspector by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxObjInsD7.bpl=ExpressRTTIInspector by Developer Express Inc. -C:\Program Files\Developer Express.VCL\Library\Delphi7\dcldxPSCoreD7.bpl=ExpressPrinting System (core 3.1) by Developer Express Inc. -C:\WINDOWS\system32\dxPSTeeChartD7.bpl=ExpressPrinting System ReportLink for TeeChart by Developer Express Inc. -C:\WINDOWS\system32\dxPsPrVwAdvD7.bpl=ExpressPrinting System Advanced Preview Window by Developer Express Inc. -C:\WINDOWS\system32\dxPSLnksD7.bpl=ExpressPrinting System ReportLinks (Standard) by Developer Express Inc. -C:\WINDOWS\system32\dxPSdxInsLnkD7.bpl=ExpressPrinting System ReportLink for ExpressInspector by Developer Express Inc. -C:\WINDOWS\system32\dxPSdxOCLnkD7.bpl=ExpressPrinting System ReportLinks for ExpressOrgChart by Developer Express Inc. -C:\WINDOWS\system32\dxPSdxMVLnkD7.bpl=ExpressPrinting System ReportLink for ExpressMasterView by Developer Express Inc. -C:\WINDOWS\system32\dxPSdxLCLnkD7.bpl=ExpressPrinting System ReportLink for ExpressLayoutControl by Developer Express Inc. -C:\WINDOWS\system32\dxPSdxOILnkD7.bpl=ExpressPrinting System ReportLink for ExpressRTTIInspector by Developer Express Inc. -C:\WINDOWS\system32\dxPSdxFCLnkD7.bpl=ExpressPrinting System ReportLinks for ExpressFlowChart by Developer Express Inc. -C:\WINDOWS\system32\dxPSdxDBTVLnkD7.bpl=ExpressPrinting System ReportLink for ExpressDBTree by Developer Express Inc. -C:\WINDOWS\system32\dxPSdxDBOCLnkD7.bpl=ExpressPrinting System ReportLinks for ExpressDBOrgChart by Developer Express Inc. -C:\WINDOWS\system32\dxPSDBTeeChartD7.bpl=ExpressPrinting System ReportLink for DBTeeChart by Developer Express Inc. -C:\WINDOWS\system32\dxPScxCommonD7.bpl=ExpressPrinting System Cross Platform Library by Developer Express Inc. -C:\WINDOWS\system32\dxPscxTLLnkD7.bpl=ExpressPrinting System ReportLink for ExpressQuantumTreeList 4 by Developer Express Inc. -C:\WINDOWS\system32\dxPScxSSLnkD7.bpl=ExpressPrinting System ReportLink for ExpressSpreadSheet by Developer Express Inc. -C:\WINDOWS\system32\dxPScxSchedulerLnkD7.bpl=ExpressPrinting System ReportLink for ExpressScheduler by Developer Express Inc. -C:\WINDOWS\system32\dxPScxPCProdD7.bpl=ExpressPrinting System ContainerProducer for ExpressPageControl 2 by Developer Express Inc. -C:\WINDOWS\system32\dxPScxGridLnkD7.bpl=ExpressPrinting System ReportLink for ExpressQuantumGrid 5 by Developer Express Inc. -C:\WINDOWS\system32\dxPScxExtCommonD7.bpl=ExpressPrinting System Extended Cross Platform Library by Developer Express Inc. -C:\WINDOWS\system32\dxPScxVGridLnkD7.bpl=ExpressPrinting System ReportLink for ExpressVerticalGrid by Developer Express Inc. -c:\program files\borland\delphi7\Projects\Bpl\SynEdit_D7.bpl=SynEdit component suite diff --git a/PythonForDelphi/Demos/Demo26/Project1.dpr b/PythonForDelphi/Demos/Demo26/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo26/Project1.dpr +++ b/PythonForDelphi/Demos/Demo26/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo26/Project1.kof b/PythonForDelphi/Demos/Demo26/Project1.kof deleted file mode 100644 index 6ad26fc6..00000000 --- a/PythonForDelphi/Demos/Demo26/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/Demo26/Unit1.pas b/PythonForDelphi/Demos/Demo26/Unit1.pas index c0ce8cd0..27ad4a85 100644 --- a/PythonForDelphi/Demos/Demo26/Unit1.pas +++ b/PythonForDelphi/Demos/Demo26/Unit1.pas @@ -6,13 +6,8 @@ interface uses SysUtils, Classes, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -29,9 +24,9 @@ TForm1 = class(TForm) procedure Button1Click(Sender: TObject); procedure PythonType1Initialization(Sender: TObject); private - { Déclarations privées } + { D�clarations priv�es } public - { Déclarations publiques } + { D�clarations publiques } end; // This is a Delphi class implementing a new Python type diff --git a/PythonForDelphi/Demos/Demo28/Project1.conf b/PythonForDelphi/Demos/Demo28/Project1.conf deleted file mode 100644 index 84e6d103..00000000 --- a/PythonForDelphi/Demos/Demo28/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/Demo28/Project1.dof b/PythonForDelphi/Demos/Demo28/Project1.dof deleted file mode 100644 index 72c886ef..00000000 --- a/PythonForDelphi/Demos/Demo28/Project1.dof +++ /dev/null @@ -1,148 +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= -[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\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. diff --git a/PythonForDelphi/Demos/Demo28/Project1.dpr b/PythonForDelphi/Demos/Demo28/Project1.dpr index 34e6006c..7a68fc98 100644 --- a/PythonForDelphi/Demos/Demo28/Project1.dpr +++ b/PythonForDelphi/Demos/Demo28/Project1.dpr @@ -3,12 +3,7 @@ program Project1; {$I Definition.Inc} uses -{$IFDEF MSWINDOWS} Forms, -{$ENDIF} -{$IFDEF LINUX} - QForms, -{$ENDIF} Unit1 in 'Unit1.pas' {Form1}; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo28/Project1.kof b/PythonForDelphi/Demos/Demo28/Project1.kof deleted file mode 100644 index 6ad26fc6..00000000 --- a/PythonForDelphi/Demos/Demo28/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/Demo28/Unit1.pas b/PythonForDelphi/Demos/Demo28/Unit1.pas index bcac8c89..ff408160 100644 --- a/PythonForDelphi/Demos/Demo28/Unit1.pas +++ b/PythonForDelphi/Demos/Demo28/Unit1.pas @@ -6,13 +6,8 @@ interface uses Classes, SysUtils, -{$IFDEF MSWINDOWS} Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QForms, QDialogs, QStdCtrls, QControls, QExtCtrls, -{$ENDIF} PythonEngine, PythonGUIInputOutput; type @@ -89,9 +84,7 @@ TForm1 = class(TForm) procedure ptStringListCreate(Sender: TObject); procedure ptStringListIteratorCreate(Sender: TObject); private - { Déclarations privées } public - { Déclarations publiques } end; @@ -101,12 +94,7 @@ TForm1 = class(TForm) implementation -{$IFDEF MSWINDOWS} {$R *.DFM} -{$ENDIF} -{$IFDEF LINUX} -{$R *.xfm} -{$ENDIF} procedure TForm1.Button1Click(Sender: TObject); begin diff --git a/PythonForDelphi/Demos/Demo28/Unit1.xfm b/PythonForDelphi/Demos/Demo28/Unit1.xfm deleted file mode 100644 index 215ff8d171b9d384b2a0472f3d1c2c809404d874..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1449 zcmb`GPjAyO7{*;^aoTi6NN5LcIS&*qMcnD16)LthTEZs81uu15YpxwRZt0|bkqJHk zH~1JF`6h@@08X6s&suTfV)>2b=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!MnbMKaYndkxfO2b=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 Date: Wed, 22 Aug 2018 02:25:58 +0300 Subject: [PATCH 074/123] Removed PyObject_CallMethodStr. Same as PyObject_CallMethod. --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 -- PythonForDelphi/Demos/Demo11/SortThds.pas | 5 ----- PythonForDelphi/Demos/Demo30/Unit1.pas | 5 ----- 3 files changed, 12 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index f4714aa9..4bc64c3b 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -1864,7 +1864,6 @@ TPythonInterface=class(TDynamicDll) PyOS_InterruptOccurred:function :integer; cdecl; PyObject_CallObject:function (ob,args:PPyObject):PPyObject; cdecl; PyObject_CallMethod : function ( obj : PPyObject; method, format : PAnsiChar {...}) : PPyObject; cdecl varargs; - PyObject_CallMethodStr: function ( obj : PPyObject; method, format, value : PAnsiChar ) : PPyObject; cdecl; PyObject_Compare: function (ob1,ob2:PPyObject):integer; cdecl; PyObject_RichCompare:function (ob1,ob2:PPyObject;opid:integer):PPyObject; cdecl; PyObject_RichCompareBool:function (ob1,ob2:PPyObject;opid:integer):Integer; cdecl; @@ -3932,7 +3931,6 @@ procedure TPythonInterface.MapDll; PyOS_InterruptOccurred :=Import('PyOS_InterruptOccurred'); PyObject_CallObject :=Import('PyObject_CallObject'); PyObject_CallMethod :=Import('PyObject_CallMethod'); - PyObject_CallMethodStr :=Import('PyObject_CallMethod'); if not IsPython3000 then PyObject_Compare :=Import('PyObject_Compare'); PyObject_RichCompare :=Import('PyObject_RichCompare'); diff --git a/PythonForDelphi/Demos/Demo11/SortThds.pas b/PythonForDelphi/Demos/Demo11/SortThds.pas index ef8add6e..d9b0cae1 100644 --- a/PythonForDelphi/Demos/Demo11/SortThds.pas +++ b/PythonForDelphi/Demos/Demo11/SortThds.pas @@ -6,12 +6,7 @@ interface uses Classes, -{$IFDEF MSWINDOWS} Graphics, ExtCtrls, -{$ENDIF} -{$IFDEF LINUX} - QGraphics, QExtCtrls, -{$ENDIF} PythonEngine; type diff --git a/PythonForDelphi/Demos/Demo30/Unit1.pas b/PythonForDelphi/Demos/Demo30/Unit1.pas index 6ebc3ef1..ae4edfef 100644 --- a/PythonForDelphi/Demos/Demo30/Unit1.pas +++ b/PythonForDelphi/Demos/Demo30/Unit1.pas @@ -40,12 +40,7 @@ implementation uses VarPyth; -{$IFDEF MSWINDOWS} {$R *.DFM} -{$ENDIF} -{$IFDEF LINUX} -{$R *.xfm} -{$ENDIF} procedure TForm1.Button1Click(Sender: TObject); var From b1c0ed5a3b5cd26e40e2889ae60aa26da807e614 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 26 Aug 2018 04:44:46 +0300 Subject: [PATCH 075/123] Check whether InstallPath from Registry exists --- PythonForDelphi/Components/Sources/Core/PythonVersions.pas | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index 195860df..c243f339 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -320,7 +320,8 @@ function GetRegisteredPythonVersion(SysVersion: string; PythonVersion.DLLPath := PythonVersion.InstallPath; CloseKey; end; - Result := PythonVersion.InstallPath <> ''; + Result := (PythonVersion.InstallPath <> '') and + DirectoryExists(ExcludeTrailingPathDelimiter(PythonVersion.InstallPath)); if not Result then Exit; if OpenKey(Key, False) then begin From 171909a4a7da3990afb642ade52d9e3bd34de79a Mon Sep 17 00:00:00 2001 From: Idan Miara Date: Tue, 9 Oct 2018 11:04:10 +0300 Subject: [PATCH 076/123] added SetPythonHome function (i.e. to use with OSGEO4W where python dll dir is not the same as PythonHome) --- .../Components/Sources/Core/PythonEngine.pas | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 4bc64c3b..103d967d 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -1968,6 +1968,10 @@ TPythonInterface=class(TDynamicDll) Py_GetCopyright : function : PAnsiChar; cdecl; Py_GetExecPrefix : function : PAnsiChar; cdecl; Py_GetPath : function : PAnsiChar; cdecl; + Py_SetPythonHome : procedure (home : PAnsiChar); cdecl; + Py_GetPythonHome : function : PAnsiChar; cdecl; + Py_SetPythonHome3000 : procedure (home : PWideChar); cdecl; + Py_GetPythonHome3000 : function : PWideChar; cdecl; Py_GetPrefix : function : PAnsiChar; cdecl; Py_GetProgramName : function : PAnsiChar; cdecl; @@ -2187,6 +2191,8 @@ TPythonEngine = class(TPythonInterface) FAutoFinalize: Boolean; FProgramName: AnsiString; FProgramNameW: UnicodeString; + FPythonHome: AnsiString; + FPythonHomeW: UnicodeString; FInitThreads: Boolean; FOnPathInitialization: TPathInitializationEvent; FOnSysPathInit: TSysPathInitEvent; @@ -2240,6 +2246,7 @@ TPythonEngine = class(TPythonInterface) procedure Finalize; procedure Lock; procedure Unlock; + procedure SetPythonHome(PythonHome: String); function IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; function GetAttrString(obj: PPyObject; AName: PAnsiChar):PAnsiChar; function CleanString(const s : AnsiString) : AnsiString; @@ -4056,6 +4063,14 @@ procedure TPythonInterface.MapDll; Py_GetCopyright :=Import('Py_GetCopyright'); Py_GetExecPrefix :=Import('Py_GetExecPrefix'); Py_GetPath :=Import('Py_GetPath'); + if IsPython3000 then + Py_SetPythonHome3000 :=Import('Py_SetPythonHome') + else + Py_SetPythonHome :=Import('Py_SetPythonHome'); + if IsPython3000 then + Py_GetPythonHome3000 :=Import('Py_GetPythonHome') + else + Py_GetPythonHome :=Import('Py_GetPythonHome'); Py_GetPrefix :=Import('Py_GetPrefix'); Py_GetProgramName :=Import('Py_GetProgramName'); PyParser_SimpleParseString :=Import('PyParser_SimpleParseString'); @@ -4850,6 +4865,12 @@ procedure TPythonEngine.Initialize; end end; AssignPyFlags; + if FPythonHomeW<>'' then begin + if IsPython3000 then + Py_SetPythonHome3000(PChar(FPythonHomeW)) + else + Py_SetPythonHome(PAnsiChar(FPythonHome)); + end; Py_Initialize; FInitialized := True; FIORedirected := False; @@ -5111,6 +5132,12 @@ procedure TPythonEngine.SetPyFlags(const Value: TPythonFlags); end; // of if end; +procedure TPythonEngine.SetPythonHome(PythonHome: String); +begin + FPythonHomeW := PythonHome; + FPythonHome := UTF8Encode(PythonHome); +end; + function TPythonEngine.IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; begin result := ob^.ob_type = obt; From 1dba1908565c7536fac0a98e69046a7f49bdcf20 Mon Sep 17 00:00:00 2001 From: Idan Miara Date: Tue, 9 Oct 2018 10:50:00 +0300 Subject: [PATCH 077/123] UTF8 Exec and eval accept utf8 code --- .../Components/Sources/Core/PythonEngine.pas | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 103d967d..519cb579 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -5307,12 +5307,12 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command : AnsiString; m procedure TPythonEngine.ExecStrings( strings : TStrings ); begin - Py_XDecRef( Run_CommandAsObject( CleanString( AnsiString(strings.Text) ), file_input ) ); + Py_XDecRef( Run_CommandAsObject( CleanString( UTF8Encode(strings.Text) ), file_input ) ); end; function TPythonEngine.EvalStrings( strings : TStrings ) : PPyObject; begin - Result := Run_CommandAsObject( CleanString( AnsiString(strings.Text) ), eval_input ); + Result := Run_CommandAsObject( CleanString( UTF8Encode(strings.Text) ), eval_input ); end; procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : PPyObject ); @@ -5322,7 +5322,7 @@ procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : procedure TPythonEngine.ExecStrings( strings : TStrings; locals, globals : PPyObject ); begin - Py_XDecRef( Run_CommandAsObjectWithDict( CleanString( AnsiString(strings.Text) ), file_input, locals, globals ) ); + Py_XDecRef( Run_CommandAsObjectWithDict( CleanString( UTF8Encode(strings.Text) ), file_input, locals, globals ) ); end; function TPythonEngine.EvalString( const command : AnsiString; locals, globals : PPyObject ) : PPyObject; @@ -5332,12 +5332,12 @@ function TPythonEngine.EvalString( const command : AnsiString; locals, globals : function TPythonEngine.EvalStrings( strings : TStrings; locals, globals : PPyObject ) : PPyObject; begin - Result := Run_CommandAsObjectWithDict( CleanString( AnsiString(strings.Text) ), eval_input, locals, globals ); + Result := Run_CommandAsObjectWithDict( CleanString( UTF8Encode(strings.Text) ), eval_input, locals, globals ); end; function TPythonEngine.EvalStringsAsStr( strings : TStrings ) : String; begin - Result := Run_CommandAsString( CleanString( AnsiString(strings.Text) ), eval_input ); + Result := Run_CommandAsString( CleanString( UTF8Encode(strings.Text) ), eval_input ); end; function TPythonEngine.CheckEvalSyntax( const str : AnsiString ) : Boolean; From 645daecaa369bb14c8b5fe654daf100689483219 Mon Sep 17 00:00:00 2001 From: Idan Miara Date: Tue, 9 Oct 2018 11:36:20 +0300 Subject: [PATCH 078/123] {$WARN SYMBOL_PLATFORM OFF} to silent: [dcc64 Warning] PythonEngine.pas(9758): W1002 Symbol 'SetPrecisionMode' is specific to a platform which is {$IFNDEF NEXTGEN} anyway. --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 519cb579..f65b43f2 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -9753,12 +9753,12 @@ procedure MaskFPUExceptions(ExceptionsMasked : boolean; exOverflow, exUnderflow, exPrecision]) else SetExceptionMask([exDenormalized, exUnderflow, exPrecision]); -{$IFNDEF NEXTGEN} +{$IFNDEF NEXTGEN}{$WARN SYMBOL_PLATFORM OFF} if MatchPythonPrecision then SetPrecisionMode(pmDouble) else SetPrecisionMode(pmExtended); -{$ENDIF !NEXTGEN} +{$ENDIF !NEXTGEN}{$WARN SYMBOL_PLATFORM ON} end; {$IFDEF MSWINDOWS} From 3553b25e1cce182d8a467c4d455504445af96b91 Mon Sep 17 00:00:00 2001 From: Idan Miara Date: Tue, 9 Oct 2018 11:52:57 +0300 Subject: [PATCH 079/123] ToPythonRawString - Python 2.x expects ANSI and Python 3.x expects utf8; ToPythonRawString will make the right RawString. --- .../Components/Sources/Core/PythonEngine.pas | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index f65b43f2..221e2aed 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -2253,6 +2253,7 @@ TPythonEngine = class(TPythonInterface) function Run_CommandAsString(const command : AnsiString; mode : Integer) : String; function Run_CommandAsObject(const command : AnsiString; mode : Integer) : PPyObject; function Run_CommandAsObjectWithDict(const command : AnsiString; mode : Integer; locals, globals : PPyObject) : PPyObject; + function ToPythonRawString (str: String): AnsiString; procedure ExecString(const command : AnsiString); overload; procedure ExecStrings( strings : TStrings ); overload; function EvalString(const command : AnsiString) : PPyObject; overload; @@ -5135,7 +5136,7 @@ procedure TPythonEngine.SetPyFlags(const Value: TPythonFlags); procedure TPythonEngine.SetPythonHome(PythonHome: String); begin FPythonHomeW := PythonHome; - FPythonHome := UTF8Encode(PythonHome); + FPythonHome := ToPythonRawString(PythonHome); end; function TPythonEngine.IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; @@ -5307,12 +5308,12 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command : AnsiString; m procedure TPythonEngine.ExecStrings( strings : TStrings ); begin - Py_XDecRef( Run_CommandAsObject( CleanString( UTF8Encode(strings.Text) ), file_input ) ); + Py_XDecRef( Run_CommandAsObject( CleanString( ToPythonRawString(strings.Text) ), file_input ) ); end; function TPythonEngine.EvalStrings( strings : TStrings ) : PPyObject; begin - Result := Run_CommandAsObject( CleanString( UTF8Encode(strings.Text) ), eval_input ); + Result := Run_CommandAsObject( CleanString( ToPythonRawString(strings.Text) ), eval_input ); end; procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : PPyObject ); @@ -5322,7 +5323,7 @@ procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : procedure TPythonEngine.ExecStrings( strings : TStrings; locals, globals : PPyObject ); begin - Py_XDecRef( Run_CommandAsObjectWithDict( CleanString( UTF8Encode(strings.Text) ), file_input, locals, globals ) ); + Py_XDecRef( Run_CommandAsObjectWithDict( CleanString( ToPythonRawString(strings.Text) ), file_input, locals, globals ) ); end; function TPythonEngine.EvalString( const command : AnsiString; locals, globals : PPyObject ) : PPyObject; @@ -5332,12 +5333,12 @@ function TPythonEngine.EvalString( const command : AnsiString; locals, globals : function TPythonEngine.EvalStrings( strings : TStrings; locals, globals : PPyObject ) : PPyObject; begin - Result := Run_CommandAsObjectWithDict( CleanString( UTF8Encode(strings.Text) ), eval_input, locals, globals ); + Result := Run_CommandAsObjectWithDict( CleanString( ToPythonRawString(strings.Text) ), eval_input, locals, globals ); end; function TPythonEngine.EvalStringsAsStr( strings : TStrings ) : String; begin - Result := Run_CommandAsString( CleanString( UTF8Encode(strings.Text) ), eval_input ); + Result := Run_CommandAsString( CleanString( ToPythonRawString(strings.Text) ), eval_input ); end; function TPythonEngine.CheckEvalSyntax( const str : AnsiString ) : Boolean; @@ -5685,6 +5686,14 @@ function TPythonEngine.FindClient( const aName : string ) : TEngineClient; end; end; +function TPythonEngine.ToPythonRawString(str: String): AnsiString; +begin + if IsPython3000 then + Result := UTF8Encode(str) + else + Result := AnsiString(str); +end; + function TPythonEngine.TypeByName( const aTypeName : AnsiString ) : PPyTypeObject; var i : Integer; From a7d24852e320ea85df0655dc6e8ef9399c511c9d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 9 Oct 2018 22:16:30 +0300 Subject: [PATCH 080/123] Style changes to PR #59 --- .../Components/Sources/Core/PythonEngine.pas | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 221e2aed..ea2ef68e 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -2246,14 +2246,14 @@ TPythonEngine = class(TPythonInterface) procedure Finalize; procedure Lock; procedure Unlock; - procedure SetPythonHome(PythonHome: String); + procedure SetPythonHome(const PythonHome: string); function IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; function GetAttrString(obj: PPyObject; AName: PAnsiChar):PAnsiChar; function CleanString(const s : AnsiString) : AnsiString; function Run_CommandAsString(const command : AnsiString; mode : Integer) : String; function Run_CommandAsObject(const command : AnsiString; mode : Integer) : PPyObject; function Run_CommandAsObjectWithDict(const command : AnsiString; mode : Integer; locals, globals : PPyObject) : PPyObject; - function ToPythonRawString (str: String): AnsiString; + function StringToPythonBytes (const str: string): AnsiString; procedure ExecString(const command : AnsiString); overload; procedure ExecStrings( strings : TStrings ); overload; function EvalString(const command : AnsiString) : PPyObject; overload; @@ -5133,10 +5133,10 @@ procedure TPythonEngine.SetPyFlags(const Value: TPythonFlags); end; // of if end; -procedure TPythonEngine.SetPythonHome(PythonHome: String); +procedure TPythonEngine.SetPythonHome(const PythonHome: string); begin FPythonHomeW := PythonHome; - FPythonHome := ToPythonRawString(PythonHome); + FPythonHome := StringToPythonBytes(PythonHome); end; function TPythonEngine.IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; @@ -5308,12 +5308,12 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command : AnsiString; m procedure TPythonEngine.ExecStrings( strings : TStrings ); begin - Py_XDecRef( Run_CommandAsObject( CleanString( ToPythonRawString(strings.Text) ), file_input ) ); + Py_XDecRef( Run_CommandAsObject( CleanString( StringToPythonBytes(strings.Text) ), file_input ) ); end; function TPythonEngine.EvalStrings( strings : TStrings ) : PPyObject; begin - Result := Run_CommandAsObject( CleanString( ToPythonRawString(strings.Text) ), eval_input ); + Result := Run_CommandAsObject( CleanString( StringToPythonBytes(strings.Text) ), eval_input ); end; procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : PPyObject ); @@ -5323,7 +5323,7 @@ procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : procedure TPythonEngine.ExecStrings( strings : TStrings; locals, globals : PPyObject ); begin - Py_XDecRef( Run_CommandAsObjectWithDict( CleanString( ToPythonRawString(strings.Text) ), file_input, locals, globals ) ); + Py_XDecRef( Run_CommandAsObjectWithDict( CleanString( StringToPythonBytes(strings.Text) ), file_input, locals, globals ) ); end; function TPythonEngine.EvalString( const command : AnsiString; locals, globals : PPyObject ) : PPyObject; @@ -5333,12 +5333,12 @@ function TPythonEngine.EvalString( const command : AnsiString; locals, globals : function TPythonEngine.EvalStrings( strings : TStrings; locals, globals : PPyObject ) : PPyObject; begin - Result := Run_CommandAsObjectWithDict( CleanString( ToPythonRawString(strings.Text) ), eval_input, locals, globals ); + Result := Run_CommandAsObjectWithDict( CleanString( StringToPythonBytes(strings.Text) ), eval_input, locals, globals ); end; function TPythonEngine.EvalStringsAsStr( strings : TStrings ) : String; begin - Result := Run_CommandAsString( CleanString( ToPythonRawString(strings.Text) ), eval_input ); + Result := Run_CommandAsString( CleanString( StringToPythonBytes(strings.Text) ), eval_input ); end; function TPythonEngine.CheckEvalSyntax( const str : AnsiString ) : Boolean; @@ -5686,7 +5686,7 @@ function TPythonEngine.FindClient( const aName : string ) : TEngineClient; end; end; -function TPythonEngine.ToPythonRawString(str: String): AnsiString; +function TPythonEngine.StringToPythonBytes(const str: string): AnsiString; begin if IsPython3000 then Result := UTF8Encode(str) From a20425278222b1ac3714512417c89400474038e2 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 9 Oct 2018 22:22:33 +0300 Subject: [PATCH 081/123] Rename ToPythonRawString to StringToPythonBytes to EncodeString --- .../Components/Sources/Core/PythonEngine.pas | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index ea2ef68e..41fa479b 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -2253,7 +2253,7 @@ TPythonEngine = class(TPythonInterface) function Run_CommandAsString(const command : AnsiString; mode : Integer) : String; function Run_CommandAsObject(const command : AnsiString; mode : Integer) : PPyObject; function Run_CommandAsObjectWithDict(const command : AnsiString; mode : Integer; locals, globals : PPyObject) : PPyObject; - function StringToPythonBytes (const str: string): AnsiString; + function EncodeString (const str: string): AnsiString; procedure ExecString(const command : AnsiString); overload; procedure ExecStrings( strings : TStrings ); overload; function EvalString(const command : AnsiString) : PPyObject; overload; @@ -5136,7 +5136,7 @@ procedure TPythonEngine.SetPyFlags(const Value: TPythonFlags); procedure TPythonEngine.SetPythonHome(const PythonHome: string); begin FPythonHomeW := PythonHome; - FPythonHome := StringToPythonBytes(PythonHome); + FPythonHome := EncodeString(PythonHome); end; function TPythonEngine.IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; @@ -5308,12 +5308,12 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command : AnsiString; m procedure TPythonEngine.ExecStrings( strings : TStrings ); begin - Py_XDecRef( Run_CommandAsObject( CleanString( StringToPythonBytes(strings.Text) ), file_input ) ); + Py_XDecRef( Run_CommandAsObject( CleanString( EncodeString(strings.Text) ), file_input ) ); end; function TPythonEngine.EvalStrings( strings : TStrings ) : PPyObject; begin - Result := Run_CommandAsObject( CleanString( StringToPythonBytes(strings.Text) ), eval_input ); + Result := Run_CommandAsObject( CleanString( EncodeString(strings.Text) ), eval_input ); end; procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : PPyObject ); @@ -5323,7 +5323,7 @@ procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : procedure TPythonEngine.ExecStrings( strings : TStrings; locals, globals : PPyObject ); begin - Py_XDecRef( Run_CommandAsObjectWithDict( CleanString( StringToPythonBytes(strings.Text) ), file_input, locals, globals ) ); + Py_XDecRef( Run_CommandAsObjectWithDict( CleanString( EncodeString(strings.Text) ), file_input, locals, globals ) ); end; function TPythonEngine.EvalString( const command : AnsiString; locals, globals : PPyObject ) : PPyObject; @@ -5333,12 +5333,12 @@ function TPythonEngine.EvalString( const command : AnsiString; locals, globals : function TPythonEngine.EvalStrings( strings : TStrings; locals, globals : PPyObject ) : PPyObject; begin - Result := Run_CommandAsObjectWithDict( CleanString( StringToPythonBytes(strings.Text) ), eval_input, locals, globals ); + Result := Run_CommandAsObjectWithDict( CleanString( EncodeString(strings.Text) ), eval_input, locals, globals ); end; function TPythonEngine.EvalStringsAsStr( strings : TStrings ) : String; begin - Result := Run_CommandAsString( CleanString( StringToPythonBytes(strings.Text) ), eval_input ); + Result := Run_CommandAsString( CleanString( EncodeString(strings.Text) ), eval_input ); end; function TPythonEngine.CheckEvalSyntax( const str : AnsiString ) : Boolean; @@ -5686,7 +5686,7 @@ function TPythonEngine.FindClient( const aName : string ) : TEngineClient; end; end; -function TPythonEngine.StringToPythonBytes(const str: string): AnsiString; +function TPythonEngine.EncodeString(const str: string): AnsiString; begin if IsPython3000 then Result := UTF8Encode(str) From 43701a007e58040b3b1a12cf21261a57c10be592 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 11 Oct 2018 18:37:01 +0300 Subject: [PATCH 082/123] EncodeWindowsFilePath added --- .../Components/Sources/Core/PythonEngine.pas | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 41fa479b..10b84f42 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -2254,6 +2254,7 @@ TPythonEngine = class(TPythonInterface) function Run_CommandAsObject(const command : AnsiString; mode : Integer) : PPyObject; function Run_CommandAsObjectWithDict(const command : AnsiString; mode : Integer; locals, globals : PPyObject) : PPyObject; function EncodeString (const str: string): AnsiString; + function EncodeWindowsFilePath (const str: string): AnsiString; procedure ExecString(const command : AnsiString); overload; procedure ExecStrings( strings : TStrings ); overload; function EvalString(const command : AnsiString) : PPyObject; overload; @@ -4901,11 +4902,7 @@ procedure TPythonEngine.SetInitScript(Value: TStrings); function TPythonEngine.GetInterpreterState: PPyInterpreterState; var res: PPyThreadState; - MajorVersion : integer; - MinorVersion : integer; begin - MajorVersion := StrToInt(RegVersion[1]); - MinorVersion := StrToInt(RegVersion[3]); if Assigned(PyThreadState_Get) then begin res:= PyThreadState_Get(); if (MajorVersion > 3) or ((MajorVersion = 3) and (MinorVersion >= 4)) then @@ -5694,6 +5691,15 @@ function TPythonEngine.EncodeString(const str: string): AnsiString; Result := AnsiString(str); end; +function TPythonEngine.EncodeWindowsFilePath(const str: string): AnsiString; +{PEP 529} +begin + if (MajorVersion > 3) or ((MajorVersion = 3) and (MinorVersion >=6) )then + Result := UTF8Encode(str) + else + Result := AnsiString(str); +end; + function TPythonEngine.TypeByName( const aTypeName : AnsiString ) : PPyTypeObject; var i : Integer; From 7303bb12c9a5abc5247adb7ac714f17c1008b2c0 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 17 Oct 2018 14:34:27 +0300 Subject: [PATCH 083/123] Undefine PYTHON25 --- PythonForDelphi/Components/Sources/Core/Definition.Inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index e280b211..96c2bd91 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -27,7 +27,7 @@ ///////////////////////////////////////////////////////////////////////////// //{$DEFINE PYTHON24} -{$DEFINE PYTHON25} +//{$DEFINE PYTHON25} //{$DEFINE PYTHON26} //{$DEFINE PYTHON27} //{$DEFINE PYTHON30} From 61fa702c9f6a719a5f0f2b6f256ef65c0b3830c0 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 19 Oct 2018 04:10:58 +0300 Subject: [PATCH 084/123] Changes in the documentation of the unit. --- PythonForDelphi/Components/Sources/Core/WrapDelphi.pas | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas index 1f019037..6ac6df6c 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas @@ -356,7 +356,7 @@ TPyDelphiWrapper = class; TMyClass = class(TInterfacedObject, IFreeNotification) private - fFreeNotifImpl : TFreeNotificationImpl; + fFreeNotifImpl : IFreeNotification; protected property FreeNotifImpl : IFreeNotification read fFreeNotifImpl implements IFreeNotification; public @@ -738,9 +738,9 @@ TRegisteredUnits = class { The main component of this unit. - Method TObjectToPyObject wraps Delphi objects into Python objects - Method RegisterDelphiClass can be used to extend its functionality. - Method RegisterEventHandler can be used to add event handling functionality + Method Wrap wraps Delphi objects into Python objects + Method RegisterDelphiWrapper can be used to extend its functionality. + Method EventHandlers.RegisterHandler can be used to add event handling functionality } {$IF not Defined(FPC) and (CompilerVersion >= 23)} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] @@ -2951,7 +2951,7 @@ function TPyDelphiWrapper.Wrap(AObj: TObject; if Index >= 0 then break; DelphiClass := DelphiClass.ClassParent; end; - Assert(Index >= 0, 'Internal Error in PyDelphiWrapper.TObjectToPyObject'); // shouldn't happen + Assert(Index >= 0, 'Internal Error in PyDelphiWrapper.Wrap'); // shouldn't happen Result := TRegisteredClass(fClassRegister[Index]).PythonType.CreateInstance; with PythonToDelphi(Result) as TPyDelphiObject do begin From 27563a443f69c26177a5404e5319513d85d62e4d Mon Sep 17 00:00:00 2001 From: Idan Miara Date: Wed, 24 Oct 2018 18:17:45 +0300 Subject: [PATCH 085/123] Detect Python RegVersion correctly for UseLastKnownVersion=False --- .../Components/Sources/Core/PythonEngine.pas | 10 +++++++++- .../Components/Sources/Core/PythonVersions.pas | 3 +-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 10b84f42..a4a6ac37 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3149,6 +3149,7 @@ procedure PyObjectDestructor( pSelf : PPyObject); cdecl; procedure FreeSubtypeInst(ob:PPyObject); cdecl; procedure Register; function PyType_HasFeature(AType : PPyTypeObject; AFlag : Integer) : Boolean; +function GetPythonVersionFromDLLName(const DLLFileName : String): String; { Helper functions} (* @@ -4746,7 +4747,9 @@ procedure TPythonEngine.DoOpenDll(const aDllName : String); end; if not PYTHON_KNOWN_VERSIONS[i].CanUseLatest then Break; - end; + end + else + RegVersion := GetPythonVersionFromDLLName(aDllName); inherited; end; @@ -9754,6 +9757,11 @@ procedure Register; TPythonType, TPythonModule, TPythonDelphiVar]); end; +function GetPythonVersionFromDLLName(const DLLFileName : String): String; +begin + Result := DLLFileName[{$IFDEF MSWINDOWS}7{$ELSE}10{$ENDIF}] + '.' + DLLFileName[{$IFDEF MSWINDOWS}8{$ELSE}11{$ENDIF}]; +end; + function PyType_HasFeature(AType : PPyTypeObject; AFlag : Integer) : Boolean; begin //(((t)->tp_flags & (f)) != 0) diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index c243f339..f917991f 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -464,8 +464,7 @@ function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVer end; PythonVersion.DLLPath := DLLPath; - SysVersion := Copy(DLLFileName, 7, 2); - Insert('.', SysVersion, 2); + SysVersion := GetPythonVersionFromDLLName(DLLFileName); PythonVersion.SysVersion := SysVersion; PythonVersion.fSysArchitecture := PythonVersion.ExpectedArchitecture; From 8f138f74668d9aa4c7c3897ef2c94ab1387f6a8b Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 27 Nov 2018 04:48:11 +0200 Subject: [PATCH 086/123] Removed packages for old unsupported versions of Delphi and C++ Builder. --- .../Components/Compile_PythonVCL_d5.bat | 3 - .../Components/Compile_Python_d5.bat | 1 - PythonForDelphi/Components/PythonVCL_cb3.bpk | 163 ------------- PythonForDelphi/Components/PythonVCL_cb3.cpp | 21 -- PythonForDelphi/Components/PythonVCL_cb3.dpk | 39 ---- PythonForDelphi/Components/PythonVCL_cb3.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/PythonVCL_cb4.bpk | 208 ----------------- PythonForDelphi/Components/PythonVCL_cb4.cpp | 21 -- PythonForDelphi/Components/PythonVCL_cb4.dpk | 39 ---- PythonForDelphi/Components/PythonVCL_cb4.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/PythonVCL_cb5.bpi | Bin 18948 -> 0 bytes PythonForDelphi/Components/PythonVCL_cb5.bpk | 117 ---------- PythonForDelphi/Components/PythonVCL_cb5.cpp | 22 -- PythonForDelphi/Components/PythonVCL_cb5.lib | Bin 151188 -> 0 bytes PythonForDelphi/Components/PythonVCL_cb5.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/PythonVCL_d3.dpk | 40 ---- PythonForDelphi/Components/PythonVCL_d3.res | Bin 32 -> 0 bytes PythonForDelphi/Components/PythonVCL_d4.dpk | 39 ---- PythonForDelphi/Components/PythonVCL_d4.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/PythonVCL_d5.dpk | 40 ---- PythonForDelphi/Components/PythonVCL_d5.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/PythonVCL_d6.dof | 87 ------- PythonForDelphi/Components/PythonVCL_d6.dpk | 40 ---- PythonForDelphi/Components/PythonVCL_d6.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/Python_cb3.bpk | 179 --------------- PythonForDelphi/Components/Python_cb3.cpp | 19 -- PythonForDelphi/Components/Python_cb3.dpk | 38 ---- PythonForDelphi/Components/Python_cb3.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/Python_cb4.bpi | Bin 44148 -> 0 bytes PythonForDelphi/Components/Python_cb4.bpk | 214 ------------------ PythonForDelphi/Components/Python_cb4.cpp | 21 -- PythonForDelphi/Components/Python_cb4.dpk | 37 --- PythonForDelphi/Components/Python_cb4.lib | Bin 183604 -> 0 bytes PythonForDelphi/Components/Python_cb4.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/Python_cb5.bpi | Bin 37876 -> 0 bytes PythonForDelphi/Components/Python_cb5.bpk | 117 ---------- PythonForDelphi/Components/Python_cb5.cpp | 19 -- PythonForDelphi/Components/Python_cb5.lib | Bin 159748 -> 0 bytes PythonForDelphi/Components/Python_cb5.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/Python_d3.dpk | 40 ---- PythonForDelphi/Components/Python_d3.res | Bin 692 -> 0 bytes PythonForDelphi/Components/Python_d4.dpk | 39 ---- PythonForDelphi/Components/Python_d4.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/Python_d5.dpk | 41 ---- PythonForDelphi/Components/Python_d5.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/Python_d6.dpk | 40 ---- PythonForDelphi/Components/Python_d6.res | Bin 1536 -> 0 bytes PythonForDelphi/Components/Python_kylix.conf | 33 --- PythonForDelphi/Components/Python_kylix.dpk | 37 --- PythonForDelphi/Components/Python_kylix.res | Bin 32 -> 0 bytes PythonForDelphi/Components/py15.lib | Bin 41984 -> 0 bytes PythonForDelphi/Components/py21.lib | Bin 81920 -> 0 bytes 52 files changed, 1754 deletions(-) delete mode 100644 PythonForDelphi/Components/Compile_PythonVCL_d5.bat delete mode 100644 PythonForDelphi/Components/Compile_Python_d5.bat delete mode 100644 PythonForDelphi/Components/PythonVCL_cb3.bpk delete mode 100644 PythonForDelphi/Components/PythonVCL_cb3.cpp delete mode 100644 PythonForDelphi/Components/PythonVCL_cb3.dpk delete mode 100644 PythonForDelphi/Components/PythonVCL_cb3.res delete mode 100644 PythonForDelphi/Components/PythonVCL_cb4.bpk delete mode 100644 PythonForDelphi/Components/PythonVCL_cb4.cpp delete mode 100644 PythonForDelphi/Components/PythonVCL_cb4.dpk delete mode 100644 PythonForDelphi/Components/PythonVCL_cb4.res delete mode 100644 PythonForDelphi/Components/PythonVCL_cb5.bpi delete mode 100644 PythonForDelphi/Components/PythonVCL_cb5.bpk delete mode 100644 PythonForDelphi/Components/PythonVCL_cb5.cpp delete mode 100644 PythonForDelphi/Components/PythonVCL_cb5.lib delete mode 100644 PythonForDelphi/Components/PythonVCL_cb5.res delete mode 100644 PythonForDelphi/Components/PythonVCL_d3.dpk delete mode 100644 PythonForDelphi/Components/PythonVCL_d3.res delete mode 100644 PythonForDelphi/Components/PythonVCL_d4.dpk delete mode 100644 PythonForDelphi/Components/PythonVCL_d4.res delete mode 100644 PythonForDelphi/Components/PythonVCL_d5.dpk delete mode 100644 PythonForDelphi/Components/PythonVCL_d5.res delete mode 100644 PythonForDelphi/Components/PythonVCL_d6.dof delete mode 100644 PythonForDelphi/Components/PythonVCL_d6.dpk delete mode 100644 PythonForDelphi/Components/PythonVCL_d6.res delete mode 100644 PythonForDelphi/Components/Python_cb3.bpk delete mode 100644 PythonForDelphi/Components/Python_cb3.cpp delete mode 100644 PythonForDelphi/Components/Python_cb3.dpk delete mode 100644 PythonForDelphi/Components/Python_cb3.res delete mode 100644 PythonForDelphi/Components/Python_cb4.bpi delete mode 100644 PythonForDelphi/Components/Python_cb4.bpk delete mode 100644 PythonForDelphi/Components/Python_cb4.cpp delete mode 100644 PythonForDelphi/Components/Python_cb4.dpk delete mode 100644 PythonForDelphi/Components/Python_cb4.lib delete mode 100644 PythonForDelphi/Components/Python_cb4.res delete mode 100644 PythonForDelphi/Components/Python_cb5.bpi delete mode 100644 PythonForDelphi/Components/Python_cb5.bpk delete mode 100644 PythonForDelphi/Components/Python_cb5.cpp delete mode 100644 PythonForDelphi/Components/Python_cb5.lib delete mode 100644 PythonForDelphi/Components/Python_cb5.res delete mode 100644 PythonForDelphi/Components/Python_d3.dpk delete mode 100644 PythonForDelphi/Components/Python_d3.res delete mode 100644 PythonForDelphi/Components/Python_d4.dpk delete mode 100644 PythonForDelphi/Components/Python_d4.res delete mode 100644 PythonForDelphi/Components/Python_d5.dpk delete mode 100644 PythonForDelphi/Components/Python_d5.res delete mode 100644 PythonForDelphi/Components/Python_d6.dpk delete mode 100644 PythonForDelphi/Components/Python_d6.res delete mode 100644 PythonForDelphi/Components/Python_kylix.conf delete mode 100644 PythonForDelphi/Components/Python_kylix.dpk delete mode 100644 PythonForDelphi/Components/Python_kylix.res delete mode 100644 PythonForDelphi/Components/py15.lib delete mode 100644 PythonForDelphi/Components/py21.lib diff --git a/PythonForDelphi/Components/Compile_PythonVCL_d5.bat b/PythonForDelphi/Components/Compile_PythonVCL_d5.bat deleted file mode 100644 index a76cf18e..00000000 --- a/PythonForDelphi/Components/Compile_PythonVCL_d5.bat +++ /dev/null @@ -1,3 +0,0 @@ -"C:\Program Files\Borland\Delphi5\bin\dcc32.exe" PythonVCL_d5.dpk /USources\Core;Sources\Vcl /RSources\Core;Sources\Vcl -pause - diff --git a/PythonForDelphi/Components/Compile_Python_d5.bat b/PythonForDelphi/Components/Compile_Python_d5.bat deleted file mode 100644 index 20a718f0..00000000 --- a/PythonForDelphi/Components/Compile_Python_d5.bat +++ /dev/null @@ -1 +0,0 @@ -"C:\Program Files\Borland\Delphi5\bin\dcc32.exe" Python_d5.dpk /USources\Core;Sources\Vcl /RSources\Core;Sources\Vcl diff --git a/PythonForDelphi/Components/PythonVCL_cb3.bpk b/PythonForDelphi/Components/PythonVCL_cb3.bpk deleted file mode 100644 index 2c81855c..00000000 --- a/PythonForDelphi/Components/PythonVCL_cb3.bpk +++ /dev/null @@ -1,163 +0,0 @@ -# --------------------------------------------------------------------------- -!if !$d(BCB) -BCB = $(MAKEDIR)\.. -!endif - -# --------------------------------------------------------------------------- -# SECTION EDI -# --------------------------------------------------------------------------- -# La section suivante du Makefile du projet est gérée par l'EDI de BCB. -# Il est recommandé d'utiliser l'EDI pour modifier les valeurs de cette -# section. -# --------------------------------------------------------------------------- - -VERSION = BCB.03 -# --------------------------------------------------------------------------- -PROJECT = PythonVCL_cb3.bpl -OBJFILES = Sources\VCL\PythonDatabase.obj Sources\VCL\pyDBTables.obj Sources\VCL\pyDB.obj \ - PythonVCL_cb3.obj -RESFILES = PythonVCL_cb3.res Sources\VCL\PythonDatabase.dcr -DEFFILE = -RESDEPEN = $(RESFILES) -LIBFILES = -LIBRARIES = -SPARELIBS = VCL35.lib Python_cb3.lib VCLDB35.lib -PACKAGES = VCL35.bpi VCLDB35.bpi Python_cb3.bpi -# --------------------------------------------------------------------------- -PATHCPP = .; -PATHASM = .;Sources\Core;Sources\VCL -PATHPAS = .;Sources\Core;Sources\VCL -PATHRC = .; -DEBUGLIBPATH = $(BCB)\lib\debug -RELEASELIBPATH = $(BCB)\lib\release -# --------------------------------------------------------------------------- -CFLAG1 = -O2 -Hc -w -Ve -r- -k -y -v -vi- -c -b- -w-par -w-inl -Vx -CFLAG2 = -D_RTLDLL;USEPACKAGES -Isources\vcl;$(BCB)\include;$(BCB)\include\vcl \ - -H=$(BCB)\lib\vcl35.csm -CFLAG3 = -Tkh30000 -PFLAGS = -D_RTLDLL;USEPACKAGES \ - -U.;sources\core;sources\vcl;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ - -Isources\core;sources\vcl;$(BCB)\include;$(BCB)\include\vcl -$Y -$W -$D- -v -JPHN -M -RFLAGS = -D_RTLDLL;USEPACKAGES -isources\core;sources\vcl;$(BCB)\include;$(BCB)\include\vcl -AFLAGS = /isources\core /isources\vcl /i$(BCB)\include /i$(BCB)\include\vcl /d_RTLDLL /dUSEPACKAGES /mx \ - /w2 /zd -LFLAGS = -L.;sources\core;sources\vcl;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ - -D"VCL Components for Python" -aa -Tpp -x -Gn -Gl -Gi -v -IFLAGS = -# --------------------------------------------------------------------------- -ALLOBJ = c0pkg32.obj $(PACKAGES) sysinit.obj $(OBJFILES) -ALLRES = $(RESFILES) -ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib -# --------------------------------------------------------------------------- -!ifdef IDEOPTIONS - -[Version Info] -IncludeVerInfo=1 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1036 -CodePage=1252 - -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= - -[Debugging] -DebugSourceDirs=$(BCB)\source\vcl - -[Parameters] -RunParams= -HostApplication= - -!endif - -# --------------------------------------------------------------------------- -# SECTION MAKE -# --------------------------------------------------------------------------- -# Cette section du fichier projet n'est pas utilisée par l'EDI de BCB. Elle est destinée -# à la construction à partir de la ligne de commande en utilisant l'utilitaire MAKE. -# --------------------------------------------------------------------------- - -.autodepend -# --------------------------------------------------------------------------- -!if !$d(BCC32) -BCC32 = bcc32 -!endif - -!if !$d(DCC32) -DCC32 = dcc32 -!endif - -!if !$d(TASM32) -TASM32 = tasm32 -!endif - -!if !$d(LINKER) -LINKER = ilink32 -!endif - -!if !$d(BRCC32) -BRCC32 = brcc32 -!endif -# --------------------------------------------------------------------------- -!if $d(PATHCPP) -.PATH.CPP = $(PATHCPP) -.PATH.C = $(PATHCPP) -!endif - -!if $d(PATHPAS) -.PATH.PAS = $(PATHPAS) -!endif - -!if $d(PATHASM) -.PATH.ASM = $(PATHASM) -!endif - -!if $d(PATHRC) -.PATH.RC = $(PATHRC) -!endif -# --------------------------------------------------------------------------- -$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) - $(BCB)\BIN\$(LINKER) @&&! - $(LFLAGS) + - $(ALLOBJ), + - $(PROJECT),, + - $(ALLLIB), + - $(DEFFILE), + - $(ALLRES) -! -# --------------------------------------------------------------------------- -.pas.hpp: - $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } - -.pas.obj: - $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } - -.cpp.obj: - $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< } - -.c.obj: - $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< } - -.asm.obj: - $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ - -.rc.res: - $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< -# --------------------------------------------------------------------------- diff --git a/PythonForDelphi/Components/PythonVCL_cb3.cpp b/PythonForDelphi/Components/PythonVCL_cb3.cpp deleted file mode 100644 index 8f27d640..00000000 --- a/PythonForDelphi/Components/PythonVCL_cb3.cpp +++ /dev/null @@ -1,21 +0,0 @@ -//--------------------------------------------------------------------------- -#include -#pragma hdrstop -USERES("PythonVCL_cb3.res"); -USEPACKAGE("VCL35.bpi"); -USEPACKAGE("VCLDB35.bpi"); -USEPACKAGE("Python_cb3.bpi"); -USEUNIT("Sources\VCL\PythonDatabase.pas"); -USERES("Sources\VCL\PythonDatabase.dcr"); -USEUNIT("Sources\VCL\pyDBTables.pas"); -USEUNIT("Sources\VCL\pyDB.pas"); -//--------------------------------------------------------------------------- -#pragma package(smart_init) -//--------------------------------------------------------------------------- -// Source du paquet. -//--------------------------------------------------------------------------- -int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) -{ - return 1; -} -//--------------------------------------------------------------------------- diff --git a/PythonForDelphi/Components/PythonVCL_cb3.dpk b/PythonForDelphi/Components/PythonVCL_cb3.dpk deleted file mode 100644 index 2e742f06..00000000 --- a/PythonForDelphi/Components/PythonVCL_cb3.dpk +++ /dev/null @@ -1,39 +0,0 @@ -package PythonVCL_cb3; - -{$R *.RES} -{$R 'PythonDatabase.dcr'} -{$ALIGN ON} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO OFF} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $00400000} -{$DESCRIPTION 'VCL Components for Python'} -{$DESIGNONLY} -{$IMPLICITBUILD ON} - -requires - VCLDB35, - Python_cb3; - -contains - pyDB, - pyDBTables, - PythonDatabase; - -end. diff --git a/PythonForDelphi/Components/PythonVCL_cb3.res b/PythonForDelphi/Components/PythonVCL_cb3.res deleted file mode 100644 index cde45972f8f285a8136c7530c7b8ed0780743266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcma)5J#Q015Ph~!B1Hr)Xs9p}NYEf7xeq8y_96m71i6hY2qwa@PiE023X)x6LGxRy}b`(3C5n=nSF1*_HF^7MNLzuG%ND6?(qgWHH$Ty>wzcT zr_rK5rq+;cGiJ3+0sb+ax`j`gn9t{21&}6WN!`My>np|iXUfE!QZADyiOyrnL_eF& zW^ufT7bTo%j_WV8kZ6vZQxjHj9jXc*hv9L;UzT5M6<$idwJTfS#2J5WVe4xhhN(!7 zt57BCEGclMj?WBoJQSS1k0-y1t13=@1(*DxF2zg!D9>*U<24Fg8)YK;S^vhwif{>! z0>ZEdJTVmSXY*K?s= zyubs?@i`Tdk9cEiMXY(q*kR6Xqe-^scF7%+U2q=ZA**}!^`%c^xkJ_-EOl_t*54uC zx2SX*u}_({kN1pp;`%IjugU1)E#r>3j`4w=cyZj_EQg$$)b)LfSDb)5qnG54nC%m1 zH%lFYXDM@6Im^>8&wk6!<<4HJ$r<<#m2I?Z`}SQGZxgs{zXUhokWm9N%kN@6_!0a8 D1$kP5 diff --git a/PythonForDelphi/Components/PythonVCL_cb4.bpk b/PythonForDelphi/Components/PythonVCL_cb4.bpk deleted file mode 100644 index 9565d1a9..00000000 --- a/PythonForDelphi/Components/PythonVCL_cb4.bpk +++ /dev/null @@ -1,208 +0,0 @@ -# --------------------------------------------------------------------------- -!if !$d(BCB) -BCB = $(MAKEDIR)\.. -!endif - -# --------------------------------------------------------------------------- -# IDE SECTION -# --------------------------------------------------------------------------- -# The following section of the project makefile is managed by the BCB IDE. -# It is recommended to use the IDE to change any of the values in this -# section. -# --------------------------------------------------------------------------- - -VERSION = BCB.04.04 -# --------------------------------------------------------------------------- -PROJECT = PythonVCL_cb4.bpl -OBJFILES = Sources\VCL\PythonDatabase.obj Sources\VCL\pyDBTables.obj Sources\VCL\pyDB.obj \ - PythonVCL_cb4.obj -RESFILES = PythonVCL_cb4.res Sources\VCL\PythonDatabase.dcr -RESDEPEN = $(RESFILES) -LIBFILES = -IDLFILES = -IDLGENFILES = -LIBRARIES = -SPARELIBS = Vcl40.lib -PACKAGES = vcl40.bpi vcldb40.bpi Python_cb4.bpi -DEFFILE = -# --------------------------------------------------------------------------- -PATHCPP = .; -PATHASM = .; -PATHPAS = .;Sources\VCL -PATHRC = .; -DEBUGLIBPATH = $(BCB)\lib\debug -RELEASELIBPATH = $(BCB)\lib\release -USERDEFINES = -SYSDEFINES = _RTLDLL;NO_STRICT;USEPACKAGES -# --------------------------------------------------------------------------- -CFLAG1 = -ISources\Core;Sources\VCL;$(BCB)\include;$(BCB)\include\vcl -O2 -Hc \ - -H=$(BCB)\lib\vcl40.csm -w -Ve -r- -a8 -k -y -v -vi- -c -b- -w-par -w-inl -Vx \ - -tWM -D$(SYSDEFINES);$(USERDEFINES) -IDLCFLAGS = -ISources\Core -ISources\VCL -I$(BCB)\include -I$(BCB)\include\vcl -src_suffixcpp -PFLAGS = -U..\..\borland\cbuilder4\lib\release;Sources\Core;Sources\VCL;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ - -ISources\Core;Sources\VCL;$(BCB)\include;$(BCB)\include\vcl -$YD -$W -$O- -$D- \ - -v -JPHNE -M -RFLAGS = -iSources\Core;Sources\VCL;$(BCB)\include;$(BCB)\include\vcl -AFLAGS = /iSources\Core /iSources\VCL /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zd -LFLAGS = -L..\..\borland\cbuilder4\lib\release;Sources\Core;Sources\VCL;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ - -l. -D"VCL Components for Python" -aa -Tpp -x -Gn -Gl -Gi -v -# --------------------------------------------------------------------------- -ALLOBJ = c0pkg32.obj Memmgr.Lib $(PACKAGES) sysinit.obj $(OBJFILES) -ALLRES = $(RESFILES) -ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib -# --------------------------------------------------------------------------- -!ifdef IDEOPTIONS - -[Version Info] -IncludeVerInfo=1 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1036 -CodePage=1252 - -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= - -[HistoryLists\hlIncludePath] -Count=1 -Item0=Sources\Core;Sources\VCL;$(BCB)\include;$(BCB)\include\vcl - -[HistoryLists\hlLibraryPath] -Count=1 -Item0=..\..\borland\cbuilder4\lib\release;Sources\Core;Sources\VCL;$(BCB)\lib\obj;$(BCB)\lib - -[HistoryLists\hlDebugSourcePath] -Count=1 -Item0=$(BCB)\source\vcl - -[HistoryLists\hIBPIOutputDir] -Count=1 -Item0=. - -[Debugging] -DebugSourceDirs=$(BCB)\source\vcl - -[Parameters] -RunParams= -HostApplication= -RemoteHost= -RemotePath= -RemoteDebug=0 - -[Compiler] -InMemoryExe=0 -ShowInfoMsgs=0 - -[CORBA] -AddServerUnit=1 -AddClientUnit=1 -PrecompiledHeaders=1 - -!endif - -# --------------------------------------------------------------------------- -# MAKE SECTION -# --------------------------------------------------------------------------- -# This section of the project file is not used by the BCB IDE. It is for -# the benefit of building from the command-line using the MAKE utility. -# --------------------------------------------------------------------------- - -.autodepend -# --------------------------------------------------------------------------- -!if !$d(BCC32) -BCC32 = bcc32 -!endif - -!if !$d(CPP32) -CPP32 = cpp32 -!endif - -!if !$d(DCC32) -DCC32 = dcc32 -!endif - -!if !$d(TASM32) -TASM32 = tasm32 -!endif - -!if !$d(LINKER) -LINKER = ilink32 -!endif - -!if !$d(BRCC32) -BRCC32 = brcc32 -!endif - -!if !$d(IDL2CPP) -IDL2CPP = idl2cpp -!endif - -# --------------------------------------------------------------------------- -!if $d(PATHCPP) -.PATH.CPP = $(PATHCPP) -.PATH.C = $(PATHCPP) -!endif - -!if $d(PATHPAS) -.PATH.PAS = $(PATHPAS) -!endif - -!if $d(PATHASM) -.PATH.ASM = $(PATHASM) -!endif - -!if $d(PATHRC) -.PATH.RC = $(PATHRC) -!endif -# --------------------------------------------------------------------------- -$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) - $(BCB)\BIN\$(LINKER) @&&! - $(LFLAGS) + - $(ALLOBJ), + - $(PROJECT),, + - $(ALLLIB), + - $(DEFFILE), + - $(ALLRES) -! -# --------------------------------------------------------------------------- -.pas.hpp: - $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } - -.pas.obj: - $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } - -.cpp.obj: - $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } - -.c.obj: - $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } - -.c.i: - $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } - -.cpp.i: - $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } - -.asm.obj: - $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ - -.rc.res: - $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< -# --------------------------------------------------------------------------- diff --git a/PythonForDelphi/Components/PythonVCL_cb4.cpp b/PythonForDelphi/Components/PythonVCL_cb4.cpp deleted file mode 100644 index d23d4d79..00000000 --- a/PythonForDelphi/Components/PythonVCL_cb4.cpp +++ /dev/null @@ -1,21 +0,0 @@ -//--------------------------------------------------------------------------- -#include -#pragma hdrstop -USERES("PythonVCL_cb4.res"); -USEPACKAGE("vcl40.bpi"); -USEUNIT("Sources\VCL\PythonDatabase.pas"); -USERES("Sources\VCL\PythonDatabase.dcr"); -USEUNIT("Sources\VCL\pyDBTables.pas"); -USEUNIT("Sources\VCL\pyDB.pas"); -USEPACKAGE("vcldb40.bpi"); -USEPACKAGE("Python_cb4.bpi"); -//--------------------------------------------------------------------------- -#pragma package(smart_init) -//--------------------------------------------------------------------------- -// Package source. -//--------------------------------------------------------------------------- -int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) -{ - return 1; -} -//--------------------------------------------------------------------------- diff --git a/PythonForDelphi/Components/PythonVCL_cb4.dpk b/PythonForDelphi/Components/PythonVCL_cb4.dpk deleted file mode 100644 index ecd8c3db..00000000 --- a/PythonForDelphi/Components/PythonVCL_cb4.dpk +++ /dev/null @@ -1,39 +0,0 @@ -package PythonVCL_cb4; - -{$R *.RES} -{$R 'Sources\VCL\PythonDatabase.dcr'} -{$ALIGN ON} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $00400000} -{$DESCRIPTION 'VCL Components for Python'} -{$IMPLICITBUILD OFF} - -requires - vcl40, - Vcldb40, - Python_cb4; - -contains - PythonDatabase in 'Sources\VCL\PythonDatabase.pas', - pyDB in 'Sources\VCL\pyDB.pas', - pyDBTables in 'sources\VCL\pyDBTables.pas'; - -end. diff --git a/PythonForDelphi/Components/PythonVCL_cb4.res b/PythonForDelphi/Components/PythonVCL_cb4.res deleted file mode 100644 index 37c47b0bb30453cb3857e96d6b2ef340817e4aa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmb7DO=}ZD7=F?$#6!^>Jb5vQh^cyw#;o@U0oSwA1QNlM){TKM9)&nJbJWP zEYft9t|~au0*^i~LZSt3&P-UtqfpiGGz?D@{^jwbNQE|E>)hryY0hu0Z2l+;!%U>W zRj3jbCnc`bX>3s7q2RQ=KlycB)p7D`xWo^mioe9yMSNrEAECq}ql~7V*KbU!2v=|& z5QZJ_+)#9&L6HH>BZ>|*&HuoKUG>jxH$P)^Zf7=rn&x&Z;S|%9l{p+pk_4D|>mR#B zsc4hui?qf2E7a@MEsc%Y@-J;>OO*PJ=X1=ms{p#xEW3;+cz|6zrEX)7yO-*_kk`;a zrxVy$A+M-`xOhwL3*S<_(POAS_Hn@VA)fQJYcm|!d^?$@*kDUG&)LHnqnZq@o*)*5J(;C;T1*@;|Wa z0j}Bp4+q=WA&T(>V^%^4{M@HNM$!uH0(P84S?xBfF{_!;>48)_j;YEv)vgo=lMy;`Tq1Vr|md@z3ezAwpP|x+FK|2?|P+OIkDCFia+z;{Mq^2 z%g#SfILCkB#DBf?L&tf3!Fl%msT{C)dvfFJ_TA?CR;{{tt-7%SV_$)>Cm+^U7q7=J z&hi%!||~-8oHhv!KXjwpTc9r zcH!xB$N9%G=hx-AgJ5pqx+-J2EuQPKGR})f5N@lxy?AXq7y!V>2=L2tj&#}eIs^BQ zoyhgQxxKycDM@@2iQmi=?(Om8&R_Vu%+Isa4!A{P*)#Dq?k-u- z*hRo-tMx|WROh%8z`J@ic{S#E+-t}EGwXb3_=tMym@kWG@Cy6{j0H?+z+D!f8wZi{ z+=_bgS?k7iSW>^wAx?4dWk1|a@M^vng?@^EC+q|}ZkKEgLu<%}d?73th31>}UCN|lDv zvYN>w_e7AV_opqSU)IxCf`ECwjnEHR7`aU7dA_6wxiM;Pf6KbGomP>(+wiu7nL=P`re7i7FZ6st!Rh)1Hug1-(7(t*C$W=u$cISunU<)qKmHzp8(QE) zyA$mR>2#C7^v?7J%J_~}#>u_}SvKU<-)Iqz$coauHXBBh8JCM2(KVdVPjeH(EtEE( zO(eKY5)?L`-ymp(1UqVMUf#{)+TskR`I;ai&A;a}tb_X*S8P5*L$TB#YRZ(XH773Y; z0Jn&|bbyvBZuH#f9vfN8O6N{lOf-gu2YIWN`I_y43yZ+5s1rt(&}PqQ>;}>kM|)p{)w&z!SG#6wL66~~KHO92jO6$jRmd2c-5?L^#4`4!A{H;HLEn-A^BNvf) ziB*=I>EjC>(G|M%6f&P2T%Pt%A$nml~%A0p3Xi#x!L}q$NqggOgq?8GVq;tt^dU?i5jL2ToKyLlbKOrOUR269pJrw982KA-ZR| zHh^PW<0&44_CmXS>MjC(6ayWq^Z5-zRRt8U`tC!=OG>3n@`8iX4cP+%)k0V5z$MrH zI->tvppS(jk|e$C0amrnzKe|nlY~;X=jD^+ijFr~v>$pCr$Yk$8Aaa{qC=_@%Yl8q ziHIXF;5S_qd8vkBC>nPhTeJt~=(g-1P?$So!c1ByN)8Q+5LtYkut?^pHBFs$khRtY zQps14=_`UMziR{mjZVKhIP$JKGHrsGa!5)ZQkravC&OzwQ)gUd{B$Z^@fC<;Fpm1=_y%`v`YFhT9m$K1N$W_RTI91D|Ml=k{j=0+(G%SjmcMe3^xTunSDGek^(3}F{3(x#0%?F0vSaTu#2f3O$^339Ien9!_h1EL7Hg?1@?m zmn~T;O7iROkl#y{muxL@zeFiZgp|ThtfrhT8>&J!yhF&Ct!=BYc&Mz7c)QDT-q{L2 zfr$;Y%CNm3SU0WpW`xq(w&gZ)fy5OhLeODlSa-X&JvlXH&U%iJvDnO;DC$kZmUy=S zku6tA??cOOXx%&2uZ#@kR@Sa}oz>0^WrMCGTxYdZoPMgSzW-!Dm>Jxf|CCj2?;hwi zx6Tf1ZCMW{cGVfJsn}Vq!1UI;5xV?xvK87Ide;rYyEfTlxJj^MiI?r8WdjTPsT%)u zJGXA%mqA2CCLOg>GRmZ(k~$8)I`Spd$E7iSOg>6)Bjw5%rSvrV-kEN(qIvQhpl2fd z&yoqYi|X)I5qPi|#wf0uwE0qz1Z(XE&7d_={;wk9YbhRyS z?j)OEVj&XJ z;-C5@hHq5Eo!{#@Mf0N~w3{q9_H1LG8>o;%W9A? z?<4t~Sy)5yUF1ES@VR8d;vNwlit{^8JT?uUQ{Ohq-aX;A86!<|!$`LLrP7d8^tx%O z^BYK(pn&LCQDGMpg^5KV4Jv<@>{k5NoJ_I*T- zJL-KgC+%P*TPAK3Qjzt=8;xUN|-EAL`%=+Ttv$M__u}wYg4*37zNiH5n zhxzwJuZoL@JT6OI=eaaiSe48N<@nYT{qGj!p)^O6Zm6UR-*hgPwG^Pk*PYk$pGzr< NDA7rO{saHH=D)qhpJo66 diff --git a/PythonForDelphi/Components/PythonVCL_cb5.bpk b/PythonForDelphi/Components/PythonVCL_cb5.bpk deleted file mode 100644 index 794b8a16..00000000 --- a/PythonForDelphi/Components/PythonVCL_cb5.bpk +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[Version Info] -IncludeVerInfo=1 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1036 -CodePage=1252 - -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= - -[HistoryLists\hlIncludePath] -Count=1 -Item0=Sources\Core;Sources\VCL;$(BCB)\include;$(BCB)\include\vcl - -[HistoryLists\hlLibraryPath] -Count=1 -Item0=..\..\borland\cbuilder4\lib\release;Sources\Core;Sources\VCL;$(BCB)\lib\obj;$(BCB)\lib - -[HistoryLists\hlDebugSourcePath] -Count=1 -Item0=$(BCB)\source\vcl - -[HistoryLists\hIBPIOutputDir] -Count=1 -Item0=. - -[Debugging] -DebugSourceDirs=$(BCB)\source\vcl - -[Parameters] -RunParams= -HostApplication= -RemoteHost= -RemotePath= -RemoteDebug=0 - -[Compiler] -ShowInfoMsgs=0 -LinkDebugVcl=0 -LinkCGLIB=0 - -[CORBA] -AddServerUnit=1 -AddClientUnit=1 -PrecompiledHeaders=1 - -[Language] -ActiveLang= -ProjectLang= -RootDir= - - \ No newline at end of file diff --git a/PythonForDelphi/Components/PythonVCL_cb5.cpp b/PythonForDelphi/Components/PythonVCL_cb5.cpp deleted file mode 100644 index 7585c651..00000000 --- a/PythonForDelphi/Components/PythonVCL_cb5.cpp +++ /dev/null @@ -1,22 +0,0 @@ -//--------------------------------------------------------------------------- -#include -#pragma hdrstop -USERES("PythonVCL_cb5.res"); -USEUNIT("Sources\VCL\PythonDatabase.pas"); -USERES("Sources\VCL\PythonDatabase.dcr"); -USEUNIT("Sources\VCL\pyDBTables.pas"); -USEUNIT("Sources\VCL\pyDB.pas"); -USEPACKAGE("Python_cb5.bpi"); -USEPACKAGE("vcl50.bpi"); -USEPACKAGE("vcldb50.bpi"); -USEPACKAGE("vclbde50.bpi"); -//--------------------------------------------------------------------------- -#pragma package(smart_init) -//--------------------------------------------------------------------------- -// Package source. -//--------------------------------------------------------------------------- -int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) -{ - return 1; -} -//--------------------------------------------------------------------------- diff --git a/PythonForDelphi/Components/PythonVCL_cb5.lib b/PythonForDelphi/Components/PythonVCL_cb5.lib deleted file mode 100644 index 3e1902de902241706110c8bf97ad887c76d1fed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151188 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
  • nNt+bj$pGGVP!{BN-LR7RWy8oz(n2QNjxzd$f(1sbZ912j`g>$oc&YQu>cqX zeG#=>$(kFiz^Yma*)-uRVpOsj7_6+m7F`lWP%%aB1rI`7;DmUyE;s zBpG>#gqfQ353H|~G{uKOWnKbcPCkfkr;VUi;u5rCfy!8{CYD@AkQL2hkd9IeLMd2r zNE!rWO#;ZnFysprB=y?jBUdmyBoPDWx*-n8Tv_3f6?{&Cn)T%@3&48330Rk*1Huz^ z14&H3LF%ud2tQE7-;7EK?O)CjLRSi$7Jh^1C8QelhDR>nr7FWYb6*1gr`Vu<@_xiu4tYw;m9< zqLY$TyWuMFwMfiiIVzP(rVwGF3SM}qER&;7EjmW!>ea=eq4JZ%h-AS~4Tp+DmkBxs zV(9;iL&F5NuB4cAqrt_cn8ncp;+3rr!OGSh5MXB+Pz;@WsrX$tthl&pRdH#39mILV zh~iS5=EU5nxI9=|f=%a)Vo3VRx|(W8VH|X=tX^F+uy{2`*o@+uU{%S3HRz}SDywVi z1`&YI5d6hvVGysL4J!^Bd*)L)xFJYEEwhGkthgE&K5xZcmPC$&#i1dhBp5HP;&Ny$ zhCsQ(NMPlHJ5LAj$GGpC!>}43gH>+Ym0W$`tZsk&Ud2@p{=pNAdah>N|9*?O{|}mg BD(?UQ diff --git a/PythonForDelphi/Components/PythonVCL_cb5.res b/PythonForDelphi/Components/PythonVCL_cb5.res deleted file mode 100644 index 37c47b0bb30453cb3857e96d6b2ef340817e4aa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmb7DO=}ZD7=F?$#6!^>Jb5vQh^cyw#;o@U0oSwA1QNlM){TKM9)&nJbJWP zEYft9t|~au0*^i~LZSt3&P-UtqfpiGGz?D@{^jwbNQE|E>)hryY0hu0Z2l+;!%U>W zRj3jbCnc`bX>3s7q2RQ=KlycB)p7D`xWo^mioe9yMSNrEAECq}ql~7V*KbU!2v=|& z5QZJ_+)#9&L6HH>BZ>|*&HuoKUG>jxH$P)^Zf7=rn&x&Z;S|%9l{p+pk_4D|>mR#B zsc4hui?qf2E7a@MEsc%Y@-J;>OO*PJ=X1=ms{p#xEW3;+cz|6zrEX)7yO-*_kk`;a zrxVy$A+M-`xOhwL3*S<_(POAS_Hn@VA)fQJYcm|!d^?$@*kDUG&)LHnqnZq@o*)*5J(;C;T1*@;|Wa z0j)H;{X347|28c09i@|9RL6T diff --git a/PythonForDelphi/Components/PythonVCL_d4.dpk b/PythonForDelphi/Components/PythonVCL_d4.dpk deleted file mode 100644 index c1d9f6ed..00000000 --- a/PythonForDelphi/Components/PythonVCL_d4.dpk +++ /dev/null @@ -1,39 +0,0 @@ -package PythonVCL_d4; - -{$R *.RES} -{$R 'Sources\VCL\PythonDatabase.dcr'} -{$ALIGN ON} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $00400000} -{$DESCRIPTION 'VCL Components for Python'} -{$IMPLICITBUILD OFF} - -requires - vcl40, - Vcldb40, - Python_d4; - -contains - PythonDatabase in 'Sources\VCL\PythonDatabase.pas', - pyDB in 'Sources\VCL\pyDB.pas', - pyDBTables in 'sources\VCL\pyDBTables.pas'; - -end. diff --git a/PythonForDelphi/Components/PythonVCL_d4.res b/PythonForDelphi/Components/PythonVCL_d4.res deleted file mode 100644 index 592ec65ddd2178865cfcc6362d7ad228bf1d08de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmah|K~EDw6#hy#Sq{W<@Z^QY7-KvbOt^yqp(LvqF7YT4>%~&=jb^k%gnji0)T%6fen0eNDmOlF#!=F!Pvm3)g_A~R`a=VO0(;3 zJq&c3EVyCcpE&jOCk(ewg3xKPEYyYIS(EvH2`57pB*7c1Fb6nYC3MwdfVJykua>kB zoCLpCff5uaA#{Q9lIJPjJ?Z%sA3>whwYcZk+;IHhb1A{QVOXz(tti8nYQ6g5Me8`j zeZSXfMaRs?0F6ZL;e>u6Xc%M9a?vn9}kzZNf#EfU9yfK%qF;@k~ zDaP5`0H*22+`=KswZpphTjW^moAXEHa%Asg8fO*dn;b%tCHzq8DyrDWHpXzBy1ne2TAa{?|K63BX5ryDc%D%62Mt48D_dB{Td-l>z j&LCB|phDMFcdBaeHi3KkCDuDO_ah diff --git a/PythonForDelphi/Components/PythonVCL_d5.dpk b/PythonForDelphi/Components/PythonVCL_d5.dpk deleted file mode 100644 index 81bdc087..00000000 --- a/PythonForDelphi/Components/PythonVCL_d5.dpk +++ /dev/null @@ -1,40 +0,0 @@ -package PythonVCL_d5; - -{$R *.RES} -{$R 'Sources\VCL\PythonDatabase.dcr'} -{$ALIGN ON} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DESCRIPTION 'VCL Components for Python'} -{$IMPLICITBUILD OFF} - -requires - vcl50, - Vcldb50, - Vclbde50, - Python_d5; - -contains - pyDB in 'Sources\VCL\pyDB.pas', - pyDBTables in 'Sources\VCL\pyDBTables.pas', - PythonDatabase in 'Sources\VCL\PythonDatabase.pas'; - -end. diff --git a/PythonForDelphi/Components/PythonVCL_d5.res b/PythonForDelphi/Components/PythonVCL_d5.res deleted file mode 100644 index ffcaf64ce20efdae2b6e052d2cb0a8ef8a334315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmaJ=O>0v@6g{sAc`k}g&_!`!gNTR=NwMIfizuyuf?BcCZ4KP*mh>hY(PjPC5Pp0r;r9Z_#jH2FTJaJzz;`onIKhlYa z1NPH7IyrhwcbGE8;KrlV%wo?R3!epPXf3CD#Z_LGHdG8UG^2Iu0>}^+!d1Bv?U-44 zOejH1YI8JELKNuL;_;o**iqMCiyee^q~}Z4QuEZ?2<;aH_B;PIXTaxkARp@zvFO6! zA1Xetj0vfU3!rofTnrIh+HPWK&lar6O#nHnwb$_iPqBfQ)HQ5!_cHk|>TVbkgY+;A%GrZ<$Lo4iPy#mi7-;%$FlFzAF+`G)nk&>i3i$Yy~ zs9_6jG_i*o$|!KJVwag~FsPIDRXI7VaMCsE3VV=_?l40v@6g{sAc`k}g&_!`!gNTR=NwMIfizuyuf?BcCZ4KP*mh>hY(PjPC5Pp0r;r9Z_#jH2FTJaJzz;`onIKhlYa z1NPH7IyrhwcbGE8;KrlV%wo?R3!epPXf3CD#Z_LGHdG8UG^2Iu0>}^+!d1Bv?U-44 zOejH1YI8JELKNuL;_;o**iqMCiyee^q~}Z4QuEZ?2<;aH_B;PIXTaxkARp@zvFO6! zA1Xetj0vfU3!rofTnrIh+HPWK&lar6O#nHnwb$_iPqBfQ)HQ5!_cHk|>TVbkgY+;A%GrZ<$Lo4iPy#mi7-;%$FlFzAF+`G)nk&>i3i$Yy~ zs9_6jG_i*o$|!KJVwag~FsPIDRXI7VaMCsE3VV=_?l4 -#pragma hdrstop -USERES("Python_cb3.res"); -USEPACKAGE("VCL35.bpi"); -USEUNIT("Sources\Core\PythonGUIInputOutput.pas"); -USEUNIT("Sources\Core\PythonEngine.pas"); -USERES("Sources\Core\PythonEngine.dcr"); -USEUNIT("Sources\Core\MethodCallBack.pas"); -//--------------------------------------------------------------------------- -#pragma package(smart_init) -//--------------------------------------------------------------------------- -// Source du paquet. -//--------------------------------------------------------------------------- -int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) -{ - return 1; -} -//--------------------------------------------------------------------------- diff --git a/PythonForDelphi/Components/Python_cb3.dpk b/PythonForDelphi/Components/Python_cb3.dpk deleted file mode 100644 index d59ac666..00000000 --- a/PythonForDelphi/Components/Python_cb3.dpk +++ /dev/null @@ -1,38 +0,0 @@ -package Python_cb3; - -{$R *.RES} -{$R 'PythonEngine.dcr'} -{$ALIGN ON} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO OFF} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $00400000} -{$DESCRIPTION 'Components for Python'} -{$DESIGNONLY} -{$IMPLICITBUILD ON} - -requires - vcl35; - -contains - PythonEngine, - MethodCallback, - PythonGUIInputOutput; - -end. diff --git a/PythonForDelphi/Components/Python_cb3.res b/PythonForDelphi/Components/Python_cb3.res deleted file mode 100644 index cde45972f8f285a8136c7530c7b8ed0780743266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcma)5J#Q015Ph~!B1Hr)Xs9p}NYEf7xeq8y_96m71i6hY2qwa@PiE023X)x6LGxRy}b`(3C5n=nSF1*_HF^7MNLzuG%ND6?(qgWHH$Ty>wzcT zr_rK5rq+;cGiJ3+0sb+ax`j`gn9t{21&}6WN!`My>np|iXUfE!QZADyiOyrnL_eF& zW^ufT7bTo%j_WV8kZ6vZQxjHj9jXc*hv9L;UzT5M6<$idwJTfS#2J5WVe4xhhN(!7 zt57BCEGclMj?WBoJQSS1k0-y1t13=@1(*DxF2zg!D9>*U<24Fg8)YK;S^vhwif{>! z0>ZEdJTVmSXY*K?s= zyubs?@i`Tdk9cEiMXY(q*kR6Xqe-^scF7%+U2q=ZA**}!^`%c^xkJ_-EOl_t*54uC zx2SX*u}_({kN1pp;`%IjugU1)E#r>3j`4w=cyZj_EQg$$)b)LfSDb)5qnG54nC%m1 zH%lFYXDM@6Im^>8&wk6!<<4HJ$r<<#m2I?Z`}SQGZxgs{zXUhokWm9N%kN@6_!0a8 D1$kP5 diff --git a/PythonForDelphi/Components/Python_cb4.bpi b/PythonForDelphi/Components/Python_cb4.bpi deleted file mode 100644 index be3d06d4ec9e809aab9a95ffa4aa884110164bf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44148 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 jGWK4)gVMgz@ApUJao -#pragma hdrstop -USERES("Python_cb4.res"); -USEPACKAGE("vcl40.bpi"); -USEUNIT("Sources\Core\PythonGUIInputOutput.pas"); -USEUNIT("Sources\Core\PythonEngine.pas"); -USERES("Sources\Core\PythonEngine.dcr"); -USEUNIT("Sources\Core\MethodCallBack.pas"); -USEUNIT("Sources\Core\AtomPythonEngine.pas"); -USEUNIT("Sources\Core\PythonAtom.pas"); -//--------------------------------------------------------------------------- -#pragma package(smart_init) -//--------------------------------------------------------------------------- -// Package source. -//--------------------------------------------------------------------------- -int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) -{ - return 1; -} -//--------------------------------------------------------------------------- diff --git a/PythonForDelphi/Components/Python_cb4.dpk b/PythonForDelphi/Components/Python_cb4.dpk deleted file mode 100644 index 3032f047..00000000 --- a/PythonForDelphi/Components/Python_cb4.dpk +++ /dev/null @@ -1,37 +0,0 @@ -package Python_cb4; - -{$R *.RES} -{$R 'Sources\Core\PythonEngine.dcr'} -{$ALIGN ON} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $00400000} -{$DESCRIPTION 'Components for Python'} -{$IMPLICITBUILD OFF} - -requires - vcl40; - -contains - PythonEngine in 'Sources\Core\PythonEngine.pas', - PythonGUIInputOutput in 'Sources\Core\PythonGUIInputOutput.pas', - MethodCallback in 'Sources\Core\MethodCallBack.pas'; - -end. diff --git a/PythonForDelphi/Components/Python_cb4.lib b/PythonForDelphi/Components/Python_cb4.lib deleted file mode 100644 index 0ba8c238b06145f59d6bb37dd6d5ab53a7db9b49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183604 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 XuMV>nT2FcS3YnPVmGJq0qWu2=rU=E> diff --git a/PythonForDelphi/Components/Python_cb4.res b/PythonForDelphi/Components/Python_cb4.res deleted file mode 100644 index 37c47b0bb30453cb3857e96d6b2ef340817e4aa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmb7DO=}ZD7=F?$#6!^>Jb5vQh^cyw#;o@U0oSwA1QNlM){TKM9)&nJbJWP zEYft9t|~au0*^i~LZSt3&P-UtqfpiGGz?D@{^jwbNQE|E>)hryY0hu0Z2l+;!%U>W zRj3jbCnc`bX>3s7q2RQ=KlycB)p7D`xWo^mioe9yMSNrEAECq}ql~7V*KbU!2v=|& z5QZJ_+)#9&L6HH>BZ>|*&HuoKUG>jxH$P)^Zf7=rn&x&Z;S|%9l{p+pk_4D|>mR#B zsc4hui?qf2E7a@MEsc%Y@-J;>OO*PJ=X1=ms{p#xEW3;+cz|6zrEX)7yO-*_kk`;a zrxVy$A+M-`xOhwL3*S<_(POAS_Hn@VA)fQJYcm|!d^?$@*kDUG&)LHnqnZq@o*)*5J(;C;T1*@;|Wa z0j^#zPqZsXGQ5f@d1meUsqRGS5;Tn)c)@` zoyvbNzw3OvJ5Qd4!RgHRgJ_n7vjqNiUR`yZ&#zx``i}F*cN}MV(C)PRgRA1--B!P~ zJlK0Gei#3W-<>~w-TCXXv-A}w{pqV;bDUS-cV2#ejf8hz-GIMceY|sU`_|3vZW|u{ z2l0V?*b7emz=O}eDL&f?&qhf+nP$KDl5zI?b@BII-<^b~;?LK_ulr$qmOr}_21y(i zwD)5-dghPB-;s7_;!dYt{&;Uboh5$p_@OtQx~KSeeEf+YjKdc>H9YPIega_M5F^8{ ziFXFS-FKY7Tya*nRxYEJjWtRDTYdTI{YUM#koply{f7K-FdE*zIgBQN^b17#w=EK5 z-w)i0|2sGF!(iq7Jibur?;-tX*Y>2TOf)LqbgxhKY*BXzzUNH89(uOnv#eDv|%jk-R1&b;86y@khBXk+LtX$5G_P_^>+q zF^>LGlhKd8k>_7{yKdq#!W$y!K@-p(EJ=oFC$|MS#|4+Wm*E_?F&Kl#O*oI{U>79l zlVIG9!;!#_SMOx@Xse(8q)PvnINZO}!wG8z)>3OTUVq@&Q#;P<_Z(aE1e{%Su7Lk} z8-389mz}>YEnm4JK3%GPy0ql{L45Y|hI3uozSJkY5x*o{P3o6&SEKkN^gYr<#&a;m z-x4PN&;wsN9=Vgr&>cO8Pw}ae+o*Y!CSKzvuH5&~YpmWW&w48e$DX>>KSP4=OM<%< zf^LVTxP=sNNs4=GoaILbfaC~LQfQKsrJ>qzqhNt3!vxi-R8 z9t}V9Muh3#K&rPT)p}*5z3#ky#LP)UCdJU7M})j@<7hvWqixhj+dJB4hSSqM^yba! z`n&VMJ@ZGqlZh%z&3LKXrsubb^ZOS$zuT4h?HmmbTTizSj&>gQ)B!bwunc>bBQFv$ zN^?SQ#E3>eV#hu679tdKS%^?X(9H?E(wwy7*qt{L4w!#ohZw>;xQ;)P>$q82$GzQy zgM-i=Gra03VLt_9?{XnZ8MEwN`otdAkNMc0%(x}dP63_+*%>qrC4WB2wAAXiOKM1=Z>3=*;{y? zVrTZe_`)A~g!j0M8vl;e_^Rs^egKXRal$CBp7bCLpU6Ve$?JPNL+5G znMlPMv^m55ZFlOA7Lsu8pYgD!DujmNeioxMny(}6$L`1zQCJ%$td5$Ue8m}jtr{E& zBdFC09c_1hJPQ(^bub#*erI+z^kQDfI$F8i_Ab2Jr&SKJRKdZz)N8SEc)a~`^fdX{9l|XuA zI7_%NK||f0qZQc(E5d~e8tOC(n~Ef(3kgf&D5RtAx-qzWG@8t|)KQmGCXDgaQTM#_ znHP*SF7+dn`MXl)t5P}A1DTLHrXM5oKatEU=R!Df z4MVVJsIKuWN>q*01AOYm;jVw-PvKC*EM1m{5$=e*ayg6+yoZALcA5>6VdBM3-fosz#t1gAz9-jyKC5`=Za zEFVUYWC=orB+C>vqDhlP1WgvP)W=cHFF~ATSL?)SR*|5{a+nH5asDKz=yfhaf z=vgw6Aju9Fb?y{zNYHXKD;q#Vqd6 zvjjv%vEXzkf0ywTbMMzd`+c`+zuQxJz>=p8K^d)8gKPe>ql3a(2z;MKWQiO(5-G=~9GH0dhUcBu(oMNbgbwW;ihlR_59S zwcRy*cJg6m)1E$njMT&f6XSDp%TACih>$H@pD~ll4$oS0j~o051$&PdER;_K>EL!U zAq{4Exy3p$b1~|gR1#hoq>1lK>nE=}i2X*It13~`9Y?Qeg^!gXzvpPZs*vwI^G46L zX59v4;<>RFB+Cv|wX4EO>YTV@B6|B*5b^{8hfysq^YHd+tGYsBldxJ2^$$?l@~Ece z6&~JTSzdA%eF**T$Z+psGc!fI);v2e=766_6$A42_BOZEbt&Q;~?$hsy+_&F*%e_ zQlV8MrWPZuRr8Z_-NheO9o1(5e22R>qZ@z zik*Nz30hxWaTD#)3%GV*#-)Rhblgk}aa=GFHBUs>f-x>#O7&4Rc4h5rw6;#zJ^GrK zOgkwTE5r)ZTTGU16gM)ZwJsH}YKn=sP;uU?=@|jbhZ+Ba5P=B-6h@wwB)C|JXfzKZ z_V|{pu5cD8A(F7aM>b9@*eEmb#)i*o;H!$I2(mSqgroFRMvwP#BDYKv*^fO>5449s zKQjTrmMq~An-bnufVgMfgmdgcnW$-UwEowPE1~~Sk%{dZ6AGb>1NtGVmt`c76{1#` zF3U6!ywKJ*Cn(w5>P=W0lF`oYGn`<*KEbpWw6w9;SWs@esCJgj^8kA?Pos^(=rll1 z+8Td0o1&wO2;V?k)SP$+GzeFYNfJ@}{u7kj&pEjX+Xt>&hpLK)J`Lw=!j2J_@Q685 zsSWCpQXe&Ai9QRKS(0vCpb~;NtQzpt^Cl+@F?q{UXv+h4`i!BZ{dvxHI~W~%+^C=8 z!tQbldlF2>r87K$ zS3H^N(4ll`mmJO}i62eog5F*QjhnaQokA7N1-E$(7QQp=gn_s(VrFGjjiV8_LUcyE zB#lpj0u8vU@-EazTX0f6$+K6uWLY@P;<)I=4qaq$Jpoj)n&>0?kXHYCR*0ZaM z(1&;fE+_IBM;FB5B0_iYDd!Hdd$H09CCc9k73XFb zkKPd<6sw{&gfqup#HAPvdI?E}A}-`KQ{~5Ck5W`^yhy3L3HBV~Cy}HOtL@u!`xqB2 zdtW$9HRZ;lCt!OMcy9r58vq-&XYU;9PT_^!X3A;s6TS0X0_wUL6uWn>jS-F1pl6<( z4zVqa)FlzCoHM8F?05(7Q41*&#{~LT0N;Bg&cU25fpTiA^Qy{t^_}rTxoi>b)tJ77 zkTca?LU3+YaA-Ie8c4B#gjpB*`b%;PqatZ*3Ox8O8^uAV21w&PQ7o@mtPEP?c7redpaJDsN5)t>~@T{~VPzS>Qzo|fM zM9wc&>59CRU2d2zmylVqf}0(9EiQr51kR+;iBT3MyCx!x6MYq3M>1R_+ks?zirJ3U z7953{s>(Y9X-zZl$iUGzNA-ynaIy~u1GbCX?xwQss=OI5%Q-h+gUM{p(R0C$jgH&t zYI$4QphEW?Fm6YNS!bwXYnIoZ zYP##WV`v4EzYY2gPNQD7AayzA2yTL86^&3CrEEby#JyEa-&a-P4V7fNCCoS!Z>aaf z?tIrz&sT-6mqEwaJ5A0-B=ea+NCNj}w1F4!emmhxWR%qt?~Oo%21jaZ)MJV!RzHY^K!(Xi22BUpP$(B+X8r87je7K{Nx z$?e*$yoEy(u;smwC+CWWZ3}J#fn3~a+A;i}Xd&+FOcI3AB1u;)Js12%#MLfcQc+nc zz?Z?xP6&+?7>{A$baNckBf>f8P7SFM2Mm1aH;O%|u7}rk*qcMUiOHr6Ivk6M8IK-Z zO1NZi+SBZu$gbX6wWAZfgbg)@+*|M5U2|zj5wP_`I6>$f3Yp^Oa(QL&aD)da!pm9& z)Q9eKuRG5p%IK2uvQ*4!v125B5mq+Bw=f}TZhw2;?7(CZbxHHl6qv5_u59u*Sm$k_ z?Q(5F`OsZyBN{93Xc6ROr(<-xX){i4tEo}c0L^e)XNHRbN;xw75zcXhU+YIem3?z! zv#@PNT{UC)EhGaMhT(;`@Cn(5OD~zl0bD0@SJ4&<0$qUyP+N5dFDA97#p`{Pn7^$OX9q%g)~z$ z$YQ5|SF!J)Df|&>3QJvMh-(8~dZA3&G=-=$K~-Enk4V4lBb{&=!>$*#E()okWNp?kcAYQR>yi zOwo2dvVM62#%?`ycD2l-))LsRfP4qUc3pL5ugqFQ4b+(}1vXPVJ7MbXBk^DkzSZWPremPyg z%QLQ^aUTEn^9Uz)XqcGjv2!|r_b;Yk#<;jW8bz1UR= z$TV!_gayir4B(=i9vbD8-k%c8q;xv6%&6V;3T8ZGCZ(K-*FF0yF$ z=!=L*S3DynLPV*$qgzVU^yK>y%J5xMhB+jE=+#;Fl>Cbn&*;uZDSXlS0uxt+s_XVl z3Igf{r`z4IbiYaf=?)1w&;%~7AoF2={?p|&QdDdS&@{QEJ2s@a;)su5hOp?(Umb_L z`Lj@5;H8n+bP1}0Er6_48QYyAb?KlK+ju9)y&NENdkO}8C0@sSflf@`d@@Hk3&zCV zm&9iuyw(iNG0!+mgwueYC7gU8G|| z61-wa%I$q*bS2_Y)tgzY3qZ^6AYv+!?Kd~+Qdb4f@~37Onz|!#fvnlq_JX%iE|3lk zRV!kr6s(m01_JQ{g1Qi5 zzuAP)0bOZSL6?VVM3`ZVz(-|v2s@$+9^)i*j;5Fe_-xJFXu7yd!B{i`DS)6aL+r7A z9d6;)e2dbSMDoO@g1HlC&ehSE+avp2$L!ut8K$yT{KV{ zKptWFr1L^@g}o7!FvKoGx5Uc`h}J;czK6F=}7A zT?_}TGR*Z;%I!43iY_u7BE_l=rsyNn1XEX~hk`9S$#Ad{_Xkxf7Q)Ut%y6KTVC-Pe zM30#!uom)8yUcK?ssywVrZ53%^O-k_2xoYH<|>cI9bB}kv1ij_jj|3l94NK)x+G4j zzp{r72dYkAcjiqYi`F(AEXAvZ2#V%59I(o-G1@8hys<~MP*iM%V~=RDRH8!;2e_a_ ziyk=~uqshq_A}Lhv~>=LNxMc11<0D`@W3j&M(0>*pYw*1OAU0IAY0g0Y@yQx)5oJs zk3Y)1!FqG!rb`?4aQxG4e2fvN?5e|os;XhsWXMmMB6e!y8Es^WtBu(g1zsqVsk>Xm zJq;Yo^q@R$k!|4R1FD#fXD$HGO7*cm2FJ)>@+vwosnEt~9iX$X?j$)Elgl1Z;f;C> z@B*P(4%Vz5McX7!nSDw<%z`d8PGXTsXrpm1S|@S96vswGmo-n~K#3A2V}MpPRpL+= z(S-A?*AfRxuxi$?^Rx#O3re7B^S&aAhC2;Dl2GTqj-KNOHP4Z!@kBn6$i=N8RlV0l zdA|`v^xbxaC{N)L`7&BdE98qbZ@z<5sa3!GmG25=@)4viMsq(D)gFQ`cuU$%Ac4=V zFSTh%twB&QN6<9Konv)xLsT*V%}@{BOHoeP5Rz=_jgaDN?wd`Td=nM1UcmR}YU)D? z3BF!&%!}zbuitTgSXFv>T^PO|>37g!GsN!!xd6qu=3H?c=WY1kasIsQ{B3FZ$`$eH zQti{FCFc*~Gw0>sJ2zy0aRjZX#kZ|HudX`I=hv?|puc~7$8nYi?M}NtxGMhLZS`Br zgT1HXck!?I-TBkkoxd(SOJ8x)pT7Dv$9eTF=jG?uYQWB`8}RAX$2$kNZ{6JP!h*cI zEuRo>4-b;n#17zseR;@LP7Hf?xQ)QN`Zsi{!KTnrGEwnCXP>t902$!|^uj z>Dgloi#VynYuCEGPhuw#`mi^@G&V+?OAuaTNVYe06Ls*VDy zUmi$&tHb%!PybsX+@OnA`{9-fb#x+mQ}E)8m1gYT!!dqbAH&8synffQp#w7{tW|9i z%6ctgh=ehM|6X2quE|U0!Dx6pw?$wL7Pm!zCu~s()OqzjO6ogVPfsz_Ryqs95d0LM f{>RGGMe1Hr&ev}_+_NCR?>Y3a3(D;Oz~28q1q=_n diff --git a/PythonForDelphi/Components/Python_cb5.bpk b/PythonForDelphi/Components/Python_cb5.bpk deleted file mode 100644 index 97835fbe..00000000 --- a/PythonForDelphi/Components/Python_cb5.bpk +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[Version Info] -IncludeVerInfo=1 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1036 -CodePage=1252 - -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= - -[HistoryLists\hlIncludePath] -Count=1 -Item0=Sources\Core;$(BCB)\include;$(BCB)\include\vcl - -[HistoryLists\hlLibraryPath] -Count=2 -Item0=Sources\Core;$(BCB)\lib\obj;$(BCB)\lib -Item1=..\..\borland\cbuilder4\lib\release;Sources\Core;$(BCB)\lib\obj;$(BCB)\lib - -[HistoryLists\hlDebugSourcePath] -Count=1 -Item0=$(BCB)\source\vcl - -[HistoryLists\hIBPIOutputDir] -Count=1 -Item0=. - -[Debugging] -DebugSourceDirs=$(BCB)\source\vcl - -[Parameters] -RunParams= -HostApplication= -RemoteHost= -RemotePath= -RemoteDebug=0 - -[Compiler] -ShowInfoMsgs=0 -LinkDebugVcl=0 -LinkCGLIB=0 - -[CORBA] -AddServerUnit=1 -AddClientUnit=1 -PrecompiledHeaders=1 - -[Language] -ActiveLang= -ProjectLang= -RootDir= - - \ No newline at end of file diff --git a/PythonForDelphi/Components/Python_cb5.cpp b/PythonForDelphi/Components/Python_cb5.cpp deleted file mode 100644 index 3f50a4e3..00000000 --- a/PythonForDelphi/Components/Python_cb5.cpp +++ /dev/null @@ -1,19 +0,0 @@ -//--------------------------------------------------------------------------- -#include -#pragma hdrstop -USERES("Python_cb5.res"); -USEUNIT("Sources\Core\PythonGUIInputOutput.pas"); -USEUNIT("Sources\Core\PythonEngine.pas"); -USERES("Sources\Core\PythonEngine.dcr"); -USEUNIT("Sources\Core\MethodCallBack.pas"); -USEPACKAGE("vcl50.bpi"); -//--------------------------------------------------------------------------- -#pragma package(smart_init) -//--------------------------------------------------------------------------- -// Package source. -//--------------------------------------------------------------------------- -int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) -{ - return 1; -} -//--------------------------------------------------------------------------- diff --git a/PythonForDelphi/Components/Python_cb5.lib b/PythonForDelphi/Components/Python_cb5.lib deleted file mode 100644 index 047fcae812f7e897f42c0c3aa59027ce3df2b155..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159748 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 diff --git a/PythonForDelphi/Components/Python_d5.dpk b/PythonForDelphi/Components/Python_d5.dpk deleted file mode 100644 index d0d2eb64..00000000 --- a/PythonForDelphi/Components/Python_d5.dpk +++ /dev/null @@ -1,41 +0,0 @@ -package Python_d5; - -{$R *.RES} -{$R 'Sources\Core\PythonEngine.dcr'} -{$ALIGN ON} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DESCRIPTION 'Components for Python'} -{$IMPLICITBUILD OFF} - -requires - vcl50; - -contains - PythonEngine in 'Sources\Core\PythonEngine.pas', - PythonGUIInputOutput in 'Sources\Core\PythonGUIInputOutput.pas', - MethodCallback in 'Sources\Core\MethodCallBack.pas', - WrapDelphi in 'Sources\Core\WrapDelphi.pas', - AtomPythonEngine in 'Sources\Core\AtomPythonEngine.pas', - PythonAtom in 'Sources\Core\PythonAtom.pas', - TinyWideStrings in 'Sources\Core\TinyWideStrings.pas'; - -end. diff --git a/PythonForDelphi/Components/Python_d5.res b/PythonForDelphi/Components/Python_d5.res deleted file mode 100644 index f001d42f66c3374851318faefe85efbca9537ef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmah|K~EDw6#hy#X%ED5@Z^QY7-KvbOt^yqEhMWLF z|G<0Gm~LVZ960$4Jb3UXx0XN{zxQT$TN6GpL5g3xKPEHs7ST9f&I3CAN9B*7i2Fb_CACG^x{fVG?cppmo? zoP@9uKnaSI;1_{H#dQ_$9S_1FM9uSh7I(u&(Jvf)tR#5P_nU#=jxv0yF=!s1w~sPB z3Dbv_^C z1xL%;VO{$@;aKdO^GD=zWbb1d=M?3e96^#L{7~vDJnUl|Rczr2;|?}ixr#T~Bk`+p zW-!a0F3@MGK@{C)pBz{Au!|Zt$p6G$Z*aDmmdAbNq%{|byvHl;Rb$U>=2kQA42oo@ z+%a1jm86E8n)FR|%WQZ8_KcpByT@uDxOZ<%A$XRu@2i~g-H-46mhQ`*y>yc^ hNEI%s&^6Vasv5pc;EsL?c867F?T|V8E+(B{&R<9rWg7qh diff --git a/PythonForDelphi/Components/Python_d6.dpk b/PythonForDelphi/Components/Python_d6.dpk deleted file mode 100644 index f3df967c..00000000 --- a/PythonForDelphi/Components/Python_d6.dpk +++ /dev/null @@ -1,40 +0,0 @@ -package Python_d6; - -{$R *.res} -{$R 'Sources\Core\PythonEngine.dcr'} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST ON} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DESCRIPTION 'Components for Python'} -{$IMPLICITBUILD OFF} - -requires - vcl; - -contains - PythonEngine in 'Sources\Core\PythonEngine.pas', - PythonGUIInputOutput in 'Sources\Core\PythonGUIInputOutput.pas', - MethodCallback in 'Sources\Core\MethodCallBack.pas', - WrapDelphi in 'Sources\Core\WrapDelphi.pas', - AtomPythonEngine in 'Sources\Core\AtomPythonEngine.pas', - PythonAtom in 'Sources\Core\PythonAtom.pas'; - -end. diff --git a/PythonForDelphi/Components/Python_d6.res b/PythonForDelphi/Components/Python_d6.res deleted file mode 100644 index f001d42f66c3374851318faefe85efbca9537ef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmah|K~EDw6#hy#X%ED5@Z^QY7-KvbOt^yqEhMWLF z|G<0Gm~LVZ960$4Jb3UXx0XN{zxQT$TN6GpL5g3xKPEHs7ST9f&I3CAN9B*7i2Fb_CACG^x{fVG?cppmo? zoP@9uKnaSI;1_{H#dQ_$9S_1FM9uSh7I(u&(Jvf)tR#5P_nU#=jxv0yF=!s1w~sPB z3Dbv_^C z1xL%;VO{$@;aKdO^GD=zWbb1d=M?3e96^#L{7~vDJnUl|Rczr2;|?}ixr#T~Bk`+p zW-!a0F3@MGK@{C)pBz{Au!|Zt$p6G$Z*aDmmdAbNq%{|byvHl;Rb$U>=2kQA42oo@ z+%a1jm86E8n)FR|%WQZ8_KcpByT@uDxOZ<%A$XRu@2i~g-H-46mhQ`*y>yc^ hNEI%s&^6Vasv5pc;EsL?c867F?T|V8E+(B{&R<9rWg7qh diff --git a/PythonForDelphi/Components/Python_kylix.conf b/PythonForDelphi/Components/Python_kylix.conf deleted file mode 100644 index f8e16b1e..00000000 --- a/PythonForDelphi/Components/Python_kylix.conf +++ /dev/null @@ -1,33 +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 --Z diff --git a/PythonForDelphi/Components/Python_kylix.dpk b/PythonForDelphi/Components/Python_kylix.dpk deleted file mode 100644 index acb0f2af..00000000 --- a/PythonForDelphi/Components/Python_kylix.dpk +++ /dev/null @@ -1,37 +0,0 @@ -package Python_kylix; - -{$R *.res} -{$R 'Sources/Core/PythonEngine.dcr'} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO ON} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$IMPLICITBUILD OFF} - -requires - baseclx, - visualclx; - -contains - MethodCallBack in 'Sources/Core/MethodCallBack.pas', - PythonEngine in 'Sources/Core/PythonEngine.pas', - PythonGUIInputOutput in 'Sources/Core/PythonGUIInputOutput.pas'; - -end. diff --git a/PythonForDelphi/Components/Python_kylix.res b/PythonForDelphi/Components/Python_kylix.res deleted file mode 100644 index 36f26e234a8ac66a47e95cec6d496cf2f1442471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T diff --git a/PythonForDelphi/Components/py15.lib b/PythonForDelphi/Components/py15.lib deleted file mode 100644 index 50b88f0d91dfcd4801c63a967d7d109dd6e743be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41984 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

    3dxoLn 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 Mr;T3!r#nvgzg$O6?*IS* From 6295c4153d706d67cf0a706e85339bbb41b13b52 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 27 Nov 2018 12:27:45 +0200 Subject: [PATCH 087/123] Delphi 10.3 support --- .../Components/Sources/Core/Definition.Inc | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index 96c2bd91..7c23b112 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -7,7 +7,7 @@ (* IBS Schillings GmbH & Co KG *) (* Ein Unternehmen der KROHNE-Gruppe *) (* Heisenbergstr. 18 *) -(* 50169 Kerpen-Türnich *) +(* 50169 Kerpen-Türnich *) (* Phone: (49)22 37/97 44-0 *) (* *) (**************************************************************************) @@ -385,6 +385,31 @@ {$DEFINE DELPHI10.1_OR_HIGHER} {$DEFINE DELPHI10.2_OR_HIGHER} {$ENDIF} +{$IFDEF VER330} // Delphi 10.3 + {$DEFINE DELPHI10.2} + {$DEFINE DELPHI4_OR_HIGHER} + {$DEFINE DELPHI5_OR_HIGHER} + {$DEFINE DELPHI6_OR_HIGHER} + {$DEFINE DELPHI7_OR_HIGHER} + {$DEFINE DELPHI8_OR_HIGHER} + {$DEFINE DELPHI2005_OR_HIGHER} + {$DEFINE DELPHI2006_OR_HIGHER} + {$DEFINE DELPHI2007_OR_HIGHER} + {$DEFINE DELPHI2009_OR_HIGHER} + {$DEFINE DELPHI2010_OR_HIGHER} + {$DEFINE DELPHIXE_OR_HIGHER} + {$DEFINE DELPHIXE2_OR_HIGHER} + {$DEFINE DELPHIXE3_OR_HIGHER} + {$DEFINE DELPHIXE4_OR_HIGHER} + {$DEFINE DELPHIXE5_OR_HIGHER} + {$DEFINE DELPHIXE6_OR_HIGHER} + {$DEFINE DELPHIXE7_OR_HIGHER} + {$DEFINE DELPHIXE8_OR_HIGHER} + {$DEFINE DELPHI10_OR_HIGHER} + {$DEFINE DELPHI10.1_OR_HIGHER} + {$DEFINE DELPHI10.2_OR_HIGHER} + {$DEFINE DELPHI10.3_OR_HIGHER} +{$ENDIF} ///////////////////////////////////////////////////////////////////////////// // Python versions ///////////////////////////////////////////////////////////////////////////// From ca259a5cf72275cda1c6b35b345c1be3ca042552 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 6 Dec 2018 13:22:43 +0200 Subject: [PATCH 088/123] Fix Delphi Rio define --- PythonForDelphi/Components/Sources/Core/Definition.Inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index 7c23b112..2998ea7f 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -386,7 +386,7 @@ {$DEFINE DELPHI10.2_OR_HIGHER} {$ENDIF} {$IFDEF VER330} // Delphi 10.3 - {$DEFINE DELPHI10.2} + {$DEFINE DELPHI10.3} {$DEFINE DELPHI4_OR_HIGHER} {$DEFINE DELPHI5_OR_HIGHER} {$DEFINE DELPHI6_OR_HIGHER} From b959c1294873648e29937b1e50061ec1c3bc1df1 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 22 Dec 2018 03:08:32 +0200 Subject: [PATCH 089/123] Fix potential memory corruption in TPythonVariantType.DispInvoke (freeing WideStrings twice) --- .../Components/Sources/Core/VarPyth.pas | 169 +++++++++++------- 1 file changed, 100 insertions(+), 69 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index 89137bd6..da3e5a2b 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -126,6 +126,7 @@ TNamedParamDesc = record {$IFDEF DELPHIXE2_OR_HIGHER} {$DEFINE USESYSTEMDISPINVOKE} //Delphi 2010 DispInvoke is buggy + {$DEFINE PATCHEDSYSTEMDISPINVOKE} //To correct memory leaks {$ENDIF} {.$IF DEFINED(FPC_FULLVERSION) and (FPC_FULLVERSION >= 20500)} {.$DEFINE USESYSTEMDISPINVOKE} @@ -944,17 +945,40 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData; var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); {$ENDIF} {$IFDEF USESYSTEMDISPINVOKE} -{$IFDEF DELPHIXE2_OR_HIGHER} - // Modified to correct memory leak QC102387 +{$IFDEF PATCHEDSYSTEMDISPINVOKE} + // Modified to correct memory leak QC102387 / RSP-23093 + procedure PatchedFinalizeDispatchInvokeArgs(CallDesc: PCallDesc; const Args: TVarDataArray; OrderLTR : Boolean); + const + atByRef = $80; + var + I: Integer; + ArgType: Byte; + PVarParm: PVarData; + VType: TVarType; + begin + for I := 0 to CallDesc^.ArgCount-1 do + begin + ArgType := CallDesc^.ArgTypes[I]; + + if OrderLTR then + PVarParm := @Args[I] + else + PVarParm := @Args[CallDesc^.ArgCount-I-1]; + + VType := PVarParm.VType; + + // Only ByVal Variant or Array parameters have been copied and need to be released + // Strings have been released via the use of the TStringRefList parameter to GetDispatchInvokeArgs + // !!Modified to prevent memory leaks!! RSP-23093 + if ((ArgType and atByRef) <> atByRef) and ((ArgType = varVariant) or ((VType and varArray) = varArray)) then + VarClear(PVariant(PVarParm)^); + end; + end; + procedure PatchedDispInvoke(Dest: PVarData; const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); type - PParamRec = ^TParamRec; - TParamRec = array[0..3] of LongInt; - TStringDesc = record - BStr: WideString; - PStr: PAnsiString; - end; + PStringRefList = ^TStringRefList; const CDoMethod = $01; CPropertyGet = $02; @@ -964,67 +988,75 @@ TStringDesc = record LIdent: string; LTemp: TVarData; VarParams : TVarDataArray; - Strings: TStringRefList; + Strings: array of TStringRef; + PIdent: PByte; begin // Grab the identifier LArgCount := CallDesc^.ArgCount; - LIdent := FixupIdent(string(AnsiString(PAnsiChar(@CallDesc^.ArgTypes[LArgCount])))); - - FillChar(Strings, SizeOf(Strings), 0); - VarParams := GetDispatchInvokeArgs(CallDesc, Params, Strings, true); - - // What type of invoke is this? - case CallDesc^.CallType of - CDoMethod: - // procedure with N arguments - if Dest = nil then - begin - if not DoProcedure(Source, LIdent, VarParams) then + PIdent := @CallDesc^.ArgTypes[LArgCount]; + LIdent := FixupIdent( UTF8ToString(MarshaledAString(PIdent)) ); + if LArgCount > 0 then begin + SetLength(Strings, LArgCount); + FillChar(Strings[0], SizeOf(TStringRef)*LArgCount, 0); + VarParams := GetDispatchInvokeArgs(CallDesc, Params, PStringRefList(Strings)^, true); + end; + try + // What type of invoke is this? + case CallDesc^.CallType of + CDoMethod: + // procedure with N arguments + if Dest = nil then begin + if not DoProcedure(Source, LIdent, VarParams) then + begin + + // ok maybe its a function but first we must make room for a result + VarDataInit(LTemp); + try + + // notate that the destination shouldn't be bothered with + // functions can still return stuff, we just do this so they + // can tell that they don't need to if they don't want to + SetClearVarToEmptyParam(LTemp); + + // ok lets try for that function + if not DoFunction(LTemp, Source, LIdent, VarParams) then + RaiseDispError; + finally + VarDataClear(LTemp); + end; + end + end - // ok maybe its a function but first we must make room for a result - VarDataInit(LTemp); - try - - // notate that the destination shouldn't be bothered with - // functions can still return stuff, we just do this so they - // can tell that they don't need to if they don't want to - SetClearVarToEmptyParam(LTemp); - - // ok lets try for that function - if not DoFunction(LTemp, Source, LIdent, VarParams) then - RaiseDispError; - finally - VarDataClear(LTemp); - end; + // property get or function with 0 argument + else if LArgCount = 0 then + begin + if not GetProperty(Dest^, Source, LIdent) and + not DoFunction(Dest^, Source, LIdent, VarParams) then + RaiseDispError; end - end - // property get or function with 0 argument - else if LArgCount = 0 then - begin - if not GetProperty(Dest^, Source, LIdent) and - not DoFunction(Dest^, Source, LIdent, VarParams) then + // function with N arguments + else if not DoFunction(Dest^, Source, LIdent, VarParams) then RaiseDispError; - end - // function with N arguments - else if not DoFunction(Dest^, Source, LIdent, VarParams) then - RaiseDispError; + CPropertyGet: + if not ((Dest <> nil) and // there must be a dest + (LArgCount = 0) and // only no args + GetProperty(Dest^, Source, LIdent)) then // get op be valid + RaiseDispError; - CPropertyGet: - if not ((Dest <> nil) and // there must be a dest - (LArgCount = 0) and // only no args - GetProperty(Dest^, Source, LIdent)) then // get op be valid - RaiseDispError; + CPropertySet: + if not ((Dest = nil) and // there can't be a dest + (LArgCount = 1) and // can only be one arg + SetProperty(Source, LIdent, VarParams[0])) then // set op be valid + RaiseDispError; + else + RaiseDispError; + end; - CPropertySet: - if not ((Dest = nil) and // there can't be a dest - (LArgCount = 1) and // can only be one arg - SetProperty(Source, LIdent, VarParams[0])) then // set op be valid - RaiseDispError; - else - RaiseDispError; + finally + PatchedFinalizeDispatchInvokeArgs(CallDesc, VarParams, true); end; for I := 0 to Length(Strings) - 1 do @@ -1033,13 +1065,12 @@ TStringDesc = record Break; if Strings[I].Ansi <> nil then Strings[I].Ansi^ := AnsiString(Strings[I].Wide) - else if Strings[I].Unicode <> nil then - Strings[I].Unicode^ := UnicodeString(Strings[I].Wide) + else + if Strings[I].Unicode <> nil then + Strings[I].Unicode^ := UnicodeString(Strings[I].Wide) end; - for I := Low(VarParams) to High(VarParams) do - VarDataClear(VarParams[I]); end; -{$ENDIF DELPHIXE2_OR_HIGHER} +{$ENDIF PATCHEDSYSTEMDISPINVOKE} procedure GetNamedParams; var @@ -1066,17 +1097,17 @@ TStringDesc = record if (CallDesc^.CallType = CPropertyGet) and (CallDesc^.ArgCount = 1) then begin NewCallDesc := CallDesc^; NewCallDesc.CallType := CDoMethod; - {$IFDEF DELPHIXE2_OR_HIGHER} + {$IFDEF PATCHEDSYSTEMDISPINVOKE} PatchedDispInvoke(Dest, Source, @NewCallDesc, Params); - {$ELSE DELPHIXE2_OR_HIGHER} + {$ELSE PATCHEDSYSTEMDISPINVOKE} inherited DispInvoke(Dest, Source, @NewCallDesc, Params); - {$ENDIF DELPHIXE2_OR_HIGHER} + {$ENDIF PATCHEDSYSTEMDISPINVOKE} end else - {$IFDEF DELPHIXE2_OR_HIGHER} + {$IFDEF PATCHEDSYSTEMDISPINVOKE} PatchedDispInvoke(Dest, Source, CallDesc, Params); - {$ELSE DELPHIXE2_OR_HIGHER} + {$ELSE PATCHEDSYSTEMDISPINVOKE} inherited; - {$ENDIF DELPHIXE2_OR_HIGHER} + {$ENDIF PATCHEDSYSTEMDISPINVOKE} finally if CallDesc^.NamedArgCount > 0 then SetLength(fNamedParams, 0); end; From 8cc656809203930ba54ce5c27e217155bd74bb53 Mon Sep 17 00:00:00 2001 From: Idan Miara Date: Thu, 17 Jan 2019 18:06:04 +0200 Subject: [PATCH 090/123] PyEngine.pas - ArrayVarDim3 bugfix --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index a4a6ac37..4e42a536 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -5801,7 +5801,7 @@ function TPythonEngine.VariantAsPyObject( const V : Variant ) : PPyObject; for j := VarArrayLowBound( DeRefV, 2 ) to VarArrayHighBound( DeRefV, 2 ) do begin L2 := PyList_New( VarArrayHighBound( DeRefV, 3 ) - VarArrayLowBound( DeRefV, 3 ) + 1 ); - PyList_SetItem( Result, cpt2, L ); + PyList_SetItem( L, cpt2, L2 ); cpt3 := 0; for k := VarArrayLowBound( DeRefV, 3 ) to VarArrayHighBound( DeRefV, 3 ) do begin From c9a6ddabfae8496dc49e08f479c87f517c7e8a32 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 1 Feb 2019 07:08:13 +0200 Subject: [PATCH 091/123] Added the possibility to customize the ProgramName but it does not seem to help with venv. --- .../Components/Sources/Core/PythonEngine.pas | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 4e42a536..9dd47436 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -2247,6 +2247,7 @@ TPythonEngine = class(TPythonInterface) procedure Lock; procedure Unlock; procedure SetPythonHome(const PythonHome: string); + procedure SetProgramName(const ProgramName: string); function IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; function GetAttrString(obj: PPyObject; AName: PAnsiChar):PAnsiChar; function CleanString(const s : AnsiString) : AnsiString; @@ -4859,18 +4860,20 @@ procedure TPythonEngine.Initialize; if IsPython3000 then begin if Assigned(Py_SetProgramName3000) then begin - FProgramNameW := ParamStr(0); + if FProgramNameW = '' then + FProgramNameW := ParamStr(0); Py_SetProgramName3000(PWideChar(FProgramNameW)); end end else begin if Assigned(Py_SetProgramName) then begin - FProgramName := AnsiString(ParamStr(0)); + if FProgramName = '' then + FProgramName := AnsiString(ParamStr(0)); Py_SetProgramName(PAnsiChar(FProgramName)); end end; AssignPyFlags; - if FPythonHomeW<>'' then begin + if FPythonHomeW <> '' then begin if IsPython3000 then Py_SetPythonHome3000(PChar(FPythonHomeW)) else @@ -5139,6 +5142,12 @@ procedure TPythonEngine.SetPythonHome(const PythonHome: string); FPythonHome := EncodeString(PythonHome); end; +procedure TPythonEngine.SetProgramName(const ProgramName: string); +begin + FProgramNameW := ProgramName; + FProgramName := EncodeString(ProgramName); +end; + function TPythonEngine.IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; begin result := ob^.ob_type = obt; From 7b174c778fa206ad060cc371856210541053f558 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 19 Jun 2019 03:01:14 +0300 Subject: [PATCH 092/123] Preparing for Python 3.8. Will not work until https://bugs.python.org/issue37189 is fixed in beta 2. --- .../Components/Sources/Core/Definition.Inc | 51 ++++++++++++------- .../Components/Sources/Core/PythonEngine.pas | 13 +++-- 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index 2998ea7f..496cb0d6 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -1,4 +1,4 @@ -(**************************************************************************) +(**************************************************************************) (* *) (* Module: 'Definition.Inc' Copyright (c) 1998 *) (* *) @@ -38,6 +38,7 @@ //{$DEFINE PYTHON35} //{$DEFINE PYTHON36} //{$DEFINE PYTHON37} +//{$DEFINE PYTHON38} ///////////////////////////////////////////////////////////////////////////// // Python for Delphi settings. Comment out the setting you want to enable. @@ -418,21 +419,23 @@ // Note that the installer will let the user specify its default Python version, and // thus will edit this file. -{$IFNDEF PYTHON37} - {$IFNDEF PYTHON36} - {$IFNDEF PYTHON35} - {$IFNDEF PYTHON34} - {$IFNDEF PYTHON33} - {$IFNDEF PYTHON32} - {$IFNDEF PYTHON31} - {$IFNDEF PYTHON30} - {$IFNDEF PYTHON27} - {$IFNDEF PYTHON26} - {$IFNDEF PYTHON25} - {$IFNDEF PYTHON24} - {------} - {$DEFINE PYTHON27} - {------} +{$IFNDEF PYTHON38} + {$IFNDEF PYTHON37} + {$IFNDEF PYTHON36} + {$IFNDEF PYTHON35} + {$IFNDEF PYTHON34} + {$IFNDEF PYTHON33} + {$IFNDEF PYTHON32} + {$IFNDEF PYTHON31} + {$IFNDEF PYTHON30} + {$IFNDEF PYTHON27} + {$IFNDEF PYTHON26} + {$IFNDEF PYTHON25} + {$IFNDEF PYTHON24} + {------} + {$DEFINE PYTHON27} + {------} + {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} @@ -446,7 +449,6 @@ {$ENDIF} {$ENDIF} - {$IFDEF PYTHON24} {$DEFINE PYTHON24_OR_HIGHER} {$ENDIF} @@ -549,6 +551,21 @@ {$DEFINE PYTHON36_OR_HIGHER} {$DEFINE PYTHON37_OR_HIGHER} {$ENDIF} +{$IFDEF PYTHON38} + {$DEFINE PYTHON24_OR_HIGHER} + {$DEFINE PYTHON25_OR_HIGHER} + {$DEFINE PYTHON26_OR_HIGHER} + {$DEFINE PYTHON27_OR_HIGHER} + {$DEFINE PYTHON30_OR_HIGHER} + {$DEFINE PYTHON31_OR_HIGHER} + {$DEFINE PYTHON32_OR_HIGHER} + {$DEFINE PYTHON33_OR_HIGHER} + {$DEFINE PYTHON34_OR_HIGHER} + {$DEFINE PYTHON35_OR_HIGHER} + {$DEFINE PYTHON36_OR_HIGHER} + {$DEFINE PYTHON37_OR_HIGHER} + {$DEFINE PYTHON38_OR_HIGHER} +{$ENDIF} ///////////////////////////////////////////////////////////////////////////// // Misc diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 9dd47436..aac5f92a 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -129,7 +129,7 @@ interface end; const {$IFDEF MSWINDOWS} - PYTHON_KNOWN_VERSIONS: array[1..12] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..13] of TPythonVersionProp = ( (DllName: 'python24.dll'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), (DllName: 'python25.dll'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python26.dll'; RegVersion: '2.6'; APIVersion: 1013; CanUseLatest: True), @@ -141,10 +141,11 @@ interface (DllName: 'python34.dll'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python35.dll'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python36.dll'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True), - (DllName: 'python37.dll'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) ); + (DllName: 'python37.dll'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'python38.dll'; RegVersion: '3.8'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF LINUX} - PYTHON_KNOWN_VERSIONS: array[1..12] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..13] of TPythonVersionProp = ( (DllName: 'libpython2.4.so'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), (DllName: 'libpython2.5.so'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython2.6.so'; RegVersion: '2.6'; APIVersion: 1013; CanUseLatest: True), @@ -156,7 +157,8 @@ interface (DllName: 'libpython3.4.so'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.5.so'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.6.so'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True) - (DllName: 'libpython3.7.so'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) ); + (DllName: 'libpython3.7.so'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) + (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF PYTHON24} COMPILED_FOR_PYTHON_VERSION_INDEX = 1; @@ -193,6 +195,9 @@ interface {$ENDIF} {$IFDEF PYTHON37} COMPILED_FOR_PYTHON_VERSION_INDEX = 12; +{$ENDIF} +{$IFDEF PYTHON38} + COMPILED_FOR_PYTHON_VERSION_INDEX = 13; {$ENDIF} PYT_METHOD_BUFFER_INCREASE = 10; PYT_MEMBER_BUFFER_INCREASE = 10; From 46214576f0997140e8bb1106e650656368075e22 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 18 Jul 2019 03:26:08 +0300 Subject: [PATCH 093/123] Better detection of Conda environments --- PythonForDelphi/Components/Sources/Core/PythonVersions.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index f917991f..b3cd57d9 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -198,7 +198,7 @@ function TPythonVersion.GetSysArchitecture: string; function TPythonVersion.Is_conda: Boolean; begin - Result := FileExists(IncludeTrailingPathDelimiter(InstallPath) + 'scripts\conda.exe'); + Result := DirectoryExists(IncludeTrailingPathDelimiter(InstallPath) + 'conda-meta'); end; function TPythonVersion.Is_venv: Boolean; From 67429378c1999e9f353badd185f9340442f929c2 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 20 Jul 2019 14:47:04 +0300 Subject: [PATCH 094/123] Dropping support for 2.4, 3.0, 3.1 Working around 3.8 bug failing to publish Py_CompileString and PyParse_SimpleParseString. --- .../Components/Sources/Core/Definition.Inc | 63 ++----------- .../Components/Sources/Core/PythonEngine.pas | 88 ++++++++++--------- 2 files changed, 54 insertions(+), 97 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index 496cb0d6..f7269306 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -26,12 +26,9 @@ // modify the default Python version below, in the Python versions section. ///////////////////////////////////////////////////////////////////////////// -//{$DEFINE PYTHON24} //{$DEFINE PYTHON25} //{$DEFINE PYTHON26} //{$DEFINE PYTHON27} -//{$DEFINE PYTHON30} -//{$DEFINE PYTHON31} //{$DEFINE PYTHON32} //{$DEFINE PYTHON33} //{$DEFINE PYTHON34} @@ -426,18 +423,12 @@ {$IFNDEF PYTHON34} {$IFNDEF PYTHON33} {$IFNDEF PYTHON32} - {$IFNDEF PYTHON31} - {$IFNDEF PYTHON30} - {$IFNDEF PYTHON27} - {$IFNDEF PYTHON26} - {$IFNDEF PYTHON25} - {$IFNDEF PYTHON24} - {------} - {$DEFINE PYTHON27} - {------} - {$ENDIF} - {$ENDIF} - {$ENDIF} + {$IFNDEF PYTHON27} + {$IFNDEF PYTHON26} + {$IFNDEF PYTHON25} + {------} + {$DEFINE PYTHON27} + {------} {$ENDIF} {$ENDIF} {$ENDIF} @@ -449,88 +440,52 @@ {$ENDIF} {$ENDIF} -{$IFDEF PYTHON24} - {$DEFINE PYTHON24_OR_HIGHER} -{$ENDIF} {$IFDEF PYTHON25} - {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON26} - {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON27} - {$DEFINE PYTHON24_OR_HIGHER} - {$DEFINE PYTHON25_OR_HIGHER} - {$DEFINE PYTHON26_OR_HIGHER} - {$DEFINE PYTHON27_OR_HIGHER} -{$ENDIF} -{$IFDEF PYTHON30} - {$DEFINE PYTHON24_OR_HIGHER} - {$DEFINE PYTHON25_OR_HIGHER} - {$DEFINE PYTHON26_OR_HIGHER} - {$DEFINE PYTHON27_OR_HIGHER} - {$DEFINE PYTHON30_OR_HIGHER} -{$ENDIF} -{$IFDEF PYTHON31} - {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$DEFINE PYTHON27_OR_HIGHER} - {$DEFINE PYTHON30_OR_HIGHER} - {$DEFINE PYTHON31_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON32} - {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$DEFINE PYTHON27_OR_HIGHER} - {$DEFINE PYTHON30_OR_HIGHER} - {$DEFINE PYTHON31_OR_HIGHER} {$DEFINE PYTHON32_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON33} - {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$DEFINE PYTHON27_OR_HIGHER} - {$DEFINE PYTHON30_OR_HIGHER} - {$DEFINE PYTHON31_OR_HIGHER} {$DEFINE PYTHON32_OR_HIGHER} {$DEFINE PYTHON33_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON34} - {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$DEFINE PYTHON27_OR_HIGHER} - {$DEFINE PYTHON30_OR_HIGHER} - {$DEFINE PYTHON31_OR_HIGHER} {$DEFINE PYTHON32_OR_HIGHER} {$DEFINE PYTHON33_OR_HIGHER} {$DEFINE PYTHON34_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON35} - {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$DEFINE PYTHON27_OR_HIGHER} - {$DEFINE PYTHON30_OR_HIGHER} - {$DEFINE PYTHON31_OR_HIGHER} {$DEFINE PYTHON32_OR_HIGHER} {$DEFINE PYTHON33_OR_HIGHER} {$DEFINE PYTHON34_OR_HIGHER} {$DEFINE PYTHON35_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON36} - {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$DEFINE PYTHON27_OR_HIGHER} - {$DEFINE PYTHON30_OR_HIGHER} - {$DEFINE PYTHON31_OR_HIGHER} {$DEFINE PYTHON32_OR_HIGHER} {$DEFINE PYTHON33_OR_HIGHER} {$DEFINE PYTHON34_OR_HIGHER} @@ -538,12 +493,9 @@ {$DEFINE PYTHON36_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON37} - {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$DEFINE PYTHON27_OR_HIGHER} - {$DEFINE PYTHON30_OR_HIGHER} - {$DEFINE PYTHON31_OR_HIGHER} {$DEFINE PYTHON32_OR_HIGHER} {$DEFINE PYTHON33_OR_HIGHER} {$DEFINE PYTHON34_OR_HIGHER} @@ -552,12 +504,9 @@ {$DEFINE PYTHON37_OR_HIGHER} {$ENDIF} {$IFDEF PYTHON38} - {$DEFINE PYTHON24_OR_HIGHER} {$DEFINE PYTHON25_OR_HIGHER} {$DEFINE PYTHON26_OR_HIGHER} {$DEFINE PYTHON27_OR_HIGHER} - {$DEFINE PYTHON30_OR_HIGHER} - {$DEFINE PYTHON31_OR_HIGHER} {$DEFINE PYTHON32_OR_HIGHER} {$DEFINE PYTHON33_OR_HIGHER} {$DEFINE PYTHON34_OR_HIGHER} diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index aac5f92a..663c7f0b 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -129,13 +129,10 @@ interface end; const {$IFDEF MSWINDOWS} - PYTHON_KNOWN_VERSIONS: array[1..13] of TPythonVersionProp = - ( (DllName: 'python24.dll'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), - (DllName: 'python25.dll'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), + PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = + ( (DllName: 'python25.dll'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python26.dll'; RegVersion: '2.6'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python27.dll'; RegVersion: '2.7'; APIVersion: 1013; CanUseLatest: True), - (DllName: 'python30.dll'; RegVersion: '3.0'; APIVersion: 1013; CanUseLatest: True), - (DllName: 'python31.dll'; RegVersion: '3.1'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python32.dll'; RegVersion: '3.2'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python33.dll'; RegVersion: '3.3'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python34.dll'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), @@ -145,13 +142,10 @@ interface (DllName: 'python38.dll'; RegVersion: '3.8'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} {$IFDEF LINUX} - PYTHON_KNOWN_VERSIONS: array[1..13] of TPythonVersionProp = - ( (DllName: 'libpython2.4.so'; RegVersion: '2.4'; APIVersion: 1012; CanUseLatest: True), - (DllName: 'libpython2.5.so'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), + PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = + ( (DllName: 'libpython2.5.so'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython2.6.so'; RegVersion: '2.6'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython2.7.so'; RegVersion: '2.7'; APIVersion: 1013; CanUseLatest: True), - (DllName: 'libpython3.0.so'; RegVersion: '3.0'; APIVersion: 1013; CanUseLatest: True), - (DllName: 'libpython3.1.so'; RegVersion: '3.1'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.2.so'; RegVersion: '3.2'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.3.so'; RegVersion: '3.3'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.4.so'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), @@ -160,44 +154,35 @@ interface (DllName: 'libpython3.7.so'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013; CanUseLatest: True) ); {$ENDIF} -{$IFDEF PYTHON24} - COMPILED_FOR_PYTHON_VERSION_INDEX = 1; -{$ENDIF} {$IFDEF PYTHON25} - COMPILED_FOR_PYTHON_VERSION_INDEX = 2; + COMPILED_FOR_PYTHON_VERSION_INDEX = 1; {$ENDIF} {$IFDEF PYTHON26} - COMPILED_FOR_PYTHON_VERSION_INDEX = 3; + COMPILED_FOR_PYTHON_VERSION_INDEX = 2; {$ENDIF} {$IFDEF PYTHON27} - COMPILED_FOR_PYTHON_VERSION_INDEX = 4; -{$ENDIF} -{$IFDEF PYTHON30} - COMPILED_FOR_PYTHON_VERSION_INDEX = 5; -{$ENDIF} -{$IFDEF PYTHON31} - COMPILED_FOR_PYTHON_VERSION_INDEX = 6; + COMPILED_FOR_PYTHON_VERSION_INDEX = 3; {$ENDIF} {$IFDEF PYTHON32} - COMPILED_FOR_PYTHON_VERSION_INDEX = 7; + COMPILED_FOR_PYTHON_VERSION_INDEX = 4; {$ENDIF} {$IFDEF PYTHON33} - COMPILED_FOR_PYTHON_VERSION_INDEX = 8; + COMPILED_FOR_PYTHON_VERSION_INDEX = 5; {$ENDIF} {$IFDEF PYTHON34} - COMPILED_FOR_PYTHON_VERSION_INDEX = 9; + COMPILED_FOR_PYTHON_VERSION_INDEX = 6; {$ENDIF} {$IFDEF PYTHON35} - COMPILED_FOR_PYTHON_VERSION_INDEX = 10; + COMPILED_FOR_PYTHON_VERSION_INDEX = 7; {$ENDIF} {$IFDEF PYTHON36} - COMPILED_FOR_PYTHON_VERSION_INDEX = 11; + COMPILED_FOR_PYTHON_VERSION_INDEX = 8; {$ENDIF} {$IFDEF PYTHON37} - COMPILED_FOR_PYTHON_VERSION_INDEX = 12; + COMPILED_FOR_PYTHON_VERSION_INDEX = 9; {$ENDIF} {$IFDEF PYTHON38} - COMPILED_FOR_PYTHON_VERSION_INDEX = 13; + COMPILED_FOR_PYTHON_VERSION_INDEX = 10; {$ENDIF} PYT_METHOD_BUFFER_INCREASE = 10; PYT_MEMBER_BUFFER_INCREASE = 10; @@ -1071,6 +1056,11 @@ interface n_child : PNode; end; + PPyCompilerFlags = ^PyCompilerFlags; + PyCompilerFlags = {$IFNDEF CPUX64}packed{$ENDIF} record + flags : integer; + end; + // From weakrefobject.h PPyWeakReference = ^PyWeakReference; @@ -1959,7 +1949,8 @@ TPythonInterface=class(TDynamicDll) PyThreadState_SetAsyncExc: function(t_id :LongInt; exc :PPyObject) : Integer; cdecl; Py_AtExit:function (proc: AtExitProc):integer; cdecl; //Py_Cleanup:procedure; cdecl; - Py_CompileString:function (s1,s2:PAnsiChar;i:integer):PPyObject; cdecl; + Py_CompileStringFlags:function (s1,s2:PAnsiChar;i:integer;flags:PPyCompilerFlags):PPyObject; cdecl; + Py_CompileStringExFlags:function (s1,s2:PAnsiChar;i:integer;flags:PPyCompilerFlags;optimize:integer):PPyObject; cdecl; Py_FatalError:procedure(s:PAnsiChar); cdecl; Py_FindMethod:function (md:PPyMethodDef;ob:PPyObject;key:PAnsiChar):PPyObject; cdecl; Py_FindMethodInChain:function (mc:PPyMethodChain;ob:PPyObject;key:PAnsiChar):PPyObject; cdecl; @@ -1980,7 +1971,7 @@ TPythonInterface=class(TDynamicDll) Py_GetPrefix : function : PAnsiChar; cdecl; Py_GetProgramName : function : PAnsiChar; cdecl; - PyParser_SimpleParseString : function ( str : PAnsiChar; start : Integer) : PNode; cdecl; + PyParser_SimpleParseStringFlags : function ( str : PAnsiChar; start, flags : Integer) : PNode; cdecl; PyNode_Free : procedure( n : PNode ); cdecl; PyErr_NewException : function ( name : PAnsiChar; base, dict : PPyObject ) : PPyObject; cdecl; Py_Malloc : function ( size : NativeInt ) : Pointer; @@ -2071,6 +2062,10 @@ TPythonInterface=class(TDynamicDll) _Py_c_quot: Pointer; _Py_c_sum: Pointer; } + // Not exported in Python 3.8 and implemented as functions + function PyParser_SimpleParseString( str : PAnsiChar; start : Integer) : PNode; cdecl; + function Py_CompileString( s1,s2:PAnsiChar;i:integer) : PPyObject; cdecl; + // functions redefined in Delphi procedure Py_INCREF ( op: PPyObject); procedure Py_DECREF ( op: PPyObject); @@ -4047,18 +4042,18 @@ procedure TPythonInterface.MapDll; PyThreadState_SetAsyncExc :=Import('PyThreadState_SetAsyncExc'); Py_AtExit :=Import('Py_AtExit'); //Py_Cleanup :=Import('Py_Cleanup'); - Py_CompileString :=Import('Py_CompileString'); Py_FatalError :=Import('Py_FatalError'); if not IsPython3000 then begin - Py_FindMethod :=Import('Py_FindMethod'); - Py_FindMethodInChain :=Import('Py_FindMethodInChain'); + Py_FindMethod :=Import('Py_FindMethod'); + Py_FindMethodInChain :=Import('Py_FindMethodInChain'); DLL_Py_FlushLine :=Import('Py_FlushLine'); + _PyString_Resize :=Import('_PyString_Resize'); + Py_CompileStringFlags :=Import('Py_CompileStringFlags'); + end else begin + _PyString_Resize :=Import('_PyBytes_Resize'); + Py_CompileStringExFlags :=Import('Py_CompileStringExFlags'); end; - _PyObject_New :=Import('_PyObject_New'); - if not IsPython3000 then - _PyString_Resize :=Import('_PyString_Resize') - else - _PyString_Resize :=Import('_PyBytes_Resize'); + _PyObject_New :=Import('_PyObject_New'); Py_Finalize :=Import('Py_Finalize'); if getProcAddress( FDLLHandle, 'PyCode_Addr2Line' ) <> nil then DLL_PyCode_Addr2Line := Import('PyCode_Addr2Line'); @@ -4082,7 +4077,7 @@ procedure TPythonInterface.MapDll; Py_GetPythonHome :=Import('Py_GetPythonHome'); Py_GetPrefix :=Import('Py_GetPrefix'); Py_GetProgramName :=Import('Py_GetProgramName'); - PyParser_SimpleParseString :=Import('PyParser_SimpleParseString'); + PyParser_SimpleParseStringFlags := Import('PyParser_SimpleParseStringFlags'); PyNode_Free :=Import('PyNode_Free'); PyErr_NewException :=Import('PyErr_NewException'); /// jah 29-sep-2000 : updated for python 2.0 @@ -4121,6 +4116,19 @@ procedure TPythonInterface.MapDll; PyGILState_Release := Import('PyGILState_Release'); end; +function TPythonInterface.Py_CompileString( s1,s2:PAnsiChar;i:integer):PPyObject; cdecl; +begin + if IsPython3000 then + Result := Py_CompileStringExFlags(s1, s2, i, nil, -1) + else + Result := Py_CompileStringFlags(s1, s2, i, nil); +end; + +function TPythonInterface.PyParser_SimpleParseString( str : PAnsiChar; start : integer) : PNode; cdecl; +begin + Result := PyParser_SimpleParseStringFlags(str, start, 0); +end; + procedure TPythonInterface.Py_INCREF(op: PPyObject); begin Inc(op^.ob_refcnt); From d8ea944ba0c72562628b66368eae83a86eb08cec Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 18 Sep 2019 04:24:40 +0300 Subject: [PATCH 095/123] Git Test --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1b61c1ce..80e75e70 100644 --- a/README.md +++ b/README.md @@ -7,4 +7,5 @@ Python for Delphi (P4D) is a set of free components that wrap up the Python dll 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. + Delphinus-Support From 5a961b2445391cc84ecd82159395e105d642ac0e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 18 Sep 2019 04:27:35 +0300 Subject: [PATCH 096/123] Undo previous change --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 80e75e70..1b61c1ce 100644 --- a/README.md +++ b/README.md @@ -7,5 +7,4 @@ Python for Delphi (P4D) is a set of free components that wrap up the Python dll 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. - Delphinus-Support From 40f26b5d29211b6ea34d932a1b76d263452cceca Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 21 Sep 2019 01:16:01 +0300 Subject: [PATCH 097/123] Issue 83. Changed provided by Alexey-T --- .../Components/Sources/Core/MethodCallBack.pas | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas b/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas index 44cfbd8e..c4797620 100644 --- a/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas +++ b/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas @@ -181,7 +181,12 @@ procedure GetCodeMem(var ptr: PByte; size: integer); {$ELSE} //page := GetMem(PageSize); page := mmap(Pointer($10000000), PageSize, PROT_NONE, MAP_PRIVATE or MAP_ANON, -1, 0); - mprotect(page, PageSize, PROT_READ or PROT_WRITE or PROT_EXEC); + if page=Pointer(-1) then //MMAP_FAILED result? + begin + ptr := nil; + exit; + end; + mprotect(page, PageSize, PROT_READ or PROT_WRITE or PROT_EXEC); {$ENDIF} page^.next:=CodeMemPages; CodeMemPages:=page; @@ -451,6 +456,7 @@ function GetCallBack( self: TObject; method: Pointer; Inc(lCount,sizeof(c64jump)); GetCodeMem(Q,lCount); + if Q=nil then exit(nil); P := Q; lSize := 0; From 3a71bab1e3991874c7a4605232e52bcd0fb80ba5 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 11 Oct 2019 21:21:04 +0300 Subject: [PATCH 098/123] Fix for Python crash if Unicode surrogate pair passed from Pascal in Linux. #85 --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 663c7f0b..372e4ec3 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -6419,7 +6419,7 @@ function TPythonEngine.PyUnicode_FromWideString( const AString : UnicodeString) {$IFDEF LINUX} // Note that Linux uses UCS4 strings, whereas it declares using UCS2 strings!!! _ucs4Str := WideStringToUCS4String(AString); - Result := PyUnicode_FromWideChar( {PWideChar}(@_ucs4Str[0]), Length(AString) ); + Result := PyUnicode_FromWideChar( {PWideChar}(@_ucs4Str[0]), Length(_ucs4Str)-1 {trim trailing zero}); {$ELSE} Result := PyUnicode_FromWideChar( PWideChar(AString), Length(AString) ); {$ENDIF} From 22227a190eafa8e09aba05c62df9031f21a669f9 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 12 Oct 2019 05:32:00 +0300 Subject: [PATCH 099/123] Added DARWIN support #87 --- .../Components/Sources/Core/PythonEngine.pas | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 372e4ec3..5443a494 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -130,7 +130,8 @@ interface const {$IFDEF MSWINDOWS} PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = - ( (DllName: 'python25.dll'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), + ( + (DllName: 'python25.dll'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python26.dll'; RegVersion: '2.6'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python27.dll'; RegVersion: '2.7'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python32.dll'; RegVersion: '3.2'; APIVersion: 1013; CanUseLatest: True), @@ -139,11 +140,13 @@ interface (DllName: 'python35.dll'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python36.dll'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True), (DllName: 'python37.dll'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True), - (DllName: 'python38.dll'; RegVersion: '3.8'; APIVersion: 1013; CanUseLatest: True) ); + (DllName: 'python38.dll'; RegVersion: '3.8'; APIVersion: 1013; CanUseLatest: True) + ); {$ENDIF} {$IFDEF LINUX} PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = - ( (DllName: 'libpython2.5.so'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), + ( + (DllName: 'libpython2.5.so'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython2.6.so'; RegVersion: '2.6'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython2.7.so'; RegVersion: '2.7'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.2.so'; RegVersion: '3.2'; APIVersion: 1013; CanUseLatest: True), @@ -152,8 +155,24 @@ interface (DllName: 'libpython3.5.so'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True), (DllName: 'libpython3.6.so'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True) (DllName: 'libpython3.7.so'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True) - (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013; CanUseLatest: True) ); + (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013; CanUseLatest: True) + ); {$ENDIF} +{$IFDEF DARWIN} + PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = + ( + (DllName: 'libpython2.5.dylib'; RegVersion: '2.5'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython2.6.dylib'; RegVersion: '2.6'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython2.7.dylib'; RegVersion: '2.7'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.2.dylib'; RegVersion: '3.2'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.3.dylib'; RegVersion: '3.3'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.4.dylib'; RegVersion: '3.4'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.5.dylib'; RegVersion: '3.5'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.6.dylib'; RegVersion: '3.6'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.7.dylib'; RegVersion: '3.7'; APIVersion: 1013; CanUseLatest: True), + (DllName: 'libpython3.8.dylib'; RegVersion: '3.8'; APIVersion: 1013; CanUseLatest: True) + ); +{$endif} {$IFDEF PYTHON25} COMPILED_FOR_PYTHON_VERSION_INDEX = 1; {$ENDIF} From 10b80aef7a3af7f3af6cf42eca56237152d66211 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 12 Oct 2019 14:17:35 +0300 Subject: [PATCH 100/123] for Py2.x on Linux --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 5443a494..50da006d 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3632,7 +3632,7 @@ function TPythonInterface.GetUnicodeTypeSuffix : String; if (fMajorVersion > 3) or ((fMajorVersion = 3) and (fMinorVersion >= 3)) then Result := '' else if APIVersion >= 1011 then - Result := 'UCS2' + Result := {$IFDEF WINDOWS} 'UCS2' {$ELSE} 'UCS4' {$ENDIF} else Result := ''; end; From bbbf0b05cb1930a34c37060dc38385f062f8ac9a Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 13 Oct 2019 22:33:23 +0300 Subject: [PATCH 101/123] Added PyString_AsStringAndSize/PyBytes_AsStringAndSize for Python 2/3 Updated/fixed demo 29. --- .../Components/Sources/Core/PythonEngine.pas | 12 +- PythonForDelphi/Demos/Demo29/Project1.dof | 148 --------- PythonForDelphi/Demos/Demo29/Project1.dpr | 3 - PythonForDelphi/Demos/Demo29/Project1.dproj | 290 ++++++++++-------- PythonForDelphi/Demos/Demo29/Project1.res | Bin 2040 -> 59020 bytes PythonForDelphi/Demos/Demo29/Unit1.dfm | 44 +-- PythonForDelphi/Demos/Demo29/Unit1.pas | 55 +++- PythonForDelphi/Demos/readme.txt | 2 +- 8 files changed, 228 insertions(+), 326 deletions(-) delete mode 100644 PythonForDelphi/Demos/Demo29/Project1.dof diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 50da006d..645848c2 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -1771,13 +1771,14 @@ TPythonInterface=class(TDynamicDll) PyDict_GetItemString: function( dp: PPyObject; key: PAnsiChar): PPyObject; cdecl; PyDict_SetItemString: function( dp: PPyObject; key: PAnsiChar; item: PPyObject): Integer; cdecl; - PyDictProxy_New: function (obj : PPyObject) : PPyObject; cdecl; + PyDictProxy_New: function (obj : PPyObject) : PPyObject; cdecl; PyModule_GetDict: function( module:PPyObject): PPyObject; cdecl; PyObject_Str: function( v: PPyObject): PPyObject; cdecl; PyRun_String: function( str: PAnsiChar; start: Integer; globals: PPyObject; locals: PPyObject): PPyObject; cdecl; PyRun_SimpleString: function( str: PAnsiChar): Integer; cdecl; PyString_AsString: function( ob: PPyObject): PAnsiChar; cdecl; + PyString_AsStringAndSize: function( ob: PPyObject; var buffer: PAnsiChar; var size: NativeInt): integer; cdecl; PySys_SetArgv: procedure( argc: Integer; argv: PPAnsiChar); cdecl; PySys_SetArgv3000: procedure( argc: Integer; argv: PPWideChar); cdecl; @@ -3836,10 +3837,13 @@ procedure TPythonInterface.MapDll; PyRun_String := Import('PyRun_String'); PyRun_SimpleString := Import('PyRun_SimpleString'); PyDict_GetItemString := Import('PyDict_GetItemString'); - if not IsPython3000 then - PyString_AsString := Import('PyString_AsString') - else + if not IsPython3000 then begin + PyString_AsString := Import('PyString_AsString'); + PyString_AsStringAndSize := Import('PyString_AsStringAndSize') + end else begin PyString_AsString := Import('PyBytes_AsString'); + PyString_AsStringAndSize := Import('PyBytes_AsStringAndSize'); + end; if not IsPython3000 then DLL_PyString_FromString := Import('PyString_FromString'); if not IsPython3000 then diff --git a/PythonForDelphi/Demos/Demo29/Project1.dof b/PythonForDelphi/Demos/Demo29/Project1.dof deleted file mode 100644 index a1de42b4..00000000 --- a/PythonForDelphi/Demos/Demo29/Project1.dof +++ /dev/null @@ -1,148 +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=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP;cxEditorsVCLD7;cxLibraryVCLD7;dxThemeD7;cxDataD7;cxExtEditorsVCLD7;cxGridVCLD7;cxGridUtilsVCLD7;dxNavBarD7;cxPageControlVCLD7;dxBarD7;dxComnD7;dxBarDBNavD7;dxBarExtItemsD7;dxBarExtDBItemsD7;dxsbD7;dxDockingD7;dxmdsD7;dxdbtrD7;dxtrmdD7;cxSpreadSheetVCLD7;cxCommonEditingVCLD7;cxVerticalGridVCLD7;dxPSCoreD7;dxPsPrVwAdvD7;dxPSLnksD7;dxPSTeeChartD7;dxPSDBTeeChartD7;dxPScxCommonD7;dxPScxExtCommonD7;dxPScxSSLnkD7;dxPScxGridLnkD7;rbTDBC77;rbDBDE77;rbDAD77;rbDIDE77;rbUSER77;rbRCL77;rbBDE77;rbIDE77;rbCIDE77;rbRIDE77;rbRAP77;madBasic_;madDisAsm_;Tiger;SynEdit_D7;dxPScxVGridLnkD7;dxPSdxDBTVLnkD7;dxPScxPCProdD7 -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -Launcher= -UseLauncher=0 -DebugCWD= -[Language] -ActiveLang= -ProjectLang= -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=4105 -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\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. diff --git a/PythonForDelphi/Demos/Demo29/Project1.dpr b/PythonForDelphi/Demos/Demo29/Project1.dpr index 8d0a35f3..1faa1f9c 100644 --- a/PythonForDelphi/Demos/Demo29/Project1.dpr +++ b/PythonForDelphi/Demos/Demo29/Project1.dpr @@ -1,6 +1,3 @@ -// JCL_DEBUG_EXPERT_GENERATEJDBG OFF -// JCL_DEBUG_EXPERT_INSERTJDBG OFF -// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF program Project1; uses diff --git a/PythonForDelphi/Demos/Demo29/Project1.dproj b/PythonForDelphi/Demos/Demo29/Project1.dproj index 1f6b5738..488cd6fd 100644 --- a/PythonForDelphi/Demos/Demo29/Project1.dproj +++ b/PythonForDelphi/Demos/Demo29/Project1.dproj @@ -1,134 +1,156 @@ - - - {2F621E09-DAC5-4AB2-83F7-BD019D49AAF2} - 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) - 4105 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - Project1.exe - 00400000 - x86 - - - Project1_Icon.ico - - - $(BDS)\bin\default_app.manifest - 1033 - true - Project1_Icon.ico - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - - - 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 - 4105 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - False - True - - - 12 - - -
    + + + {2F621E09-DAC5-4AB2-83F7-BD019D49AAF2} + Project1.dpr + Debug + DCC32 + 18.7 + VCL + True + Win32 + 1 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 4105 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + Project1.exe + 00400000 + x86 + Project1 + + + $(BDS)\bin\default_app.manifest + 1033 + true + Project1_Icon.ico + true + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + $(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 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + DEBUG;$(DCC_Define) + + + Debug + true + 1033 + $(BDS)\bin\delphi_PROJECTICON.ico + true + + + + 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 + 4105 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + True + False + + + 12 + + +
    diff --git a/PythonForDelphi/Demos/Demo29/Project1.res b/PythonForDelphi/Demos/Demo29/Project1.res index fbaca376ee9a178564ffeb78afeae98e456e7f34..aff75aeb20d9f85f9fc0644b9444884261577bc7 100644 GIT binary patch literal 59020 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�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 literal 2040 zcma)7UvJw~6hCPrku5Mf32A++WmOwOY7&#IVk22wwd)kI!PJHFh+O9;vvBO<>)4Bg zAk!X*l!tuFwAX!M^35idE1P{E?w;?fc`Q01aaR(2a_SpA#{@-(ba*2pEun-Hz z@&fG^QvDii06;amR7{O_3k@uf=@EU7=UqC&s!gBJ$G~ko53!c?L-CKliKPD`M*7}S zS|S-R)g&VNPRSloKt9>zQXkQ5a)=?aOFiYhgDS8|ncySsAHvF`E)B^-*4MpW_c=hE0<27UrJ0tM5pAknb)Yqom7{VKQI|Db zD*jgdeT7Iv93fV-{;sVp`};0*Qojo>sCZbw=f7!8gnt^37cV@q1dnMxpF<%JS-!;L zh3Dej1(l7flGdPARF3N)Bg3W1R0=Xo64kG!=0uapB#vJ!u`)2IcyN%&rt$0r6%WHO z5da%>uix*5yUJoRof#|F!?54)DqMzsC5rkdVUXb{ihRA_Qx2s`Y$zNi0phs64t1)h z6klK16B4XPksj%~@~09KJdgYvdHn55s5ezUk_mhS{HwUYGT^lvkzPGZFj{g=kD|>u z!KLYJZAI6qoEQKbN|hQQpv2`kF_^@%q2)M^Pn8{-4g+AKnQZTe3L`I(I*xigtHUsc zKUVcR93_?xQ>^2763=9yIR1W$^8if~e71l%BdIT^1xX<3jK&2aQl760A^CjunK-{f z;`~ke=Db8Ze@Z6Wko+pg80-!3j%0jZk~hTDXV1l0{3PbDR>l15g81dm+fcm$UIjk| z&%r-}e-%Q!d6 zs^-p;~!@3WBJG33vXFOA)=b8HM6SxNWSnjisIm;$%nj-}*-Q;aIL~s1u zo;7V~?^$x&Exl(toayOi<+(MhS@eG;Z&ojq+N@@KMs>|<`Y8Y`u7D<{LWs+_weDkL cI_j=H!t`{2j_4k4!VYfZWOj0Qb^)S)00aZ#6951J diff --git a/PythonForDelphi/Demos/Demo29/Unit1.dfm b/PythonForDelphi/Demos/Demo29/Unit1.dfm index 8a17a093..e394b150 100644 --- a/PythonForDelphi/Demos/Demo29/Unit1.dfm +++ b/PythonForDelphi/Demos/Demo29/Unit1.dfm @@ -2,7 +2,7 @@ object Form1: TForm1 Left = 218 Top = 18 Caption = 'Form1' - ClientHeight = 731 + ClientHeight = 743 ClientWidth = 668 Color = clBtnFace Font.Charset = DEFAULT_CHARSET @@ -17,11 +17,12 @@ object Form1: TForm1 Left = 8 Top = 8 Width = 657 - Height = 329 + Height = 289 + AutoSize = True end object Button1: TButton Left = 8 - Top = 352 + Top = 312 Width = 97 Height = 25 Caption = 'Open Picture...' @@ -30,7 +31,7 @@ object Form1: TForm1 end object Button2: TButton Left = 196 - Top = 352 + Top = 312 Width = 105 Height = 25 Caption = 'Execute' @@ -39,25 +40,32 @@ object Form1: TForm1 end object Memo1: TMemo Left = 8 - Top = 520 + Top = 471 Width = 657 - Height = 281 + Height = 330 Lines.Strings = ( - 'import StringIO' - 'import Image' + '# This demo requires the module pillow (PIL)' + + '# You can use "pip install Pillow" from a command prompt to ins' + + 'tall Pillow' + '' + 'from io import BytesIO' + 'from PIL import Image' + 'import sys' '' 'def ProcessImage(data):' - ' stream = StringIO.StringIO(data)' + ' print(sys.version)' + ' stream = BytesIO(data)' ' im = Image.open(stream)' - ' print "Processing image %s of %d bytes" % (im.format, len(data' + - '))' - ' new_im = im.rotate(90)' + ' print ("Processing image %s of %d bytes" % (im.format, len(dat' + + 'a)))' + ' new_im = im.rotate(90, expand=True)' ' new_im.format = im.format' ' return new_im' ' ' 'def ImageToString(image):' - ' stream = StringIO.StringIO()' + ' stream = BytesIO()' ' image.save(stream, image.format)' ' return stream.getvalue()') ScrollBars = ssBoth @@ -65,7 +73,7 @@ object Form1: TForm1 end object Memo2: TMemo Left = 8 - Top = 392 + Top = 352 Width = 657 Height = 113 ScrollBars = ssBoth @@ -73,12 +81,10 @@ object Form1: TForm1 end object chkUseDC: TCheckBox Left = 336 - Top = 356 + Top = 316 Width = 193 Height = 17 Caption = 'Use Device Context' - Checked = True - State = cbChecked TabOrder = 4 end object OpenPictureDialog1: TOpenPictureDialog @@ -87,9 +93,9 @@ object Form1: TForm1 end object PythonEngine1: TPythonEngine AutoUnload = False - DllName = 'python27.dll' + DllName = 'python36.dll' APIVersion = 1013 - RegVersion = '3.4' + RegVersion = '3.6' UseLastKnownVersion = False IO = PythonGUIInputOutput1 Left = 168 diff --git a/PythonForDelphi/Demos/Demo29/Unit1.pas b/PythonForDelphi/Demos/Demo29/Unit1.pas index 60704606..57cd85d6 100644 --- a/PythonForDelphi/Demos/Demo29/Unit1.pas +++ b/PythonForDelphi/Demos/Demo29/Unit1.pas @@ -1,5 +1,11 @@ unit Unit1; - +{ + Demonstrates the manipulation of images on the Delphi side using python. + Requires the Pillow python module. + Istall using pip (pip install Pillow). + Currently the code is setup for Python 3.x, but Python 2 can be supported + with minor changes. (io.Bytes should be replaced with StringIO.StringIO) +} interface uses @@ -31,7 +37,9 @@ TForm1 = class(TForm) implementation uses - VarPyth, jpeg; + VarPyth, + Math, + jpeg; {$R *.dfm} @@ -85,9 +93,11 @@ procedure TForm1.Button2Click(Sender: TObject); var _im : Variant; _stream : TMemoryStream; - _hdc : Variant; _dib : Variant; - S : AnsiString; + pargs: PPyObject; + presult :PPyObject; + P : PAnsiChar; + Len : NativeInt; begin if (Image1.Picture.Graphic = nil) or Image1.Picture.Graphic.Empty then raise Exception.Create('You must first select an image'); @@ -95,16 +105,28 @@ procedure TForm1.Button2Click(Sender: TObject); _im := MainModule.ProcessImage(ImageToPyStr(Image1.Picture.Graphic)); if not chkUseDC.Checked then begin - { - TODO : - Needs fixing. Probably has to do with images containing null bytes which - cannot be converted to ansistrings. - } - ShowMessage('This does not work and needs fixing'); + // We have to call PyString_AsStringAndSize because the image may contain zeros + with GetPythonEngine do begin + pargs := MakePyTuple([ExtractPythonObjectFrom(_im)]); + try + try + presult := PyEval_CallObjectWithKeywords( + ExtractPythonObjectFrom(MainModule.ImageToString), pargs, nil); + if (PyString_AsStringAndSize(presult, P, Len) < 0) or (P = nil) then begin + ShowMessage('This does not work and needs fixing'); + Abort; + end; + finally + Py_XDECREF(pResult); + end; + finally + Py_DECREF(pargs); + end; + end; + _stream := TMemoryStream.Create(); try - S := MainModule.ImageToString(_im); - _stream.Write(PAnsiChar(S)^, Length(S)); + _stream.Write(P^, Len); _stream.Position := 0; Image1.Picture.Graphic.LoadFromStream(_stream); finally @@ -113,11 +135,10 @@ procedure TForm1.Button2Click(Sender: TObject); end else begin - Image1.Picture.Bitmap.Width := Image1.Width; - Image1.Picture.Bitmap.Height := Image1.Height; - _hdc := Import('ImageWin').HDC(Image1.Picture.Bitmap.Canvas.Handle); - _dib := Import('ImageWin').Dib(_im); - _dib.expose(_hdc); + Image1.Picture.Bitmap.SetSize(Image1.Width, Image1.Height); + _dib := Import('PIL.ImageWin').Dib(_im); + Image1.Picture.Bitmap.SetSize(Image1.Height, Image1.Width); + _dib.expose(NativeInt(Image1.Picture.Bitmap.Canvas.Handle)); end; end; diff --git a/PythonForDelphi/Demos/readme.txt b/PythonForDelphi/Demos/readme.txt index 6c159b23..9ee803e7 100644 --- a/PythonForDelphi/Demos/readme.txt +++ b/PythonForDelphi/Demos/readme.txt @@ -27,7 +27,7 @@ Demo25 Using VarPyth.pas (Kylix ready) Demo26 Demo8 revisited to allow the new Python type to be subclassed Demo27 Container indexing Demo28 Iterator (Kylix ready) -Demo29 Using Python Imaging Library (PAL) +Demo29 Using Python Imaging Library (PIL) 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) From 3b606d80cd6b04ba23e540ba8219eb8d9c4b0566 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 14 Oct 2019 05:06:14 +0300 Subject: [PATCH 102/123] Surprisingly, in Darwin python 2.x Unicode is UCS2 --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 645848c2..3c2eb5ba 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3633,7 +3633,8 @@ function TPythonInterface.GetUnicodeTypeSuffix : String; if (fMajorVersion > 3) or ((fMajorVersion = 3) and (fMinorVersion >= 3)) then Result := '' else if APIVersion >= 1011 then - Result := {$IFDEF WINDOWS} 'UCS2' {$ELSE} 'UCS4' {$ENDIF} + Result := + {$IFDEF WINDOWS} 'UCS2' {$ELSEIF DARWIN} 'UCS2' {$ELSE} 'UCS4' {$ENDIF} else Result := ''; end; From 8c159408f24854d3da48339edf0ea5496ce4ddb5 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 14 Oct 2019 14:49:28 +0300 Subject: [PATCH 103/123] SOLARIS is USC2 too. --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 3c2eb5ba..8b49c62d 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3634,7 +3634,10 @@ function TPythonInterface.GetUnicodeTypeSuffix : String; Result := '' else if APIVersion >= 1011 then Result := - {$IFDEF WINDOWS} 'UCS2' {$ELSEIF DARWIN} 'UCS2' {$ELSE} 'UCS4' {$ENDIF} + {$IF DEFINED(WINDOWS) or DEFINED(DARWIN) or DEFINED(SOLARIS)} + 'UCS2' + {$ELSE} + 'UCS4' else Result := ''; end; From 41ae302c8a57373c11fa1db51167266e2fc4dd8c Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 15 Oct 2019 03:54:05 +0300 Subject: [PATCH 104/123] Fixed previous commit and a typo --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 1 + PythonForDelphi/Demos/readme.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 8b49c62d..d5e096ff 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3638,6 +3638,7 @@ function TPythonInterface.GetUnicodeTypeSuffix : String; 'UCS2' {$ELSE} 'UCS4' + {$ENDIF} else Result := ''; end; diff --git a/PythonForDelphi/Demos/readme.txt b/PythonForDelphi/Demos/readme.txt index 9ee803e7..f48d1b21 100644 --- a/PythonForDelphi/Demos/readme.txt +++ b/PythonForDelphi/Demos/readme.txt @@ -32,4 +32,4 @@ 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 -Demo34 Dynamically creating, destroying and recreating PythonEngine. Uses PytonVersions +Demo34 Dynamically creating, destroying and recreating PythonEngine. Uses PythonVersions From c33e873190acbe4ae8a2b88a7e66b6d6d5f9ea7c Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 15 Oct 2019 04:08:19 +0300 Subject: [PATCH 105/123] Further fix of the fix... --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index d5e096ff..b26dcf61 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3634,7 +3634,7 @@ function TPythonInterface.GetUnicodeTypeSuffix : String; Result := '' else if APIVersion >= 1011 then Result := - {$IF DEFINED(WINDOWS) or DEFINED(DARWIN) or DEFINED(SOLARIS)} + {$IF DEFINED(MSWINDOWS) or DEFINED(DARWIN) or DEFINED(SOLARIS)} 'UCS2' {$ELSE} 'UCS4' From 0d606f5a158df711b2fb4cfd215431fb78e4099e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 15 Oct 2019 05:44:18 +0300 Subject: [PATCH 106/123] Fix #72 --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index b26dcf61..880e7994 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -4916,7 +4916,7 @@ procedure TPythonEngine.Initialize; AssignPyFlags; if FPythonHomeW <> '' then begin if IsPython3000 then - Py_SetPythonHome3000(PChar(FPythonHomeW)) + Py_SetPythonHome3000(PWideChar(FPythonHomeW)) else Py_SetPythonHome(PAnsiChar(FPythonHome)); end; From 0209f110a404b687c4a02c6d832659d8762c67d5 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 18 Oct 2019 00:49:33 +0300 Subject: [PATCH 107/123] Fix #82 --- .../Components/Sources/Core/PythonEngine.pas | 14 ++++++ .../Sources/Core/PythonVersions.pas | 48 +++++++++++++++++-- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 880e7994..8cccf7b3 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -2201,6 +2201,7 @@ TPythonTraceback = class {$IFEND} TPythonEngine = class(TPythonInterface) private + FVenvPythonExe: string; FInitScript: TStrings; FIO: TPythonInputOutput; FRedirectIO: Boolean; @@ -2352,6 +2353,7 @@ TPythonEngine = class(TPythonInterface) property IOPythonModule: TObject read FIOPythonModule; {TPythonModule} published property AutoFinalize: Boolean read FAutoFinalize write FAutoFinalize default True; + property VenvPythonExe: string read FVenvPythonExe write FVenvPythonExe; property DatetimeConversionMode: TDatetimeConversionMode read FDatetimeConversionMode write FDatetimeConversionMode default DEFAULT_DATETIME_CONVERSION_MODE; property InitScript: TStrings read FInitScript write SetInitScript; property InitThreads: Boolean read FInitThreads write SetInitThreads default False; @@ -4828,7 +4830,19 @@ procedure TPythonEngine.Initialize; procedure InitSysPath; var _path : PPyObject; + const Script = + 'import sys' + sLineBreak + + 'sys.executable = r"%s"' + sLineBreak + + 'path = sys.path' + sLineBreak + + 'for i in range(len(path)-1, -1, -1):' + sLineBreak + + ' if path[i].find("site-packages") > 0:' + sLineBreak + + ' path.pop(i)' + sLineBreak + + 'import site' + sLineBreak + + 'site.main()' + sLineBreak + + 'del sys, path, i, site'; begin + if VenvPythonExe <> '' then + ExecString(Format(Script, [VenvPythonExe])); _path := PySys_GetObject('path'); if Assigned(FOnSysPathInit) then FOnSysPathInit(Self, _path); diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index b3cd57d9..07947ced 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -72,7 +72,8 @@ TPythonVersion = record function GetRegisteredPythonVersions : TPythonVersions; (* Returns the highest numbered registered Python version *) function GetLatestRegisteredPythonVersion(out PythonVersion: TPythonVersion): Boolean; - function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVersion): Boolean; + function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVersion; + AcceptVirtualEnvs: Boolean = True): Boolean; {$ENDIF} implementation @@ -122,6 +123,11 @@ procedure TPythonVersion.AssignTo(PythonEngine: TPersistent); TPythonEngine(PythonEngine).DllName := DLLName; TPythonEngine(PythonEngine).DllPath := DLLPath; TPythonEngine(PythonEngine).APIVersion := ApiVersion; + if Is_venv then begin + TPythonEngine(PythonEngine).VenvPythonExe := PythonExecutable; + TPythonEngine(PythonEngine).SetPythonHome(DLLPath); + end else if not IsRegistered then + TPythonEngine(PythonEngine).SetPythonHome(InstallPath); end; end; @@ -416,7 +422,9 @@ function GetLatestRegisteredPythonVersion(out PythonVersion: TPythonVersion): Bo end; end; -function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVersion): Boolean; +function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVersion; + AcceptVirtualEnvs: Boolean = True): Boolean; + function FindPythonDLL(APath : string): string; Var FindFileData: TWIN32FindData; @@ -436,10 +444,29 @@ function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVer Result := DLLFileName; end; + function GetVenvBasePrefix(InstallPath: string): string; + var + SL : TStringList; + begin + SL := TStringList.Create; + try + try + SL.LoadFromFile(IncludeTrailingPathDelimiter(InstallPath)+'pyvenv.cfg'); + Result := Trim(SL.Values['home']); + if Result = '' then + Result := Trim(SL.Values['home ']); + except + end; + finally + SL.Free; + end; + end; + Var DLLFileName: string; DLLPath: string; SysVersion: string; + BasePrefix: string; I: integer; begin Result := False; @@ -450,11 +477,24 @@ function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVer PythonVersion.InstallPath := DLLPath; DLLFileName := FindPythonDLL(DLLPath); - if DLLFileName = '' then begin + + if (DLLFileName = '') and AcceptVirtualEnvs then begin DLLPath := DLLPath + '\Scripts'; DLLFileName := FindPythonDLL(DLLPath); end; - if DLLFileName = '' then Exit; + if DLLFileName = '' then begin + if AcceptVirtualEnvs and PythonVersion.Is_venv then + begin + BasePrefix := GetVenvBasePrefix(PythonVersion.InstallPath); + if (BasePrefix <> '') and PythonVersionFromPath(BasePrefix, PythonVersion, False) then + begin + // Install path points to venv but the rest of the info is from base_prefix + PythonVersion.InstallPath := ExcludeTrailingPathDelimiter(Path); + Result := True; + end; + end; + Exit; + end; // check if same platform try From 768320052e358ab7ceb2d4709ea8eab3115b522f Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 19 Oct 2019 00:53:49 +0300 Subject: [PATCH 108/123] Added WrapDelphiDialogs.pas and updated Demo31 to test the wrapper and also work with python 3.x. Note that the new wrapper is incomplete and is in response to #74 --- .../Sources/Core/WrapDelphiDialogs.pas | 115 +++ PythonForDelphi/Demos/Demo31/Project1.dpr | 5 +- PythonForDelphi/Demos/Demo31/Project1.dproj | 681 +++++++++++++++++- PythonForDelphi/Demos/Demo31/Project1.res | Bin 2040 -> 59020 bytes PythonForDelphi/Demos/Demo31/Unit1.dfm | Bin 14978 -> 15334 bytes PythonForDelphi/Demos/Demo31/Unit1.pas | 2 +- 6 files changed, 791 insertions(+), 12 deletions(-) create mode 100644 PythonForDelphi/Components/Sources/Core/WrapDelphiDialogs.pas diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiDialogs.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiDialogs.pas new file mode 100644 index 00000000..9014c101 --- /dev/null +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiDialogs.pas @@ -0,0 +1,115 @@ +unit WrapDelphiDialogs; +{$I Definition.Inc} + +interface + +uses + Classes, SysUtils, PythonEngine, WrapDelphi, WrapDelphiClasses, + WrapDelphiControls, Windows, Dialogs, TypInfo; + +type + TPyDelphiOpenDialog = class(TPyDelphiComponent) + private + function GetDelphiObject: TOpenDialog; + procedure SetDelphiObject(const Value: TOpenDialog); + protected + // Exposed Methods + function Execute_Wrapper(args: PPyObject): PPyObject; cdecl; + // Property Getters + function Get_filename(AContext: Pointer): PPyObject; cdecl; + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure RegisterMethods( PythonType : TPythonType ); override; + // Properties + property DelphiObject: TOpenDialog read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +uses + WrapDelphiTypes; + +{ Register the wrappers, the globals and the constants } +type + TDialogRegistration = class(TRegisteredUnit) + public + function Name: String; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + + { TDialogRegistration } +procedure TDialogRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TDialogRegistration.Name: String; +begin + Result := 'Dialog'; +end; + +procedure TDialogRegistration.RegisterWrappers(APyDelphiWrapper + : TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiOpenDialog); +end; + +{ TPyDelphiOpenDialog } +class function TPyDelphiOpenDialog.DelphiObjectClass: TClass; +begin + Result := TOpenDialog; +end; + +function TPyDelphiOpenDialog.GetDelphiObject: TOpenDialog; +begin + Result := TOpenDialog(inherited DelphiObject); +end; + +function TPyDelphiOpenDialog.Execute_Wrapper(args: PPyObject): PPyObject; +begin + with GetPythonEngine do begin + // We adjust the transmitted self argument + Adjust(@Self); + if PyArg_ParseTuple( args, ':Execute') <> 0 then + Result := VariantAsPyObject(DelphiObject.Execute()) + else + Result := nil; + end; +end; + +function TPyDelphiOpenDialog.Get_filename(AContext: Pointer): PPyObject; +begin + with GetPythonEngine do + begin + Adjust(@self); + Result := VariantAsPyObject(DelphiObject.FileName); + end; +end; + +class procedure TPyDelphiOpenDialog.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + PythonType.AddGetSet('FileName', @TPyDelphiOpenDialog.Get_filename, + nil, '', nil); +end; + +class procedure TPyDelphiOpenDialog.RegisterMethods(PythonType: TPythonType); +begin + inherited; + PythonType.AddMethod('Execute', @TPyDelphiOpenDialog.Execute_Wrapper, + 'TOpenDialog.Execute()'#10 + + 'Displays the dialog'); +end; + +procedure TPyDelphiOpenDialog.SetDelphiObject(const Value: TOpenDialog); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TDialogRegistration.Create); +end. diff --git a/PythonForDelphi/Demos/Demo31/Project1.dpr b/PythonForDelphi/Demos/Demo31/Project1.dpr index e19c95d4..6f167359 100644 --- a/PythonForDelphi/Demos/Demo31/Project1.dpr +++ b/PythonForDelphi/Demos/Demo31/Project1.dpr @@ -5,14 +5,15 @@ program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}, + Unit2 in 'Unit2.pas' {TestForm}, WrapDelphiExtCtrls in '..\..\Components\Sources\Core\WrapDelphiExtCtrls.pas', WrapDelphiTypes in '..\..\Components\Sources\Core\WrapDelphiTypes.pas', - Unit2 in 'Unit2.pas' {TestForm}, WrapDelphiWindows in '..\..\Components\Sources\Core\WrapDelphiWindows.pas', WrapDelphiComCtrls in '..\..\Components\Sources\Core\WrapDelphiComCtrls.pas', WrapDelphiGrids in '..\..\Components\Sources\Core\WrapDelphiGrids.pas', WrapDelphiGraphics in '..\..\Components\Sources\Core\WrapDelphiGraphics.pas', - WrapDelphiButtons in '..\..\Components\Sources\Core\WrapDelphiButtons.pas'; + WrapDelphiButtons in '..\..\Components\Sources\Core\WrapDelphiButtons.pas', + WrapDelphiDialogs in '..\..\Components\Sources\Core\WrapDelphiDialogs.pas'; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo31/Project1.dproj b/PythonForDelphi/Demos/Demo31/Project1.dproj index f7200dc2..7713904b 100644 --- a/PythonForDelphi/Demos/Demo31/Project1.dproj +++ b/PythonForDelphi/Demos/Demo31/Project1.dproj @@ -4,10 +4,10 @@ Project1.dpr Debug DCC32 - 16.1 + 18.7 VCL True - Win64 + Win32 3 Application @@ -34,6 +34,18 @@ Base true + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + Project1 Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) @@ -49,6 +61,9 @@ 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 @@ -56,6 +71,9 @@ 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 false @@ -66,6 +84,16 @@ DEBUG;$(DCC_Define) + + Debug + true + 1033 + $(BDS)\bin\delphi_PROJECTICON.ico + true + + + Debug + MainSource @@ -73,16 +101,17 @@
    Form1
    - -
    TestForm
    - - - - - + + + + + + + + Cfg_2 Base @@ -136,13 +165,647 @@ 1.0.0.0 + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + True True + + + + Project1.exe + true + + + + + 1 + + + 0 + + + + + classes + 1 + + + + + res\xml + 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\values-v21 + 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-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 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 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + 12 + diff --git a/PythonForDelphi/Demos/Demo31/Project1.res b/PythonForDelphi/Demos/Demo31/Project1.res index b6d7cb1862f22932b2716dede182f78c170cd6c3..a04757b0aea42bc749f5f8f90968580f9e279181 100644 GIT binary patch literal 59020 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�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 literal 2040 zcma)7&u<$=6n@5*;#Poj;J~e`6$gYA+o5hmD;p*!ee1Lx=icl=!LxuWBaNxj=+~O!zmv3f&coPut?Ae+3zVH2**_j<8A_dL& zgNETHSx-gyGB{8mMY@)WNb9K*hCB3xzQgk#ZDUlUNAxxH8lLwt7V>lE&v!(^KZp_a zRf!UbfDsa!=qG7=LM}OEkVS1oGsq-{$QHH82L8R|6sd%&Zlje@gQ%!TS;UL@JMeLc z!`p_ZkX6cq6E%X5;6Db-rY7}BN7k!eSAFgxP6{jyUQwn+WkjFISv7!a$jVW`(3GqhHU?A^!}T={0T<(36A^?% zJrQ9Y8)PO4GbvLd#6IlL$6*SAgD@HoNfIOuLO)Biv{kQ5eD-=i8jh&zy0ZYUkH*>l z(u@7A5TEt?hr|An7vm4c^TU@HN3UXhG@73rd9UD4cOhHjgO?WAb@ZX_?8E4B5@K9?zuMsU*aLb^Ns>sdbnp`gt#!Q zKgu0UyaR-b$%81w4BTGVwiHm`xoE$e>lzg!)e+dVuzp|Oo^($5#2zsxv(uk z7cKp74csNs=HQ{F-l7+WAG<8=Ptl(~Nc;ZVCEtISLw^H(^&=8zR&31==^<^%Z%2(b z<(C9zDaFLO5T_wUijtA1LY$%${TiR8kK?nH{8p8#{f?>ZF^3zrRZ&;-MO9&zZZ{39 zT~WVj++X=ZRk*8JP0h3|R#69xtJN<*xL(#cXPsShpdf(7D{9ZN?r{An>u7wXW9W{} z?UuWu+nqZa@8tJZRi&d@MvHNGCz%bQ6s6o`U1l|rcp&wJ#oY+=gaDu@a}5rz;SNNE zK-@tWCGH#6&Ck_^)zUh!K8$M0e`{Dxd!Oew?M}zGRyJ+Rb!?L-JmU3O%NNBj0d;%3 zrlEhu1`Yce!-}olx_xVRt+ZMy>3VCm*-B7N&1(0wHgbQKuy!3=XPn#4hNC|Shy#iBawc@OV~H6J_1o?)^! z<1vUekKucLxVqRZb+*UM#Ud+;DGU`=<27p!YvUy5tSCKWLl@Jos4dOpOpPWh-dnj4 zNB>*$a^X^`OS-Z%APBo*4qHpQ3iZWhoVGy76O{?(t|0O}u-sf#l`#_FyBLx5^CxIE zF7sE}?(RyxP_Rsq>fyN12lxN&VsrD6z)&TT?6#ez9&Gyqrn)9mhqx~~ho9L}rQjLaxG+y{H$no@x2td?HEY7er3 z6Pa7m*OI!bWa*{d7dQV;36m+53HV(n*Tq2O9r_mRD7jZ23E3~teqdWJR^#MxILshY zlsfG%;g#Cf;cALNt_`)2eyNV+rMlw?B&sQ7TNbvt#TjVff>jz8v4FD~ z6g%7lLW!{_hzSV9yaYNOwFPx=*5Ejdn^>`MT+bPL9y`;PDrsp0%+M$Tp$$*0Wnh^; zGP#b^s}`M%7&zz-hw2tkNN8E?+*^z~mCL+10zuEX0yZ(V1e}L~AlV-I)XvT8raEsb z2G=mTZqOFctdwr}UXfeTGxRaph{{ck9x$(|){<|BC2yjSC^jaK@P{#SPwr)8vLlD+ T`d-c-u>pNk>H%|FQ3kikHp$Z8^=2IJa|=6;Nfb0@bk#sJC3jM|J$AocxJT zNrw&WY`D>2bJ)aC75XM-=DFn;R`fE0$)V~&vRgqxSs^#IBqKjXAwMZAHMxWh zt_5N-*sZ}nlQ-~Z38007^<*6Zc}9iFJ_6F4GXw&dl$2n4p&?sbQlt^=qp4u4q@w^~ zZ@w)g#L91ss&4Whan;RA5_OE|Vc>?Q?tr9)03tl00rN*(hCQ#OC_kq-cC)S&8=Iak zOc#iTC<;!^OGz!#^GnQ4)lpDaC{HX_NY2Sj&Q48H-<+hN#33t-&;!wtrWc%%U+$Zq zl9;10*-=w>@_CIAf~qF-K|=^)M#1FAnl~jS5JsaqXY)0!Q%u74n9`Fs>*{WPsN2aR zVuC5DGIR25}PZgg2`Kqj3+ Date: Sat, 19 Oct 2019 03:29:47 +0300 Subject: [PATCH 109/123] Eliminate warning in the previous commit. --- PythonForDelphi/Components/Sources/Core/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 8cccf7b3..2f1d6746 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -4842,7 +4842,7 @@ procedure TPythonEngine.Initialize; 'del sys, path, i, site'; begin if VenvPythonExe <> '' then - ExecString(Format(Script, [VenvPythonExe])); + ExecString(AnsiString(Format(Script, [VenvPythonExe]))); _path := PySys_GetObject('path'); if Assigned(FOnSysPathInit) then FOnSysPathInit(Self, _path); From 4cf3ece117c2893cb321d4aa8ae18be66a64596b Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 19 Oct 2019 23:36:19 +0300 Subject: [PATCH 110/123] Fix #92 --- .../Components/Sources/Core/PythonEngine.pas | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 2f1d6746..e7233294 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -2233,8 +2233,6 @@ TPythonEngine = class(TPythonInterface) FPyDateTime_TZInfoType: PPyObject; FPyDateTime_TimeTZType: PPyObject; FPyDateTime_DateTimeTZType: PPyObject; - function GetVersion: String; - procedure SetVersion(const Value: String); protected procedure AfterLoad; override; @@ -2361,7 +2359,6 @@ TPythonEngine = class(TPythonInterface) property PyFlags: TPythonFlags read FPyFlags write SetPyFlags default []; property RedirectIO: Boolean read FRedirectIO write FRedirectIO default True; property UseWindowsConsole: Boolean read FUseWindowsConsole write FUseWindowsConsole default False; - property Version : String read GetVersion write SetVersion stored False; property OnAfterInit: TNotifyEvent read FOnAfterInit write FOnAfterInit; property OnPathInitialization: TPathInitializationEvent read FOnPathInitialization write FOnPathInitialization; property OnSysPathInit: TSysPathInitEvent read FOnSysPathInit write FOnSysPathInit; @@ -6640,16 +6637,6 @@ function TPythonEngine.PyTZInfo_CheckExact( obj : PPyObject ) : Boolean; Result := Assigned(FPyDateTime_DateType) and (Pointer(obj^.ob_type) = FPyDateTime_TZInfoType); end; -function TPythonEngine.GetVersion: String; -begin - Result := '3.32'; -end; - -procedure TPythonEngine.SetVersion(const Value: String); -begin - // do nothing -end; - function TPythonEngine.PyString_AsDelphiString(ob: PPyObject): string; begin if PyUnicode_Check(ob) then From 91c0e88ac1dede615684095e3fbd90b0a1e96d0b Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 19 Oct 2019 23:40:00 +0300 Subject: [PATCH 111/123] Fix #89 --- .../Components/Sources/Core/PythonEngine.pas | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index e7233294..48aff6f5 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3643,7 +3643,12 @@ function TPythonInterface.GetUnicodeTypeSuffix : String; end; procedure TPythonInterface.MapDll; +Var + UnicodeSuffix : string; + begin + UnicodeSuffix := GetUnicodeTypeSuffix; + Py_DebugFlag := Import('Py_DebugFlag'); Py_VerboseFlag := Import('Py_VerboseFlag'); Py_InteractiveFlag := Import('Py_InteractiveFlag'); @@ -4055,12 +4060,12 @@ procedure TPythonInterface.MapDll; PyType_GenericAlloc :=Import('PyType_GenericAlloc'); PyType_GenericNew :=Import('PyType_GenericNew'); PyType_Ready :=Import('PyType_Ready'); - PyUnicode_FromWideChar :=Import(AnsiString(Format('PyUnicode%s_FromWideChar',[GetUnicodeTypeSuffix]))); - PyUnicode_AsWideChar :=Import(AnsiString(Format('PyUnicode%s_AsWideChar',[GetUnicodeTypeSuffix]))); - PyUnicode_Decode :=Import(AnsiString(Format('PyUnicode%s_Decode',[GetUnicodeTypeSuffix]))); - PyUnicode_AsEncodedString :=Import(AnsiString(Format('PyUnicode%s_AsEncodedString',[GetUnicodeTypeSuffix]))); - PyUnicode_FromOrdinal :=Import(AnsiString(Format('PyUnicode%s_FromOrdinal',[GetUnicodeTypeSuffix]))); - PyUnicode_GetSize :=Import(AnsiString(Format('PyUnicode%s_GetSize',[GetUnicodeTypeSuffix]))); + PyUnicode_FromWideChar :=Import(AnsiString(Format('PyUnicode%s_FromWideChar',[UnicodeSuffix]))); + PyUnicode_AsWideChar :=Import(AnsiString(Format('PyUnicode%s_AsWideChar',[UnicodeSuffix]))); + PyUnicode_Decode :=Import(AnsiString(Format('PyUnicode%s_Decode',[UnicodeSuffix]))); + PyUnicode_AsEncodedString :=Import(AnsiString(Format('PyUnicode%s_AsEncodedString',[UnicodeSuffix]))); + PyUnicode_FromOrdinal :=Import(AnsiString(Format('PyUnicode%s_FromOrdinal',[UnicodeSuffix]))); + PyUnicode_GetSize :=Import(AnsiString(Format('PyUnicode%s_GetSize',[UnicodeSuffix]))); PyWeakref_GetObject :=Import('PyWeakref_GetObject'); PyWeakref_NewProxy :=Import('PyWeakref_NewProxy'); PyWeakref_NewRef :=Import('PyWeakref_NewRef'); From 5aee50231b96c2642d37178b56b684f01493ec08 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 21 Oct 2019 17:18:47 +0300 Subject: [PATCH 112/123] Preparing for Extended RTTI implementation --- PythonForDelphi/Components/Sources/Core/Definition.Inc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PythonForDelphi/Components/Sources/Core/Definition.Inc b/PythonForDelphi/Components/Sources/Core/Definition.Inc index f7269306..c57287a7 100644 --- a/PythonForDelphi/Components/Sources/Core/Definition.Inc +++ b/PythonForDelphi/Components/Sources/Core/Definition.Inc @@ -541,4 +541,7 @@ {$ENDIF DARWIN} {$ENDIF FPC} +{$IFDEF DELPHIXE_OR_HIGHER} + {$DEFINE EXTENDED_RTTI} +{$ENDIF DELPHIXE_OR_HIGHER} From bf3357e0a75dfbce8114488809c3527321e86218 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 23 Oct 2019 00:59:20 +0300 Subject: [PATCH 113/123] Optimized CleanString and improved the way it is used. --- .../Components/Sources/Core/PythonEngine.pas | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 48aff6f5..8e5425b3 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -2269,7 +2269,7 @@ TPythonEngine = class(TPythonInterface) procedure SetProgramName(const ProgramName: string); function IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; function GetAttrString(obj: PPyObject; AName: PAnsiChar):PAnsiChar; - function CleanString(const s : AnsiString) : AnsiString; + function CleanString(const s : AnsiString; AppendLF : Boolean = True) : AnsiString; function Run_CommandAsString(const command : AnsiString; mode : Integer) : String; function Run_CommandAsObject(const command : AnsiString; mode : Integer) : PPyObject; function Run_CommandAsObjectWithDict(const command : AnsiString; mode : Integer; locals, globals : PPyObject) : PPyObject; @@ -5224,7 +5224,7 @@ function TPythonEngine.GetAttrString(obj: PPyObject; AName: PAnsiChar):PAnsiChar PyErr_Clear; end; -function TPythonEngine.CleanString(const s : AnsiString) : AnsiString; +function TPythonEngine.CleanString(const s : AnsiString; AppendLF : Boolean) : AnsiString; var i : Integer; begin @@ -5235,9 +5235,9 @@ function TPythonEngine.CleanString(const s : AnsiString) : AnsiString; while i > 0 do begin Delete( result, i, 1 ); - i := Pos(AnsiString(CR),result); + i := Pos(AnsiString(CR),result, i); end; - if result[length(result)] <> LF then + if AppendLF and (result[length(result)] <> LF) then Insert( LF, result, length(result)+1 ); end; @@ -6801,7 +6801,8 @@ function TEventDef.GetDisplayName: string; function TEventDef.GetDocString : AnsiString; begin Owner.Container.CheckEngine; - FTmpDocString := Owner.Container.Engine.CleanString(AnsiString(FDocString.Text)); + FTmpDocString := + Owner.Container.Engine.CleanString(AnsiString(FDocString.Text), False); Result := fTmpDocString; end; @@ -7576,7 +7577,9 @@ procedure TPythonModule.DefineDocString; begin if DocString.Text <> '' then begin - doc := PyString_FromString( PAnsiChar(CleanString(AnsiString(FDocString.Text))) ); + doc := + PyString_FromString(PAnsiChar(CleanString(EncodeString(FDocString.Text), + False)) ); PyObject_SetAttrString( FModule, '__doc__', doc ); Py_XDecRef(doc); CheckError(False); @@ -8823,8 +8826,9 @@ procedure TPythonType.InitServices; begin // Basic services if FDocString.Count > 0 then + With Engine do begin - FCurrentDocString := GetPythonEngine.CleanString(AnsiString(FDocString.Text)); + FCurrentDocString := CleanString(EncodeString(FDocString.Text), False); tp_doc := PAnsiChar(FCurrentDocString); end; tp_dealloc := @PyObjectDestructor; From 79a7ac88179585265607604ae37fa05effffc040 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 23 Oct 2019 02:02:01 +0300 Subject: [PATCH 114/123] Make the last commit FPC compatible. (Use PosEx instead of Pos). --- .../Components/Sources/Core/PythonEngine.pas | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 8e5425b3..1a34ff7e 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3196,8 +3196,15 @@ procedure MaskFPUExceptions(ExceptionsMasked : boolean; implementation +uses +{$IFDEF FPC} + StrUtils, +{$ELSE} + AnsiStrings, +{$ENDIF} {$IFDEF MSWINDOWS} -uses Math, Registry; + Math, + Registry; {$ENDIF} @@ -5235,7 +5242,7 @@ function TPythonEngine.CleanString(const s : AnsiString; AppendLF : Boolean) : A while i > 0 do begin Delete( result, i, 1 ); - i := Pos(AnsiString(CR),result, i); + i := PosEx(AnsiString(CR),result, i); end; if AppendLF and (result[length(result)] <> LF) then Insert( LF, result, length(result)+1 ); From 816f7dd3300b9104c3c1cff5fc62f9fbc69a18e5 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 23 Oct 2019 02:17:58 +0300 Subject: [PATCH 115/123] Avoid calling CleanString twice. --- .../Components/Sources/Core/PythonEngine.pas | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 1a34ff7e..0b1d37a1 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -5381,12 +5381,12 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command : AnsiString; m procedure TPythonEngine.ExecStrings( strings : TStrings ); begin - Py_XDecRef( Run_CommandAsObject( CleanString( EncodeString(strings.Text) ), file_input ) ); + Py_XDecRef( Run_CommandAsObject( EncodeString(strings.Text) , file_input ) ); end; function TPythonEngine.EvalStrings( strings : TStrings ) : PPyObject; begin - Result := Run_CommandAsObject( CleanString( EncodeString(strings.Text) ), eval_input ); + Result := Run_CommandAsObject( EncodeString(strings.Text) , eval_input ); end; procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : PPyObject ); @@ -5396,7 +5396,7 @@ procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : procedure TPythonEngine.ExecStrings( strings : TStrings; locals, globals : PPyObject ); begin - Py_XDecRef( Run_CommandAsObjectWithDict( CleanString( EncodeString(strings.Text) ), file_input, locals, globals ) ); + Py_XDecRef( Run_CommandAsObjectWithDict( EncodeString(strings.Text), file_input, locals, globals ) ); end; function TPythonEngine.EvalString( const command : AnsiString; locals, globals : PPyObject ) : PPyObject; @@ -5406,12 +5406,12 @@ function TPythonEngine.EvalString( const command : AnsiString; locals, globals : function TPythonEngine.EvalStrings( strings : TStrings; locals, globals : PPyObject ) : PPyObject; begin - Result := Run_CommandAsObjectWithDict( CleanString( EncodeString(strings.Text) ), eval_input, locals, globals ); + Result := Run_CommandAsObjectWithDict( EncodeString(strings.Text), eval_input, locals, globals ); end; function TPythonEngine.EvalStringsAsStr( strings : TStrings ) : String; begin - Result := Run_CommandAsString( CleanString( EncodeString(strings.Text) ), eval_input ); + Result := Run_CommandAsString( EncodeString(strings.Text), eval_input ); end; function TPythonEngine.CheckEvalSyntax( const str : AnsiString ) : Boolean; From 6b88fc29d2857b25dc075633d16a2881c877acd3 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 23 Oct 2019 15:08:34 +0300 Subject: [PATCH 116/123] tp_compare is not available in Python 3. In fact the slot is now used for something else. Use bsRichCompare instead of bsCompare Default implementation of RichCompare in TPyObject (moved up from TPyDelphiObject) using the Compare method. --- .../Components/Sources/Core/PythonEngine.pas | 19 ++++++- .../Components/Sources/Core/WrapDelphi.pas | 50 +------------------ .../Sources/Core/WrapDelphiTypes.pas | 6 +-- 3 files changed, 22 insertions(+), 53 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 0b1d37a1..16e347ab 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -7970,8 +7970,23 @@ function TPyObject.Clear: integer; end; function TPyObject.RichCompare( obj : PPyObject; Op : TRichComparisonOpcode) : PPyObject; -begin - Result := nil; +Var + Res : Boolean; +begin + Res := False; + case Op of + pyLT: Res := Compare(obj) < 0; + pyLE: Res := Compare(obj) <= 0; + pyEQ: Res := Compare(obj) = 0; + pyNE: Res := Compare(obj) <> 0; + pyGT: Res := Compare(obj) > 0; + pyGE: Res := Compare(obj) >= 0; + end; + if Res then + Result := PPyObject(GetPythonEngine.Py_True) + else + Result := PPyObject(GetPythonEngine.Py_False); + GetPythonEngine.Py_INCREF( Result ); end; function TPyObject.Iter : PPyObject; diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas index 6ac6df6c..3b91d535 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas @@ -545,7 +545,6 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) function SetAttrO( key, value: PPyObject) : Integer; override; // Objects are equal when they refer to the same DelphiObject function Compare( obj: PPyObject) : Integer; override; - function RichCompare( obj : PPyObject; Op : TRichComparisonOpcode) : PPyObject; override; function Repr : PPyObject; override; // automatic iterator support when the wrapper implements IContainerAccessProvider function Iter : PPyObject; override; @@ -590,7 +589,6 @@ TPyDelphiVarParameter = class(TPyObject) public destructor Destroy; override; - function Compare( obj: PPyObject) : Integer; override; function RichCompare( obj : PPyObject; Op : TRichComparisonOpcode) : PPyObject; override; function Repr : PPyObject; override; @@ -1803,27 +1801,6 @@ function TPyDelphiObject.Repr: PPyObject; [DelphiObjectClass.ClassName, NativeInt(Self)]))) ); end; -function TPyDelphiObject.RichCompare(obj: PPyObject; - Op: TRichComparisonOpcode): PPyObject; -Var - Res : Boolean; -begin - Res := False; - case Op of - pyLT: Res := Compare(obj) < 0; - pyLE: Res := Compare(obj) <= 0; - pyEQ: Res := Compare(obj) = 0; - pyNE: Res := Compare(obj) <> 0; - pyGT: Res := Compare(obj) > 0; - pyGE: Res := Compare(obj) >= 0; - end; - if Res then - Result := PPyObject(GetPythonEngine.Py_True) - else - Result := PPyObject(GetPythonEngine.Py_False); - GetPythonEngine.Py_INCREF( Result ); -end; - function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; function HandleEvent(PropInfo: PPropInfo) : Integer; @@ -1991,7 +1968,7 @@ class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType, tpfHaveRichCompare]; PythonType.GenerateCreateFunction := False; PythonType.DocString.Text := 'Wrapper for Delphi ' + DelphiObjectClass.ClassName; - PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsCompare, bsRichCompare]; + PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; _ContainerAccessClass := GetContainerAccessClass; if Assigned(_ContainerAccessClass) then begin @@ -2195,29 +2172,6 @@ class procedure TPyDelphiMethodObject.SetupType( PythonType : TPythonType ); { TPyDelphiVarParameter } -function TPyDelphiVarParameter.Compare(obj: PPyObject): Integer; -var - _value : PPyObject; -begin - with GetPythonEngine do - begin - if Self.Value = nil then - _value := Py_None - else - _value := Self.Value; - if IsPython3000 then begin - if PyObject_RichCompareBool(_value, obj, PY_LT) = 1 then - Result := -1 - else if PyObject_RichCompareBool(_value, obj, PY_EQ) = 1 then - Result := 0 - else - Result := 1; - PyErr_Clear; - end else - Result := PyObject_Compare(_value, obj); - end; -end; - destructor TPyDelphiVarParameter.Destroy; begin Value := nil; @@ -2284,7 +2238,7 @@ class procedure TPyDelphiVarParameter.SetupType(PythonType: TPythonType); PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; PythonType.GenerateCreateFunction := False; PythonType.DocString.Text := 'Container object allowing modification of Delphi var parameters from Python'; - PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsCompare]; + PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; end; procedure TPyDelphiVarParameter.SetValue(const Value: PPyObject); diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiTypes.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiTypes.pas index 64a14f6c..a4e43513 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiTypes.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiTypes.pas @@ -290,7 +290,7 @@ class procedure TPyDelphiPoint.SetupType(PythonType: TPythonType); PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; PythonType.GenerateCreateFunction := False; PythonType.DocString.Text := 'wrapper for Delphi TPoint type'; - PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsCompare]; + PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; end; function TPyDelphiPoint.Set_X(AValue: PPyObject; @@ -523,7 +523,7 @@ class procedure TPyDelphiRect.SetupType(PythonType: TPythonType); PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; PythonType.GenerateCreateFunction := False; PythonType.DocString.Text := 'wrapper for Delphi TRect type'; - PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsCompare]; + PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; end; @@ -599,7 +599,7 @@ class procedure TPyDelphiSize.SetupType(PythonType: TPythonType); PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; PythonType.GenerateCreateFunction := False; PythonType.DocString.Text := 'wrapper for Delphi TSize type'; - PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsCompare]; + PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; end; function TPyDelphiSize.Set_CX(AValue: PPyObject; From 3815a9863ef5fa769df04a8111e264e8e0bef079 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 24 Oct 2019 03:32:53 +0300 Subject: [PATCH 117/123] Added PyString_FromDelphiString to avoid unnecessary string conversions. Replaced calls to PyString_FromString with calls to PyString_FromDelphi string Refactored WrapDelphi units --- .../Components/Sources/Core/PythonEngine.pas | 31 +- .../Sources/Core/WrapDelphiActnList.pas | 16 +- .../Sources/Core/WrapDelphiClasses.pas | 108 +- .../Sources/Core/WrapDelphiComCtrls.pas | 134 +- .../Sources/Core/WrapDelphiControls.pas | 132 +- .../Sources/Core/WrapDelphiDialogs.pas | 11 +- .../Sources/Core/WrapDelphiForms.pas | 1049 ++++---- .../Sources/Core/WrapDelphiGraphics.pas | 924 +++---- .../Sources/Core/WrapDelphiGrids.pas | 185 +- .../Sources/Core/WrapDelphiStdCtrls.pas | 48 +- .../Sources/Core/WrapDelphiTypes.pas | 184 +- .../Components/Sources/Core/WrapFireDAC.pas | 2214 ++++++++--------- .../Components/Sources/VCL/pyDB.pas | 4 +- 13 files changed, 2301 insertions(+), 2739 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 16e347ab..99ab4751 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -2132,7 +2132,6 @@ TPythonInterface=class(TDynamicDll) function Py_InitModule( const AName : PAnsiChar; md : PPyMethodDef) : PPyObject; function Py_InitModule3000( const md : PyModuleDef) : PPyObject; function PyString_FromString( str: PAnsiChar): PPyObject; virtual; abstract; - function PyString_AsDelphiString( ob: PPyObject): string; virtual; abstract; procedure Py_FlushLine; cdecl; // Constructors & Destructors @@ -2335,7 +2334,8 @@ TPythonEngine = class(TPythonInterface) function PyTZInfo_CheckExact( obj : PPyObject ) : Boolean; { end date/time functions } function PyString_FromString( str: PAnsiChar): PPyObject; override; - function PyString_AsDelphiString( ob: PPyObject): string; override; + function PyString_FromDelphiString(str : string): PPyObject; + function PyString_AsDelphiString( ob: PPyObject): string; function PyString_AsAnsiString( ob: PPyObject): AnsiString; function PyString_AsWideString( ob: PPyObject): UnicodeString; @@ -6390,7 +6390,7 @@ function TPythonEngine.StringsToPyList( strings : TStrings ) : PPyObject; raise EPythonError.Create('Could not create a new list object'); for i := 0 to strings.Count - 1 do PyList_SetItem( Result, i, - PyString_FromString( PAnsiChar(AnsiString(strings.Strings[i])) ) ); + PyString_FromDelphiString( strings.Strings[i]) ); end; function TPythonEngine.StringsToPyTuple( strings : TStrings ) : PPyObject; @@ -6402,7 +6402,7 @@ function TPythonEngine.StringsToPyTuple( strings : TStrings ) : PPyObject; raise EPythonError.Create('Could not create a new tuple object'); for i := 0 to strings.Count - 1 do PyTuple_SetItem( Result, i, - PyString_FromString( PAnsiChar(AnsiString(strings.Strings[i])) ) ); + PyString_FromDelphiString( strings.Strings[i]) ); end; procedure TPythonEngine.PyListToStrings( list : PPyObject; strings : TStrings ); @@ -6673,6 +6673,16 @@ function TPythonEngine.PyString_AsWideString( ob: PPyObject): UnicodeString; Result := UnicodeString(PyString_AsString(ob)); end; +function TPythonEngine.PyString_FromDelphiString(str: string): PPyObject; +begin + if IsPython3000 then + begin + Result := PyUnicode_FromWideString(str); + end + else + Result := DLL_PyString_FromString(PAnsiChar(AnsiString(str))); +end; + function TPythonEngine.PyString_FromString( str: PAnsiChar): PPyObject; var _text : UnicodeString; @@ -7585,8 +7595,7 @@ procedure TPythonModule.DefineDocString; if DocString.Text <> '' then begin doc := - PyString_FromString(PAnsiChar(CleanString(EncodeString(FDocString.Text), - False)) ); + PyString_FromDelphiString(AdjustLineBreaks(FDocString.Text,tlbsLF)); PyObject_SetAttrString( FModule, '__doc__', doc ); Py_XDecRef(doc); CheckError(False); @@ -7924,9 +7933,9 @@ function TPyObject.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; function TPyObject.Repr : PPyObject; begin - with GetPythonEngine do - Result := - PyString_FromString( PAnsiChar(AnsiString(Format('<%s at %x>', [PythonType.TypeName, NativeInt(self)]))) ); + Result := + GetPythonEngine.PyString_FromDelphiString( Format('<%s at %x>', + [PythonType.TypeName, NativeInt(self)]) ); end; function TPyObject.Compare( obj: PPyObject) : Integer; @@ -9429,8 +9438,8 @@ function TPyVar.Repr : PPyObject; obj := GetValue; try Result := - PyString_FromString( PAnsiChar(AnsiString(Format('<%s: %s>', - [PythonType.TypeName, PyObjectAsString(obj)]))) ); + PyString_FromDelphiString( Format('<%s: %s>', + [PythonType.TypeName, PyObjectAsString(obj)]) ); finally Py_XDecRef(obj); end; diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiActnList.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiActnList.pas index 30dc7858..3d929408 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiActnList.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiActnList.pas @@ -96,20 +96,16 @@ function TPyDelphiCustomActionList.GetDelphiObject: TCustomActionList; function TPyDelphiCustomActionList.Get_ActionCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.ActionCount); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.ActionCount); end; function TPyDelphiCustomActionList.Get_Actions(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TActionListAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); - end; + Adjust(@Self); + Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TActionListAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; class procedure TPyDelphiCustomActionList.RegisterGetSets( diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas index 8bd1932f..dd032ee3 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas @@ -292,7 +292,7 @@ function ShiftToPython(AShift : TShiftState) : PPyObject; begin with GetPythonEngine do begin - _item := PyString_FromString(PAnsiChar(AnsiString(AString))); + _item := PyString_FromDelphiString(AString); PyList_Append(AList, _item); Py_XDecRef(_item); end; @@ -338,15 +338,12 @@ function TPyDelphiPersistent.Assign_Wrapper(args: PPyObject): PPyObject; var _obj : PPyObject; begin - with GetPythonEngine do - begin - // We adjust the transmitted self argument - Adjust(@Self); - if PyArg_ParseTuple( args, 'O:Assign',@_obj ) <> 0 then - Result := Self.Assign(_obj) - else - Result := nil; - end; + // We adjust the transmitted self argument + Adjust(@Self); + if GetPythonEngine.PyArg_ParseTuple( args, 'O:Assign',@_obj ) <> 0 then + Result := Self.Assign(_obj) + else + Result := nil; end; class function TPyDelphiPersistent.DelphiObjectClass: TClass; @@ -362,11 +359,11 @@ function TPyDelphiPersistent.GetDelphiObject: TPersistent; function TPyDelphiPersistent.GetNamePath_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':GetNamePath' ) <> 0 then begin - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.GetNamePath))) + Result := PyString_FromDelphiString(DelphiObject.GetNamePath) end else Result := nil; end; @@ -536,28 +533,22 @@ function TPyDelphiCollection.GetDelphiObject: TCollection; function TPyDelphiCollection.Get_Count(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Count); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Count); end; function TPyDelphiCollection.Get_Items(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, Self.ContainerAccess.Clone); - end; + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, Self.ContainerAccess.Clone); end; function TPyDelphiCollection.Get_Owner(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Owner); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Owner); end; function TPyDelphiCollection.Insert_Wrapper(args: PPyObject): PPyObject; @@ -730,10 +721,10 @@ function TPyDelphiComponent.BindMethodsToEvents(args: PPyObject): PPyObject; _bindings : PPyObject; _type : PPyTypeObject; begin + Adjust(@Self); _prefix := 'handle_'; with GetPythonEngine do begin // We adjust the transmitted self argument - Adjust(@Self); Result := nil; s := nil; if PyArg_ParseTuple( args, '|O:BindMethodsToEvents',@s ) <> 0 then @@ -808,8 +799,8 @@ function TPyDelphiComponent.BindMethodsToEvents(args: PPyObject): PPyObject; else begin _pair := PyTuple_New(3); - PyTuple_SetItem(_pair, 0, PyString_FromString(PAnsiChar(AnsiString(_compName)))); - PyTuple_SetItem(_pair, 1, PyString_FromString(PAnsiChar(AnsiString(_eventName)))); + PyTuple_SetItem(_pair, 0, PyString_FromDelphiString(_compName)); + PyTuple_SetItem(_pair, 1, PyString_FromDelphiString(_eventName)); PyTuple_SetItem(_pair, 2, objMethod); PyList_Append(_bindings, _pair); end; @@ -839,36 +830,30 @@ function TPyDelphiComponent.BindMethodsToEvents(args: PPyObject): PPyObject; function TPyDelphiComponent.Get_ComponentCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.ComponentCount); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.ComponentCount); end; function TPyDelphiComponent.Get_Components(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, Self.ContainerAccess.Clone); - end; + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, Self.ContainerAccess.Clone); end; function TPyDelphiComponent.Get_Owner(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Owner); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Owner); end; function TPyDelphiComponent.GetParentComponent_Wrapper( args: PPyObject): PPyObject; begin + Adjust(@Self); with GetPythonEngine do begin // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':GetParentComponent') <> 0 then begin Result := Wrap(DelphiObject.GetParentComponent) end else @@ -878,9 +863,9 @@ function TPyDelphiComponent.GetParentComponent_Wrapper( function TPyDelphiComponent.HasParent_Wrapper(args: PPyObject): PPyObject; begin + Adjust(@Self); with GetPythonEngine do begin // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':HasParent') <> 0 then begin Result := VariantAsPyObject(DelphiObject.HasParent) end else @@ -1071,7 +1056,7 @@ function TStringsAccess.GetContainer: TStrings; function TStringsAccess.GetItem(AIndex: Integer): PPyObject; begin - Result := GetPythonEngine.PyString_FromString( PAnsiChar(AnsiString(Container[AIndex])) ); + Result := GetPythonEngine.PyString_FromDelphiString( Container[AIndex] ); end; function TStringsAccess.GetSize: Integer; @@ -1302,28 +1287,24 @@ function TPyDelphiStrings.GetDelphiObject: TStrings; function TPyDelphiStrings.Get_Capacity(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Capacity); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Capacity); end; function TPyDelphiStrings.Get_Objects(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TStringsObjectsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); - end; + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TStringsObjectsAccess.Create(Self.PyDelphiWrapper, + Self.DelphiObject)); end; function TPyDelphiStrings.Get_Text(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(GetPythonEngine.CleanString(AnsiString(DelphiObject.Text)))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString( + AdjustLineBreaks(DelphiObject.Text, tlbsLF)); end; function TPyDelphiStrings.IndexOf_Wrapper(args: PPyObject): PPyObject; @@ -1438,9 +1419,8 @@ class procedure TPyDelphiStrings.RegisterMethods(PythonType: TPythonType); function TPyDelphiStrings.Repr: PPyObject; begin - with GetPythonEngine do - Result := PyString_FromString( PAnsiChar(AnsiString(Format('', - [NativeInt(self)]))) ); + Result := GetPythonEngine.PyString_FromDelphiString( Format('', + [NativeInt(self)]) ); end; function TPyDelphiStrings.SaveToFile_Wrapper(args: PPyObject): PPyObject; diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiComCtrls.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiComCtrls.pas index e2c0b6c9..b1f5162e 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiComCtrls.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiComCtrls.pas @@ -169,15 +169,15 @@ class function TPyDelphiPageControl.DelphiObjectClass: TClass; function TPyDelphiPageControl.FindNextPage_Wrapper( args: PPyObject): PPyObject; +// function FindNextPage(CurPage: TTabSheet; GoForward, CheckTabVisible: Boolean): TTabSheet; var _CurPage: TObject; _pCurPage: PPyObject; _pGoForward, _pCheckTabVisible: PPyObject; begin - // function FindNextPage(CurPage: TTabSheet; GoForward, CheckTabVisible: Boolean): TTabSheet; + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'OOO:FindNextPage',@_pCurPage, @_pGoForward, @_pCheckTabVisible ) <> 0 then begin if CheckObjAttribute(_pCurPage, 'CurPage', TTabSheet, _CurPage) then Result := Wrap( DelphiObject.FindNextPage(TTabSheet(_CurPage), PyObject_IsTrue(_pGoForward)<>0, PyObject_IsTrue(_pCheckTabVisible)<>0) ) @@ -203,7 +203,7 @@ function TPyDelphiPageControl.GetHitTestInfoAt_Wrapper( begin with GetPythonEngine do begin - _text := PyString_FromString(PAnsiChar(AnsiString(AText))); + _text := PyString_FromDelphiString(AText); PyList_Append(Result, _text); Py_DecRef(_text); end; @@ -213,9 +213,9 @@ function TPyDelphiPageControl.GetHitTestInfoAt_Wrapper( x, y: Integer; _result : THitTests; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'ii:GetHitTestInfoAt',@x, @y ) <> 0 then begin _result := DelphiObject.GetHitTestInfoAt(x, y); Result := PyList_New(0); @@ -257,10 +257,8 @@ function TPyDelphiPageControl.Get_ActivePage(AContext: Pointer): PPyObject; function TPyDelphiPageControl.Get_ActivePageIndex( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.ActivePageIndex); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.ActivePageIndex); end; {$IFNDEF FPC} @@ -272,29 +270,23 @@ function TPyDelphiPageControl.Get_Canvas(AContext: Pointer): PPyObject; function TPyDelphiPageControl.Get_PageCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.PageCount); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.PageCount); end; function TPyDelphiPageControl.Get_Pages(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TPagesAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); - end; + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TPagesAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; {$IFNDEF FPC} function TPyDelphiPageControl.Get_RowCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.RowCount); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.RowCount); end; function TPyDelphiPageControl.IndexOfTabAt_Wrapper( @@ -302,9 +294,9 @@ function TPyDelphiPageControl.IndexOfTabAt_Wrapper( var x, y: Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'ii:IndexOfTabAt',@x, @y ) <> 0 then begin Result := VariantAsPyObject( DelphiObject.IndexOfTabAt(x, y) ); end else @@ -369,9 +361,9 @@ function TPyDelphiPageControl.ScrollTabs_Wrapper( var delta: Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'i:ScrollTabs',@delta ) <> 0 then begin DelphiObject.ScrollTabs(delta); Result := ReturnNone; @@ -383,13 +375,13 @@ function TPyDelphiPageControl.ScrollTabs_Wrapper( function TPyDelphiPageControl.SelectNextPage_Wrapper( args: PPyObject): PPyObject; +// procedure SelectNextPage(GoForward: Boolean; CheckTabVisible: Boolean = True); var _pGoForward, _pCheckTabVisible: PPyObject; begin - // procedure SelectNextPage(GoForward: Boolean; CheckTabVisible: Boolean = True); + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'OO:SelectNextPage',@_pGoForward, @_pCheckTabVisible ) <> 0 then begin DelphiObject.SelectNextPage(PyObject_IsTrue(_pGoForward)<>0, PyObject_IsTrue(_pCheckTabVisible)<>0); Result := ReturnNone; @@ -409,16 +401,14 @@ function TPyDelphiPageControl.Set_ActivePage(AValue: PPyObject; var _object : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'ActivePage', TTabSheet, _object) then - begin - Self.DelphiObject.ActivePage := TTabSheet(_object); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'ActivePage', TTabSheet, _object) then + begin + Self.DelphiObject.ActivePage := TTabSheet(_object); + Result := 0; + end + else + Result := -1; end; function TPyDelphiPageControl.Set_ActivePageIndex(AValue: PPyObject; @@ -426,30 +416,26 @@ function TPyDelphiPageControl.Set_ActivePageIndex(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'ActivePageIndex', _value) then - begin - DelphiObject.ActivePageIndex := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'ActivePageIndex', _value) then + begin + DelphiObject.ActivePageIndex := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiPageControl.TabRect_Wrapper(args: PPyObject): PPyObject; var idx: Integer; begin - with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); - if PyArg_ParseTuple( args, 'i:TabRect',@idx ) <> 0 then begin - Result := WrapRect(PyDelphiWrapper, DelphiObject.TabRect(idx)); - end else - Result := nil; - end; + // We adjust the transmitted self argument + Adjust(@Self); + if GetPythonEngine.PyArg_ParseTuple( args, 'i:TabRect',@idx ) <> 0 then begin + Result := WrapRect(PyDelphiWrapper, DelphiObject.TabRect(idx)); + end else + Result := nil; end; { TPyDelphiTabSheet } @@ -466,18 +452,14 @@ function TPyDelphiTabSheet.GetDelphiObject: TTabSheet; function TPyDelphiTabSheet.Get_PageControl(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.PageControl); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.PageControl); end; function TPyDelphiTabSheet.Get_TabIndex(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.TabIndex); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.TabIndex); end; class procedure TPyDelphiTabSheet.RegisterGetSets(PythonType: TPythonType); @@ -499,16 +481,14 @@ function TPyDelphiTabSheet.Set_PageControl(AValue: PPyObject; var _object : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'PageControl', TPageControl, _object) then - begin - Self.DelphiObject.PageControl := TPageControl(_object); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'PageControl', TPageControl, _object) then + begin + Self.DelphiObject.PageControl := TPageControl(_object); + Result := 0; + end + else + Result := -1; end; { TPagesAccess } diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiControls.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiControls.pas index 211a5815..e055d488 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiControls.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiControls.pas @@ -192,9 +192,9 @@ procedure TControlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap function TPyDelphiControl.BringToFront_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':BringToFront') <> 0 then begin DelphiObject.BringToFront; Result := ReturnNone; @@ -209,9 +209,9 @@ function TPyDelphiControl.ClientToScreen_Wrapper( p : TPoint; pt : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:ClientToScreen',@pt ) <> 0 then begin if CheckPointAttribute(pt, 'point', p) then Result := WrapPoint(PyDelphiWrapper, DelphiObject.ClientToScreen(p)) @@ -234,17 +234,15 @@ function TPyDelphiControl.GetDelphiObject: TControl; function TPyDelphiControl.Get_Parent(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Parent); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Parent); end; function TPyDelphiControl.Hide_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Hide') <> 0 then begin DelphiObject.Hide; Result := ReturnNone; @@ -255,9 +253,9 @@ function TPyDelphiControl.Hide_Wrapper(args: PPyObject): PPyObject; function TPyDelphiControl.Invalidate_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Invalidate') <> 0 then begin DelphiObject.Invalidate; Result := ReturnNone; @@ -310,9 +308,9 @@ class procedure TPyDelphiControl.RegisterMethods(PythonType: TPythonType); function TPyDelphiControl.Repaint_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Repaint') <> 0 then begin DelphiObject.Repaint; Result := ReturnNone; @@ -327,24 +325,22 @@ function TPyDelphiControl.ScreenToClient_Wrapper( p : TPoint; pt : PPyObject; begin - with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); - if PyArg_ParseTuple( args, 'O:ScreenToClient',@pt ) <> 0 then begin - if CheckPointAttribute(pt, 'point', p) then - Result := WrapPoint(PyDelphiWrapper, DelphiObject.ScreenToClient(p)) - else - Result := nil; - end else + // We adjust the transmitted self argument + Adjust(@Self); + if GetPythonEngine.PyArg_ParseTuple( args, 'O:ScreenToClient',@pt ) <> 0 then begin + if CheckPointAttribute(pt, 'point', p) then + Result := WrapPoint(PyDelphiWrapper, DelphiObject.ScreenToClient(p)) + else Result := nil; - end; + end else + Result := nil; end; function TPyDelphiControl.SendToBack_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':SendToBack') <> 0 then begin DelphiObject.SendToBack; Result := ReturnNone; @@ -360,9 +356,9 @@ function TPyDelphiControl.SetBounds_Wrapper(args: PPyObject): PPyObject; _width : Integer; _height : Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'iiii:SetBounds',@_left, @_top, @_width, @_height ) <> 0 then begin DelphiObject.SetBounds(_left, _top, _width, _height); Result := ReturnNone; @@ -381,23 +377,21 @@ function TPyDelphiControl.Set_Parent(AValue: PPyObject; var _object : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'Parent', TWinControl, _object) then - begin - Self.DelphiObject.Parent := TWinControl(_object); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'Parent', TWinControl, _object) then + begin + Self.DelphiObject.Parent := TWinControl(_object); + Result := 0; + end + else + Result := -1; end; function TPyDelphiControl.Show_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Show') <> 0 then begin DelphiObject.Show; Result := ReturnNone; @@ -408,9 +402,9 @@ function TPyDelphiControl.Show_Wrapper(args: PPyObject): PPyObject; function TPyDelphiControl.Update_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Update') <> 0 then begin DelphiObject.Update; Result := ReturnNone; @@ -497,9 +491,9 @@ class function TControlsAccess.SupportsIndexOf: Boolean; function TPyDelphiWinControl.CanFocus_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':CanFocus') <> 0 then begin Result := VariantAsPyObject(DelphiObject.CanFocus) end else @@ -519,62 +513,48 @@ function TPyDelphiWinControl.GetDelphiObject: TWinControl; function TPyDelphiWinControl.Get_ControlCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.ControlCount); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.ControlCount); end; function TPyDelphiWinControl.Get_Controls(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TControlsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); - end; + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TControlsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; function TPyDelphiWinControl.Get_Focused(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.Focused); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.Focused); end; function TPyDelphiWinControl.Get_Handle(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Handle); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Handle); end; function TPyDelphiWinControl.Get_HandleAllocated( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.HandleAllocated); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.HandleAllocated); end; function TPyDelphiWinControl.Get_ParentWindow( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.ParentWindow); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.ParentWindow); end; function TPyDelphiWinControl.Get_Showing(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.Showing); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.Showing); end; class procedure TPyDelphiWinControl.RegisterGetSets( @@ -616,9 +596,9 @@ procedure TPyDelphiWinControl.SetDelphiObject(const Value: TWinControl); function TPyDelphiWinControl.SetFocus_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':SetFocus') <> 0 then begin DelphiObject.SetFocus; Result := ReturnNone; diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiDialogs.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiDialogs.pas index 9014c101..6e9b4630 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiDialogs.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiDialogs.pas @@ -71,9 +71,9 @@ function TPyDelphiOpenDialog.GetDelphiObject: TOpenDialog; function TPyDelphiOpenDialog.Execute_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Execute') <> 0 then Result := VariantAsPyObject(DelphiObject.Execute()) else @@ -83,11 +83,8 @@ function TPyDelphiOpenDialog.Execute_Wrapper(args: PPyObject): PPyObject; function TPyDelphiOpenDialog.Get_filename(AContext: Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@self); - Result := VariantAsPyObject(DelphiObject.FileName); - end; + Adjust(@self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.FileName); end; class procedure TPyDelphiOpenDialog.RegisterGetSets(PythonType: TPythonType); diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiForms.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiForms.pas index f45f4867..feb95722 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiForms.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiForms.pas @@ -453,10 +453,10 @@ procedure TFormsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper function TPyDelphiCustomForm.Close_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); - if PyArg_ParseTuple( args, ':Close') <> 0 then begin + if GetPythonEngine.PyArg_ParseTuple( args, ':Close') <> 0 then begin DelphiObject.Close; Result := ReturnNone; end else @@ -466,9 +466,9 @@ function TPyDelphiCustomForm.Close_Wrapper(args: PPyObject): PPyObject; function TPyDelphiCustomForm.CloseQuery_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':CloseQuery') <> 0 then begin Result := VariantAsPyObject(DelphiObject.CloseQuery) end else @@ -478,10 +478,10 @@ function TPyDelphiCustomForm.CloseQuery_Wrapper(args: PPyObject): PPyObject; function TPyDelphiCustomForm.Release_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Release') <> 0 then begin if Owned then begin @@ -504,9 +504,9 @@ function TPyDelphiCustomForm.ShowModal_Wrapper(args: PPyObject): PPyObject; Var ModalResult : integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':ShowModal') <> 0 then begin ModalResult := (DelphiObject as TForm).ShowModal; Result := PyInt_FromLong(ModalResult); @@ -559,10 +559,8 @@ class function TPyDelphiCustomForm.DelphiObjectClass: TClass; function TPyDelphiCustomForm.Get_ModalResult(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.ModalResult); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.ModalResult); end; function TPyDelphiCustomForm.Set_ModalResult(AValue: PPyObject; @@ -648,9 +646,9 @@ destructor TPyDelphiScreen.Destroy; {$IFNDEF FPC} function TPyDelphiScreen.DisableAlign_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':DisableAlign') <> 0 then begin DelphiObject.DisableAlign; Result := ReturnNone; @@ -661,9 +659,9 @@ function TPyDelphiScreen.DisableAlign_Wrapper(args: PPyObject): PPyObject; function TPyDelphiScreen.EnableAlign_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':EnableAlign') <> 0 then begin DelphiObject.EnableAlign; Result := ReturnNone; @@ -680,234 +678,182 @@ function TPyDelphiScreen.GetDelphiObject: TScreen; function TPyDelphiScreen.Get_ActiveControl(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.ActiveControl); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.ActiveControl); end; function TPyDelphiScreen.Get_ActiveCustomForm( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.ActiveCustomForm); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.ActiveCustomForm); end; function TPyDelphiScreen.Get_ActiveForm(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.ActiveForm); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.ActiveForm); end; function TPyDelphiScreen.Get_Cursor(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Cursor); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Cursor); end; function TPyDelphiScreen.Get_Cursors(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TScreenCursorsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); - end; + Adjust(@Self); + Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TScreenCursorsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; function TPyDelphiScreen.Get_CustomFormCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.CustomFormCount); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.CustomFormCount); end; function TPyDelphiScreen.Get_CustomForms(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TScreenCustomFormsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); - end; + Adjust(@Self); + Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TScreenCustomFormsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; function TPyDelphiScreen.Get_DataModuleCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.DataModuleCount); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.DataModuleCount); end; function TPyDelphiScreen.Get_DataModules(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TScreenDataModulesAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); - end; + Adjust(@Self); + Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TScreenDataModulesAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; {$IFNDEF FPC} function TPyDelphiScreen.Get_DefaultIme(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.DefaultIme))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.DefaultIme); end; function TPyDelphiScreen.Get_DefaultKbLayout(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.DefaultKbLayout); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.DefaultKbLayout); end; {$ENDIF FPC} function TPyDelphiScreen.Get_DesktopHeight(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.DesktopHeight); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.DesktopHeight); end; {$IFNDEF FPC} function TPyDelphiScreen.Get_DesktopLeft(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.DesktopLeft); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.DesktopLeft); end; function TPyDelphiScreen.Get_DesktopRect(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := WrapRect(PyDelphiWrapper, DelphiObject.DesktopRect); - end; + Adjust(@Self); + Result := WrapRect(PyDelphiWrapper, DelphiObject.DesktopRect); end; function TPyDelphiScreen.Get_DesktopTop(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.DesktopTop); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.DesktopTop); end; {$ENDIF FPC} function TPyDelphiScreen.Get_DesktopWidth(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.DesktopWidth); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.DesktopWidth); end; function TPyDelphiScreen.Get_Fonts(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Fonts); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Fonts); end; function TPyDelphiScreen.Get_FormCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.FormCount); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.FormCount); end; function TPyDelphiScreen.Get_Forms(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TScreenFormsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); - end; + Adjust(@Self); + Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TScreenFormsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; function TPyDelphiScreen.Get_Height(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Height); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Height); end; function TPyDelphiScreen.Get_HintFont(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.HintFont); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.HintFont); end; function TPyDelphiScreen.Get_IconFont(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.IconFont); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.IconFont); end; {$IFNDEF FPC} function TPyDelphiScreen.Get_Imes(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Imes); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Imes); end; {$ENDIF FPC} function TPyDelphiScreen.Get_MenuFont(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.MenuFont); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.MenuFont); end; function TPyDelphiScreen.Get_MonitorCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.MonitorCount); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.MonitorCount); end; function TPyDelphiScreen.Get_Monitors(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TScreenMonitorsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); - end; + Adjust(@Self); + Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TScreenMonitorsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; function TPyDelphiScreen.Get_OnActiveControlChange( AContext: Pointer): PPyObject; begin + Adjust(@Self); with GetPythonEngine do begin - Adjust(@Self); if Assigned(fOnActiveControlChange) then begin Result := fOnActiveControlChange; @@ -921,8 +867,8 @@ function TPyDelphiScreen.Get_OnActiveControlChange( function TPyDelphiScreen.Get_OnActiveFormChange( AContext: Pointer): PPyObject; begin + Adjust(@Self); with GetPythonEngine do begin - Adjust(@Self); if Assigned(fOnActiveFormChange) then begin Result := fOnActiveFormChange; @@ -935,59 +881,45 @@ function TPyDelphiScreen.Get_OnActiveFormChange( function TPyDelphiScreen.Get_PixelsPerInch(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.PixelsPerInch); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.PixelsPerInch); end; function TPyDelphiScreen.Get_Width(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Width); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Width); end; {$IFNDEF FPC} function TPyDelphiScreen.Get_WorkAreaHeight(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.WorkAreaHeight); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.WorkAreaHeight); end; function TPyDelphiScreen.Get_WorkAreaLeft(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.WorkAreaLeft); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.WorkAreaLeft); end; function TPyDelphiScreen.Get_WorkAreaRect(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := WrapRect(PyDelphiWrapper, DelphiObject.WorkAreaRect); - end; + Adjust(@Self); + Result := WrapRect(PyDelphiWrapper, DelphiObject.WorkAreaRect); end; function TPyDelphiScreen.Get_WorkAreaTop(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.WorkAreaTop); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.WorkAreaTop); end; function TPyDelphiScreen.Get_WorkAreaWidth(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.WorkAreaWidth); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.WorkAreaWidth); end; {$ENDIF FPC} @@ -1007,30 +939,28 @@ function TPyDelphiScreen.MonitorFromPoint_Wrapper(args: PPyObject): PPyObject; _pointObj : PPyObject; _monitorDefault : Integer; begin - with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); - if PyArg_ParseTuple( args, 'Oi:MonitorFromPoint',@_pointObj, @_monitorDefault ) <> 0 then + // We adjust the transmitted self argument + Adjust(@Self); + if GetPythonEngine.PyArg_ParseTuple( args, 'Oi:MonitorFromPoint',@_pointObj, @_monitorDefault ) <> 0 then + begin + if CheckPointAttribute(_pointObj, 'First parameter', p) and + CheckEnum('TMonitorDefaultTo', _monitorDefault, Ord(Low(TMonitorDefaultTo)), Ord(High(TMonitorDefaultTo))) then begin - if CheckPointAttribute(_pointObj, 'First parameter', p) and - CheckEnum('TMonitorDefaultTo', _monitorDefault, Ord(Low(TMonitorDefaultTo)), Ord(High(TMonitorDefaultTo))) then - begin - Result := Wrap(DelphiObject.MonitorFromPoint(p, TMonitorDefaultTo(_monitorDefault))); - end - else - Result := nil; + Result := Wrap(DelphiObject.MonitorFromPoint(p, TMonitorDefaultTo(_monitorDefault))); end else Result := nil; - end; + end + else + Result := nil; end; {$IFNDEF FPC} function TPyDelphiScreen.Realign_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Realign') <> 0 then begin DelphiObject.Realign; Result := ReturnNone; @@ -1041,9 +971,9 @@ function TPyDelphiScreen.Realign_Wrapper(args: PPyObject): PPyObject; function TPyDelphiScreen.ResetFonts_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':ResetFonts') <> 0 then begin DelphiObject.ResetFonts; Result := ReturnNone; @@ -1169,16 +1099,14 @@ function TPyDelphiScreen.Set_Cursor(AValue: PPyObject; var _cursor : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Cursor', _cursor) then - begin - DelphiObject.Cursor := _cursor; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Cursor', _cursor) then + begin + DelphiObject.Cursor := _cursor; + Result := 0; + end + else + Result := -1; end; function TPyDelphiScreen.Set_HintFont(AValue: PPyObject; @@ -1186,16 +1114,14 @@ function TPyDelphiScreen.Set_HintFont(AValue: PPyObject; var _font : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'HintFont', TFont, _font) then - begin - DelphiObject.HintFont := TFont(_font); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'HintFont', TFont, _font) then + begin + DelphiObject.HintFont := TFont(_font); + Result := 0; + end + else + Result := -1; end; function TPyDelphiScreen.Set_IconFont(AValue: PPyObject; @@ -1203,16 +1129,14 @@ function TPyDelphiScreen.Set_IconFont(AValue: PPyObject; var _font : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'IconFont', TFont, _font) then - begin - DelphiObject.IconFont := TFont(_font); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'IconFont', TFont, _font) then + begin + DelphiObject.IconFont := TFont(_font); + Result := 0; + end + else + Result := -1; end; function TPyDelphiScreen.Set_MenuFont(AValue: PPyObject; @@ -1220,23 +1144,21 @@ function TPyDelphiScreen.Set_MenuFont(AValue: PPyObject; var _font : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'MenuFont', TFont, _font) then - begin - DelphiObject.MenuFont := TFont(_font); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'MenuFont', TFont, _font) then + begin + DelphiObject.MenuFont := TFont(_font); + Result := 0; + end + else + Result := -1; end; function TPyDelphiScreen.Set_OnActiveControlChange(AValue: PPyObject; AContext: Pointer): Integer; begin + Adjust(@Self); with GetPythonEngine do begin - Adjust(@Self); if CheckCallableAttribute(AValue, 'OnActiveControlChange') then begin Py_XDECREF(fOnActiveControlChange); @@ -1261,8 +1183,8 @@ function TPyDelphiScreen.Set_OnActiveControlChange(AValue: PPyObject; function TPyDelphiScreen.Set_OnActiveFormChange(AValue: PPyObject; AContext: Pointer): Integer; begin + Adjust(@Self); with GetPythonEngine do begin - Adjust(@Self); if CheckCallableAttribute(AValue, 'OnActiveFormChange') then begin Py_XDECREF(fOnActiveFormChange); @@ -1385,83 +1307,56 @@ class function TScreenMonitorsAccess.Name: String; function TPyDelphiMonitor.Get_BoundsRect(AContext : Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := WrapRect(PyDelphiWrapper, DelphiObject.BoundsRect); - end; + Adjust(@Self); + Result := WrapRect(PyDelphiWrapper, DelphiObject.BoundsRect); end; function TPyDelphiMonitor.Get_Handle(AContext : Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Handle); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Handle); end; function TPyDelphiMonitor.Get_Height(AContext : Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Height); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Height); end; function TPyDelphiMonitor.Get_Left(AContext : Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Left); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Left); end; function TPyDelphiMonitor.Get_MonitorNum(AContext : Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.MonitorNum); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.MonitorNum); end; function TPyDelphiMonitor.Get_Primary(AContext : Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.Primary); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.Primary); end; function TPyDelphiMonitor.Get_Top(AContext : Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Top); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Top); end; function TPyDelphiMonitor.Get_Width(AContext : Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Width); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Width); end; function TPyDelphiMonitor.Get_WorkareaRect(AContext : Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := WrapRect(PyDelphiWrapper, DelphiObject.WorkareaRect); - end; + Adjust(@Self); + Result := WrapRect(PyDelphiWrapper, DelphiObject.WorkareaRect); end; function TPyDelphiMonitor.GetDelphiObject: TMonitor; @@ -1513,9 +1408,9 @@ function TPyDelphiApplication.ActivateHint_Wrapper( _obj : PPyObject; _point : TPoint; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:ActivateHint',@_obj ) <> 0 then begin if CheckPointAttribute(_obj, 'The first argument of ActivateHint', _point) then begin @@ -1531,9 +1426,9 @@ function TPyDelphiApplication.ActivateHint_Wrapper( function TPyDelphiApplication.BringToFront_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':BringToFront') <> 0 then begin DelphiObject.BringToFront; Result := ReturnNone; @@ -1545,9 +1440,9 @@ function TPyDelphiApplication.BringToFront_Wrapper( function TPyDelphiApplication.CancelHint_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':CancelHint') <> 0 then begin DelphiObject.CancelHint; Result := ReturnNone; @@ -1562,9 +1457,9 @@ function TPyDelphiApplication.ExecuteAction_Wrapper( _obj : PPyObject; _value : TObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:ExecuteAction',@_obj ) <> 0 then begin if CheckObjAttribute(_obj, 'The first argument of ExecuteAction', TBasicAction, _value) then begin @@ -1587,9 +1482,9 @@ function TPyDelphiApplication.HandleException_Wrapper( _obj : PPyObject; _sender : TObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:HandleException',@_obj ) <> 0 then begin if CheckObjAttribute(_obj, 'The first argument of HandleException', TObject, _sender) then begin @@ -1605,9 +1500,9 @@ function TPyDelphiApplication.HandleException_Wrapper( function TPyDelphiApplication.HandleMessage_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':HandleMessage') <> 0 then begin DelphiObject.HandleMessage; Result := ReturnNone; @@ -1622,9 +1517,9 @@ function TPyDelphiApplication.HelpCommand_Wrapper( _command : Integer; _data : Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'i:HelpCommand',@_command, @_data ) <> 0 then begin Result := VariantAsPyObject( DelphiObject.HelpCommand(_command, _data) ); end else @@ -1637,9 +1532,9 @@ function TPyDelphiApplication.HelpContext_Wrapper( var _context : Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'i:HelpContext',@_context ) <> 0 then begin Result := VariantAsPyObject( DelphiObject.HelpContext(_context) ); end else @@ -1652,9 +1547,9 @@ function TPyDelphiApplication.HelpJump_Wrapper(args: PPyObject): PPyObject; var _jumpID : PAnsiChar; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 's:HelpJump',@_jumpID ) <> 0 then begin Result := VariantAsPyObject( DelphiObject.HelpJump(String(_jumpID)) ); end else @@ -1668,9 +1563,9 @@ function TPyDelphiApplication.HelpKeyword_Wrapper( var _keyword : PAnsiChar; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 's:HelpKeyword',@_keyword ) <> 0 then begin Result := VariantAsPyObject( DelphiObject.HelpKeyword(String(_keyword)) ); end else @@ -1680,9 +1575,9 @@ function TPyDelphiApplication.HelpKeyword_Wrapper( function TPyDelphiApplication.HideHint_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':HideHint') <> 0 then begin DelphiObject.HideHint; Result := ReturnNone; @@ -1694,9 +1589,9 @@ function TPyDelphiApplication.HideHint_Wrapper(args: PPyObject): PPyObject; function TPyDelphiApplication.Initialize_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Initialize') <> 0 then begin DelphiObject.Initialize; Result := ReturnNone; @@ -1709,9 +1604,9 @@ function TPyDelphiApplication.Initialize_Wrapper( function TPyDelphiApplication.IsRightToLeft_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':IsRightToLeft') <> 0 then begin Result := VariantAsPyObject( DelphiObject.IsRightToLeft ); end else @@ -1727,9 +1622,9 @@ function TPyDelphiApplication.MessageBox_Wrapper( _caption : PAnsiChar; _flags : Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'ssi:MessageBox',@_text, @_caption, @_flags ) <> 0 then begin Result := PyInt_FromLong( DelphiObject.MessageBox(PChar(string(_text)), PChar(string(_caption)), _flags) ); @@ -1740,9 +1635,9 @@ function TPyDelphiApplication.MessageBox_Wrapper( function TPyDelphiApplication.Minimize_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Minimize') <> 0 then begin DelphiObject.Minimize; Result := ReturnNone; @@ -1754,9 +1649,9 @@ function TPyDelphiApplication.Minimize_Wrapper(args: PPyObject): PPyObject; function TPyDelphiApplication.ModalFinished_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':ModalFinished') <> 0 then begin DelphiObject.ModalFinished; Result := ReturnNone; @@ -1768,9 +1663,9 @@ function TPyDelphiApplication.ModalFinished_Wrapper( function TPyDelphiApplication.ModalStarted_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':ModalStarted') <> 0 then begin DelphiObject.ModalStarted; Result := ReturnNone; @@ -1783,9 +1678,9 @@ function TPyDelphiApplication.ModalStarted_Wrapper( function TPyDelphiApplication.NormalizeAllTopMosts_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':NormalizeAllTopMosts') <> 0 then begin DelphiObject.NormalizeAllTopMosts; Result := ReturnNone; @@ -1797,9 +1692,9 @@ function TPyDelphiApplication.NormalizeAllTopMosts_Wrapper( function TPyDelphiApplication.NormalizeTopMosts_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':NormalizeTopMosts') <> 0 then begin DelphiObject.NormalizeTopMosts; Result := ReturnNone; @@ -1811,9 +1706,9 @@ function TPyDelphiApplication.NormalizeTopMosts_Wrapper( function TPyDelphiApplication.RestoreTopMosts_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':RestoreTopMosts') <> 0 then begin DelphiObject.RestoreTopMosts; Result := ReturnNone; @@ -1826,9 +1721,9 @@ function TPyDelphiApplication.RestoreTopMosts_Wrapper( function TPyDelphiApplication.ProcessMessages_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':ProcessMessages') <> 0 then begin DelphiObject.ProcessMessages; Result := ReturnNone; @@ -2004,9 +1899,9 @@ class procedure TPyDelphiApplication.RegisterMethods( function TPyDelphiApplication.Restore_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Restore') <> 0 then begin DelphiObject.Restore; Result := ReturnNone; @@ -2017,9 +1912,9 @@ function TPyDelphiApplication.Restore_Wrapper(args: PPyObject): PPyObject; function TPyDelphiApplication.Run_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Run') <> 0 then begin DelphiObject.Run; @@ -2041,9 +1936,9 @@ function TPyDelphiApplication.ShowException_Wrapper( _obj : PPyObject; _value : TObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:ShowException',@_obj ) <> 0 then begin if CheckObjAttribute(_obj, 'The first argument of ShowException', Exception, _value) then begin @@ -2059,9 +1954,9 @@ function TPyDelphiApplication.ShowException_Wrapper( function TPyDelphiApplication.Terminate_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Terminate') <> 0 then begin DelphiObject.Terminate; Result := ReturnNone; @@ -2076,9 +1971,9 @@ function TPyDelphiApplication.UpdateAction_Wrapper( _obj : PPyObject; _value : TObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:UpdateAction',@_obj ) <> 0 then begin if CheckObjAttribute(_obj, 'The first argument of UpdateAction', TBasicAction, _value) then begin @@ -2095,9 +1990,9 @@ function TPyDelphiApplication.UpdateAction_Wrapper( function TPyDelphiApplication.UseRightToLeftAlignment_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':UseRightToLeftAlignment') <> 0 then begin DelphiObject.UseRightToLeftAlignment; Result := ReturnNone; @@ -2109,9 +2004,9 @@ function TPyDelphiApplication.UseRightToLeftAlignment_Wrapper( function TPyDelphiApplication.UseRightToLeftReading_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':UseRightToLeftReading') <> 0 then begin DelphiObject.UseRightToLeftReading; Result := ReturnNone; @@ -2123,9 +2018,9 @@ function TPyDelphiApplication.UseRightToLeftReading_Wrapper( function TPyDelphiApplication.UseRightToLeftScrollBar_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':UseRightToLeftScrollBar') <> 0 then begin DelphiObject.UseRightToLeftScrollBar; Result := ReturnNone; @@ -2137,223 +2032,173 @@ function TPyDelphiApplication.UseRightToLeftScrollBar_Wrapper( function TPyDelphiApplication.Get_Active(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.Active); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.Active); end; {$IFNDEF FPC} function TPyDelphiApplication.Get_AllowTesting( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.AllowTesting); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.AllowTesting); end; function TPyDelphiApplication.Get_AutoDragDocking( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.AutoDragDocking); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.AutoDragDocking); end; function TPyDelphiApplication.Get_BiDiKeyboard( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.BiDiKeyboard))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.BiDiKeyboard); end; {$ENDIF FPC} function TPyDelphiApplication.Get_BiDiMode(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(Ord(DelphiObject.BiDiMode)); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(Ord(DelphiObject.BiDiMode)); end; {$IFNDEF FPC} function TPyDelphiApplication.Get_CurrentHelpFile( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.CurrentHelpFile))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.CurrentHelpFile); end; function TPyDelphiApplication.Get_DialogHandle( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.DialogHandle); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.DialogHandle); end; {$ENDIF FPC} function TPyDelphiApplication.Get_ExeName(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.ExeName))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.ExeName); end; {$IFNDEF FPC} function TPyDelphiApplication.Get_Handle(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Handle); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Handle); end; {$ENDIF FPC} function TPyDelphiApplication.Get_HelpFile(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.HelpFile))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.HelpFile); end; function TPyDelphiApplication.Get_Hint(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.Hint))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.Hint); end; function TPyDelphiApplication.Get_HintColor(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.HintColor); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.HintColor); end; function TPyDelphiApplication.Get_HintHidePause( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.HintHidePause); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.HintHidePause); end; function TPyDelphiApplication.Get_HintPause(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.HintPause); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.HintPause); end; function TPyDelphiApplication.Get_HintShortCuts( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.HintShortCuts); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.HintShortCuts); end; function TPyDelphiApplication.Get_HintShortPause( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.HintShortPause); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.HintShortPause); end; function TPyDelphiApplication.Get_Icon(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Icon); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Icon); end; function TPyDelphiApplication.Get_MainForm(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.MainForm); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.MainForm); end; {$IFNDEF FPC} function TPyDelphiApplication.Get_NonBiDiKeyboard( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.NonBiDiKeyboard))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.NonBiDiKeyboard); end; {$ENDIF FPC} function TPyDelphiApplication.Get_ShowHint(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.ShowHint); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.ShowHint); end; function TPyDelphiApplication.Get_ShowMainForm( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.ShowMainForm); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.ShowMainForm); end; function TPyDelphiApplication.Get_Terminated(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.Terminated); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.Terminated); end; function TPyDelphiApplication.Get_Title(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.Title))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.Title); end; {$IFNDEF FPC} function TPyDelphiApplication.Get_UpdateFormatSettings( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.UpdateFormatSettings); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.UpdateFormatSettings); end; function TPyDelphiApplication.Get_UpdateMetricSettings( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.UpdateMetricSettings); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.UpdateMetricSettings); end; function TPyDelphiApplication.Set_AllowTesting(AValue: PPyObject; @@ -2361,16 +2206,14 @@ function TPyDelphiApplication.Set_AllowTesting(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'AllowTesting', _value) then - begin - DelphiObject.AllowTesting := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'AllowTesting', _value) then + begin + DelphiObject.AllowTesting := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_AutoDragDocking(AValue: PPyObject; @@ -2378,16 +2221,14 @@ function TPyDelphiApplication.Set_AutoDragDocking(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'AutoDragDocking', _value) then - begin - DelphiObject.AutoDragDocking := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'AutoDragDocking', _value) then + begin + DelphiObject.AutoDragDocking := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_BiDiKeyboard(AValue: PPyObject; @@ -2395,16 +2236,14 @@ function TPyDelphiApplication.Set_BiDiKeyboard(AValue: PPyObject; var _value : String; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckStrAttribute(AValue, 'BiDiKeyboard', _value) then - begin - DelphiObject.BiDiKeyboard := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckStrAttribute(AValue, 'BiDiKeyboard', _value) then + begin + DelphiObject.BiDiKeyboard := _value; + Result := 0; + end + else + Result := -1; end; {$ENDIF FPC} @@ -2413,16 +2252,14 @@ function TPyDelphiApplication.Set_BiDiMode(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'BiDiMode', _value) then - begin - DelphiObject.BiDiMode := TBiDiMode(_value); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'BiDiMode', _value) then + begin + DelphiObject.BiDiMode := TBiDiMode(_value); + Result := 0; + end + else + Result := -1; end; {$IFNDEF FPC} @@ -2431,16 +2268,14 @@ function TPyDelphiApplication.Set_DialogHandle(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'DialogHandle', _value) then - begin - DelphiObject.DialogHandle := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'DialogHandle', _value) then + begin + DelphiObject.DialogHandle := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_Handle(AValue: PPyObject; @@ -2448,16 +2283,14 @@ function TPyDelphiApplication.Set_Handle(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Handle', _value) then - begin - DelphiObject.Handle := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Handle', _value) then + begin + DelphiObject.Handle := _value; + Result := 0; + end + else + Result := -1; end; {$ENDIF FPC} @@ -2466,16 +2299,14 @@ function TPyDelphiApplication.Set_HelpFile(AValue: PPyObject; var _value : String; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckStrAttribute(AValue, 'HelpFile', _value) then - begin - DelphiObject.HelpFile := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckStrAttribute(AValue, 'HelpFile', _value) then + begin + DelphiObject.HelpFile := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_Hint(AValue: PPyObject; @@ -2483,16 +2314,14 @@ function TPyDelphiApplication.Set_Hint(AValue: PPyObject; var _value : String; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckStrAttribute(AValue, 'Hint', _value) then - begin - DelphiObject.Hint := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckStrAttribute(AValue, 'Hint', _value) then + begin + DelphiObject.Hint := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_HintColor(AValue: PPyObject; @@ -2500,16 +2329,14 @@ function TPyDelphiApplication.Set_HintColor(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'HintColor', _value) then - begin - DelphiObject.HintColor := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'HintColor', _value) then + begin + DelphiObject.HintColor := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_HintHidePause(AValue: PPyObject; @@ -2517,16 +2344,14 @@ function TPyDelphiApplication.Set_HintHidePause(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'HintHidePause', _value) then - begin - DelphiObject.HintHidePause := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'HintHidePause', _value) then + begin + DelphiObject.HintHidePause := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_HintPause(AValue: PPyObject; @@ -2534,16 +2359,14 @@ function TPyDelphiApplication.Set_HintPause(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'HintPause', _value) then - begin - DelphiObject.HintPause := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'HintPause', _value) then + begin + DelphiObject.HintPause := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_HintShortCuts(AValue: PPyObject; @@ -2551,16 +2374,14 @@ function TPyDelphiApplication.Set_HintShortCuts(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'HintShortCuts', _value) then - begin - DelphiObject.HintShortCuts := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'HintShortCuts', _value) then + begin + DelphiObject.HintShortCuts := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_HintShortPause(AValue: PPyObject; @@ -2568,16 +2389,14 @@ function TPyDelphiApplication.Set_HintShortPause(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'HintShortPause', _value) then - begin - DelphiObject.HintShortPause := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'HintShortPause', _value) then + begin + DelphiObject.HintShortPause := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_Icon(AValue: PPyObject; @@ -2585,16 +2404,14 @@ function TPyDelphiApplication.Set_Icon(AValue: PPyObject; var _value : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'Icon', TIcon, _value) then - begin - DelphiObject.Icon := TIcon(_value); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'Icon', TIcon, _value) then + begin + DelphiObject.Icon := TIcon(_value); + Result := 0; + end + else + Result := -1; end; {$IFNDEF FPC} @@ -2603,16 +2420,14 @@ function TPyDelphiApplication.Set_NonBiDiKeyboard(AValue: PPyObject; var _value : String; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckStrAttribute(AValue, 'NonBiDiKeyboard', _value) then - begin - DelphiObject.NonBiDiKeyboard := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckStrAttribute(AValue, 'NonBiDiKeyboard', _value) then + begin + DelphiObject.NonBiDiKeyboard := _value; + Result := 0; + end + else + Result := -1; end; {$ENDIF FPC} @@ -2621,16 +2436,14 @@ function TPyDelphiApplication.Set_ShowHint(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'ShowHint', _value) then - begin - DelphiObject.ShowHint := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'ShowHint', _value) then + begin + DelphiObject.ShowHint := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_ShowMainForm(AValue: PPyObject; @@ -2638,16 +2451,14 @@ function TPyDelphiApplication.Set_ShowMainForm(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'ShowMainForm', _value) then - begin - DelphiObject.ShowMainForm := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'ShowMainForm', _value) then + begin + DelphiObject.ShowMainForm := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_Title(AValue: PPyObject; @@ -2655,16 +2466,14 @@ function TPyDelphiApplication.Set_Title(AValue: PPyObject; var _value : String; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckStrAttribute(AValue, 'Title', _value) then - begin - DelphiObject.Title := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckStrAttribute(AValue, 'Title', _value) then + begin + DelphiObject.Title := _value; + Result := 0; + end + else + Result := -1; end; {$IFNDEF FPC} @@ -2673,16 +2482,14 @@ function TPyDelphiApplication.Set_UpdateFormatSettings(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'UpdateFormatSettings', _value) then - begin - DelphiObject.UpdateFormatSettings := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'UpdateFormatSettings', _value) then + begin + DelphiObject.UpdateFormatSettings := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiApplication.Set_UpdateMetricSettings(AValue: PPyObject; @@ -2690,16 +2497,14 @@ function TPyDelphiApplication.Set_UpdateMetricSettings(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'UpdateMetricSettings', _value) then - begin - DelphiObject.UpdateMetricSettings := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'UpdateMetricSettings', _value) then + begin + DelphiObject.UpdateMetricSettings := _value; + Result := 0; + end + else + Result := -1; end; {$ENDIF FPC} diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiGraphics.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiGraphics.pas index eda1033d..20459596 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiGraphics.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiGraphics.pas @@ -374,59 +374,45 @@ function TPyDelphiGraphic.GetDelphiObject: TGraphic; function TPyDelphiGraphic.Get_Empty(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.Empty); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.Empty); end; function TPyDelphiGraphic.Get_Height(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Height); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Height); end; function TPyDelphiGraphic.Get_Modified(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.Modified); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.Modified); end; function TPyDelphiGraphic.Get_Palette(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Palette); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Palette); end; function TPyDelphiGraphic.Get_PaletteModified( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.PaletteModified); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.PaletteModified); end; function TPyDelphiGraphic.Get_Transparent(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.Transparent); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.Transparent); end; function TPyDelphiGraphic.Get_Width(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Width); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Width); end; function TPyDelphiGraphic.LoadFromClipboardFormat_Wrapper( @@ -438,9 +424,9 @@ function TPyDelphiGraphic.LoadFromClipboardFormat_Wrapper( _palette : Integer; {$ENDIF FPC} begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); {$IFDEF FPC} if PyArg_ParseTuple( args, 'i:LoadFromClipboardFormat',@_format ) <> 0 then begin @@ -461,9 +447,9 @@ function TPyDelphiGraphic.LoadFromFile_Wrapper(args: PPyObject): PPyObject; var _pFileName : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:LoadFromFile',@_pFileName ) <> 0 then begin DelphiObject.LoadFromFile(PyString_AsDelphiString(_pFileName)); @@ -481,9 +467,9 @@ function TPyDelphiGraphic.LoadFromStream_Wrapper( _oStream : PPyObject; _stream : TStream; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); _oStream := nil; if (PyArg_ParseTuple( args, 'O:LoadFromStrea',@_oStream ) <> 0) and CheckObjAttribute(_oStream, 'Stream', TStream, _obj) then @@ -551,9 +537,9 @@ function TPyDelphiGraphic.SaveToClipboardFormat_Wrapper( _palette : HPALETTE; {$ENDIF FPC} begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); {$IFDEF FPC} if PyArg_ParseTuple( args, ':SaveToClipboardFormat') <> 0 then begin @@ -579,9 +565,9 @@ function TPyDelphiGraphic.SaveToFile_Wrapper(args: PPyObject): PPyObject; var _pFileName : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:SaveToFile',@_pFileName ) <> 0 then begin DelphiObject.SaveToFile(PyString_AsDelphiString(_pFileName)); @@ -598,9 +584,9 @@ function TPyDelphiGraphic.SaveToStream_Wrapper(args: PPyObject): PPyObject; _oStream : PPyObject; _stream : TStream; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); _oStream := nil; if (PyArg_ParseTuple( args, 'O:SaveToStream',@_oStream ) <> 0) and CheckObjAttribute(_oStream, 'Stream', TStream, _obj) then @@ -624,16 +610,14 @@ function TPyDelphiGraphic.Set_Height(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Height', _value) then - begin - DelphiObject.Height := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Height', _value) then + begin + DelphiObject.Height := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiGraphic.Set_Modified(AValue: PPyObject; @@ -641,16 +625,14 @@ function TPyDelphiGraphic.Set_Modified(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'Modified', _value) then - begin - DelphiObject.Modified := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'Modified', _value) then + begin + DelphiObject.Modified := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiGraphic.Set_Palette(AValue: PPyObject; @@ -658,16 +640,14 @@ function TPyDelphiGraphic.Set_Palette(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Palette', _value) then - begin - DelphiObject.Palette := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Palette', _value) then + begin + DelphiObject.Palette := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiGraphic.Set_PaletteModified(AValue: PPyObject; @@ -675,16 +655,14 @@ function TPyDelphiGraphic.Set_PaletteModified(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'PaletteModified', _value) then - begin - DelphiObject.PaletteModified := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'PaletteModified', _value) then + begin + DelphiObject.PaletteModified := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiGraphic.Set_Transparent(AValue: PPyObject; @@ -692,16 +670,14 @@ function TPyDelphiGraphic.Set_Transparent(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'Transparent', _value) then - begin - DelphiObject.Transparent := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'Transparent', _value) then + begin + DelphiObject.Transparent := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiGraphic.Set_Width(AValue: PPyObject; @@ -709,16 +685,14 @@ function TPyDelphiGraphic.Set_Width(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Width', _value) then - begin - DelphiObject.Width := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Width', _value) then + begin + DelphiObject.Width := _value; + Result := 0; + end + else + Result := -1; end; { TPyDelphiBitmap } @@ -731,9 +705,9 @@ class function TPyDelphiBitmap.DelphiObjectClass: TClass; {$IFNDEF FPC} function TPyDelphiBitmap.Dormant_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Dormant') <> 0 then begin DelphiObject.Dormant; @@ -747,9 +721,9 @@ function TPyDelphiBitmap.Dormant_Wrapper(args: PPyObject): PPyObject; function TPyDelphiBitmap.FreeImage_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':FreeImage') <> 0 then begin DelphiObject.FreeImage; @@ -767,35 +741,29 @@ function TPyDelphiBitmap.GetDelphiObject: TBitmap; function TPyDelphiBitmap.Get_Canvas(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Canvas); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Canvas); end; function TPyDelphiBitmap.Get_Handle(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Handle); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Handle); end; function TPyDelphiBitmap.Get_HandleAllocated(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.HandleAllocated); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.HandleAllocated); end; function TPyDelphiBitmap.Get_HandleType(AContext: Pointer): PPyObject; begin + Adjust(@Self); with GetPythonEngine do begin - Adjust(@Self); case DelphiObject.HandleType of - bmDIB: Result := PyString_FromString('bmDIB'); - bmDDB: Result := PyString_FromString('bmDDB'); + bmDIB: Result := PyString_FromDelphiString('bmDIB'); + bmDDB: Result := PyString_FromDelphiString('bmDDB'); else Result := ReturnNone; end; @@ -805,43 +773,37 @@ function TPyDelphiBitmap.Get_HandleType(AContext: Pointer): PPyObject; {$IFNDEF FPC} function TPyDelphiBitmap.Get_IgnorePalette(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.IgnorePalette); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.IgnorePalette); end; {$ENDIF FPC} function TPyDelphiBitmap.Get_MaskHandle(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.MaskHandle); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.MaskHandle); end; function TPyDelphiBitmap.Get_Monochrome(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.Monochrome); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.Monochrome); end; function TPyDelphiBitmap.Get_PixelFormat(AContext: Pointer): PPyObject; begin + Adjust(@Self); with GetPythonEngine do begin - Adjust(@Self); case DelphiObject.PixelFormat of - pfDevice: Result := PyString_FromString('pfDevice'); - pf1bit: Result := PyString_FromString('pf1bit'); - pf4bit: Result := PyString_FromString('pf4bit'); - pf8bit: Result := PyString_FromString('pf8bit'); - pf15bit: Result := PyString_FromString('pf15bit'); - pf16bit: Result := PyString_FromString('pf16bit'); - pf24bit: Result := PyString_FromString('pf24bit'); - pf32bit: Result := PyString_FromString('pf32bit'); - pfCustom: Result := PyString_FromString('pfCustom'); + pfDevice: Result := PyString_FromDelphiString('pfDevice'); + pf1bit: Result := PyString_FromDelphiString('pf1bit'); + pf4bit: Result := PyString_FromDelphiString('pf4bit'); + pf8bit: Result := PyString_FromDelphiString('pf8bit'); + pf15bit: Result := PyString_FromDelphiString('pf15bit'); + pf16bit: Result := PyString_FromDelphiString('pf16bit'); + pf24bit: Result := PyString_FromDelphiString('pf24bit'); + pf32bit: Result := PyString_FromDelphiString('pf32bit'); + pfCustom: Result := PyString_FromDelphiString('pfCustom'); else Result := ReturnNone; end; @@ -851,19 +813,17 @@ function TPyDelphiBitmap.Get_PixelFormat(AContext: Pointer): PPyObject; function TPyDelphiBitmap.Get_TransparentColor( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.TransparentColor); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.TransparentColor); end; function TPyDelphiBitmap.Get_TransparentMode(AContext: Pointer): PPyObject; begin + Adjust(@Self); with GetPythonEngine do begin - Adjust(@Self); case DelphiObject.TransparentMode of - tmAuto: Result := PyString_FromString('tmAuto'); - tmFixed: Result := PyString_FromString('tmFixed'); + tmAuto: Result := PyString_FromDelphiString('tmAuto'); + tmFixed: Result := PyString_FromDelphiString('tmFixed'); else Result := ReturnNone; end; @@ -876,9 +836,9 @@ function TPyDelphiBitmap.LoadFromResourceID_Wrapper( _instance : Integer; _resID : Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'ii:LoadFromResourceID',@_instance, @_resID ) <> 0 then begin DelphiObject.LoadFromResourceID(_instance, _resID); @@ -895,9 +855,9 @@ function TPyDelphiBitmap.LoadFromResourceName_Wrapper( _instance : Integer; _resName : PAnsiChar; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); _resName := nil; if PyArg_ParseTuple( args, 'is:LoadFromResourceName',@_instance, @_resName ) <> 0 then begin @@ -914,9 +874,9 @@ function TPyDelphiBitmap.Mask_Wrapper(args: PPyObject): PPyObject; var _transpColor : Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'i:Mask',@_transpColor ) <> 0 then begin DelphiObject.Mask(_transpColor); @@ -990,9 +950,9 @@ class procedure TPyDelphiBitmap.RegisterMethods(PythonType: TPythonType); function TPyDelphiBitmap.ReleaseHandle_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':ReleaseHandle') <> 0 then begin Result := PyInt_FromLong(DelphiObject.ReleaseHandle); @@ -1005,9 +965,9 @@ function TPyDelphiBitmap.ReleaseHandle_Wrapper(args: PPyObject): PPyObject; function TPyDelphiBitmap.ReleaseMaskHandle_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':ReleaseMaskHandle') <> 0 then begin Result := PyInt_FromLong(DelphiObject.ReleaseMaskHandle); @@ -1020,9 +980,9 @@ function TPyDelphiBitmap.ReleaseMaskHandle_Wrapper( function TPyDelphiBitmap.ReleasePalette_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':ReleasePalette') <> 0 then begin Result := PyInt_FromLong(DelphiObject.ReleasePalette); @@ -1042,16 +1002,14 @@ function TPyDelphiBitmap.Set_Handle(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Handle', _value) then - begin - DelphiObject.Handle := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Handle', _value) then + begin + DelphiObject.Handle := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiBitmap.Set_HandleType(AValue: PPyObject; @@ -1059,25 +1017,24 @@ function TPyDelphiBitmap.Set_HandleType(AValue: PPyObject; var _value : String; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckStrAttribute(AValue, 'HandleType', _value) then + Adjust(@Self); + if CheckStrAttribute(AValue, 'HandleType', _value) then + begin + if SameText(_value, 'bmDIB') then + DelphiObject.HandleType := bmDIB + else if SameText(_value, 'bmDDB') then + DelphiObject.HandleType := bmDDB + else begin - if SameText(_value, 'bmDIB') then - DelphiObject.HandleType := bmDIB - else if SameText(_value, 'bmDDB') then - DelphiObject.HandleType := bmDDB - else - begin + with GetPythonEngine do PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown THandleType value "%s"', [_value])))); - Result := -1; - Exit; - end; - Result := 0; - end - else Result := -1; - end; + Exit; + end; + Result := 0; + end + else + Result := -1; end; {$IFNDEF FPC} @@ -1086,16 +1043,14 @@ function TPyDelphiBitmap.Set_IgnorePalette(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'IgnorePalette', _value) then - begin - DelphiObject.IgnorePalette := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'IgnorePalette', _value) then + begin + DelphiObject.IgnorePalette := _value; + Result := 0; + end + else + Result := -1; end; {$ENDIF FPC} @@ -1104,16 +1059,14 @@ function TPyDelphiBitmap.Set_MaskHandle(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'MaskHandle', _value) then - begin - DelphiObject.MaskHandle := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'MaskHandle', _value) then + begin + DelphiObject.MaskHandle := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiBitmap.Set_Monochrome(AValue: PPyObject; @@ -1121,16 +1074,14 @@ function TPyDelphiBitmap.Set_Monochrome(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'Monochrome', _value) then - begin - DelphiObject.Monochrome := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'Monochrome', _value) then + begin + DelphiObject.Monochrome := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiBitmap.Set_PixelFormat(AValue: PPyObject; @@ -1178,16 +1129,14 @@ function TPyDelphiBitmap.Set_TransparentColor(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'TransparentColor', _value) then - begin - DelphiObject.TransparentColor := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'TransparentColor', _value) then + begin + DelphiObject.TransparentColor := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiBitmap.Set_TransparentMode(AValue: PPyObject; @@ -1195,25 +1144,24 @@ function TPyDelphiBitmap.Set_TransparentMode(AValue: PPyObject; var _value : String; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckStrAttribute(AValue, 'TransparentMode', _value) then + Adjust(@Self); + if CheckStrAttribute(AValue, 'TransparentMode', _value) then + begin + if SameText(_value, 'tmAuto') then + DelphiObject.TransparentMode := tmAuto + else if SameText(_value, 'tmFixed') then + DelphiObject.TransparentMode := tmFixed + else begin - if SameText(_value, 'tmAuto') then - DelphiObject.TransparentMode := tmAuto - else if SameText(_value, 'tmFixed') then - DelphiObject.TransparentMode := tmFixed - else - begin + with GetPythonEngine do PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown TTransparentMode value "%s"', [_value])))); - Result := -1; - Exit; - end; - Result := 0; - end - else Result := -1; - end; + Exit; + end; + Result := 0; + end + else + Result := -1; end; { TPyDelphiCanvas } @@ -1222,9 +1170,9 @@ function TPyDelphiCanvas.Arc_Wrapper(args: PPyObject): PPyObject; var x1, y1, x2, y2, x3, y3, x4, y4: Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'iiiiiiii:Arc',@x1, @y1, @x2, @y2, @x3, @y3, @x4, @y4 ) <> 0 then begin DelphiObject.Arc(x1, y1, x2, y2, x3, y3, x4, y4); @@ -1247,9 +1195,9 @@ function TPyDelphiCanvas.BrushCopy_Wrapper(args: PPyObject): PPyObject; _oDest : PPyObject; _oSource : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); _oBitmap := nil; _oSource := nil; _oDest := nil; @@ -1272,9 +1220,9 @@ function TPyDelphiCanvas.Chord_Wrapper(args: PPyObject): PPyObject; var x1, y1, x2, y2, x3, y3, x4, y4: Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'iiiiiiii:Chord',@x1, @y1, @x2, @y2, @x3, @y3, @x4, @y4 ) <> 0 then begin DelphiObject.Chord(x1, y1, x2, y2, x3, y3, x4, y4); @@ -1295,9 +1243,9 @@ function TPyDelphiCanvas.CopyRect_Wrapper(args: PPyObject): PPyObject; _oSource : PPyObject; _source : TRect; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); _oCanvas := nil; _oSource := nil; _oDest := nil; @@ -1327,9 +1275,9 @@ function TPyDelphiCanvas.Draw_Wrapper(args: PPyObject): PPyObject; _oGraphic : PPyObject; _graphic : TGraphic; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); x := 0; y := 0; _oGraphic := nil; @@ -1350,9 +1298,9 @@ function TPyDelphiCanvas.DrawFocusRect_Wrapper(args: PPyObject): PPyObject; _rectO : PPyObject; _rect : TRect; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if (PyArg_ParseTuple( args, 'O:DrawFocusRect',@_rectO ) <> 0) and CheckRectAttribute(_rectO, 'Rect', _rect) then begin @@ -1368,9 +1316,9 @@ function TPyDelphiCanvas.Ellipse_Wrapper(args: PPyObject): PPyObject; var x1, y1, x2, y2: Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'iiii:Ellipse',@x1, @y1, @x2, @y2 ) <> 0 then begin DelphiObject.Ellipse(x1, y1, x2, y2); @@ -1386,9 +1334,9 @@ function TPyDelphiCanvas.FillRect_Wrapper(args: PPyObject): PPyObject; _rectO : PPyObject; _rect : TRect; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if (PyArg_ParseTuple( args, 'O:FillRect',@_rectO ) <> 0) and CheckRectAttribute(_rectO, 'Rect', _rect) then begin @@ -1406,9 +1354,9 @@ function TPyDelphiCanvas.FloodFill_Wrapper(args: PPyObject): PPyObject; _pFillStyle : PPyObject; _FillStyle : TFillStyle; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'iiiO:FloodFill',@x, @y, @_color, @_pFillStyle ) <> 0 then begin if SameText(PyString_AsDelphiString(_pFillStyle), 'fsBorder') then @@ -1428,9 +1376,9 @@ function TPyDelphiCanvas.FrameRect_Wrapper(args: PPyObject): PPyObject; _rectO : PPyObject; _rect : TRect; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if (PyArg_ParseTuple( args, 'O:FrameRect',@_rectO ) <> 0) and CheckRectAttribute(_rectO, 'Rect', _rect) then begin @@ -1446,47 +1394,38 @@ function TPyDelphiCanvas.FrameRect_Wrapper(args: PPyObject): PPyObject; function TPyDelphiCanvas.Get_CanvasOrientation( AContext: Pointer): PPyObject; begin + Adjust(@Self); with GetPythonEngine do begin - Adjust(@Self); if DelphiObject.CanvasOrientation = coRightToLeft then - Result := PyString_FromString('coRightToLeft') + Result := PyString_FromDelphiString('coRightToLeft') else - Result := PyString_FromString('coLeftToRight'); + Result := PyString_FromDelphiString('coLeftToRight'); end; end; {$ENDIF FPC} function TPyDelphiCanvas.Get_ClipRect(AContext: Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := WrapRect(PyDelphiWrapper, DelphiObject.ClipRect); - end; + Adjust(@Self); + Result := WrapRect(PyDelphiWrapper, DelphiObject.ClipRect); end; function TPyDelphiCanvas.Get_Handle(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Handle); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Handle); end; function TPyDelphiCanvas.Get_HandleAllocated(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.HandleAllocated); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.HandleAllocated); end; function TPyDelphiCanvas.Get_LockCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.LockCount); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.LockCount); end; function TPyDelphiCanvas.Get_OnChange(AContext: Pointer): PPyObject; @@ -1503,20 +1442,15 @@ function TPyDelphiCanvas.Get_OnChanging(AContext: Pointer): PPyObject; function TPyDelphiCanvas.Get_PenPos(AContext: Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := WrapPoint(PyDelphiWrapper, DelphiObject.PenPos); - end; + Adjust(@Self); + Result := WrapPoint(PyDelphiWrapper, DelphiObject.PenPos); end; {$IFNDEF FPC} function TPyDelphiCanvas.Get_TextFlags(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.TextFlags); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.TextFlags); end; {$ENDIF FPC} @@ -1529,9 +1463,9 @@ function TPyDelphiCanvas.GetPixel(args: PPyObject): PPyObject; var x, y : Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); x := 0; y := 0; if PyArg_ParseTuple( args, 'ii:GetPixel',@x, @y ) <> 0 then @@ -1547,9 +1481,9 @@ function TPyDelphiCanvas.LineTo_Wrapper(args: PPyObject): PPyObject; var x, y : Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); x := 0; y := 0; if PyArg_ParseTuple( args, 'ii:LineTo',@x, @y ) <> 0 then @@ -1564,9 +1498,9 @@ function TPyDelphiCanvas.LineTo_Wrapper(args: PPyObject): PPyObject; function TPyDelphiCanvas.Lock_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Lock') <> 0 then begin DelphiObject.Lock; @@ -1581,9 +1515,9 @@ function TPyDelphiCanvas.MoveTo_Wrapper(args: PPyObject): PPyObject; var x, y : Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); x := 0; y := 0; if PyArg_ParseTuple( args, 'ii:MoveTo',@x, @y ) <> 0 then @@ -1600,9 +1534,9 @@ function TPyDelphiCanvas.Pie_Wrapper(args: PPyObject): PPyObject; var x1, y1, x2, y2, x3, y3, x4, y4: Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'iiiiiiii:Pie',@x1, @y1, @x2, @y2, @x3, @y3, @x4, @y4 ) <> 0 then begin DelphiObject.Pie(x1, y1, x2, y2, x3, y3, x4, y4); @@ -1621,9 +1555,9 @@ function TPyDelphiCanvas.PolyBezier_Wrapper(args: PPyObject): PPyObject; _oPoints : PPyObject; _oPoint : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); _oPoints := nil; if PyArg_ParseTuple( args, 'O:PolyBezier',@_oPoints ) <> 0 then begin @@ -1668,9 +1602,9 @@ function TPyDelphiCanvas.PolyBezierTo_Wrapper(args: PPyObject): PPyObject; _oPoints : PPyObject; _oPoint : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); _oPoints := nil; if PyArg_ParseTuple( args, 'O:PolyBezierTo',@_oPoints ) <> 0 then begin @@ -1715,9 +1649,9 @@ function TPyDelphiCanvas.Polygon_Wrapper(args: PPyObject): PPyObject; _oPoints : PPyObject; _oPoint : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); _oPoints := nil; if PyArg_ParseTuple( args, 'O:Polygon',@_oPoints ) <> 0 then begin @@ -1761,9 +1695,9 @@ function TPyDelphiCanvas.Polyline_Wrapper(args: PPyObject): PPyObject; _oPoints : PPyObject; _oPoint : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); _oPoints := nil; if PyArg_ParseTuple( args, 'O:Polyline',@_oPoints ) <> 0 then begin @@ -1803,9 +1737,9 @@ function TPyDelphiCanvas.Rectangle_Wrapper(args: PPyObject): PPyObject; var x1, y1, x2, y2: Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'iiii:Rectangle',@x1, @y1, @x2, @y2 ) <> 0 then begin DelphiObject.Rectangle(x1, y1, x2, y2); @@ -1818,9 +1752,9 @@ function TPyDelphiCanvas.Rectangle_Wrapper(args: PPyObject): PPyObject; function TPyDelphiCanvas.Refresh_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Refresh') <> 0 then begin DelphiObject.Refresh; @@ -1969,9 +1903,9 @@ function TPyDelphiCanvas.RoundRect_Wrapper(args: PPyObject): PPyObject; var x1, y1, x2, y2, x3, y3: Integer; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'iiiiii:RoundRect',@x1, @y1, @x2, @y2, @x3, @y3 ) <> 0 then begin DelphiObject.RoundRect(x1, y1, x2, y2, x3, y3); @@ -1987,16 +1921,14 @@ function TPyDelphiCanvas.Set_Handle(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Handle', _value) then - begin - DelphiObject.Handle := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Handle', _value) then + begin + DelphiObject.Handle := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiCanvas.Set_OnChange(AValue: PPyObject; @@ -2019,16 +1951,14 @@ function TPyDelphiCanvas.Set_TextFlags(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'TextFlags', _value) then - begin - DelphiObject.TextFlags := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'TextFlags', _value) then + begin + DelphiObject.TextFlags := _value; + Result := 0; + end + else + Result := -1; end; {$ENDIF FPC} @@ -2042,9 +1972,9 @@ function TPyDelphiCanvas.SetPixel(args: PPyObject): PPyObject; x, y : Integer; _color : TColor; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); x := 0; y := 0; if PyArg_ParseTuple( args, 'iii:SetPixel',@x, @y, @_color ) <> 0 then @@ -2065,9 +1995,9 @@ function TPyDelphiCanvas.StretchDraw_Wrapper(args: PPyObject): PPyObject; _oRect : PPyObject; _rect : TRect; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); _oGraphic := nil; _oRect := nil; if (PyArg_ParseTuple( args, 'iiO:StretchDraw',@_oRect, @_oGraphic ) <> 0) and @@ -2087,9 +2017,9 @@ function TPyDelphiCanvas.TextExtent_Wrapper(args: PPyObject): PPyObject; var _pText : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:TextExtent',@_pText ) <> 0 then begin Result := WrapSize(PyDelphiWrapper, DelphiObject.TextExtent(PyString_AsDelphiString(_pText))); @@ -2103,9 +2033,9 @@ function TPyDelphiCanvas.TextHeight_Wrapper(args: PPyObject): PPyObject; var _pText : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:TextHeight',@_pText ) <> 0 then begin Result := PyInt_FromLong(DelphiObject.TextHeight(PyString_AsDelphiString(_pText))); @@ -2120,9 +2050,9 @@ function TPyDelphiCanvas.TextOut_Wrapper(args: PPyObject): PPyObject; x, y : Integer; _text : PAnsiChar; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); x := 0; y := 0; if PyArg_ParseTuple( args, 'iis:TextRect',@x, @y, @_text ) <> 0 then @@ -2143,9 +2073,9 @@ function TPyDelphiCanvas.TextRect_Wrapper(args: PPyObject): PPyObject; _rect : TRect; _text : PAnsiChar; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); x := 0; y := 0; _rectO := nil; @@ -2166,9 +2096,9 @@ function TPyDelphiCanvas.TextWidth_Wrapper(args: PPyObject): PPyObject; var _pText : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:TextWidth',@_pText ) <> 0 then begin Result := PyInt_FromLong(DelphiObject.TextWidth(PyString_AsDelphiString(_pText))); @@ -2180,9 +2110,9 @@ function TPyDelphiCanvas.TextWidth_Wrapper(args: PPyObject): PPyObject; function TPyDelphiCanvas.TryLock_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Unlock') <> 0 then begin Result := VariantAsPyObject( DelphiObject.TryLock ); @@ -2194,9 +2124,9 @@ function TPyDelphiCanvas.TryLock_Wrapper(args: PPyObject): PPyObject; function TPyDelphiCanvas.Unlock_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Unlock') <> 0 then begin DelphiObject.Unlock; @@ -2212,9 +2142,9 @@ function TPyDelphiCanvas.Unlock_Wrapper(args: PPyObject): PPyObject; function TPyDelphiMetaFile.Clear_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Clear') <> 0 then begin DelphiObject.Clear; @@ -2237,18 +2167,14 @@ function TPyDelphiMetaFile.GetDelphiObject: TMetaFile; function TPyDelphiMetaFile.Get_CreatedBy(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.CreatedBy))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.CreatedBy); end; function TPyDelphiMetaFile.Get_Description(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.Description))); - end; + Adjust(@Self); + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.Description); end; function TPyDelphiMetaFile.Get_Enhanced(AContext: Pointer): PPyObject; @@ -2261,43 +2187,33 @@ function TPyDelphiMetaFile.Get_Enhanced(AContext: Pointer): PPyObject; function TPyDelphiMetaFile.Get_Handle(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Handle); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Handle); end; function TPyDelphiMetaFile.Get_HandleAllocated( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.HandleAllocated); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.HandleAllocated); end; function TPyDelphiMetaFile.Get_Inch(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Inch); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Inch); end; function TPyDelphiMetaFile.Get_MMHeight(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.MMHeight); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.MMHeight); end; function TPyDelphiMetaFile.Get_MMWidth(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.MMWidth); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.MMWidth); end; class procedure TPyDelphiMetaFile.RegisterGetSets(PythonType: TPythonType); @@ -2338,9 +2254,9 @@ class procedure TPyDelphiMetaFile.RegisterMethods(PythonType: TPythonType); function TPyDelphiMetaFile.ReleaseHandle_Wrapper( args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':ReleaseHandle') <> 0 then begin Result := PyInt_FromLong(DelphiObject.ReleaseHandle); @@ -2360,16 +2276,14 @@ function TPyDelphiMetaFile.Set_Enhanced(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'Enhanced', _value) then - begin - DelphiObject.Enhanced := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'Enhanced', _value) then + begin + DelphiObject.Enhanced := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiMetaFile.Set_Handle(AValue: PPyObject; @@ -2377,16 +2291,14 @@ function TPyDelphiMetaFile.Set_Handle(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Handle', _value) then - begin - DelphiObject.Handle := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Handle', _value) then + begin + DelphiObject.Handle := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiMetaFile.Set_Inch(AValue: PPyObject; @@ -2394,16 +2306,14 @@ function TPyDelphiMetaFile.Set_Inch(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Inch', _value) then - begin - DelphiObject.Inch := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Inch', _value) then + begin + DelphiObject.Inch := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiMetaFile.Set_MMHeight(AValue: PPyObject; @@ -2411,16 +2321,14 @@ function TPyDelphiMetaFile.Set_MMHeight(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'MMHeight', _value) then - begin - DelphiObject.MMHeight := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'MMHeight', _value) then + begin + DelphiObject.MMHeight := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiMetaFile.Set_MMWidth(AValue: PPyObject; @@ -2428,16 +2336,14 @@ function TPyDelphiMetaFile.Set_MMWidth(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'MMWidth', _value) then - begin - DelphiObject.MMWidth := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'MMWidth', _value) then + begin + DelphiObject.MMWidth := _value; + Result := 0; + end + else + Result := -1; end; {$ENDIF FPC} @@ -2455,18 +2361,14 @@ function TPyDelphiIcon.GetDelphiObject: TIcon; function TPyDelphiIcon.Get_Handle(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Handle); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Handle); end; function TPyDelphiIcon.Get_HandleAllocated(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.HandleAllocated); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.HandleAllocated); end; class procedure TPyDelphiIcon.RegisterGetSets(PythonType: TPythonType); @@ -2491,9 +2393,9 @@ class procedure TPyDelphiIcon.RegisterMethods(PythonType: TPythonType); function TPyDelphiIcon.ReleaseHandle_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':ReleaseHandle') <> 0 then begin Result := PyInt_FromLong(DelphiObject.ReleaseHandle); @@ -2513,16 +2415,14 @@ function TPyDelphiIcon.Set_Handle(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Handle', _value) then - begin - DelphiObject.Handle := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Handle', _value) then + begin + DelphiObject.Handle := _value; + Result := 0; + end + else + Result := -1; end; { TPyDelphiPicture } @@ -2534,52 +2434,40 @@ class function TPyDelphiPicture.DelphiObjectClass: TClass; function TPyDelphiPicture.Get_Bitmap(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Bitmap); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Bitmap); end; function TPyDelphiPicture.Get_Graphic(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Graphic); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Graphic); end; function TPyDelphiPicture.Get_Height(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Height); - end; + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Height); end; function TPyDelphiPicture.Get_Icon(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Icon); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Icon); end; {$IFNDEF FPC} function TPyDelphiPicture.Get_MetaFile(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.MetaFile); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.MetaFile); end; {$ENDIF FPC} function TPyDelphiPicture.Get_Width(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Width); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Width); end; function TPyDelphiPicture.GetDelphiObject: TPicture; @@ -2591,9 +2479,9 @@ function TPyDelphiPicture.LoadFromFile_Wrapper(args: PPyObject): PPyObject; var _pFileName : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:LoadFromFile',@_pFileName ) <> 0 then begin DelphiObject.LoadFromFile(PyString_AsDelphiString(_pFileName)); @@ -2641,9 +2529,9 @@ function TPyDelphiPicture.SaveToFile_Wrapper(args: PPyObject): PPyObject; var _pFileName : PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:SaveToFile',@_pFileName ) <> 0 then begin DelphiObject.SaveToFile(PyString_AsDelphiString(_pFileName)); @@ -2659,16 +2547,14 @@ function TPyDelphiPicture.Set_Bitmap(AValue: PPyObject; var _object : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'Bitmap', TBitmap, _object) then - begin - Self.DelphiObject.Bitmap := TBitmap(_object); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'Bitmap', TBitmap, _object) then + begin + Self.DelphiObject.Bitmap := TBitmap(_object); + Result := 0; + end + else + Result := -1; end; function TPyDelphiPicture.Set_Graphic(AValue: PPyObject; @@ -2676,16 +2562,14 @@ function TPyDelphiPicture.Set_Graphic(AValue: PPyObject; var _object : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'Graphic', TGraphic, _object) then - begin - Self.DelphiObject.Graphic := TGraphic(_object); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'Graphic', TGraphic, _object) then + begin + Self.DelphiObject.Graphic := TGraphic(_object); + Result := 0; + end + else + Result := -1; end; function TPyDelphiPicture.Set_Icon(AValue: PPyObject; @@ -2693,16 +2577,14 @@ function TPyDelphiPicture.Set_Icon(AValue: PPyObject; var _object : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'Icon', TIcon, _object) then - begin - Self.DelphiObject.Icon := TIcon(_object); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'Icon', TIcon, _object) then + begin + Self.DelphiObject.Icon := TIcon(_object); + Result := 0; + end + else + Result := -1; end; {$IFNDEF FPC} @@ -2711,16 +2593,14 @@ function TPyDelphiPicture.Set_MetaFile(AValue: PPyObject; var _object : TObject; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'MetaFile', TMetaFile, _object) then - begin - Self.DelphiObject.MetaFile := TMetaFile(_object); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckObjAttribute(AValue, 'MetaFile', TMetaFile, _object) then + begin + Self.DelphiObject.MetaFile := TMetaFile(_object); + Result := 0; + end + else + Result := -1; end; {$ENDIF FPC} diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiGrids.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiGrids.pas index 31ec9cb7..e3bdb968 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiGrids.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiGrids.pas @@ -177,19 +177,19 @@ function MakeGridDrawState(AState : TGridDrawState) : PPyObject; Result := PyList_New(0); if gdSelected in AState then begin - _item := PyString_FromString('gdSelected'); + _item := PyString_FromDelphiString('gdSelected'); PyList_Append(Result, _item); Py_DecRef(_item); end; if gdFocused in AState then begin - _item := PyString_FromString('gdFocused'); + _item := PyString_FromDelphiString('gdFocused'); PyList_Append(Result, _item); Py_DecRef(_item); end; if gdFixed in AState then begin - _item := PyString_FromString('gdFixed'); + _item := PyString_FromDelphiString('gdFixed'); PyList_Append(Result, _item); Py_DecRef(_item); end; @@ -380,89 +380,69 @@ function TPyDelphiCustomDrawGrid.GetDelphiObject: TCustomDrawGrid; function TPyDelphiCustomDrawGrid.Get_Canvas(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Wrap(DelphiObject.Canvas); - end; + Adjust(@Self); + Result := Wrap(DelphiObject.Canvas); end; function TPyDelphiCustomDrawGrid.Get_ColWidths( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TGridColWidthsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); - end; + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TGridColWidthsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; function TPyDelphiCustomDrawGrid.Get_Col(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Col); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Col); end; function TPyDelphiCustomDrawGrid.Get_EditorMode( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := VariantAsPyObject(DelphiObject.EditorMode); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.EditorMode); end; function TPyDelphiCustomDrawGrid.Get_GridHeight( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.GridHeight); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.GridHeight); end; function TPyDelphiCustomDrawGrid.Get_GridWidth( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.GridWidth); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.GridWidth); end; function TPyDelphiCustomDrawGrid.Get_LeftCol(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.LeftCol); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.LeftCol); end; function TPyDelphiCustomDrawGrid.Get_Row(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.Row); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.Row); end; function TPyDelphiCustomDrawGrid.Get_Selection( AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := WrapRect(PyDelphiWrapper, TRect(DelphiObject.Selection)); - end; + Adjust(@Self); + Result := WrapRect(PyDelphiWrapper, TRect(DelphiObject.Selection)); end; function TPyDelphiCustomDrawGrid.Get_TopRow(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.TopRow); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.TopRow); end; class function TPyDelphiCustomDrawGrid.GetTypeName : String; @@ -510,16 +490,14 @@ function TPyDelphiCustomDrawGrid.Set_Col(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Col', _value) then - begin - DelphiObject.Col := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Col', _value) then + begin + DelphiObject.Col := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiCustomDrawGrid.Set_EditorMode(AValue: PPyObject; @@ -527,16 +505,14 @@ function TPyDelphiCustomDrawGrid.Set_EditorMode(AValue: PPyObject; var _value : Boolean; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'EditorMode', _value) then - begin - DelphiObject.EditorMode := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckBoolAttribute(AValue, 'EditorMode', _value) then + begin + DelphiObject.EditorMode := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiCustomDrawGrid.Set_LeftCol(AValue: PPyObject; @@ -544,16 +520,14 @@ function TPyDelphiCustomDrawGrid.Set_LeftCol(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'LeftCol', _value) then - begin - DelphiObject.LeftCol := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'LeftCol', _value) then + begin + DelphiObject.LeftCol := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiCustomDrawGrid.Set_Row(AValue: PPyObject; @@ -561,16 +535,14 @@ function TPyDelphiCustomDrawGrid.Set_Row(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'Row', _value) then - begin - DelphiObject.Row := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'Row', _value) then + begin + DelphiObject.Row := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiCustomDrawGrid.Set_Selection(AValue: PPyObject; @@ -578,16 +550,14 @@ function TPyDelphiCustomDrawGrid.Set_Selection(AValue: PPyObject; var _value : TRect; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckRectAttribute(AValue, 'Selection', _value) then - begin - DelphiObject.Selection := TGridRect(_value); - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckRectAttribute(AValue, 'Selection', _value) then + begin + DelphiObject.Selection := TGridRect(_value); + Result := 0; + end + else + Result := -1; end; function TPyDelphiCustomDrawGrid.Set_TopRow(AValue: PPyObject; @@ -595,16 +565,14 @@ function TPyDelphiCustomDrawGrid.Set_TopRow(AValue: PPyObject; var _value : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'TopRow', _value) then - begin - DelphiObject.TopRow := _value; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'TopRow', _value) then + begin + DelphiObject.TopRow := _value; + Result := 0; + end + else + Result := -1; end; { TPyDelphiDrawGrid } @@ -666,11 +634,11 @@ function TPyDelphiStringGrid.GetCell(args: PPyObject): PPyObject; var col, row: integer; begin + // adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'ii:GetCell',@col, @row ) <> 0 then - Result := PyString_FromString(PAnsiChar(AnsiString(DelphiObject.Cells[col, row]))) + Result := PyString_FromDelphiString(DelphiObject.Cells[col, row]) else Result := nil; end; @@ -695,7 +663,6 @@ function TPyDelphiStringGrid.SetCell(args: PPyObject): PPyObject; end; - initialization RegisteredUnits.Add( TGridsRegistration.Create ); Classes.RegisterClasses([TDrawGrid, TStringGrid]); diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiStdCtrls.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiStdCtrls.pas index 2872fb06..0fc7efaf 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiStdCtrls.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiStdCtrls.pas @@ -262,26 +262,22 @@ procedure TPyDelphiCustomEdit.SetDelphiObject(const Value: TCustomEdit); function TPyDelphiCustomEdit.Get_SelStart(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.SelStart); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.SelStart); end; function TPyDelphiCustomEdit.Set_SelStart(AValue: PPyObject; AContext: Pointer): integer; var _SelStart : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'SelStart', _SelStart) then - begin - DelphiObject.SelStart := _SelStart; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'SelStart', _SelStart) then + begin + DelphiObject.SelStart := _SelStart; + Result := 0; + end + else + Result := -1; end; class procedure TPyDelphiCustomEdit.RegisterGetSets(PythonType: TPythonType); @@ -403,24 +399,20 @@ function TPyDelphiListBox.Set_ItemIndex(AValue: PPyObject; AContext: Pointer): i var _index : Integer; begin - with GetPythonEngine do begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'ItemIndex', _index) then - begin - DelphiObject.ItemIndex := _index; - Result := 0; - end - else - Result := -1; - end; + Adjust(@Self); + if CheckIntAttribute(AValue, 'ItemIndex', _index) then + begin + DelphiObject.ItemIndex := _index; + Result := 0; + end + else + Result := -1; end; function TPyDelphiListBox.Get_ItemIndex(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.ItemIndex); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.ItemIndex); end; class procedure TPyDelphiListBox.RegisterGetSets(PythonType: TPythonType); diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiTypes.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiTypes.pas index a4e43513..0d3c4d3b 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiTypes.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiTypes.pas @@ -250,18 +250,14 @@ constructor TPyDelphiPoint.CreateWith(APythonType: TPythonType; function TPyDelphiPoint.Get_X(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(Value.X); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(Value.X); end; function TPyDelphiPoint.Get_Y(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(Value.Y); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(Value.Y); end; class procedure TPyDelphiPoint.RegisterGetSets(PythonType: TPythonType); @@ -278,8 +274,8 @@ class procedure TPyDelphiPoint.RegisterGetSets(PythonType: TPythonType); function TPyDelphiPoint.Repr: PPyObject; begin - with GetPythonEngine do - Result := PyString_FromString(PAnsiChar(AnsiString(Format('', [Value.X, Value.Y])))); + Result := GetPythonEngine.PyString_FromDelphiString(Format('', + [Value.X, Value.Y])); end; class procedure TPyDelphiPoint.SetupType(PythonType: TPythonType); @@ -353,50 +349,38 @@ constructor TPyDelphiRect.CreateWith(APythonType: TPythonType; function TPyDelphiRect.Get_Bottom(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(Value.Bottom); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(Value.Bottom); end; function TPyDelphiRect.Get_BottomRight(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := WrapPoint(PyDelphiWrapper, Value.BottomRight); - end; + Adjust(@Self); + Result := WrapPoint(PyDelphiWrapper, Value.BottomRight); end; function TPyDelphiRect.Get_Left(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(Value.Left); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(Value.Left); end; function TPyDelphiRect.Get_Right(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(Value.Right); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(Value.Right); end; function TPyDelphiRect.Get_Top(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(Value.Top); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(Value.Top); end; function TPyDelphiRect.Get_TopLeft(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := WrapPoint(PyDelphiWrapper, Value.TopLeft); - end; + Adjust(@Self); + Result := WrapPoint(PyDelphiWrapper, Value.TopLeft); end; class procedure TPyDelphiRect.RegisterGetSets(PythonType: TPythonType); @@ -421,8 +405,8 @@ class procedure TPyDelphiRect.RegisterGetSets(PythonType: TPythonType); function TPyDelphiRect.Repr: PPyObject; begin - with GetPythonEngine do - Result := PyString_FromString(PAnsiChar(AnsiString(Format('', [Value.Left, Value.Top, Value.Right, Value.Bottom])))); + Result := GetPythonEngine.PyString_FromDelphiString(Format('', + [Value.Left, Value.Top, Value.Right, Value.Bottom])); end; function TPyDelphiRect.Set_Bottom(AValue: PPyObject; @@ -431,13 +415,13 @@ function TPyDelphiRect.Set_Bottom(AValue: PPyObject; _value : Integer; begin if CheckIntAttribute(AValue, 'Bottom', _value) then - with GetPythonEngine do begin - Adjust(@Self); - fValue.Bottom := _value; - Result := 0; - end - else - Result := -1; + begin + Adjust(@Self); + fValue.Bottom := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiRect.Set_BottomRight(AValue: PPyObject; @@ -446,13 +430,13 @@ function TPyDelphiRect.Set_BottomRight(AValue: PPyObject; _value : TPoint; begin if CheckPointAttribute(AValue, 'BottomRight', _value) then - with GetPythonEngine do begin - Adjust(@Self); - fValue.BottomRight := _value; - Result := 0; - end - else - Result := -1; + begin + Adjust(@Self); + fValue.BottomRight := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiRect.Set_Left(AValue: PPyObject; @@ -461,13 +445,13 @@ function TPyDelphiRect.Set_Left(AValue: PPyObject; _value : Integer; begin if CheckIntAttribute(AValue, 'Left', _value) then - with GetPythonEngine do begin - Adjust(@Self); - fValue.Left := _value; - Result := 0; - end - else - Result := -1; + begin + Adjust(@Self); + fValue.Left := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiRect.Set_Right(AValue: PPyObject; @@ -476,13 +460,13 @@ function TPyDelphiRect.Set_Right(AValue: PPyObject; _value : Integer; begin if CheckIntAttribute(AValue, 'Right', _value) then - with GetPythonEngine do begin - Adjust(@Self); - fValue.Right := _value; - Result := 0; - end - else - Result := -1; + begin + Adjust(@Self); + fValue.Right := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiRect.Set_Top(AValue: PPyObject; @@ -491,13 +475,13 @@ function TPyDelphiRect.Set_Top(AValue: PPyObject; _value : Integer; begin if CheckIntAttribute(AValue, 'Top', _value) then - with GetPythonEngine do begin - Adjust(@Self); - fValue.Top := _value; - Result := 0; - end - else - Result := -1; + begin + Adjust(@Self); + fValue.Top := _value; + Result := 0; + end + else + Result := -1; end; function TPyDelphiRect.Set_TopLeft(AValue: PPyObject; @@ -506,13 +490,13 @@ function TPyDelphiRect.Set_TopLeft(AValue: PPyObject; _value : TPoint; begin if CheckPointAttribute(AValue, 'TopLeft', _value) then - with GetPythonEngine do begin - Adjust(@Self); - fValue.TopLeft := _value; - Result := 0; - end - else - Result := -1; + begin + Adjust(@Self); + fValue.TopLeft := _value; + Result := 0; + end + else + Result := -1; end; class procedure TPyDelphiRect.SetupType(PythonType: TPythonType); @@ -559,18 +543,14 @@ constructor TPyDelphiSize.CreateWith(APythonType: TPythonType; function TPyDelphiSize.Get_CX(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(Value.cx); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(Value.cx); end; function TPyDelphiSize.Get_CY(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); - Result := PyInt_FromLong(Value.cy); - end; + Adjust(@Self); + Result := GetPythonEngine.PyInt_FromLong(Value.cy); end; class procedure TPyDelphiSize.RegisterGetSets(PythonType: TPythonType); @@ -587,8 +567,8 @@ class procedure TPyDelphiSize.RegisterGetSets(PythonType: TPythonType); function TPyDelphiSize.Repr: PPyObject; begin - with GetPythonEngine do - Result := PyString_FromString(PAnsiChar(AnsiString(Format('', [Value.cx, Value.cy])))); + Result := GetPythonEngine.PyString_FromDelphiString(Format('', + [Value.cx, Value.cy])); end; class procedure TPyDelphiSize.SetupType(PythonType: TPythonType); @@ -608,13 +588,13 @@ function TPyDelphiSize.Set_CX(AValue: PPyObject; cx : Integer; begin if CheckIntAttribute(AValue, 'cx', cx) then - with GetPythonEngine do begin - Adjust(@Self); - fValue.cx := cx; - Result := 0; - end - else - Result := -1; + begin + Adjust(@Self); + fValue.cx := cx; + Result := 0; + end + else + Result := -1; end; function TPyDelphiSize.Set_CY(AValue: PPyObject; @@ -623,13 +603,13 @@ function TPyDelphiSize.Set_CY(AValue: PPyObject; cy : Integer; begin if CheckIntAttribute(AValue, 'cy', cy) then - with GetPythonEngine do begin - Adjust(@Self); - fValue.cy := cy; - Result := 0; - end - else - Result := -1; + begin + Adjust(@Self); + fValue.cy := cy; + Result := 0; + end + else + Result := -1; end; initialization diff --git a/PythonForDelphi/Components/Sources/Core/WrapFireDAC.pas b/PythonForDelphi/Components/Sources/Core/WrapFireDAC.pas index 5994c99b..7725d428 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapFireDAC.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapFireDAC.pas @@ -628,42 +628,42 @@ procedure TPyDBField.AppendProperties( List : PPyObject ); function TPyDBField.Do_Clear( args : PPyObject ) : PPyObject; begin - with GetPythonEngine do begin - Adjust(@Self); // <- adjust the transmitted self argument - try - if CheckField then begin - DelphiObject.Clear; - Result := ReturnNone; - end - else - Result := nil; - except - on E : Exception do begin - RaiseDBError( E ); - Result := nil; - end; - end; - end; + Adjust(@Self); // <- adjust the transmitted self argument + with GetPythonEngine do begin + try + if CheckField then begin + DelphiObject.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 - DelphiObject.FocusControl; - Result := ReturnNone; - end - else - Result := nil; - except - on E : Exception do begin - RaiseDBError( E ); - Result := nil; - end; - end; - end; + Adjust(@Self); // <- adjust the transmitted self argument + with GetPythonEngine do begin + try + if CheckField then begin + DelphiObject.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; @@ -672,50 +672,50 @@ function TPyDBField.Do_IsValidChar( args : PPyObject ) : PPyObject; 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( DelphiObject.IsValidChar( c ) ) - end - else - Result := nil; - end - else - Result := nil; - except - on E : Exception do begin - RaiseDBError( E ); - Result := nil; - end; - end; - end; + Adjust(@Self); // <- adjust the transmitted self argument + with GetPythonEngine do begin + 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( DelphiObject.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 - DelphiObject.RefreshLookupList; - Result := ReturnNone; - end - else - Result := nil; - except - on E : Exception do begin - RaiseDBError( E ); - Result := nil; - end; - end; - end; + Adjust(@Self); // <- adjust the transmitted self argument + with GetPythonEngine do begin + try + if CheckField then begin + DelphiObject.RefreshLookupList; + Result := ReturnNone; + end + else + Result := nil; + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; end; // ----------------------- TDSRowsAccess --------------------------------------- @@ -727,41 +727,41 @@ class function TDSRowsAccess.ExpectedContainerClass: TClass; function TDSRowsAccess.GetContainer: TFDDataset; begin - Result := TFDDataset(inherited Container); + Result := TFDDataset(inherited Container); end; function TDSRowsAccess.GetItem(aIndex: Integer): PPyObject; var - i : Integer; - l_oDataset: TFDDataset; -begin - Result := nil; - l_oDataset := GetContainer; - 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( SqlTimeToVarDate(Value) ) ); - end; - end; - except - on E : Exception do begin - raise Exception.CreateFmt('Exception in TDSRowsAccess.GetItem - Index=%d', [AIndex]); - end; - end; - end; - end; + i : Integer; + l_oDataset: TFDDataset; +begin + Result := nil; + l_oDataset := GetContainer; + 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( SqlTimeToVarDate(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; + l_oDataset: TFDDataset; begin - l_oDataset := GetContainer; - Result := l_oDataset.RecordCount; + l_oDataset := GetContainer; + Result := l_oDataset.RecordCount; end; @@ -775,12 +775,12 @@ class function TDSRowsAccess.Name: String; function TPyDBDataset.GetDelphiObject: TFDDataset; begin - Result := TFDDataset(inherited DelphiObject); + Result := TFDDataset(inherited DelphiObject); end; procedure TPyDBDataset.SetDelphiObject(const Value: TFDDataset); begin - inherited DelphiObject := Value; + inherited DelphiObject := Value; end; @@ -793,30 +793,26 @@ class procedure TPyDBDataset.SetupType(PythonType: TPythonType); class function TPyDBDataset.DelphiObjectClass : TClass; begin - Result := TFDDataset; + Result := TFDDataset; end; class function TPyDBDataset.GetContainerAccessClass : TContainerAccessClass; begin - Result := TDSRowsAccess; + Result := TDSRowsAccess; end; function TPyDBDataset.Get_RowsCount(AContext: Pointer): PPyObject; begin - with GetPythonEngine do begin Adjust(@Self); - Result := PyInt_FromLong(DelphiObject.RecordCount); - end; + Result := GetPythonEngine.PyInt_FromLong(DelphiObject.RecordCount); 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; + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TDSRowsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; class procedure TPyDBDataset.RegisterGetSets( PythonType : TPythonType ); @@ -867,187 +863,187 @@ function TPyDBDataset.GetAttrO(key: PPyObject) : PPyObject; l_sUpperKey: String; l_oDataset: TFDDataset; begin - Result := nil; - with GetPythonEngine do begin - try - l_oDataset := DelphiObject; - l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); - if l_sUpperKey = 'BOF' then - Result := VariantAsPyObject( l_oDataset.BOF ) - else if l_sUpperKey = 'CANMODIFY' then - Result := VariantAsPyObject( l_oDataset.CanModify ) - else if l_sUpperKey = 'EOF' then - Result := VariantAsPyObject( l_oDataset.EOF ) - else if l_sUpperKey = 'FIELDCOUNT' then - Result := VariantAsPyObject( l_oDataset.FieldCount ) - else if l_sUpperKey = 'RECNO' then - Result := VariantAsPyObject( l_oDataset.RecNo ) - else - Result := inherited GetAttrO(key); - except - on E : Exception do begin - RaiseDBError( E ); - Result := Nil; - end; - end; - end; + Result := nil; + with GetPythonEngine do begin + try + l_oDataset := DelphiObject; + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'BOF' then + Result := VariantAsPyObject( l_oDataset.BOF ) + else if l_sUpperKey = 'CANMODIFY' then + Result := VariantAsPyObject( l_oDataset.CanModify ) + else if l_sUpperKey = 'EOF' then + Result := VariantAsPyObject( l_oDataset.EOF ) + else if l_sUpperKey = 'FIELDCOUNT' then + Result := VariantAsPyObject( l_oDataset.FieldCount ) + else if l_sUpperKey = 'RECNO' then + Result := VariantAsPyObject( l_oDataset.RecNo ) + else + Result := inherited GetAttrO(key); + except + on E : Exception do begin + RaiseDBError( E ); + Result := Nil; + end; + end; + end; end; function TPyDBDataset.SetAttrO(key, value: PPyObject) : Integer; var - l_sUpperKey: String; - l_oDataset: TFDDataset; + l_sUpperKey: String; + l_oDataset: TFDDataset; begin - Result := -1; - with GetPythonEngine do begin - try - l_oDataset := DelphiObject; - l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); - if l_sUpperKey = 'FILTER' then begin - l_oDataset.Filter := PyObjectAsVariant( value ); - Result := 0; - end - else if l_sUpperKey = 'FILTERED' then begin - l_oDataset.Filtered := PyObjectAsVariant( value ); - Result := 0; - end - else if l_sUpperKey = 'BOF' then begin - Result := 0; - end - else if l_sUpperKey = 'CanModify' then begin - Result := 0; - end - else if l_sUpperKey = 'EOF' then begin - Result := 0; - end - else if l_sUpperKey = 'RECNO' then begin - l_oDataset.RecNo := PyObjectAsVariant( value ); - Result := 0; - end - else - Result := inherited SetAttrO(key, value); - except - on E : Exception do begin - RaiseDBError( E ); - Result := -1; - end; - end; - end; + Result := -1; + with GetPythonEngine do begin + try + l_oDataset := DelphiObject; + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'FILTER' then begin + l_oDataset.Filter := PyObjectAsVariant( value ); + Result := 0; + end + else if l_sUpperKey = 'FILTERED' then begin + l_oDataset.Filtered := PyObjectAsVariant( value ); + Result := 0; + end + else if l_sUpperKey = 'BOF' then begin + Result := 0; + end + else if l_sUpperKey = 'CanModify' then begin + Result := 0; + end + else if l_sUpperKey = 'EOF' then begin + Result := 0; + end + else if l_sUpperKey = 'RECNO' then begin + l_oDataset.RecNo := PyObjectAsVariant( value ); + Result := 0; + end + else + Result := inherited SetAttrO(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) ); + if self.GetModule <> nil then + GetModule.RaiseError( AnsiString('DBError'), AnsiString(E.Message) ); end; function TPyDBDataset.Do_Fields( args : PPyObject ): PPyObject; var - idx : Integer; - l_oDataset: TFDDataset; + idx : Integer; + 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 - Result := PyDelphiWrapper.Wrap(l_oDataset.Fields[idx]) - 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; + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + l_oDataset := DelphiObject; + try + if PyArg_ParseTuple( args, 'i:DBDataset.Fields',@idx ) <> 0 then begin + if (idx >= 0) and (idx < l_oDataset.FieldCount) then + Result := PyDelphiWrapper.Wrap(l_oDataset.Fields[idx]) + 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; - l_oDataset: TFDDataset; + l_sAStr: AnsiString; + s : PAnsiChar; + fld : TField; + 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 - Result := PyDelphiWrapper.Wrap(fld) - 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; + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + 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 + Result := PyDelphiWrapper.Wrap(fld) + 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_oDataset: TFDDataset; + i : Integer; + l_oDataset: TFDDataset; begin - with GetPythonEngine do begin - Adjust(@Self); - l_oDataset := DelphiObject; - try - Result := PyTuple_New(l_oDataset.FieldCount); - for i := 0 to l_oDataset.FieldCount - 1 do - with l_oDataset.Fields[i] do - PyTuple_SetItem(Result, i, PyUnicode_FromWideString(FieldName)); - except - on E : Exception do begin - RaiseDBError( E ); - Result := nil; - end; - end; - end; + Adjust(@Self); + with GetPythonEngine do begin + l_oDataset := DelphiObject; + try + Result := PyTuple_New(l_oDataset.FieldCount); + for i := 0 to l_oDataset.FieldCount - 1 do + with l_oDataset.Fields[i] do + PyTuple_SetItem(Result, i, PyUnicode_FromWideString(FieldName)); + 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_oDataset: TFDDataset; + i : Integer; + 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); - for i := 0 to l_oDataset.FieldCount - 1 do begin - PyTuple_SetItem( Result, i, - VariantAsPyObject( SqlTimeToVarDate(l_oDataset.Fields[i].AsVariant )) ); - end; - except - on E : Exception do begin - RaiseDBError( E ); - end; - end; - end; + Result := nil; + Adjust(@Self); // <- adjust the transmitted self argument + with GetPythonEngine do begin + l_oDataset := DelphiObject; + try + Result := PyTuple_New(l_oDataset.FieldCount); + for i := 0 to l_oDataset.FieldCount - 1 do begin + PyTuple_SetItem( Result, i, + VariantAsPyObject( SqlTimeToVarDate(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; @@ -1057,266 +1053,266 @@ function TPyDBDataset.Do_FieldsAsDict( args: PPyObject): PPyObject; 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( SqlTimeToVarDate(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; + with GetPythonEngine do begin + 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( SqlTimeToVarDate(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; + 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; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Adjust(@Self); + with GetPythonEngine do begin + 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; + l_oDataset: TFDDataset; + keyFields : PAnsiChar; + keyValues, options : PPyObject; + rslt : Boolean; + vvalues : Variant; + opt : TLocateOptions; +begin + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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 ------------------------------------ function TPyDBTable.GetDelphiObject: TFDTable; begin - Result := TFDTable(inherited DelphiObject); + Result := TFDTable(inherited DelphiObject); end; procedure TPyDBTable.SetDelphiObject(const Value: TFDTable); begin - inherited DelphiObject := Value; + inherited DelphiObject := Value; end; class function TPyDBTable.DelphiObjectClass: TClass; begin - Result := TFDTable; + Result := TFDTable; end; destructor TPyDBTable.Destroy; @@ -1328,586 +1324,586 @@ destructor TPyDBTable.Destroy; 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, + 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, + AnsiStrin g('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; + 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; 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; + 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.GetAttrO(key: PPyObject) : PPyObject; var - l_sUpperKey: String; - l_sConnectionDefName, l_sDatabaseName: String; - l_oConn: TFDCustomConnection; - l_oTable: TFDTable; + 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(PyString_AsDelphiString(Key)); - if l_sUpperKey = 'CONNECTIONDEFNAME' 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 l_sUpperKey = 'DATABASENAME' 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 l_sUpperKey = 'TABLENAME'then - Result := VariantAsPyObject( l_oTable.TableName ) - else if l_sUpperKey = 'ACTIVE' then - Result := VariantAsPyObject( l_oTable.Active ) - else if l_sUpperKey = 'FILTER' then - Result := VariantAsPyObject( l_oTable.Filter ) - else if l_sUpperKey = 'FILTERED' then - Result := VariantAsPyObject( l_oTable.Filtered ) - else if l_sUpperKey = 'STATE' then - Result := VariantAsPyObject( Integer(l_oTable.State) ) - else if l_sUpperKey = 'MODIFIED' then - Result := VariantAsPyObject( l_oTable.Modified ) - else if l_sUpperKey = 'ISRANGED' then - // Ermöglicht das Ermitteln des aktuellen Bereichsfilterungsmodus. - Result := VariantAsPyObject( l_oTable.IsRanged ) - else if l_sUpperKey = 'KEYEXCLUSIVE' then - // Ermittelt oder setzt die Einbeziehung der niedrigsten und höchsten Werte in einen gefilterten Bereich. - Result := VariantAsPyObject( l_oTable.KeyExclusive ) - else if l_sUpperKey = 'KEYFIELDCOUNT' then - // Ermittelt oder setzt die Anzahl der in der Bereichsfilterung zu verwendenden Indexfelder - Result := VariantAsPyObject( l_oTable.KeyFieldCount ) - else if l_sUpperKey = 'INDEXNAME' then - Result := VariantAsPyObject( l_oTable.IndexName ) - else - Result := inherited GetAttrO(key); - except - on E : Exception do begin - RaiseDBError( E ); - Result := nil; - end; - end; - end; + Result := nil; + with GetPythonEngine do begin + l_oConn := Nil; + try + l_oTable := DelphiObject; + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'CONNECTIONDEFNAME' 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 l_sUpperKey = 'DATABASENAME' 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 l_sUpperKey = 'TABLENAME'then + Result := VariantAsPyObject( l_oTable.TableName ) + else if l_sUpperKey = 'ACTIVE' then + Result := VariantAsPyObject( l_oTable.Active ) + else if l_sUpperKey = 'FILTER' then + Result := VariantAsPyObject( l_oTable.Filter ) + else if l_sUpperKey = 'FILTERED' then + Result := VariantAsPyObject( l_oTable.Filtered ) + else if l_sUpperKey = 'STATE' then + Result := VariantAsPyObject( Integer(l_oTable.State) ) + else if l_sUpperKey = 'MODIFIED' then + Result := VariantAsPyObject( l_oTable.Modified ) + else if l_sUpperKey = 'ISRANGED' then + // Ermöglicht das Ermitteln des aktuellen Bereichsfilterungsmodus. + Result := VariantAsPyObject( l_oTable.IsRanged ) + else if l_sUpperKey = 'KEYEXCLUSIVE' then + // Ermittelt oder setzt die Einbeziehung der niedrigsten und höchsten Werte in einen gefilterten Bereich. + Result := VariantAsPyObject( l_oTable.KeyExclusive ) + else if l_sUpperKey = 'KEYFIELDCOUNT' then + // Ermittelt oder setzt die Anzahl der in der Bereichsfilterung zu verwendenden Indexfelder + Result := VariantAsPyObject( l_oTable.KeyFieldCount ) + else if l_sUpperKey = 'INDEXNAME' then + Result := VariantAsPyObject( l_oTable.IndexName ) + else + Result := inherited GetAttrO(key); + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; end; function TPyDBTable.SetAttrO(key, value: PPyObject) : Integer; var - i: Integer; - l_sUpperKey: String; - l_sName, l_sConnectionDefName, l_sDatabaseName: String; - l_oConn: TFDCustomConnection; - l_oTable: TFDTable; + 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(PyString_AsDelphiString(Key)); - if l_sUpperKey = 'CONNECTIONDEFNAME' 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 l_sUpperKey = 'DATABASENAME' 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 l_sUpperKey = 'TABLENAME' then begin - if CheckActiveDBTable(False) then begin - l_oTable.TableName := PyObjectAsVariant( value ); - Result := 0; - end; - end - else if l_sUpperKey = 'ACTIVE' then begin - l_oTable.Active := PyObjectAsVariant( value ); - Result := 0; - end - else if l_sUpperKey = 'FILTER' then begin - l_oTable.Filter := PyObjectAsVariant( value ); - Result := 0; - end - else if l_sUpperKey = 'FILTERED' then begin - l_oTable.Filtered := PyObjectAsVariant( value ); - Result := 0; - end - else if l_sUpperKey = 'STATE' then begin - Result := 0; - end - else if l_sUpperKey = 'MODIFIED' then begin - Result := 0; - end - else if l_sUpperKey = 'ISRANGED' then begin - Result := 0; - end - else if l_sUpperKey = 'KEYEXCLUSIVE' 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 l_sUpperKey = 'KEYFIELDCOUNT' then begin - // Ermittelt oder setzt die Anzahl der in der Bereichsfilterung zu verwendenden Indexfelder - l_oTable.KeyFieldCount := PyObjectAsVariant( value ); - Result := 0; - end - else if l_sUpperKey = 'INDEXNAME' 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 SetAttrO(key, value); - except - on E : Exception do begin - RaiseDBError( E ); - Result := -1; - end; - end; - end; + Result := -1; + with GetPythonEngine do begin + l_oConn := Nil; + try + l_oTable := DelphiObject; + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'CONNECTIONDEFNAME' 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 l_sUpperKey = 'DATABASENAME' 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 l_sUpperKey = 'TABLENAME' then begin + if CheckActiveDBTable(False) then begin + l_oTable.TableName := PyObjectAsVariant( value ); + Result := 0; + end; + end + else if l_sUpperKey = 'ACTIVE' then begin + l_oTable.Active := PyObjectAsVariant( value ); + Result := 0; + end + else if l_sUpperKey = 'FILTER' then begin + l_oTable.Filter := PyObjectAsVariant( value ); + Result := 0; + end + else if l_sUpperKey = 'FILTERED' then begin + l_oTable.Filtered := PyObjectAsVariant( value ); + Result := 0; + end + else if l_sUpperKey = 'STATE' then begin + Result := 0; + end + else if l_sUpperKey = 'MODIFIED' then begin + Result := 0; + end + else if l_sUpperKey = 'ISRANGED' then begin + Result := 0; + end + else if l_sUpperKey = 'KEYEXCLUSIVE' 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 l_sUpperKey = 'KEYFIELDCOUNT' then begin + // Ermittelt oder setzt die Anzahl der in der Bereichsfilterung zu verwendenden Indexfelder + l_oTable.KeyFieldCount := PyObjectAsVariant( value ); + Result := 0; + end + else if l_sUpperKey = 'INDEXNAME' 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 SetAttrO(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; + 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; + Result := nil; + Adjust(@Self); // <- Adjust the transmitted self argument + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + l_oTable: TFDTable; begin - Result := nil; - with GetPythonEngine do begin - Adjust(@Self); - l_oTable := DelphiObject; - try + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + L := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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 -------------------------------------------- function TPyDBQuery.GetDelphiObject: TFDQuery; begin - Result := TFDQuery(inherited DelphiObject); + Result := TFDQuery(inherited DelphiObject); end; procedure TPyDBQuery.SetDelphiObject(const Value: TFDQuery); begin - inherited DelphiObject := Value; + inherited DelphiObject := Value; end; class function TPyDBQuery.DelphiObjectClass : TClass; begin - Result := TFDQuery; + Result := TFDQuery; end; destructor TPyDBQuery.Destroy; @@ -1936,219 +1932,219 @@ class procedure TPyDBQuery.RegisterMethods( PythonType : TPythonType ); 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; + 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.GetAttrO(key: PPyObject) : PPyObject; var - l_sUpperKey: String; - l_sConnectionDefName, l_sDatabaseName: String; - l_oConn: TFDCustomConnection; - l_oQuery: TFDQuery; + l_sUpperKey: String; + l_sConnectionDefName, l_sDatabaseName: String; + l_oConn: TFDCustomConnection; + l_oQuery: TFDQuery; begin - Result := nil; - with GetPythonEngine do begin - l_oConn := Nil; - try - l_oQuery := DelphiObject; - l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); - if l_sUpperKey = 'CONNECTIONDEFNAME' 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 l_sUpperKey = 'DATABASENAME' 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 l_sUpperKey = 'PARAMCOUNT' then - Result := VariantAsPyObject( l_oQuery.ParamCount ) - else if l_sUpperKey = 'PREPARED' then - Result := VariantAsPyObject( l_oQuery.Prepared ) - else - Result := inherited GetAttrO(key); - except - on E : Exception do begin - RaiseDBError( E ); - Result := nil; - end; - end; - end; + Result := nil; + with GetPythonEngine do begin + l_oConn := Nil; + try + l_oQuery := DelphiObject; + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'CONNECTIONDEFNAME' 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 l_sUpperKey = 'DATABASENAME' 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 l_sUpperKey = 'PARAMCOUNT' then + Result := VariantAsPyObject( l_oQuery.ParamCount ) + else if l_sUpperKey = 'PREPARED' then + Result := VariantAsPyObject( l_oQuery.Prepared ) + else + Result := inherited GetAttrO(key); + except + on E : Exception do begin + RaiseDBError( E ); + Result := nil; + end; + end; + end; end; function TPyDBQuery.SetAttrO(key, value: PPyObject) : Integer; var - i: Integer; - l_sUpperKey: String; - l_sName, l_sConnectionDefName, l_sDatabaseName: String; - l_oConn: TFDCustomConnection; - l_oQuery: TFDQuery; + i: Integer; + l_sUpperKey: String; + l_sName, l_sConnectionDefName, l_sDatabaseName: String; + l_oConn: TFDCustomConnection; + l_oQuery: TFDQuery; begin - Result := -1; - with GetPythonEngine do begin - l_oConn := Nil; - try - l_oQuery := DelphiObject; - l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); - if l_sUpperKey = 'CONNECTIONDEFNAME' 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 l_sUpperKey = 'DATABASENAME' 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 l_sUpperKey = 'PARAMCOUNT' then begin - Result := 0; - end - else if l_sUpperKey = 'PREPARED' then begin - l_oQuery.Prepared := PyObjectAsVariant( value ); - Result := 0; - end - else - Result := inherited SetAttrO(key, value); - except - on E : Exception do begin - RaiseDBError( E ); - Result := -1; - end; - end; - end; + Result := -1; + with GetPythonEngine do begin + l_oConn := Nil; + try + l_oQuery := DelphiObject; + l_sUpperKey := UpperCase(PyString_AsDelphiString(Key)); + if l_sUpperKey = 'CONNECTIONDEFNAME' 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 l_sUpperKey = 'DATABASENAME' 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 l_sUpperKey = 'PARAMCOUNT' then begin + Result := 0; + end + else if l_sUpperKey = 'PREPARED' then begin + l_oQuery.Prepared := PyObjectAsVariant( value ); + Result := 0; + end + else + Result := inherited SetAttrO(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; + 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; + Result := nil; + Adjust(@Self); // <- Adjust the transmitted self argument + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + 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; + 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; + Result := nil; + Adjust(@Self); + with GetPythonEngine do begin + l_oQuery := DelphiObject; + try + l_oQuery.ExecSQL; + Result := ReturnNone; + except + on E : Exception do begin + RaiseDBError( E ); + end; + end; + end; end; // ----------------------------------------------------------------------------- diff --git a/PythonForDelphi/Components/Sources/VCL/pyDB.pas b/PythonForDelphi/Components/Sources/VCL/pyDB.pas index 00c17cf3..810172cb 100644 --- a/PythonForDelphi/Components/Sources/VCL/pyDB.pas +++ b/PythonForDelphi/Components/Sources/VCL/pyDB.pas @@ -469,7 +469,7 @@ procedure TCommon.AppendProp( List : PPyObject; const prop : String ); begin with GetPythonEngine do begin - obj := PyString_FromString(PAnsiChar(AnsiString(prop))); + obj := PyString_FromDelphiString(prop); PyList_Append( List, obj ); Py_XDecRef(obj); end; @@ -2774,7 +2774,7 @@ function TVarArg.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; function TVarArg.Repr : PPyObject; begin with GetPythonEngine do - Result := PyString_FromString( PAnsiChar(AnsiString(PyObjectAsString(FValue))) ); + Result := PyString_FromDelphiString( PyObjectAsString(FValue) ); end; constructor TPythonVarArg.Create( AOwner : TComponent ); From b3bc5a1bf4e28293314f935676144212500ea096 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 24 Oct 2019 04:34:49 +0300 Subject: [PATCH 118/123] Changed CleanString from method to function and added an overload. --- .../Components/Sources/Core/PythonEngine.pas | 80 +++++++++---------- .../Sources/Core/WrapDelphiClasses.pas | 2 +- 2 files changed, 37 insertions(+), 45 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 99ab4751..588e8ddd 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -498,8 +498,6 @@ interface getattrofunc = function( ob1,ob2: PPyObject): PPyObject; cdecl; setattrofunc = function( ob1,ob2,ob3: PPyObject): integer; cdecl; -/// jah 29-sep-2000 : updated for python 2.0 -/// added from object.h getreadbufferproc = function ( ob1: PPyObject; i: NativeInt; ptr: Pointer): NativeInt; cdecl; getwritebufferproc= function ( ob1: PPyObject; i: NativeInt; ptr: Pointer): NativeInt; cdecl; getsegcountproc = function ( ob1: PPyObject; i: NativeInt): NativeInt; cdecl; @@ -542,8 +540,7 @@ interface nb_oct : unaryfunc; nb_hex : unaryfunc; -/// jah 29-sep-2000 : updated for python 2.0 -/// added from .h + // Updated for python 2.0 nb_inplace_add : binaryfunc; nb_inplace_subtract : binaryfunc; nb_inplace_multiply : binaryfunc; @@ -573,9 +570,6 @@ interface sq_slice : ssizessizeargfunc; sq_ass_item : ssizeobjargproc; sq_ass_slice : ssizessizeobjargproc; - -/// jah 29-sep-2000 : updated for python 2.0 -/// added from .h sq_contains : objobjproc; sq_inplace_concat : binaryfunc; sq_inplace_repeat : ssizeargfunc; @@ -589,8 +583,6 @@ interface end; PPyMappingMethods = ^PyMappingMethods; -/// jah 29-sep-2000 : updated for python 2.0 -/// added from .h PyBufferProcs = {$IFNDEF CPUX64}packed{$ENDIF} record bf_getreadbuffer : getreadbufferproc; bf_getwritebuffer : getwritebufferproc; @@ -777,10 +769,10 @@ interface // Methods to implement standard operations tp_dealloc: pydestructor; - tp_print: printfunc; + tp_print: printfunc; // not available and replaced in Python 3.x tp_getattr: getattrfunc; tp_setattr: setattrfunc; - tp_compare: cmpfunc; + tp_compare: cmpfunc; // not available and replaced in Python 3.x tp_repr: reprfunc; // Method suites for standard classes @@ -797,8 +789,6 @@ interface tp_getattro: getattrofunc; tp_setattro: setattrofunc; -/// jah 29-sep-2000 : updated for python 2.0 - // Functions to access object as input/output buffer tp_as_buffer: PPyBufferProcs; // Flags to define presence of optional/expanded features @@ -1297,9 +1287,6 @@ EPyExecError = class(EPythonError); // Standard exception classes of Python -/// jah 29-sep-2000 : updated for python 2.0 -/// base classes updated according python documentation - { Hierarchy of Python exceptions, Python 2.3, copied from \Python\exceptions.c Exception\n\ @@ -1994,7 +1981,6 @@ TPythonInterface=class(TDynamicDll) PyParser_SimpleParseStringFlags : function ( str : PAnsiChar; start, flags : Integer) : PNode; cdecl; PyNode_Free : procedure( n : PNode ); cdecl; PyErr_NewException : function ( name : PAnsiChar; base, dict : PPyObject ) : PPyObject; cdecl; - Py_Malloc : function ( size : NativeInt ) : Pointer; PyMem_Malloc : function ( size : NativeInt ) : Pointer; {New exported Objects in Python 1.5} @@ -2268,7 +2254,6 @@ TPythonEngine = class(TPythonInterface) procedure SetProgramName(const ProgramName: string); function IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; function GetAttrString(obj: PPyObject; AName: PAnsiChar):PAnsiChar; - function CleanString(const s : AnsiString; AppendLF : Boolean = True) : AnsiString; function Run_CommandAsString(const command : AnsiString; mode : Integer) : String; function Run_CommandAsObject(const command : AnsiString; mode : Integer) : PPyObject; function Run_CommandAsObjectWithDict(const command : AnsiString; mode : Integer; locals, globals : PPyObject) : PPyObject; @@ -3186,6 +3171,11 @@ function IsPythonVersionRegistered(PythonVersion : string; *) procedure MaskFPUExceptions(ExceptionsMasked : boolean; MatchPythonPrecision : Boolean = True); +(* + Converts line breaks to LF and optionally adds a line break at the end +*) +function CleanString(const s : AnsiString; AppendLF : Boolean = True) : AnsiString; overload; +function CleanString(const s : string; AppendLF : Boolean = True) : string; overload; //####################################################### //## ## @@ -4119,12 +4109,7 @@ procedure TPythonInterface.MapDll; PyParser_SimpleParseStringFlags := Import('PyParser_SimpleParseStringFlags'); PyNode_Free :=Import('PyNode_Free'); PyErr_NewException :=Import('PyErr_NewException'); -/// jah 29-sep-2000 : updated for python 2.0 -/// replaced Py_Malloc with PyMem_Malloc -///--- @Py_Malloc := Import ('Py_Malloc'); -///+++ @Py_Malloc := Import ('PyMem_Malloc'); try - Py_Malloc := Import ('PyMem_Malloc'); PyMem_Malloc := Import ('PyMem_Malloc'); except end; @@ -5231,23 +5216,6 @@ function TPythonEngine.GetAttrString(obj: PPyObject; AName: PAnsiChar):PAnsiChar PyErr_Clear; end; -function TPythonEngine.CleanString(const s : AnsiString; AppendLF : Boolean) : AnsiString; -var - i : Integer; -begin - result := s; - if s = '' then - Exit; - i := Pos(AnsiString(CR),s); - while i > 0 do - begin - Delete( result, i, 1 ); - i := PosEx(AnsiString(CR),result, i); - end; - if AppendLF and (result[length(result)] <> LF) then - Insert( LF, result, length(result)+1 ); -end; - function TPythonEngine.EvalPyFunction(pyfunc, pyargs:PPyObject): Variant; var presult :PPyObject; begin @@ -6819,7 +6787,7 @@ function TEventDef.GetDocString : AnsiString; begin Owner.Container.CheckEngine; FTmpDocString := - Owner.Container.Engine.CleanString(AnsiString(FDocString.Text), False); + Owner.Container.Engine.EncodeString(CleanString(FDocString.Text, False)); Result := fTmpDocString; end; @@ -7595,7 +7563,7 @@ procedure TPythonModule.DefineDocString; if DocString.Text <> '' then begin doc := - PyString_FromDelphiString(AdjustLineBreaks(FDocString.Text,tlbsLF)); + PyString_FromDelphiString(CleanString(FDocString.Text, False)); PyObject_SetAttrString( FModule, '__doc__', doc ); Py_XDecRef(doc); CheckError(False); @@ -8857,9 +8825,9 @@ procedure TPythonType.InitServices; begin // Basic services if FDocString.Count > 0 then - With Engine do + with Engine do begin - FCurrentDocString := CleanString(EncodeString(FDocString.Text), False); + FCurrentDocString := EncodeString(CleanString(FDocString.Text, False)); tp_doc := PAnsiChar(FCurrentDocString); end; tp_dealloc := @PyObjectDestructor; @@ -9875,6 +9843,30 @@ procedure MaskFPUExceptions(ExceptionsMasked : boolean; {$ENDIF !NEXTGEN}{$WARN SYMBOL_PLATFORM ON} end; +function CleanString(const s : AnsiString; AppendLF : Boolean) : AnsiString; +var + i : Integer; +begin + result := s; + if s = '' then + Exit; + i := Pos(AnsiString(CR),s); + while i > 0 do + begin + Delete( result, i, 1 ); + i := PosEx(AnsiString(CR),result, i); + end; + if AppendLF and (result[length(result)] <> LF) then + Result := Result + LF; +end; + +function CleanString(const s : string; AppendLF : Boolean) : string; +begin + Result := AdjustLineBreaks(s, tlbsLF); + if AppendLF and (result[length(result)] <> LF) then + Result := Result + LF; +end; + {$IFDEF MSWINDOWS} function IsPythonVersionRegistered(PythonVersion : string; out InstallPath: string; out AllUserInstall: Boolean) : Boolean; diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas index dd032ee3..48ed19f5 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas @@ -1304,7 +1304,7 @@ function TPyDelphiStrings.Get_Text(AContext: Pointer): PPyObject; begin Adjust(@Self); Result := GetPythonEngine.PyString_FromDelphiString( - AdjustLineBreaks(DelphiObject.Text, tlbsLF)); + CleanString(DelphiObject.Text, False)); end; function TPyDelphiStrings.IndexOf_Wrapper(args: PPyObject): PPyObject; From 3d7515dcef68471a24109fcc07afe5ea57707958 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 26 Oct 2019 06:21:24 +0300 Subject: [PATCH 119/123] Fix #17 - Major refactoring and clean-up - In Delhi version newer than XE, enhanced RTTI is used to provide access to methods, fields and properties. So in most cases you no longer need to create wrapping classes. - __published__ property was replaced with the implementation of the __dir__() method, so that you can do for example dir(MainForm) to inspect the methods, fields and properties of MainForm. - Demo 31 has been updated to test/showcase some of the new features. --- .../Components/Sources/Core/WrapDelphi.pas | 998 +++++++++++++----- PythonForDelphi/Demos/Demo31/Project1.dpr | 16 +- PythonForDelphi/Demos/Demo31/Project1.dproj | 14 +- PythonForDelphi/Demos/Demo31/Unit1.dfm | Bin 15334 -> 21800 bytes PythonForDelphi/Demos/Demo31/Unit1.pas | 52 +- 5 files changed, 810 insertions(+), 270 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas index 3b91d535..08015544 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas @@ -1,4 +1,4 @@ -(*----------------------------------------------------------------------------- +(*----------------------------------------------------------------------------- Unit Name: WrapDelphi Author: Kiriakos Vlahos Date: 24-Feb-2005 @@ -8,7 +8,7 @@ Contributors: Morgan Martinet (mmm@free.fr) - Features: + Features: P Check our Wiki at: http://py4d.pbwiki.com/. Published properties and methods compiled with {$METHODINFO ON} are @@ -66,7 +66,7 @@ def handle_btnAdd_OnClick(self, Sender): self.ListBox1.Items.Add(self.Edit1.Text) - There is also a helper method named SetProps at the TPyDelphiObject level, + There is also a helper method named SetProps at the TPyDelphiObject level, allowing any wrapped object to do: button.SetProps(Left=10, Top=20, Caption='Clickme!) @@ -284,17 +284,26 @@ 1.11 14-Mar-2006 Morgan Martinet - - Added methods Repaint and Invalidate to the TControl wrapper + - Added methods Repaint and Invalidate to the TControl wrapper - Fixed bug when running WrapDelphi without Assertions in the compiler options thanks to a report from Dominique Whali - - made fields fDefaultIterType and fDefaultContainerType of TPyDelphiWrapper protected - + - made fields fDefaultIterType and fDefaultContainerType of TPyDelphiWrapper protected + + Oct-2019 PyScripter + - Major refactoring and clean-up + - In Delhi version newer than XE, enhanced RTTI is used to provide access to + methods, fields and properties. So in most cases you no longer need to + create wrapping classes. + - __published__ property was replaced with the implementation of the __dir__() + method, so that you can do for example dir(MainForm) to inspect the + methods, fields and properties of MainForm. + - Demo 31 has been updated to test/showcase some of the new features. + TODO: + - Implement RTTI Fields - Extend SetProps: if property receiving the value is a TStrings and the value a sequence, then assign the sequence content to the TStrings. - - what do we do if the Delphi code raises an exception when invoked by Python? - Shouldn't we resurface it as a Python exception? - can we debug the Python code executed from a triggered event? Presently not, as we directly ask Python to execute a specific callable... - Create a simple app that just initializes Python and executes a script? To avoid having a console... @@ -323,7 +332,11 @@ interface SysUtils, Classes, PythonEngine, TypInfo, Variants, {$IFNDEF FPC} +{$IFDEF EXTENDED_RTTI} + Rtti, +{$ELSE} ObjAuto, +{$ENDIF} {$ENDIF} Contnrs; @@ -524,14 +537,11 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) function ToTuple_Wrapper(args : PPyObject) : PPyObject; cdecl; function ToList_Wrapper(args : PPyObject) : PPyObject; cdecl; function SetProps(args, keywords : PPyObject) : PPyObject; cdecl; + function Dir_Wrapper(args: PPyObject): PPyObject; cdecl; // Exposed Getters function Get_ClassName(Acontext : Pointer) : PPyObject; cdecl; function Get_Owned(Acontext : Pointer) : PPyObject; cdecl; function Get_Bound(Acontext : Pointer) : PPyObject; cdecl; - function Get_Published(AContext : Pointer) : PPyObject; cdecl; - function Dummy_Getter(AContext : Pointer) : PPyObject; cdecl; - // Exposed Setters - function Dummy_Setter(AValue : PPyObject; AContext : Pointer): Integer; cdecl; // implementation of interface IFreeNotificationSubscriber procedure Notify(ADeletedObject : TObject); public @@ -642,7 +652,8 @@ TEventHandlers = class procedure Delete(AIndex : Integer); function GetCallable(AComponent : TObject; APropInfo : PPropInfo) : PPyObject; overload; function GetCallable(AComponent : TObject; const APropName : String) : PPyObject; overload; - function Link(AComponent : TObject; APropInfo : PPropInfo; ACallable : PPyObject) : Boolean; + function Link(AComponent : TObject; APropInfo : PPropInfo; + ACallable : PPyObject; out ErrMsg: string) : Boolean; function IndexOf(AComponent : TObject; APropInfo : PPropInfo) : Integer; procedure RegisterHandler(AEventHandlerClass : TEventHandlerClass); function Unlink(AComponent : TObject; APropInfo : PPropInfo) : Boolean; @@ -823,7 +834,8 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) function SetToPython(ATypeInfo: PTypeInfo; AValue : Integer) : PPyObject; overload; function SetToPython(APropInfo: PPropInfo; AValue : Integer) : PPyObject; overload; function SetToPython(AInstance: TObject; APropInfo: PPropInfo) : PPyObject; overload; - function PythonToSet(ASet : PPyObject; APropInfo: PPropInfo) : Integer; + function PythonToSet(APropInfo: PPropInfo; ASet : PPyObject) : Integer; overload; + function PythonToSet(ATypeInfo: PTypeInfo; ASet : PPyObject) : Integer; overload function SupportsFreeNotification(AObject : TObject) : Boolean; procedure RaiseNotifyEvent(PyDelphiWrapper : TPyDelphiWrapper; ACallable : PPyObject; Sender: TObject); @@ -833,8 +845,45 @@ implementation Math, RTLConsts; +resourcestring + rs_ErrCheckIndex = '%s "%d" out of range'; + rs_ErrCheckInt = '%s receives only integer values'; + rs_ErrCheckStr = '%s receives only string values'; + rs_ErrCheckCallable = '%s accepts only None or Callable values'; + rs_ErrCheckEnum = 'Enum %s accepts values between %d and %d. Received %d.'; + rs_ErrCheckObjOfType = '%s receives only Delphi objects of type %s'; + rs_ErrCheckObj = '%s receives only Delphi objects'; + rs_ErrSqAss = 'Container %s does not support indexed write (f[i] = x)'; + rs_ErrSqContains = 'Container %s does not support the Contains protocol'; + rs_ErrCheckBound = 'Delphi wrapper %s is not bound'; + rs_ErrFree = 'The Delphi object cannot be freed, since it is not Owned'; + rs_ErrSequence = 'Wrapper %s does not support sequences'; + rs_ErrInvalidArgs = '"%s" called with invalid arguments.'#$A'Error: %s'; + rs_ErrInvalidRet = 'Call "%s" returned a value that could not be coverted to Python'#$A'Error: %s'; + rs_IncompatibleArguments = 'Could not find a method with compatible arguments'; + rs_ErrAttrGet = 'Error in getting property "%s".'#$A'Error: %s'; + rs_UnknownAttribute = 'Unknown attribute'; + rs_ErrIterSupport = 'Wrapper %s does not support iterators'; + rs_ErrAttrSetr = 'Error in setting property %s'#$A'Error: %s'; + rs_IncompatibleClasses = 'Incompatible classes'; + rs_NotPublished = 'Event handling is available only for published properties'; + rs_ExpectedObject = 'Expected a Delphi object'; + rs_InvalidClass = 'Invalid class'; + rs_ErrEventNotReg = 'No Registered EventHandler for events of type "%s'; + rs_ErrEventNoSuport = 'Class %s does not support events because it must '+ + 'either inherit from TComponent or implement interface IFreeNotification'; + rs_ErrEventExpectCallable = 'You can only assign a callable to method property "%s"'; + rs_NotWritable = 'The class members is not writable'; + rs_NotReadable = 'The class member is not readable'; + rs_NoAccess = 'Private and protected class members cannot be accessed'; + rs_ErrValueToPython = 'Unsupported conversion from TValue to Python value'; + rs_ErrPythonToValue = 'Unsupported conversion from Python value to TValue'; + rs_ErrNoTypeInfo = 'TypeInfo is not available'; + rs_ErrUnexpected = 'Unexpected error'; + var gRegisteredUnits : TRegisteredUnits; + function RegisteredUnits : TRegisteredUnits; begin if not Assigned(gRegisteredUnits) then @@ -842,21 +891,151 @@ function RegisteredUnits : TRegisteredUnits; Result := gRegisteredUnits; end; -var - gNames : TStringList; +procedure Register; +begin + RegisterComponents('Python', [TPyDelphiWrapper]); +end; + +{ Helper functions } -function AddName(const AName : String) : PAnsiChar; +{$IFDEF EXTENDED_RTTI} +function SimpleValueToPython(const Value: TValue; out ErrMsg: string): PPyObject; begin - gNames.Add(AName); - Result := PAnsiChar(AnsiString(gNames[gNames.Count-1])); + Result := nil; + if Value.IsEmpty then begin + Result := GetPythonEngine.ReturnNone; + Exit; + end; + try + case Value.TypeInfo^.Kind of + tkUnknown: Result := GetPythonEngine.ReturnNone; + tkInteger, tkChar, tkFloat, + tkString, tkWChar, tkLString, + tkWString, tkUString, tkInt64, + tkVariant: + Result := GetPythonEngine.VariantAsPyObject(Value.AsVariant); + tkEnumeration: + begin + if Value.TypeInfo = TypeInfo(Boolean) then + with GetPythonEngine do begin + if Value.AsBoolean then + Result := PPyObject(Py_True) + else + Result := PPyObject(Py_False); + Py_XIncRef(Result); + end + else + Result := GetPythonEngine.PyString_FromDelphiString(GetEnumName(Value.TypeInfo, + PInteger(Value.GetReferenceToRawData)^)); + end; + tkSet: + begin + Result := SetToPython(Value.TypeData.CompType^, + PInteger(Value.GetReferenceToRawData)^); + end; + tkClass, tkMethod, tkArray, + tkRecord, tkInterface, tkDynArray, + tkClassRef, tkPointer, tkProcedure: + ErrMsg := rs_ErrValueToPython; + else + ErrMsg := rs_ErrUnexpected; + end; + except + on E: Exception do begin + Result := nil; + ErrMsg := E.Message; + end; + end; end; -procedure Register; +function SimplePythonToValue(PyValue: PPyObject; TypeInfo: PTypeInfo; + out Value: TValue; out ErrMsg: string): Boolean; +Var + S: string; + I : integer; + V : TValue; begin - RegisterComponents('Python', [TPyDelphiWrapper]); + Result := False; + if TypeInfo = nil then begin + ErrMsg := rs_ErrNoTypeInfo; + Exit; + end; + try + case TypeInfo^.Kind of + tkUnknown: + if PyValue = GetPythonEngine.Py_None then + begin + Value := TValue.Empty; + Result := True; + end + else + ErrMsg := rs_ErrPythonToValue; + tkString, tkWString, tkUString, + tkLString, tkChar, tkWChar: + begin + V := GetPythonEngine.PyObjectAsString(PyValue); + Value := V.Cast(TypeInfo); + Result := True; + end; + tkInteger, tkFloat, tkInt64, + tkVariant: + begin + V := TValue.FromVariant(GetPythonEngine.PyObjectAsVariant(PyValue)); + Value := V.Cast(TypeInfo); + Result := True; + end; + tkEnumeration: + begin + S := GetPythonEngine.PyString_AsDelphiString(PyValue); + I := GetEnumValue(TypeInfo, S); + Value := TValue.FromOrdinal(TypeInfo, I); + Result := True; + end; + tkSet: + begin + I := PythonToSet(TypeInfo, PyValue); + TValue.Make(@I, TypeInfo, Value); + Result := True; + end; + tkClass, tkMethod, tkArray, + tkRecord, tkInterface, tkDynArray, + tkClassRef, tkPointer, tkProcedure: + ErrMsg := rs_ErrPythonToValue; + else + ErrMsg := rs_ErrUnexpected; + end; + except + on E: Exception do begin + Result := False; + ErrMsg := E.Message; + end; + end end; +{$ENDIF} -{ Helper functions } +function ValidateClassProperty(PyValue: PPyObject; TypeInfo: PTypeInfo; + out Obj: TObject; out ErrMsg: string): Boolean; +var + PyObject : TPyObject; +begin + Result := False; + if IsDelphiObject(PyValue) then + begin + PyObject := PythonToDelphi(PyValue); + if PyObject is TPyDelphiObject then + begin + Obj := TPyDelphiObject(PyObject).DelphiObject; + if Obj.ClassType.InheritsFrom(GetTypeData(TypeInfo).ClassType) then + Result := True + else + ErrMsg := rs_IncompatibleClasses; + end + else + ErrMsg := rs_ExpectedObject; + end + else + ErrMsg := rs_ExpectedObject; +end; function CheckIndex(AIndex, ACount : Integer; const AIndexName : String = 'Index') : Boolean; begin @@ -864,8 +1043,8 @@ function CheckIndex(AIndex, ACount : Integer; const AIndexName : String = 'Index with GetPythonEngine do begin Result := False; - PyErr_SetString (PyExc_IndexError^, - PAnsiChar(AnsiString(Format('%s "%d" out of range',[AIndexName, AIndex])))); + PyErr_SetObject (PyExc_IndexError^, PyString_FromDelphiString( + Format(rs_ErrCheckIndex,[AIndexName, AIndex]))); end else Result := True; @@ -882,8 +1061,8 @@ function CheckIntAttribute(AAttribute : PPyObject; const AAttributeName : String begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only integer values', [AAttributeName])))); + PyErr_SetObject (PyExc_AttributeError^, + PyString_FromDelphiString(Format(rs_ErrCheckInt, [AAttributeName]))); end; end; @@ -904,8 +1083,8 @@ function CheckStrAttribute(AAttribute : PPyObject; const AAttributeName : String begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only string values', [AAttributeName])))); + PyErr_SetObject (PyExc_AttributeError^, + PyString_FromDelphiString(Format(rs_ErrCheckStr, [AAttributeName]))); end; end; @@ -917,8 +1096,8 @@ function CheckCallableAttribute(AAttribute : PPyObject; const AAttributeName : S begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s accepts only None or Callable values', [AAttributeName])))); + PyErr_SetObject (PyExc_AttributeError^, + PyString_FromDelphiString(Format(rs_ErrCheckCallable, [AAttributeName]))); end; end; @@ -930,8 +1109,9 @@ function CheckEnum(const AEnumName : String; AValue, AMinValue, AMaxValue : Int begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('Enum %s accepts values between %d and %d. Received %d.', [AEnumName, AMinValue, AMaxValue, AValue])))); + PyErr_SetObject (PyExc_AttributeError^, + PyString_FromDelphiString(Format(rs_ErrCheckEnum, + [AEnumName, AMinValue, AMaxValue, AValue]))); end; end; @@ -954,8 +1134,8 @@ function CheckObjAttribute(AAttribute : PPyObject; const AAttributeName : String begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only Delphi objects of type %s', [AAttributeName, AExpectedClass.ClassName])))); + PyErr_SetObject (PyExc_AttributeError^, + PyString_FromDelphiString(Format(rs_ErrCheckObjOfType, [AAttributeName, AExpectedClass.ClassName]))); end else begin @@ -967,8 +1147,8 @@ function CheckObjAttribute(AAttribute : PPyObject; const AAttributeName : String begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only Delphi objects', [AAttributeName])))); + PyErr_SetObject (PyExc_AttributeError^, + PyString_FromDelphiString(Format(rs_ErrCheckObj, [AAttributeName]))); end; end; @@ -1046,7 +1226,7 @@ function SetToPython(ATypeInfo: PTypeInfo; AValue : Integer) : PPyObject; overlo for I := 0 to SizeOf(Integer) * 8 - 1 do if I in S then begin - _name := GetPythonEngine.PyString_FromString(PAnsiChar(AnsiString(GetEnumName(ATypeInfo, I)))); + _name := GetPythonEngine.PyString_FromDelphiString(GetEnumName(ATypeInfo, I)); GetPythonEngine.PyList_Append(Result, _name); GetPythonEngine.Py_XDecRef(_name); end; @@ -1066,14 +1246,13 @@ function SetToPython(AInstance: TObject; APropInfo: PPropInfo) : PPyObject; over Result := SetToPython(APropInfo, GetOrdProp(AInstance, APropInfo)); end; -function PythonToSet(ASet : PPyObject; APropInfo: PPropInfo) : Integer; +function PythonToSet(ATypeInfo: PTypeInfo; ASet : PPyObject) : Integer; overload var i : Integer; EnumObj: PPyObject; EnumName: string; EnumValue: Longint; EnumInfo: PTypeInfo; - begin Result := 0; with GetPythonEngine do @@ -1081,9 +1260,9 @@ function PythonToSet(ASet : PPyObject; APropInfo: PPropInfo) : Integer; Assert(PySequence_Check(ASet) <> 0, 'PythonToSet expects a Python sequence as first parameter'); {$IFDEF FPC} - EnumInfo := GetTypeData(APropInfo^.PropType)^.CompType; + EnumInfo := GetTypeData(ATypeInfo)^.CompType; {$ELSE FPC} - EnumInfo := GetTypeData(APropInfo^.PropType^)^.CompType^; + EnumInfo := GetTypeData(ATypeInfo)^.CompType^; {$ENDIF FPC} for i := 0 to PySequence_Length(ASet)-1 do begin @@ -1101,6 +1280,15 @@ function PythonToSet(ASet : PPyObject; APropInfo: PPropInfo) : Integer; end; end; +function PythonToSet(APropInfo: PPropInfo; ASet : PPyObject) : Integer; overload; +begin + {$IFDEF FPC} + Result := PythonToSet(APropInfo^.PropType, ASet); + {$ELSE FPC} + Result := PythonToSet(APropInfo^.PropType^, ASet); + {$ENDIF FPC} +end; + {$IFDEF FPC} function GetPropValue(Instance: TObject; PropInfo: PPropInfo): Variant; begin @@ -1134,7 +1322,12 @@ TRegisteredClass = class TPyDelphiMethodObject = class (TPyObject) public DelphiObject: TObject; + {$IFDEF EXTENDED_RTTI} + fDelphiWrapper : TPyDelphiWrapper; + MethName: string; + {$ELSE} MethodInfo : TMethodInfoHeader; + {$ENDIF} function Call( ob1, ob2 : PPyObject) : PPyObject; override; function Repr : PPyObject; override; class procedure SetupType( PythonType : TPythonType ); override; @@ -1256,8 +1449,8 @@ function TPyDelphiContainer.Iter: PPyObject; function TPyDelphiContainer.Repr: PPyObject; begin with GetPythonEngine do - Result := PyString_FromString( PAnsiChar(AnsiString(Format('', - [ContainerAccess.Name, NativeInt(Self)]))) ); + Result := PyString_FromDelphiString( Format('', + [ContainerAccess.Name, NativeInt(Self)]) ); end; procedure TPyDelphiContainer.Setup(APyDelphiWrapper : TPyDelphiWrapper; @@ -1297,7 +1490,8 @@ function TPyDelphiContainer.SqAssItem(idx: NativeInt; begin Result := -1; with GetPythonEngine do - PyErr_SetString( PyExc_SystemError^, PAnsiChar(AnsiString(Format('Container %s does not support indexed write (f[i] = x)', [fContainerAccess.Name]))) ); + PyErr_SetObject( PyExc_SystemError^, + PyString_FromDelphiString(Format(rs_ErrSqAss, [fContainerAccess.Name])) ); end; end; @@ -1314,7 +1508,8 @@ function TPyDelphiContainer.SqContains(obj: PPyObject): integer; begin Result := -1; with GetPythonEngine do - PyErr_SetString( PyExc_SystemError^, PAnsiChar(AnsiString(Format('Container %s does not support the Contains protocol', [fContainerAccess.Name]))) ); + PyErr_SetObject( PyExc_SystemError^, + PyString_FromDelphiString(Format(rs_ErrSqContains, [fContainerAccess.Name])) ); end; end; @@ -1364,8 +1559,8 @@ function TPyDelphiIterator.IterNext: PPyObject; function TPyDelphiIterator.Repr: PPyObject; begin with GetPythonEngine do - Result := PyString_FromString( PAnsiChar(AnsiString(Format('', - [ContainerAccess.Name, NativeInt(Self)]))) ); + Result := PyString_FromDelphiString( Format('', + [ContainerAccess.Name, NativeInt(Self)]) ); end; procedure TPyDelphiIterator.Setup(AContainerAccess : TContainerAccess); @@ -1413,7 +1608,8 @@ function TPyDelphiObject.CheckBound: Boolean; Result := Assigned(DelphiObject); if not Result then with GetPythonEngine do - PyErr_SetString(PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Delphi wrapper %s is not bound', [ClassName])))); + PyErr_SetObject(PyExc_AttributeError^, + PyString_FromDelphiString(Format(rs_ErrCheckBound, [ClassName]))); end; function TPyDelphiObject.Compare(obj: PPyObject): Integer; @@ -1460,37 +1656,12 @@ destructor TPyDelphiObject.Destroy; inherited; end; -function TPyDelphiObject.Dummy_Getter(AContext: Pointer): PPyObject; -begin - // Note that this code should never execute as TPyDelphiObject overrides GetAttrO - // to intercept an access to a published property. - // This getter was only registered to help document the wrapped object and - // benefit from the code insight of the Python IDE. - Result := nil; - with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar('Fatal error. The Delphi wrapper did not find the published property you were trying to access')); -end; - -function TPyDelphiObject.Dummy_Setter(AValue: PPyObject; - AContext: Pointer): Integer; -begin - // Note that this code should never execute as TPyDelphiObject overrides GetAttrO - // to intercept an access to a published property. - // This getter was only registered to help document the wrapped object and - // benefit from the code insight of the Python IDE. - Result := -1; - with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar('Fatal error. The Delphi wrapper did not find the published property you were trying to access')); -end; - function TPyDelphiObject.Free_Wrapper(args: PPyObject): PPyObject; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, ':Free' ) <> 0 then begin if Owned or fCanFreeOwnedObject then begin @@ -1498,8 +1669,8 @@ function TPyDelphiObject.Free_Wrapper(args: PPyObject): PPyObject; Owned := False; Result := ReturnNone; end else begin - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar('The Delphi object cannot be freed, since it is not Owned')); + PyErr_SetObject (PyExc_AttributeError^, + PyString_FromDelphiString(rs_ErrFree)); Result := nil; end; end @@ -1510,27 +1681,117 @@ function TPyDelphiObject.Free_Wrapper(args: PPyObject): PPyObject; function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; (* - First Look for "published" methods compiled with {$METHODINFO ON} - Then look for published properties - Finally call inherited which calls PyObject_GenericGetAttr + First look whether the attribute has ben wrapped (RegisterGetSet, RegisterMethod). + This is done by calling the inherited GetAttrO. If this fails then + - Use Rtti to locate the property in DELPHIXE_OR_HIGHER (EXTENDED_RTTI) + or for other versions + - First Look for "published" methods compiled with {$METHODINFO ON} + - Then look for published properties *) + + {$IFDEF EXTENDED_RTTI} + function GetRttiAttr(Instance: TObject; const AttrName: string; + out ErrMsg: string): PPyObject; + var + Context: TRttiContext; + Prop: TRttiProperty; + Meth: TRttiMethod; + Field: TRttiField; + begin + Result := nil; + Context := TRttiContext.Create(); + try + Meth := Context.GetType(Instance.ClassType).GetMethod(AttrName); + if Meth <> nil then + begin + Result := PyDelphiWrapper.DelphiMethodType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiMethodObject do + begin + fDelphiWrapper := PyDelphiWrapper; + MethName := Meth.Name; + DelphiObject := Self.DelphiObject; + end; + end + else + begin + Prop := Context.GetType(Instance.ClassType).GetProperty(AttrName); + if Prop <> nil then + begin + if Ord(Prop.Visibility) < Ord(mvPublic) then + ErrMsg := rs_NoAccess + else if not Prop.IsReadable then + ErrMsg := rs_NotReadable + else if Prop.PropertyType = nil then + ErrMsg := rs_ErrNoTypeInfo + else + case prop.PropertyType.TypeKind of + tkClass: + Result := Wrap(prop.GetValue(Instance).AsObject); + tkMethod: + if prop is TRttiInstanceProperty then + Result := PyDelphiWrapper.fEventHandlerList.GetCallable(Instance, + TRttiInstanceProperty(prop).PropInfo); + else + Result := SimpleValueToPython(prop.GetValue(Instance), ErrMsg) + end; + end + else + begin + Field := Context.GetType(Instance.ClassType).GetField(AttrName); + if Field <> nil then + begin + if Ord(Field.Visibility) < Ord(mvPublic) then + ErrMsg := rs_NoAccess + else if Field.FieldType = nil then + ErrMsg := rs_ErrNoTypeInfo + else + case Field.FieldType.TypeKind of + tkClass: + Result := Wrap(Field.GetValue(Instance).AsObject); + else + Result := SimpleValueToPython(Field.GetValue(Instance), ErrMsg) + end; + end + else + ErrMsg := rs_UnknownAttribute; + end; + end; + except + on E: Exception do begin + Result := nil; + ErrMsg := E.Message; + end; + end; + Context.Free; + end; + {$ENDIF} + var - Name: string; -{$IFNDEF FPC} + KeyName: string; + ErrMsg : string; +{$IFNDEF EXTENDED_RTTI} Info: PMethodInfoHeader; -{$ENDIF} PropInfo: PPropInfo; Obj : TObject; +{$ENDIF} begin - Result := nil; - if GetPythonEngine.PyString_Check(Key) then - Name := GetPythonEngine.PyString_AsDelphiString(Key) + Result := inherited GetAttrO(key); + if GetPythonEngine.PyErr_Occurred = nil then Exit; // We found what we wanted + + if Assigned(DelphiObject) and GetPythonEngine.PyString_Check(Key) then + KeyName := GetPythonEngine.PyString_AsDelphiString(Key) else - Name := ''; + Exit; + GetPythonEngine.PyErr_Clear; +{$IFDEF EXTENDED_RTTI} + // Use RTTI + if Assigned(DelphiObject) then + Result := GetRttiAttr(DelphiObject, KeyName, ErrMsg); +{$ELSE} {$IFNDEF FPC} - if Assigned(DelphiObject) and (Name <> '') then - Info := GetMethodInfo(DelphiObject, Name) + if Assigned(DelphiObject) then + Info := GetMethodInfo(DelphiObject, KeyName) else Info := nil; @@ -1538,8 +1799,9 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; begin // Ensure the method information has enough type information if Info.Len <= SizeOf(Info^) - SizeOf(ShortString) + 1 + Length(Info.Name) then - with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown attribute "%s"',[Name])))) + begin + ErrMsg := rs_UnknownAttribute; + end else begin Result := PyDelphiWrapper.DelphiMethodType.CreateInstance; @@ -1549,10 +1811,10 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; end; end; end - else{$ENDIF} if Assigned(DelphiObject) and (Name <> '') then - begin + else{$ENDIF} if Assigned(DelphiObject) then + try // Not a method, try a property. - PropInfo := GetPropInfo(DelphiObject, Name); + PropInfo := GetPropInfo(DelphiObject, KeyName); if PropInfo <> nil then begin // we have a property @@ -1573,19 +1835,26 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; Result := GetPythonEngine.VariantAsPyObject(Boolean(GetOrdProp(Self.DelphiObject, PropInfo))) else {$IFDEF FPC} - Result := GetPythonEngine.PyString_FromString(PAnsiChar(AnsiString(GetEnumName(PropInfo^.PropType, + Result := GetPythonEngine.PyString_FromDelphiString(GetEnumName(PropInfo^.PropType, {$ELSE FPC} - Result := GetPythonEngine.PyString_FromString(PAnsiChar(AnsiString(GetEnumName(PropInfo^.PropType^, + Result := GetPythonEngine.PyString_FromDelphiString(GetEnumName(PropInfo^.PropType^, {$ENDIF FPC} - GetOrdProp(Self.DelphiObject, PropInfo))))); + GetOrdProp(Self.DelphiObject, PropInfo))); end end else Result := GetPythonEngine.VariantAsPyObject(GetPropValue(DelphiObject, PropInfo)); end; + except + on E: Exception do begin + Result := nil; + ErrMsg := E.Message; + end; end; - +{$ENDIF} if not Assigned(Result) then - Result := inherited GetAttrO(key); + with GetPythonEngine do + PyErr_SetObject (PyExc_AttributeError^, + PyString_FromDelphiString(Format(rs_ErrAttrGet,[KeyName, ErrMsg]))); end; function TPyDelphiObject.GetContainerAccess: TContainerAccess; @@ -1602,63 +1871,82 @@ class function TPyDelphiObject.GetContainerAccessClass : TContainerAccessClass; function TPyDelphiObject.Get_Bound(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - Result := VariantAsPyObject(Assigned(DelphiObject)); - end; + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(Assigned(DelphiObject)); end; function TPyDelphiObject.Get_ClassName(Acontext: Pointer): PPyObject; -Var - S : String; begin - with GetPythonEngine do - begin - Adjust(@Self); - if CheckBound then - begin - S := DelphiObject.ClassName; - Result := PyString_FromString(PAnsiChar(AnsiString(S))); - end - else - Result := nil; - end; + Adjust(@Self); + if CheckBound then + Result := GetPythonEngine.PyString_FromDelphiString(DelphiObject.ClassName) + else + Result := nil; end; function TPyDelphiObject.Get_Owned(Acontext: Pointer): PPyObject; begin - with GetPythonEngine do - begin - Adjust(@Self); - if CheckBound then - Result := VariantAsPyObject(Owned) - else - Result := nil; - end; + Adjust(@Self); + if CheckBound then + Result := GetPythonEngine.VariantAsPyObject(Owned) + else + Result := nil; end; -function TPyDelphiObject.Get_Published(AContext: Pointer): PPyObject; +function TPyDelphiObject.Dir_Wrapper(args: PPyObject): PPyObject; var i : Integer; + SL : TStringList; +{$IFDEF EXTENDED_RTTI} + Context: TRttiContext; + RttiType: TRTTIType; + RttiMethod: TRttiMethod; + RttiProperty: TRttiProperty; + RttiField: TRttiField; +{$ELSE} _PropList: PPropList; _propCount : Integer; +{$ENDIF} begin - with GetPythonEngine do - begin - Adjust(@Self); + Adjust(@Self); + SL := TStringList.Create; + SL.Sorted := True; + SL.Duplicates := dupIgnore; + try + // Add methods + for i := 0 to PythonType.MethodCount - 1 do + SL.Add(string(AnsiString(PythonType.Methods[i].ml_name))); + for i := 0 to PythonType.GetSetCount - 1 do + SL.Add(string(AnsiString(PythonType.GetSet[i].name))); +{$IFDEF EXTENDED_RTTI} + Context := TRttiContext.Create(); + try + RttiType := Context.GetType(DelphiObject.ClassType); + for RttiMethod in RttiType.GetMethods do + if Ord(RttiMethod.Visibility) > Ord(mvProtected) then + SL.Add(RttiMethod.Name); + for RttiProperty in RttiType.GetProperties do + if Ord(RttiProperty.Visibility) > Ord(mvProtected) then + SL.Add(RttiProperty.Name); + for RttiField in RttiType.GetFields do + if Ord(RttiField.Visibility) > Ord(mvProtected) then + SL.Add(RttiField.Name); + finally + Context.Free(); + end; +{$ELSE} _propCount := GetPropList(DelphiObject, _PropList); - Result := PyList_New(_propCount); - if _propCount > 0 then - begin + if _propCount > 0 then try - for i := 0 to _propCount-1 do - PyList_SetItem(Result, i, PyString_FromString(PAnsiChar(AnsiString(_PropList^[i].Name)))); + for i := 0 to _propCount - 1 do + SL.Add(_PropList^[i].Name); finally FreeMem(_PropList); end; - PyList_Sort(Result); - end; +{$ENDIF} + Result := GetPythonEngine.StringsToPyList(SL); + finally + SL.Free; end; end; @@ -1679,10 +1967,10 @@ function TPyDelphiObject.InheritsFrom_Wrapper(args: PPyObject): PPyObject; KlassName: string; IsSubClass: Boolean; begin + // We adjust the transmitted self argument + Adjust(@Self); with GetPythonEngine do begin - // We adjust the transmitted self argument - Adjust(@Self); if PyArg_ParseTuple( args, 'O:InheritsFrom',@_obj ) <> 0 then begin if CheckBound then begin KlassName := PyObjectAsString(_obj); @@ -1716,7 +2004,9 @@ function TPyDelphiObject.Iter: PPyObject; begin Result := nil; with GetPythonEngine do - PyErr_SetString( PyExc_SystemError^, PAnsiChar(AnsiString(Format('Wrapper %s does not support iterators', [Self.ClassName]))) ); + PyErr_SetObject( PyExc_SystemError^, + PyString_FromDelphiString(Format(rs_ErrIterSupport, + [Self.ClassName])) ); end; end; @@ -1727,35 +2017,9 @@ procedure TPyDelphiObject.Notify(ADeletedObject: TObject); end; class procedure TPyDelphiObject.RegisterGetSets(PythonType: TPythonType); -var - i : Integer; - _doc : String; - _propCount : Integer; - _PropList: PPropList; - _typeInfo : PTypeInfo; begin inherited; - // first register get/set for each published property, to allow easier documenting - // and use of code insight within a Python IDE. - // Note that the Delphi type info contains short strings which are not directly compatible with PAnsiChar. - // So, we have to convert them to regular strings, store them in a list, to maintain them alive, then - // we can cast them into PChars. - _typeInfo := DelphiObjectClass.ClassInfo; - if _typeInfo <> nil then - begin - _propCount := GetPropList(_typeInfo, _PropList); - if _propCount > 0 then - try - for i := 0 to _propCount-1 do - begin - _doc := Format('Published property %s : %s', [_PropList^[i].Name, _PropList^[i].PropType^.Name]); - PythonType.AddGetSet(AddName(string(_PropList^[i].Name)), @TPyDelphiObject.Dummy_Getter, @TPyDelphiObject.Dummy_Setter, - AddName(_doc), nil); - end; - finally - FreeMem(_PropList); - end; - end; + // then register TObject + custom getters/setters. with PythonType do begin @@ -1765,8 +2029,6 @@ class procedure TPyDelphiObject.RegisterGetSets(PythonType: TPythonType); 'Returns True if the wrapper is still bound to the Delphi instance.', nil); AddGetSet('__owned__', @TPyDelphiObject.Get_Owned, nil, 'Returns True if the wrapper owns the Delphi instance.', nil); - AddGetSet('__published__', @TPyDelphiObject.Get_published, nil, - 'Returns the list of all published properties of this instance.', nil); end; end; @@ -1788,78 +2050,65 @@ class procedure TPyDelphiObject.RegisterMethods(PythonType: TPythonType); PythonType.AddMethod('ToList', @TPyDelphiObject.ToList_Wrapper, 'TStrings.ToList()'#10 + 'If the object is a container (TStrings, TComponent...), it returns the content of the sequence as a Python list object.'); + PythonType.AddMethod('__dir__', @TPyDelphiObject.Dir_Wrapper, + 'Returns the list of all methods, fields and properties of this instance.'); end; function TPyDelphiObject.Repr: PPyObject; begin with GetPythonEngine do if Assigned(DelphiObject) then - Result := PyString_FromString( PAnsiChar(AnsiString(Format('', - [DelphiObject.ClassName, NativeInt(Self)]))) ) + Result := PyString_FromDelphiString( Format('', + [DelphiObject.ClassName, NativeInt(Self)]) ) else - Result := PyString_FromString( PAnsiChar(AnsiString(Format('', - [DelphiObjectClass.ClassName, NativeInt(Self)]))) ); + Result := PyString_FromDelphiString( Format('', + [DelphiObjectClass.ClassName, NativeInt(Self)]) ); end; function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; +(* + First look whether the attribute has ben wrapped (RegisterGetSet, RegisterMethod). + This is done by calling the inherited SetAttrO. If this fails then + - Use Rtti to locate the property in DELPHIXE_OR_HIGHER (EXTENDED_RTTI) + or for other versions + - Look for published properties +*) - function HandleEvent(PropInfo: PPropInfo) : Integer; + function HandleEvent(PropInfo: PPropInfo; out ErrMsg: string) : Integer; begin - if PyDelphiWrapper.EventHandlers.Link(DelphiObject, PropInfo, value) then + if PyDelphiWrapper.EventHandlers.Link(DelphiObject, PropInfo, value, ErrMsg) then Result := 0 else Result := -1; end; - function HandleClass(PropInfo: PPropInfo) : Integer; - var - PyObject : TPyObject; + function HandleClass(PropInfo: PPropInfo; out ErrMsg: string) : Integer; + Var Obj : TObject; begin Result := -1; - if IsDelphiObject(value) then + if ValidateClassProperty(value, PropInfo^.PropType{$IFNDEF FPC}^{$ENDIF}, Obj, ErrMsg) then begin - PyObject := PythonToDelphi(value); - if PyObject is TPyDelphiObject then - begin - Obj := TPyDelphiObject(PyObject).DelphiObject; - {$IFDEF FPC} - if Obj.ClassType.InheritsFrom(GetTypeData(PropInfo^.PropType).ClassType) then - {$ELSE FPC} - if Obj.ClassType.InheritsFrom(GetTypeData(PropInfo^.PropType^).ClassType) then - {$ENDIF FPC} - begin - SetOrdProp(DelphiObject, PropInfo, NativeInt(Obj)); - Result := 0; - end - else - with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, 'Incompatible classes'); - end - else - with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, 'Class property - expected a Delphi object'); + SetOrdProp(DelphiObject, PropInfo, NativeInt(Obj)); + Result := 0; end - else - with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, 'Class property - expected a Delphi object'); end; - function HandleSet(PropInfo: PPropInfo) : Integer; + function HandleSet(PropInfo: PPropInfo; out ErrMsg: string) : Integer; begin try - SetPropValue(DelphiObject, PropInfo, PythonToSet(Value, PropInfo)); + SetPropValue(DelphiObject, PropInfo, PythonToSet(PropInfo, Value)); Result := 0; except on E: Exception do with GetPythonEngine do begin Result := -1; - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(E.Message))); + ErrMsg := E.Message; end; end; end; - function HandleOtherTypes(PropInfo: PPropInfo) : Integer; + function HandleOtherTypes(PropInfo: PPropInfo; out ErrMsg: string) : Integer; Var V : Variant; begin @@ -1874,37 +2123,128 @@ function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; on E: Exception do with GetPythonEngine do begin Result := -1; - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(E.Message))); + ErrMsg := E.Message; end; end; end; +{$IFDEF EXTENDED_RTTI} + function SetRttiAttr(const AttrName: string; Value: PPyObject; + out ErrMsg: string): Boolean; + var + Context: TRttiContext; + Prop: TRttiProperty; + Field: TRttiField; + V: TValue; + Obj: TObject; + begin + Result := False; + Context := TRttiContext.Create(); + Prop := Context.GetType(DelphiObject.ClassType).GetProperty(AttrName); + if Prop <> nil then + try + if Ord(Prop.Visibility) < Ord(mvPublic) then + ErrMsg := rs_NoAccess + else if not Prop.IsWritable then + ErrMsg := rs_NotWritable + else if Prop.PropertyType = nil then + ErrMsg := rs_ErrNoTypeInfo + else + case Prop.PropertyType.TypeKind of + tkClass: + if ValidateClassProperty(value, Prop.PropertyType.Handle, Obj, ErrMsg) then begin + Prop.SetValue(DelphiObject, TPyDelphiObject(PythonToDelphi(Value)).DelphiObject); + Result := True; + end; + tkMethod: + if Prop.Visibility = mvPublished then + Result := HandleEvent((Prop as TRttiInstanceProperty).PropInfo, ErrMsg) = 0 + else + ErrMsg := rs_NotPublished; + else + begin + Result := SimplePythonToValue(Value, Prop.PropertyType.Handle, V, ErrMsg); + if Result then + Prop.SetValue(DelphiObject, V); + end; + end; + except + on E: Exception do begin + Result := False; + ErrMsg := E.Message; + end; + end + else + begin + Field := Context.GetType(DelphiObject.ClassType).GetField(AttrName); + if Field <> nil then + try + if Ord(Field.Visibility) < Ord(mvPublic) then + ErrMsg := rs_NoAccess + else if Field.FieldType = nil then + ErrMsg := rs_ErrNoTypeInfo + else + case Field.FieldType.TypeKind of + tkClass: + if ValidateClassProperty(value, Field.FieldType.Handle, Obj, ErrMsg) then begin + Field.SetValue(DelphiObject, TPyDelphiObject(PythonToDelphi(Value)).DelphiObject); + Result := True; + end; + else + begin + Result := SimplePythonToValue(Value, Field.FieldType.Handle, V, ErrMsg); + if Result then + Field.SetValue(DelphiObject, V); + end; + end; + except + on E: Exception do begin + Result := False; + ErrMsg := E.Message; + end; + end + end; + Context.Free; + end; +{$ENDIF} + var +{$IFNDEF EXTENDED_RTTI} PropInfo: PPropInfo; - Name : string; +{$ENDIF} + KeyName: string; + ErrMsg: string; begin + Result := inherited SetAttrO(key, value); + if Result = 0 then Exit; - if Assigned(DelphiObject) then - begin - Name := GetPythonEngine.PyString_AsDelphiString(Key); - PropInfo := GetPropInfo(DelphiObject, Name); - end + if Assigned(DelphiObject) and GetPythonEngine.PyString_Check(Key) then + KeyName := GetPythonEngine.PyString_AsDelphiString(Key) else - PropInfo := nil; + Exit; + GetPythonEngine.PyErr_Clear; + {$IFDEF EXTENDED_RTTI} + if SetRttiAttr(KeyName, Value, ErrMsg) then + Result := 0; + {$ELSE} + PropInfo := GetPropInfo(DelphiObject, KeyName); if PropInfo <> nil then begin if PropInfo^.PropType^.Kind = tkMethod then - Result := HandleEvent(PropInfo) + Result := HandleEvent(PropInfo, ErrMsg) else if PropInfo^.PropType^.Kind = tkClass then - Result := HandleClass(PropInfo) + Result := HandleClass(PropInfo, ErrMsg) else if PropInfo^.PropType^.Kind = tkSet then - Result := HandleSet(PropInfo) + Result := HandleSet(PropInfo, ErrMsg) else - Result := HandleOtherTypes(PropInfo); - end - else - Result := inherited SetAttrO(key, value); + Result := HandleOtherTypes(PropInfo, ErrMsg); + end; + {$ENDIF} + if Result <> 0 then + with GetPythonEngine do + PyErr_SetObject(PyExc_AttributeError^, PyString_FromDelphiString( + Format(rs_ErrAttrSetr, [KeyName, ErrMsg]))); end; procedure TPyDelphiObject.SetDelphiObject(const Value: TObject); @@ -1933,9 +2273,9 @@ function TPyDelphiObject.SetProps(args, keywords: PPyObject): PPyObject; _value : PPyObject; begin Result := nil; + Adjust(@Self); with GetPythonEngine do begin - Adjust(@Self); _keys := PyDict_Keys(keywords); try for i := 0 to PySequence_Length(_keys)-1 do @@ -1997,7 +2337,8 @@ function TPyDelphiObject.SqAssItem(idx: NativeInt; obj: PPyObject): integer; begin Result := -1; with GetPythonEngine do - PyErr_SetString( PyExc_SystemError^, PAnsiChar(AnsiString(Format('Wrapper %s does not support indexed write (f[i] = x)', [Self.ClassName]))) ); + PyErr_SetObject( PyExc_SystemError^, + PyString_FromDelphiString(Format(rs_ErrSqAss, [Self.ClassName])) ); end; end; @@ -2027,7 +2368,8 @@ function TPyDelphiObject.SqItem(idx: NativeInt): PPyObject; begin Result := nil; with GetPythonEngine do - PyErr_SetString( PyExc_SystemError^, PAnsiChar(AnsiString(Format('Wrapper %s does not support sequences', [Self.ClassName]))) ); + PyErr_SetObject( PyExc_SystemError^, + PyString_FromDelphiString(Format(rs_ErrSequence, [Self.ClassName])) ); end; end; @@ -2063,7 +2405,8 @@ function TPyDelphiObject.ToList_Wrapper(args: PPyObject): PPyObject; begin Result := nil; with GetPythonEngine do - PyErr_SetString( PyExc_SystemError^, PAnsiChar(AnsiString(Format('Wrapper %s does not support sequences', [Self.ClassName]))) ); + PyErr_SetObject( PyExc_SystemError^, + PyString_FromDelphiString(Format(rs_ErrSequence, [Self.ClassName])) ); end else if GetPythonEngine.PyArg_ParseTuple( args, ':ToList' ) <> 0 then with GetPythonEngine do @@ -2086,7 +2429,8 @@ function TPyDelphiObject.ToTuple_Wrapper(args: PPyObject): PPyObject; begin Result := nil; with GetPythonEngine do - PyErr_SetString( PyExc_SystemError^, PAnsiChar(AnsiString(Format('Wrapper %s does not support sequences', [Self.ClassName]))) ); + PyErr_SetObject( PyExc_SystemError^, + PyString_FromDelphiString(Format(rs_ErrSequence, [Self.ClassName])) ); end else if GetPythonEngine.PyArg_ParseTuple( args, ':ToTuple' ) <> 0 then with GetPythonEngine do @@ -2117,6 +2461,131 @@ function TPyDelphiObject.Wrap(AObject: TObject; {$IFNDEF FPC} { TPyDelphiMethodObject } +{$IFDEF EXTENDED_RTTI} +function TPyDelphiMethodObject.Call(ob1, ob2: PPyObject): PPyObject; + + function FindMethod(const MethName:string; RttiType : TRttiType; + PyArgs: PPyObject; var Args: array of TValue):TRttiMethod; + // Deals with overloaded methods + // Constructs the Arg Array + // PyArgs is a Python tuple + Var + Method: TRttiMethod; + Index: Integer; + ErrMsg: string; + Obj: TObject; + PyValue : PPyObject; + Param: TRttiParameter; + Params : TArray; + begin + Result :=nil; + for Method in RttiType.GetMethods do + if SameText(Method.Name, MethName) then + begin + Params:=Method.GetParameters; + if Length(Args)=Length(Params) then + begin + Result := Method; + for Index:= 0 to Length(Params)-1 do + begin + Param := Params[Index]; + if (Param.ParamType = nil) or + (Param.Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> []) then + begin + Result :=nil; + Break; + end; + + PyValue := PythonType.Engine.PyTuple_GetItem(PyArgs, Index); + if Param.ParamType = nil then + begin + Result := nil; + Break + end + else if Param.ParamType.TypeKind = tkClass then + begin + if ValidateClassProperty(PyValue, Param.ParamType.Handle, Obj, ErrMsg) + then + Args[Index] := Obj + else begin + Result := nil; + Break + end + end + else + begin + if not SimplePythonToValue(PyValue, Param.ParamType.Handle, + Args[Index], ErrMsg) then + begin + Result := nil; + Break + end; + end; + if (Param.ParamType <> nil) and not Args[Index].IsType(Param.ParamType.Handle) then + begin + Result :=nil; + Break; + end; + end; + Break; + end; + end; + end; + + procedure InvalidArguments(const MethName, ErrMsg : string); + begin + with GetPythonEngine do + PyErr_SetObject(PyExc_TypeError^, PyString_FromDelphiString( + Format(rs_ErrInvalidArgs, + [MethName, ErrMsg]))); + end; + +Var + Args: array of TValue; + ArgCount: Integer; + Context: TRttiContext; + meth: TRttiMethod; + ret: TValue; + ErrMsg : string; + +begin + Result := nil; + // Ignore keyword arguments ob2 + // ob1 is a tuple with zero or more elements + + ArgCount := PythonType.Engine.PyTuple_Size(ob1); + SetLength(Args, ArgCount); + + Context := TRttiContext.Create; + meth := FindMethod(MethName, Context.GetType(DelphiObject.ClassInfo), ob1, Args); + + if not Assigned(meth) then begin + InvalidArguments(MethName, rs_IncompatibleArguments); + Exit; + end; + + try + ret := meth.Invoke(DelphiObject, Args); + if ret.IsEmpty then + Result := GetPythonEngine.ReturnNone + else if ret.Kind = tkClass then + Result := fDelphiWrapper.Wrap(ret.AsObject) + else begin + Result := SimpleValueToPython(ret, ErrMsg); + if Result = nil then + with PythonType.Engine do + PyErr_SetObject(PyExc_TypeError^, PyString_FromDelphiString( + Format(rs_ErrInvalidRet, [MethName, ErrMsg]))); + end; + except + on E: Exception do begin + Result := nil; + InvalidArguments(MethName, E.Message); + end; + end; +end; + +{$ELSE)} function TPyDelphiMethodObject.Call(ob1, ob2: PPyObject): PPyObject; Var V : Variant; @@ -2140,22 +2609,32 @@ function TPyDelphiMethodObject.Call(ob1, ob2: PPyObject): PPyObject; with GetPythonEngine do try Result := VariantAsPyObject(ObjectInvoke(DelphiObject, - @MethodInfo, ParamIndexes, Params)); + @MethodInfo, ParamIndexes, Params)); except on E: Exception do begin Result := nil; - PyErr_SetString (PyExc_TypeError^, - PAnsiChar(AnsiString(Format('"%s" called with invalid arguments: %s',[MethodInfo.Name, E.Message])))); + PyErr_SetObject (PyExc_TypeError^, + PyString_FromDelphiString(Format(rs_ErrInvalidArgs, + [MethodInfo.Name, E.Message]))); end; end; end; +{$ENDIF} function TPyDelphiMethodObject.Repr: PPyObject; begin with GetPythonEngine do - Result := PyString_FromString( PAnsiChar(AnsiString(Format('', - [MethodInfo.Name, DelphiObject.ClassName, NativeInt(Self)]))) ); + Result := PyString_FromDelphiString( + Format('', + [ + {$IFDEF EXTENDED_RTTI} + MethName, + {$ELSE} + MethodInfo.Name, + {$ENDIF} + DelphiObject.ClassName, NativeInt(Self) + ]) ); end; class procedure TPyDelphiMethodObject.SetupType( PythonType : TPythonType ); @@ -2180,9 +2659,9 @@ destructor TPyDelphiVarParameter.Destroy; function TPyDelphiVarParameter.Get_Value(Acontext: Pointer): PPyObject; begin + Adjust(@Self); with GetPythonEngine do begin - Adjust(@Self); Result := Self.Value; if not Assigned(Result) then Result := Py_None; @@ -2209,7 +2688,9 @@ function TPyDelphiVarParameter.Repr: PPyObject; else _value := GetPythonEngine.PyObject_Repr(Value); try - Result := GetPythonEngine.PyString_FromString(PAnsiChar(AnsiString(Format('', [GetPythonEngine.PyObjectAsString(_value)])))); + Result := + GetPythonEngine.PyString_FromDelphiString(Format('', + [GetPythonEngine.PyObjectAsString(_value)])); finally GetPythonEngine.Py_DECREF(_value); end; @@ -2235,7 +2716,7 @@ class procedure TPyDelphiVarParameter.SetupType(PythonType: TPythonType); inherited; PythonType.TypeName := 'VarParameter'; PythonType.Name := string(PythonType.TypeName) + 'Type'; - PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; + PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType, tpfHaveRichCompare]; PythonType.GenerateCreateFunction := False; PythonType.DocString.Text := 'Container object allowing modification of Delphi var parameters from Python'; PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; @@ -2258,12 +2739,9 @@ procedure TPyDelphiVarParameter.SetValue(const Value: PPyObject); function TPyDelphiVarParameter.Set_Value(AValue: PPyObject; Acontext: Pointer): Integer; begin - with GetPythonEngine do - begin - Adjust(@Self); - Self.Value := AValue; - Result := 0; - end; + Adjust(@Self); + Self.Value := AValue; + Result := 0; end; { TEventHandler } @@ -2445,7 +2923,7 @@ function TEventHandlers.IndexOf(AComponent: TObject; end; function TEventHandlers.Link(AComponent: TObject; APropInfo: PPropInfo; - ACallable: PPyObject) : Boolean; + ACallable: PPyObject; out ErrMsg: string) : Boolean; var _handlerClass : TEventHandlerClass; begin @@ -2476,16 +2954,13 @@ function TEventHandlers.Link(AComponent: TObject; APropInfo: PPropInfo; Result := True; end else - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar('No Registered EventHandler for events of type ' + APropInfo^.PropType^.Name)); + ErrMsg := Format(rs_ErrEventNotReg, [APropInfo^.PropType^.Name]); end else - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('Class %s does not support events because it must either inherit from TComponent or implement interface IFreeNotification', [AComponent.ClassName])))); + ErrMsg := Format(rs_ErrEventNoSuport, [AComponent.ClassName]); end else - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString('You can only assign a callable to a method property'))); + ErrMsg := Format(rs_ErrEventExpectCallable, [APropInfo^.Name]) end; end; @@ -2587,8 +3062,9 @@ function TPyDelphiWrapper.CreateComponent(pself, args: PPyObject): PPyObject; Klass := nil; end; if (Klass = nil) or not Klass.InheritsFrom(TComponent) then begin - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar('Invalid class')); + PyErr_SetObject(PyExc_TypeError^, PyString_FromDelphiString( + Format(rs_ErrInvalidArgs, + ['CreateComponent', rs_InvalidClass]))); Exit; end; @@ -2603,8 +3079,9 @@ function TPyDelphiWrapper.CreateComponent(pself, args: PPyObject): PPyObject; Ownership := soOwned; Result := Self.Wrap(Component, Ownership); end else - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar('Invalid Arguments')); + PyErr_SetObject(PyExc_TypeError^, PyString_FromDelphiString( + Format(rs_ErrInvalidArgs, + ['CreateComponent', '']))); end; end; @@ -2880,7 +3357,6 @@ procedure TPyDelphiWrapper.UnsubscribeFreeNotifications; fEventHandlerList[i].Unsubscribe; end; - function TPyDelphiWrapper.Wrap(AObj: TObject; AOwnership: TObjectOwnership): PPyObject; Var @@ -2916,10 +3392,26 @@ function TPyDelphiWrapper.Wrap(AObj: TObject; end; end; +{$IFDEF EXTENDED_RTTI} +// To keep the RTTI Pool alive and avoid continuously creating/destroying it +// See also https://stackoverflow.com/questions/27368556/trtticontext-multi-thread-issue +Var +_RttiContext: TRttiContext; + +procedure _InitRttiPool; +begin + _RttiContext := TRttiContext.Create; + _RttiContext.FindType(''); +end; + +initialization + _InitRttiPool; +finalization + _RttiContext.Free(); +{$ELSE} initialization - gNames := TStringList.Create; finalization - FreeAndNil(gNames); +{$ENDIF} FreeAndNil(gRegisteredUnits); end. diff --git a/PythonForDelphi/Demos/Demo31/Project1.dpr b/PythonForDelphi/Demos/Demo31/Project1.dpr index 6f167359..62ae3011 100644 --- a/PythonForDelphi/Demos/Demo31/Project1.dpr +++ b/PythonForDelphi/Demos/Demo31/Project1.dpr @@ -6,14 +6,14 @@ uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {TestForm}, - WrapDelphiExtCtrls in '..\..\Components\Sources\Core\WrapDelphiExtCtrls.pas', - WrapDelphiTypes in '..\..\Components\Sources\Core\WrapDelphiTypes.pas', - WrapDelphiWindows in '..\..\Components\Sources\Core\WrapDelphiWindows.pas', - WrapDelphiComCtrls in '..\..\Components\Sources\Core\WrapDelphiComCtrls.pas', - WrapDelphiGrids in '..\..\Components\Sources\Core\WrapDelphiGrids.pas', - WrapDelphiGraphics in '..\..\Components\Sources\Core\WrapDelphiGraphics.pas', - WrapDelphiButtons in '..\..\Components\Sources\Core\WrapDelphiButtons.pas', - WrapDelphiDialogs in '..\..\Components\Sources\Core\WrapDelphiDialogs.pas'; + WrapDelphiExtCtrls, + WrapDelphiTypes, + WrapDelphiWindows, + WrapDelphiComCtrls, + WrapDelphiGrids, + WrapDelphiGraphics, + WrapDelphiButtons, + WrapDelphiDialogs; {$R *.res} diff --git a/PythonForDelphi/Demos/Demo31/Project1.dproj b/PythonForDelphi/Demos/Demo31/Project1.dproj index 7713904b..8a3a0dd0 100644 --- a/PythonForDelphi/Demos/Demo31/Project1.dproj +++ b/PythonForDelphi/Demos/Demo31/Project1.dproj @@ -90,9 +90,15 @@ 1033 $(BDS)\bin\delphi_PROJECTICON.ico true + true Debug + true + 1033 + $(BDS)\bin\delphi_PROJECTICON.ico + true + true @@ -104,14 +110,6 @@
    TestForm
    - - - - - - - - Cfg_2 Base diff --git a/PythonForDelphi/Demos/Demo31/Unit1.dfm b/PythonForDelphi/Demos/Demo31/Unit1.dfm index b177b149b15162fe369da61ddf1f937976aa5f35..16d7e535d15e03b70f777aee7d175094b10e2c1c 100644 GIT binary patch literal 21800 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 literal 15334 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 0; end. From 8c80e5d452c3f86329aa353e09b75481e77f7c04 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 26 Oct 2019 12:56:07 +0300 Subject: [PATCH 120/123] Fix #93 --- .../Sources/Core/WrapDelphiClasses.pas | 28 +++++++++++-------- PythonForDelphi/Demos/Demo31/Unit1.dfm | 2 +- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas index 48ed19f5..d795ad23 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphiClasses.pas @@ -791,18 +791,22 @@ function TPyDelphiComponent.BindMethodsToEvents(args: PPyObject): PPyObject; if Assigned(_comp) and Assigned(objComp) and IsPublishedProp(_comp, _eventName) then begin objMethod := PyObject_GenericGetAttr(GetSelf, key); - if PyErr_Occurred <> nil then - Exit; - PyObject_SetAttrString(objComp, PAnsiChar(AnsiString(_eventName)), objMethod); - if PyErr_Occurred <> nil then - Exit - else - begin - _pair := PyTuple_New(3); - PyTuple_SetItem(_pair, 0, PyString_FromDelphiString(_compName)); - PyTuple_SetItem(_pair, 1, PyString_FromDelphiString(_eventName)); - PyTuple_SetItem(_pair, 2, objMethod); - PyList_Append(_bindings, _pair); + try + if PyErr_Occurred <> nil then + Exit; + PyObject_SetAttrString(objComp, PAnsiChar(AnsiString(_eventName)), objMethod); + if PyErr_Occurred <> nil then + Exit + else + begin + _pair := PyTuple_New(3); + PyTuple_SetItem(_pair, 0, PyString_FromDelphiString(_compName)); + PyTuple_SetItem(_pair, 1, PyString_FromDelphiString(_eventName)); + PyTuple_SetItem(_pair, 2, objMethod); + PyList_Append(_bindings, _pair); + end; + finally + Py_XDecRef(objMethod); end; end; end; diff --git a/PythonForDelphi/Demos/Demo31/Unit1.dfm b/PythonForDelphi/Demos/Demo31/Unit1.dfm index 16d7e535..a35fe2a5 100644 --- a/PythonForDelphi/Demos/Demo31/Unit1.dfm +++ b/PythonForDelphi/Demos/Demo31/Unit1.dfm @@ -104,7 +104,7 @@ object Form1: TForm1 ' self.Caption = self.Caption + '#39' - changed by Python subclass' + #39 - ' #self.BindMethodsToEvents()' + ' self.BindMethodsToEvents()' '' ' def handle_btnAdd_OnClick(self, Sender):' ' self.ListBox1.Items.Add(self.Edit1.Text)' From 6d3cd03da7fa1cffabc2711bdab8fee9fe0c427e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 26 Oct 2019 13:18:54 +0300 Subject: [PATCH 121/123] Minor changes to the documentation --- PythonForDelphi/Changes.txt | 3 +++ PythonForDelphi/Readme.txt | 11 +---------- PythonForDelphi/To do.txt | 2 -- 3 files changed, 4 insertions(+), 12 deletions(-) delete mode 100644 PythonForDelphi/To do.txt diff --git a/PythonForDelphi/Changes.txt b/PythonForDelphi/Changes.txt index 3d75e837..9ec91fb2 100644 --- a/PythonForDelphi/Changes.txt +++ b/PythonForDelphi/Changes.txt @@ -1247,3 +1247,6 @@ BaseException # New in Python 2.5 request made by Samuel Iseli. * Added new property "Version" to TPythonEngine returning the current version of P4D as a string as a request made by Roar Larsen. + +NOTE: This document has not been updated for a long time. Please use the Github tools (history, issue tracher) to +follow the changes to this project. diff --git a/PythonForDelphi/Readme.txt b/PythonForDelphi/Readme.txt index f252a003..ce22b912 100644 --- a/PythonForDelphi/Readme.txt +++ b/PythonForDelphi/Readme.txt @@ -101,17 +101,8 @@ INSTALLATION: For Delphi 7, install the "PythonVCL_d7" package located in the Components folder and add the folder "...\Components\Sources\VCL". - 3) Build PythonIDE (This is optional) - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - You can download the latest build of this application from - http://mmm-experts.com/Downloads.aspx?ProductId=4 - If you want to rebuild PythonIDE by yourself, you must look at PythonIDE\Readme.txt - for the required component packages to install first. - - - 3) Build Modules\Delphi\Delphi.dpr (This is optional) + 3) Build Modules\Delphi\Delphi.dpr (This is optional and unsupported) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Once the project is build you can either extend the Python path with ..\Modules or diff --git a/PythonForDelphi/To do.txt b/PythonForDelphi/To do.txt deleted file mode 100644 index c21b55af..00000000 --- a/PythonForDelphi/To do.txt +++ /dev/null @@ -1,2 +0,0 @@ -- nothing special ! - From 29a2cc6abd4d74057b12dce34e1077ac3abf86b1 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 26 Oct 2019 22:49:16 +0300 Subject: [PATCH 122/123] Conda needs PYTHONHOME to work!? --- PythonForDelphi/Components/Sources/Core/PythonVersions.pas | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas index 07947ced..cc7a2dd6 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonVersions.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonVersions.pas @@ -126,7 +126,12 @@ procedure TPythonVersion.AssignTo(PythonEngine: TPersistent); if Is_venv then begin TPythonEngine(PythonEngine).VenvPythonExe := PythonExecutable; TPythonEngine(PythonEngine).SetPythonHome(DLLPath); - end else if not IsRegistered then + end else if not IsRegistered or Is_conda then + // Not sure why but PythonHome needs to be set even for + // registered conda distributions + // Note also that for conda distributions to work properly, + // you need to add Format('%s;%0:s\Library\bin;', [Version.InstallPath] + // to your Windows path if it is not there already. TPythonEngine(PythonEngine).SetPythonHome(InstallPath); end; end; From bf83af38c1f2feeeb55934c72aebdb92dde00f06 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 12 Dec 2019 09:09:01 +0100 Subject: [PATCH 123/123] Fix compiling with fpc --- .../Components/Sources/Core/PythonEngine.pas | 18 ++++++++++-------- .../Components/Sources/Core/VarPyth.pas | 8 ++++---- .../Components/Sources/Core/WrapDelphi.pas | 11 ++++++++--- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas index 588e8ddd..cbc0dc30 100644 --- a/PythonForDelphi/Components/Sources/Core/PythonEngine.pas +++ b/PythonForDelphi/Components/Sources/Core/PythonEngine.pas @@ -3175,7 +3175,9 @@ procedure MaskFPUExceptions(ExceptionsMasked : boolean; Converts line breaks to LF and optionally adds a line break at the end *) function CleanString(const s : AnsiString; AppendLF : Boolean = True) : AnsiString; overload; +{$ifndef FPC} function CleanString(const s : string; AppendLF : Boolean = True) : string; overload; +{$ENDIF} //####################################################### //## ## @@ -5349,12 +5351,12 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command : AnsiString; m procedure TPythonEngine.ExecStrings( strings : TStrings ); begin - Py_XDecRef( Run_CommandAsObject( EncodeString(strings.Text) , file_input ) ); + Py_XDecRef( Run_CommandAsObject( EncodeString(strings.Text) , file_input ) ); end; function TPythonEngine.EvalStrings( strings : TStrings ) : PPyObject; begin - Result := Run_CommandAsObject( EncodeString(strings.Text) , eval_input ); + Result := Run_CommandAsObject( EncodeString(strings.Text) , eval_input ); end; procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : PPyObject ); @@ -5364,7 +5366,7 @@ procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : procedure TPythonEngine.ExecStrings( strings : TStrings; locals, globals : PPyObject ); begin - Py_XDecRef( Run_CommandAsObjectWithDict( EncodeString(strings.Text), file_input, locals, globals ) ); + Py_XDecRef( Run_CommandAsObjectWithDict( EncodeString(strings.Text), file_input, locals, globals ) ); end; function TPythonEngine.EvalString( const command : AnsiString; locals, globals : PPyObject ) : PPyObject; @@ -5374,12 +5376,12 @@ function TPythonEngine.EvalString( const command : AnsiString; locals, globals : function TPythonEngine.EvalStrings( strings : TStrings; locals, globals : PPyObject ) : PPyObject; begin - Result := Run_CommandAsObjectWithDict( EncodeString(strings.Text), eval_input, locals, globals ); + Result := Run_CommandAsObjectWithDict( EncodeString(strings.Text), eval_input, locals, globals ); end; function TPythonEngine.EvalStringsAsStr( strings : TStrings ) : String; begin - Result := Run_CommandAsString( EncodeString(strings.Text), eval_input ); + Result := Run_CommandAsString( EncodeString(strings.Text), eval_input ); end; function TPythonEngine.CheckEvalSyntax( const str : AnsiString ) : Boolean; @@ -5971,7 +5973,7 @@ function TPythonEngine.VariantAsPyObject( const V : Variant ) : PPyObject; // 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) + myInt := Integer(DeRefV.__asPPyObject__); //Returns the address to PPyObject as integer. (See impl. in PythonAtom.pas) Result := PPyObject(myInt); Py_XIncRef(Result); end @@ -9859,14 +9861,14 @@ function CleanString(const s : AnsiString; AppendLF : Boolean) : AnsiString; if AppendLF and (result[length(result)] <> LF) then Result := Result + LF; end; - +{$ifndef FPC} function CleanString(const s : string; AppendLF : Boolean) : string; begin Result := AdjustLineBreaks(s, tlbsLF); if AppendLF and (result[length(result)] <> LF) then Result := Result + LF; end; - +{$endif} {$IFDEF MSWINDOWS} function IsPythonVersionRegistered(PythonVersion : string; out InstallPath: string; out AllUserInstall: Boolean) : Boolean; diff --git a/PythonForDelphi/Components/Sources/Core/VarPyth.pas b/PythonForDelphi/Components/Sources/Core/VarPyth.pas index 5597e0d8..c83ba94c 100644 --- a/PythonForDelphi/Components/Sources/Core/VarPyth.pas +++ b/PythonForDelphi/Components/Sources/Core/VarPyth.pas @@ -1382,7 +1382,7 @@ function TPythonVariantType.GetPropertyWithArg(var Dest: TVarData; // So: myList[0] won't work, but myObj.MyList[0] will!!! if PySequence_Check(_prop) <> 0 then begin - _result := PySequence_GetItem(_prop, Variant(AArg)); + _result := PySequence_GetItem(_prop, Integer(Variant(AArg))); CheckError; end; // of if end; // of if @@ -1472,13 +1472,13 @@ function TPythonVariantType.EvalPython(const V: TVarData; if not Assigned(_value) then raise Exception.Create(SCantConvertValueToPythonObject); if PyList_Check(AObject) then - _result := PyList_SetItem( AObject, Variant(AKey), _value ) + _result := PyList_SetItem( AObject, Integer(Variant(AKey)), _value ) else if PyTuple_Check(AObject) then - _result := PyTuple_SetItem( AObject, Variant(AKey), _value ) + _result := PyTuple_SetItem( AObject, Integer(Variant(AKey)), _value ) else try if PySequence_Check(AObject) <> 0 then - _result := PySequence_SetItem(AObject, Variant(AKey), _value) + _result := PySequence_SetItem(AObject, Integer(Variant(AKey)), _value) else _result := PyObject_SetItem( AObject, _key, _value ); finally diff --git a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas index f45d5563..71194c96 100644 --- a/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas +++ b/PythonForDelphi/Components/Sources/Core/WrapDelphi.pas @@ -331,7 +331,7 @@ interface uses SysUtils, Classes, PythonEngine, TypInfo, Variants, -{$IFNDEF FPC} + {$IFNDEF FPC} {$IFDEF EXTENDED_RTTI} Rtti, {$ELSE} @@ -835,7 +835,7 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) function SetToPython(APropInfo: PPropInfo; AValue : Integer) : PPyObject; overload; function SetToPython(AInstance: TObject; APropInfo: PPropInfo) : PPyObject; overload; function PythonToSet(APropInfo: PPropInfo; ASet : PPyObject) : Integer; overload; - function PythonToSet(ATypeInfo: PTypeInfo; ASet : PPyObject) : Integer; overload + function PythonToSet(ATypeInfo: PTypeInfo; ASet : PPyObject) : Integer; overload; function SupportsFreeNotification(AObject : TObject) : Boolean; procedure RaiseNotifyEvent(PyDelphiWrapper : TPyDelphiWrapper; ACallable : PPyObject; Sender: TObject); @@ -1246,7 +1246,7 @@ function SetToPython(AInstance: TObject; APropInfo: PPropInfo) : PPyObject; over Result := SetToPython(APropInfo, GetOrdProp(AInstance, APropInfo)); end; -function PythonToSet(ATypeInfo: PTypeInfo; ASet : PPyObject) : Integer; overload +function PythonToSet(ATypeInfo: PTypeInfo; ASet : PPyObject) : Integer; overload; var i : Integer; EnumObj: PPyObject; @@ -1777,11 +1777,16 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; var KeyName: string; ErrMsg : string; +{$ifndef FPC} {$IFNDEF EXTENDED_RTTI} Info: PMethodInfoHeader; PropInfo: PPropInfo; Obj : TObject; {$ENDIF} +{$else} + PropInfo: PPropInfo; + Obj : TObject; +{$endif} begin Result := inherited GetAttrO(key); if GetPythonEngine.PyErr_Occurred = nil then Exit; // We found what we wanted