Jump to content

pyscripter

Members
  • Content Count

    785
  • Joined

  • Last visited

  • Days Won

    42

Posts posted by pyscripter


  1. 1 hour ago, David Heffernan said:

    How would you handle non ANSI input?

    There is a corresponding event OnReceiveUniData.  Which is used is based on IO.UnicodeIO, which by default is true.

     

    • Like 1

  2. function  TPythonGUIInputOutput.ReceiveData : AnsiString;
    Var
      S : string;
    begin
      if Assigned( FOnReceiveData ) then
        Result := inherited ReceiveData
      else
      begin
        InputQuery( 'Query from Python', 'Enter text', S);
        Result := AnsiString(S);
      end;
    end;

    You can handle the OnReceiveData event and respond in whatever way you like.


  3. 7 minutes ago, Uwe Raabe said:

    In which build/platform configuration are you removing that value?

    32bit VCL Windows.

    I have the issue with both runtime and design time packages.

     

    Try to open for example the D10_4 packages of github.com/EtheaDev/SVGIconImageList


  4. Starting from Syndey update 2, I am experiencing the folowing:

     

    • Open in the IDE packages with no LIBSUFFIX or a LIBSUFFIX different that auto.
    • LIBSUFFIX 270 is added automatically and the package is named accordingly
    • Open project options and remove the LIBSUFFIX has no effect.   Next time you open the project options is back there.
    • Removing the LIBSUFFIX directive from the package source also has no effect on the package name.

    It seems that the IDE is enforcing the LIBSUFFIX 270.  I have not found a workaround.  You can still compile the packages from the command-line though.  Am I missing something?


  5. 9 hours ago, Edwin Yip said:

    Just in case you didn't know, WASM is a subset of JavaScript that's optimized for speed and cross-platform.

    Not quite.  WebAssembly (WASM in short) is a binary executable format supported by all major browsers.  See WebAssembly.

    Quote

    WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.

     

    Various compilers of different programming languages produce WASM code.   Fpc is already moving ahead with support for Webassembly target. See WebAssembly/Roadmap - Lazarus wiki (freepascal.org).  Overall WebAssembly is an alternative to compilation to JS.  .Net has already a WASM target they call Blazor.

    • Like 1
    • Thanks 1

  6. 26 minutes ago, David Heffernan said:

    I don't think this is true. TEdit is the Win32 EDIT control. What are you doing with strings that need to know what you are asking about? What's your usage scenario? 

    Mostly agree. The problem with TEdit is a Windows and not a Delphi one.  Notepad and VSCode have similar issues.

     

    If you are not rendering text it probably does not matter.  I got interested in this because SynEdit does not handle complex unicode characters well.  Other scenarios for using libraries such as ICU include proper sorting of multi-lingual text, proper change of capitalization, string normalization etc.  (I mean better in corner cases than what Windows provides and more compatible with Unicode standards), 

     

     


  7. 1 hour ago, vfbb said:

    Windows - DWriteTextAnalyze
    Android - GraphemeCharsLength := JString.codePointAt(Index);
    iOS - CFStringGetRangeOfComposedCharactersAtInd

    It appears that ICU is the way to go.  ICU is now bunded in Windows, .NET 5 is based on ICU, also android Unicode and internationalization support  |  Android Developers  and iOS ICU usage in Swift - Development / Standard Library - Swift Forums

    • Like 1
    • Thanks 1

  8. 37 minutes ago, Stefan Glienke said:

    But before it did not run in an endless loop

    I did say I did not test :classic_biggrin:.  One missing line now added to the code.  (FStart := FEnd);

     

    Works as expected in:

        var TestString := 'å'+#$0061#$0301#$0302#$0303#$0304;
        for var S in TextElements(TestString) do
          Writeln(S);

    and yes it does not work as it should with complex emojis.

     

     

    Interestingly even VScode does not handle 🤷🏽‍♀️ correctly.  Paste the symbol and then try to delete it with Backspace.  It takes pressing backspace multiple time to actually delete this emoji.


  9. CharNext does handle surrogate pairs, diacritics and other multi-codepoint sequences reasonably well.  Cleary it does not handle emojis well.  Nor does any other Windows function that I know of. But I was mostly trying to show that doing the text enumeration is the easy part.

     

    Quote

    CharNext works with default "user" expectations of characters when dealing with diacritics. For example: A string that contains U+0061 U+030a "LATIN SMALL LETTER A" + COMBINING RING ABOVE" — which looks like "å", will advance two code points, not one. A string that contains U+0061 U+0301 U+0302 U+0303 U+0304 — which looks like "a´^~¯", will advance five code points, not one, and so on.

     

    The .NET 5 unicode support is based on the ICU library.  See Globalization and ICU | Microsoft Docs for details.  There is an ICU Delphi wrapper but it has not been updated for years.

     

    ICU has been included in the Windows Creators update.  The dll names the the header files are listed here.  It would be nice to have translations of the headers to pascal and even better some higher level wrappers.


  10. Here is an implementation of a TextElementEnumerator (not tested):

    Note that in Windows CharNext is the best but still not perfect way to get text elements.  See What('s) a character! | The Old New Thing (microsoft.com)

     

    You should then be able to write code such as:

     

    for var Element in TextElements(MyString) do:

     

    interface
    type
      TTextElementEnumerator = record
      private
        FStart: PChar;
        FCurrent: string;
      public
        constructor Create(const AValue: string);
        function MoveNext: Boolean; inline;
        function GetCurrent: string; inline;
        property Current: string read GetCurrent;
      end;
    
      TTextElementEnumeratorHelper = record
      private
        FString: string;
      public
        constructor Create(const AValue: string);
        function  GetEnumerator: TTextElementEnumerator;
      end;
    
    function TextElements(const AValue: string): TTextElementEnumeratorHelper;
    
    implementation
    
    {$REGION Text Element Enumberator}
    { TTextElementEnumerator }
    
    constructor TTextElementEnumerator.Create(const AValue: string);
    begin
       FStart := PWideChar(AValue);
    end;
    
    function TTextElementEnumerator.GetCurrent: string;
    begin
      Result := FCurrent;
    end;
    
    function TTextElementEnumerator.MoveNext: Boolean;
    Var
      FEnd : PWideChar;
    begin
      if FStart^ = #0 then Exit(False);
    
      FEnd := Windows.CharNext(FStart);
      SetString(FCurrent, FStart, FEnd - FStart);
      FStart := FEnd;
      Result := True;
    end;
    
    { TTextElementEnumeratorHelper }
    constructor TTextElementEnumeratorHelper.Create(const AValue: string);
    begin
      FString := AValue;
    end;
    
    function TTextElementEnumeratorHelper.GetEnumerator: TTextElementEnumerator;
    begin
       Result.Create(FString);
    end;
    
    function TextElements(const AValue: string): TTextElementEnumeratorHelper;
    begin
      Result.Create(AValue);
    end;
    {$ENDREGION}

  11. TPythonGUIInputOutput only captures output sent to to sys.stdout and sys.stderr.  It will not capture the output generated by sub-processes and printed to the console.

    You can capture the output of sub-processes and make it available to Delphi or print it from the script that creates the sub-processes.

     

    See subprocess — Subprocess management — Python 3.9.2 documentation for details


  12. Have you seen the last comment in AttributeError: partially initialized module 'cv2' has no attribute 'VideoCapture' · Issue #303 · pyscripter/python4delphi (github.com)

    I am not sure whether specifying the dependency with a manifest file as in P4DPython26 · pyscripter/python4delphi Wiki (github.com) might help.

     

    A minimal script reproducing the error would be a lot more helpful instead of your long python script.


  13. You were dereferencing Py_Func without increasing the reference count first.  Reference counting is tricky in Python.  See Reference Counting in Python (tripod.com).

    This is why is safer to use VarPyth, which takes care of ref counting,  even if is slower.

     

    The code below has not been tested:

    var PyFunc:= ExtractPythonObjectFrom(MainModule.calc_outflow); // borrowed reference
    var PE := GetPythonEngine;
    PE.Py_INCREF(PyFunc);  // can skip since it is protected inside the temp variant MainModule.calc_outflow but is safer to inc it.
    var PyArgs := PE.PyTuple_New(1);  // Will need to be deref
    for i:=1 to i_end do
    begin
      Input := Random * 10.0;
      var PyInput := PE.PythonEngine1.PyFloat_FromDouble(Input);
      PE.PyTuple_SetItem(PyArgs, 0, PyInput);  //  PyInput is now the responsibility of the tuple
      var PyValue :=  PyObject_CallObject(PyFunc, PyArgs);  // the result of the function is your responsibility
      Output := PE.PyFloat_AsDouble(PyValue);
      PE.Py_DECREF(PyValue); 
    end;
    PE.Py_DECREF(PyArg);
    PE.Py_DECREF(PyFunc); // to match the increment

      

     

     

     


  14. 6 hours ago, Rolf Fankhauser said:

    I will try the low level functions of PythonEngine. It seems that they are wrapper of the C-API functions?

    Nοt wrappers but the exported C-API functions of the python DLL.   You can get the PPyObject corresponding the python function by using ExtractPythonObjectFrom(MainModule.calc_outflow).

     

    6 hours ago, Rolf Fankhauser said:

    I think there is a tutorial from David I for installation and use?

     Yes but bear in mind that the package structure was modified since the tutorial video was produced.

×