-
Content Count
920 -
Joined
-
Last visited
-
Days Won
56
Everything posted by pyscripter
-
Delphi bug reports or feature requests to "vote"/comment for (important, fatal etc)/
pyscripter replied to Tommi Prami's topic in Delphi IDE and APIs
For me is three out of three from the new QA fixed: Incorrect Scaling of Vcl.Dialogs.InputQuery - RAD Studio Service - Jira Service Management (atlassian.net) Incorrect Scaling of Vcl.Dialogs.MessageDlg - RAD Studio Service - Jira Service Management (atlassian.net) Internal Compiler error AV5A1299F7(5A060000)-R0000014C-0 - RAD Studio Service - Jira Service Management (atlassian.net) And a couple from the old QA: https://quality.embarcadero.com/browse/RSP-43263 https://quality.embarcadero.com/browse/RSP-41898 -
New Warning in 12.2: Overloading a similar index type by declaring an array property 'Items'
pyscripter replied to pyscripter's topic in RTL and Delphi Object Pascal
No you don't. The index was changed to NativeInt in Delphi 12.0. There are no interface changes in minor versions. It is just the warning that was added in 12.2. Regarding older versions, you are right if you need to support versions before IF was introduced. But many of us including @Carlo Barazzetta don't. -
New Warning in 12.2: Overloading a similar index type by declaring an array property 'Items'
pyscripter replied to pyscripter's topic in RTL and Delphi Object Pascal
So, one approach is to do something like: {$IF (CompilerVersion >= 35) TListSize = NativeInt; {$ELSE} TListSize = Integer; {$END} and then something like: TSynEditMarkList = class(TObjectList) ... property Items[Index: TListSize]: TSynEditMark read GetItem write SetItem; default; end; This would make sure that in all versions of Delphi you do not overload the array property but instead overwrite it. Unintentionally overloading the array property is likely to cause trouble (see earlier post). It also needs just one conditional compilation directive for the whole code base. -
New Warning in 12.2: Overloading a similar index type by declaring an array property 'Items'
pyscripter replied to pyscripter's topic in RTL and Delphi Object Pascal
I am afraid is not that simple. I did the same and when I tried to compile with Delphi 11 64bits, I got compilation errors, not in the declaration but when using the TObjectList descendent. Apparently Delphi implicitly supports indexed property overloading! Hence the name of the warning. Did you know that? I didn't. Example: TSynEditMarkList = class(TObjectList) ... function IsBookmark: Boolean; property Items[Index: NativeInt]: TSynEditMark read GetItem write SetItem; default; end; MarkList: TSynEditMarkList; var I: Integer; J: NativeInt // Both indexed properties, the one defined here and the inherited one can be used as default properties. Mark[I].IsBookmark; // error message IsBookmark is not recognized. Mark[I] is a TObject as in the inherited class. Mark[J].IsBookmark; // works I will probably end up using a generic TList to avoid this mess. -
New Warning in 12.2: Overloading a similar index type by declaring an array property 'Items'
pyscripter replied to pyscripter's topic in RTL and Delphi Object Pascal
I ended up with the following, which is backward compatible and future proof: {$IF (CompilerVersion > 36) or Declared(RTLVersion122)}{$WARN OVERLOADING_ARRAY_PROPERTY OFF}{$ENDIF} property Items[Index : TColumnIndex] : TVirtualTreeColumn read GetItem write SetItem; default; property Header: TVTHeader read FHeader; property TrackIndex : TColumnIndex read FTrackIndex write FTrackIndex; property TreeView : TCustomControl read GetTreeView; property UpdateCount; {$IF (CompilerVersion > 36) or Declared(RTLVersion122)}{$WARN OVERLOADING_ARRAY_PROPERTY ON}{$ENDIF} end; Notes: If the $WARN OFF comes immediately after the Items declaration you still get the warning. Delphi 12.2 still defines RTLVersion121. Presumably if there is a Delphi 12.3 etc. RTLVersion122 will be defined. -
This will no longer work by default in Delphi 12.2. You would need to add to your code: System.TypInfo.GetRecCompareAddrs := System.TypInfo.GetRecordCompareAddrs; Also using {$WEAKLINKRTTI ON} no longer causes crashes. It just results in using the default equality and GetHashCode functions.
-
The following console app works fine: {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Classes, System.Generics.Collections; type TMethodList = TList<TMethod>; const Method: TMethod = (Code:nil; Data:nil); begin try var fKeyDownChain := TMethodList.Create; try fKeyDownChain.Add(Method); fKeyDownChain.Remove(Method); WriteLn(fKeyDownChain.Count); finally fKeyDownChain.Free; end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; ReadLn; end. However the exact same sequence results in an access violation when used in a larger Win64 application. const Method: TMethod = (Code:nil; Data:nil); begin fKeyDownChain := TMethodList.Create; fKeyDownChain.Add(Method); fKeyDownChain.Remove(Method); The error occurs when you call Remove, at the first statement of the following function of System.Generics.Defaults, class function TComparer<T>.EQOperCompare(Self: Pointer; const Left, Right: T): Integer; begin if TRecEqualityOperator<T>(_GetExtInstanceData(Self, 0))(Left, Right) then Result := 0 else Result := BinaryCompare(@Left, @Right, SizeOf(T)); end; In the console application this statement results in a call to TMethod.Equal, Any clues as to why the error occurs? Update: This is a consequence of [RSP-43423] Using {$WEAKLINKRTTI ON} causes access violation on TList<T>.IndexOf method - Embarcadero Technologies. The console application also fails with {$WEAKLINKRTTI ON}. I guess specifying a Comparer would be a workaround. Is there any other workaround apart from removing the WEAKLINKRTTI directive, which increases the size of the executable by 2Mb? . Beyond the executable size, this is quite a serious issue, because it makes the use of generic collections of records in components unsafe, since a user of such a component setting WEAKLINKRTTI to ON, could face unpredictable and hard to detect crashes.
-
Weird error with generic TList
pyscripter replied to pyscripter's topic in RTL and Delphi Object Pascal
Delphi 12.2 fixed this. -
New Warning in 12.2: Overloading a similar index type by declaring an array property 'Items'
pyscripter replied to pyscripter's topic in RTL and Delphi Object Pascal
Interestingly the build dialog box reports this as 3 warnings! -
This is the public interface: TParallelArrayForProc<T> = reference to procedure (const AValues: array of T; AFrom, ATo: NativeInt); TParallelArray = class public class procedure &For<T>(const AValues: array of T; const AProc: TParallelArrayForProc<T>); overload; static; class procedure &For<T>(const AValues: array of T; const AProc: TParallelArrayForProc<T>; AIndex, ACount: NativeInt); overload; static; class procedure &For<T>(const AValues: array of T; const AProc: TParallelArrayForProc<T>; AIndex, ACount: NativeInt; APool: TThreadPool; AThreshold: NativeInt); overload; static; class procedure &For<T>(const AValues: TArray<T>; const AProc: TParallelArrayForProc<T>); overload; static; inline; class procedure &For<T>(const AValues: TArray<T>; const AProc: TParallelArrayForProc<T>; AIndex, ACount: NativeInt); overload; static; inline; class procedure &For<T>(const AValues: TArray<T>; const AProc: TParallelArrayForProc<T>; AIndex, ACount: NativeInt; APool: TThreadPool; AThreshold: NativeInt); overload; static; inline; class procedure Sort<T>(var AValues: array of T); overload; static; class procedure Sort<T>(var AValues: array of T; const AComparer: IComparer<T>); overload; static; class procedure Sort<T>(var AValues: array of T; const AComparer: IComparer<T>; AIndex, ACount: NativeInt; APool: TThreadPool); overload; static; class procedure Sort<T>(var AValues: TArray<T>); overload; static; inline; class procedure Sort<T>(var AValues: TArray<T>; const AComparer: IComparer<T>); overload; static; inline; class procedure Sort<T>(var AValues: TArray<T>; const AComparer: IComparer<T>; AIndex, ACount: NativeInt; APool: TThreadPool); overload; static; inline; class property ForThreshold: NativeInt read FForThreshold write FForThreshold default 50000; class property SortThreshold: NativeInt read FSortThreshold write FSortThreshold default 5000; end;
-
New Warning in 12.2: Overloading a similar index type by declaring an array property 'Items'
pyscripter replied to pyscripter's topic in RTL and Delphi Object Pascal
Aha! So is the type of the indexed property that the compiler complains about and not just the fact that you overwrite the inherited indexed property! And it is the change of Integer to NativeInt that caused that. -
New Warning in 12.2: Overloading a similar index type by declaring an array property 'Items'
pyscripter replied to pyscripter's topic in RTL and Delphi Object Pascal
Could you please give an example of what you did? -
New Warning in 12.2: Overloading a similar index type by declaring an array property 'Items'
pyscripter replied to pyscripter's topic in RTL and Delphi Object Pascal
Great. Swap a warning in 12.2 with an error in earlier versions. -
New Warning in 12.2: Overloading a similar index type by declaring an array property 'Items'
pyscripter replied to pyscripter's topic in RTL and Delphi Object Pascal
Will this not cause an issue with earlier DELPHI versions? -
Forgot to do that. How can I fix it now? Update: Deleted Parnassus entries from Registry and now it works. Very annoying.
-
You can set ReportMemoryLeaksOnShutdown to True to see whether there are leaks on the Delphi side. Loading and unloading the python dll multiple times is not a good idea. There is no guarantee that it will release all allocated memory when it unloads and it does not unload all other dlls loaded by python. It was designed to be loaded once in a single process. And there is no need to do that. Your program will be faster and leaner if you reuse the python dll.
-
The GetIt version is created by Embarcadero based on a p4d fork. Eventually the fixes will be added to the Embacadero fork, but then it may take some time for the GetIt installation to be updated. Using the pyscripter/python4delphi: Free components that wrap up Python into Delphi and Lazarus (FPC) (github.com) repo will probably get you the latest fixes much faster.
-
TComponent.Create() equivalent in Python script?
pyscripter replied to eivindbakkestuen's topic in Python4Delphi
You can create instances of classes in the "pythonic" way: myform = Form() TForm.Create() is not supported (TForm is exposed in python as Form). -
OnData is called from a thread. You need to change it to: procedure TForm2.OnData(Sender: TObject; const Data: string); begin TThread.Synchronize(nil, procedure begin Memo1.Lines.Add(Data); //No Memo1.Lines.Add('2'); //No end); end; Also set DelayWrites to False. DelayWrites only makes sense with TPythonGUIInputOutput. With the above two changes your code works as expected.
-
Can you post a zip file with your project?
-
Use the OnSendUniData event to process data sent by the python engine.
-
TPythonGUIInputOutput works with a linked memo. Use TPythonInputOutput instead.
-
Parsing a python collection into a delphi collection
pyscripter replied to Chris Mathews's topic in Python4Delphi
As you can see from your output AddressNumber is a string (as well as the other fields). You need to convert it to an integer. -
Parsing a python collection into a delphi collection
pyscripter replied to Chris Mathews's topic in Python4Delphi
I am not exactly sure what you are trying to do, Also the 4th line in your script is doing nothing since you are assigning a new value in the next statement. However, if you want to access these values in Delphi and store them say in a Delphi data structure, the easiest way is using VarPyth. For instance to access the AddressNumber, after running the above script, you use something like: var AddressNumber := MainModule.od[0]['AddressNumber']; -
You can always use the this python module from Delphi using P4D . One of the most advanced such Delphi functions in the Jcl unit JclSysUtils. Look at ExecuteCmdProcess and the various Execute overloads. It uses overlapped IO for super efficient redirection of the produced output, instead of using a special thread or a timer. These functions are also suitable for execution from a task/thread, if you do not want to block the main thread. The unit pyscripter/Source/uSysUtils.pas at master · pyscripter/pyscripter (github.com) extends the jcl functions to allow for an stdin pipe, customized environment variables and a buffered raw output.