Jump to content

pyscripter

Members
  • Content Count

    920
  • Joined

  • Last visited

  • Days Won

    56

Everything posted by pyscripter

  1. 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
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. pyscripter

    Records as TDictionary keys

    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.
  7. 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.
  8. pyscripter

    Weird error with generic TList

    Delphi 12.2 fixed this.
  9. Interestingly the build dialog box reports this as 3 warnings!
  10. pyscripter

    TParallelArray Documentation?

    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;
  11. 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.
  12. Great. Swap a warning in 12.2 with an error in earlier versions.
  13. Will this not cause an issue with earlier DELPHI versions?
  14. pyscripter

    Delphi 12.2 available for download

    Forgot to do that. How can I fix it now? Update: Deleted Parnassus entries from Registry and now it works. Very annoying.
  15. pyscripter

    Memory Leak creating Engine at runtime?

    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.
  16. pyscripter

    Possible memory leak

    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.
  17. pyscripter

    TComponent.Create() equivalent in Python script?

    You can create instances of classes in the "pythonic" way: myform = Form() TForm.Create() is not supported (TForm is exposed in python as Form).
  18. pyscripter

    I/O doesn't work

    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.
  19. pyscripter

    I/O doesn't work

    Can you post a zip file with your project?
  20. pyscripter

    I/O doesn't work

    Use the OnSendUniData event to process data sent by the python engine.
  21. pyscripter

    I/O doesn't work

    TPythonGUIInputOutput works with a linked memo. Use TPythonInputOutput instead.
  22. pyscripter

    Parsing a python collection into a delphi collection

    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.
  23. pyscripter

    Parsing a python collection into a delphi collection

    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'];
  24. pyscripter

    Is there a Delphi "subprocess" library?

    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.
×