Jump to content

pyscripter

Members
  • Content Count

    1020
  • Joined

  • Last visited

  • Days Won

    66

Posts posted by pyscripter


  1. The IDE docking is based on TDockTabSet, which was introduced in Delphi 2005.  It has received some attention later including Vcl styling.  The only demo I could find is an old one by Jeremy North, but the source code is not available.  Jeremy also seemed to have expanded this component in his QualityCentral client (look at the images at the end of the article), the source code of which is also not available.

     

    3 hours ago, Anders Melander said:

    It's broken beyond repair

    It is not the sleekest implementation, but apparently it works OK in the IDE. 

    3 hours ago, Anders Melander said:

    So I think it's best to try and limit the range of docking features available to the user. For example: No auto-hide panels, no docked maximize/minimize.

    Agree in general, but it depends on the application.  All the IDEs I know of, including Visual Studio, use docking extensively.  Same is true for VS Code for example (but no floating forms though).

     

    In PyScripter I use a heavily modified version of JvDocking (part of the JVCL library), but I am still looking for a better open source library.  I may have to create one.

    • Like 1

  2. A new version 1.2.0 of ChatLLM has been released:

     

    New Features:

    • Much improved rendering of responses on a par with the Web Chat interfaces of the LLM providers.
    • Syntax highlighting of code (300 languages are now supported thanks to Prism).
    • Support for DeepSeek models
    • Support for reasoning models such as OpenAI's o1-mini and DeeepSeek's deepseek-reasoner.
    • Exposed the temperature LLM parameter.

     

    Screenshots:

     

    Settings:

    1135942123_Screenshot2025-02-07025038.png.861b95cc15233a9dec7920e40c87f8a9.png

    User interface:

    683384458_Screenshot2025-02-07025734.thumb.png.62e5193d1e0a59be66a72fc4308e3a1b.png

    Reasoning with deepseek-reasoner:

    410715660-23d842f3-b1ef-4561-92cd-b8554d25e110.thumb.png.1f2a8ea473684922be08f7ce4a8552b4.png

    And by the way DeepSeek is so much better than Gemini on Delphi coding.

     

    • Like 2
    • Thanks 4

  3. Looks like an installation problem.

    Solving the AttributeError: Module 'numpy' has no attribute '__version__' | Saturn Cloud Blog

     

    I would start afresh:

    • Uninstall existing python
    • Grab the most recent python from www.python.org
    • Use pip to install any modules you need

    Then test

    • Open the python CLI
    • >>> import numpy
    • etc.

    And finally find a good python tutorial to get started, using of course PyScripter.:classic_biggrin:

     


  4. 1 hour ago, pyscripter said:

    By the way does anyone know how to Vcl style the EdgeBrowser scrollbar?

    In case anyone has a use for it, here is how you can set the browser color scheme:

     

    procedure TForm2.SetColorScheme(Dark: Boolean);
    var
      Profile: ICoreWebView2Profile;
      Scheme: COREWEBVIEW2_PREFERRED_COLOR_SCHEME;
    begin
      if Dark then
        Scheme := COREWEBVIEW2_PREFERRED_COLOR_SCHEME_DARK
      else
        Scheme := COREWEBVIEW2_PREFERRED_COLOR_SCHEME_LIGHT;
      (EdgeBrowser.DefaultInterface as ICoreWebView2_13).Get_Profile(Profile);
      Profile.Set_PreferredColorScheme(Scheme);
    end;
    
    function IsStyleDark: Boolean;
    var
      LStyle: TCustomStyleServices;
      LColor: TColor;
    begin
      Result := False;
      LStyle := TStyleManager.ActiveStyle;
      if Assigned(LStyle) then
      begin
        LColor := LStyle.GetSystemColor(clWindow);
        // Check if the background color is dark
        Result := (LColor and $FFFFFF) < $808080;
      end;
    end;
                                                 
      Form2.SetColorScheme(IsStyleDark);
      Form2.EdgeBrowser.NavigateToString(Html);                                             

     

    • Like 1

  5. For years there have been rants about flicker in Vcl applications.   So when I tried to fast resize a form with an EdgeBrowser and saw the browser scrollbar jumping right and left, I assumed that it is Delphi's problem.  Then I tried the same with Edge and the result was the same.  Massive flicker when the scrollbar is visible!   Bravo Microsoft!  In fact Edge flickers even without scrollbars, whilst Delphi's EdgeBrowser doesn't.

     

    By the way does anyone know how to Vcl style the EdgeBrowser scrollbar?


  6. Out of curiosity, I tried the CrowdStrike analyzer on the PyScripter setup program (signed).  Whilst Falcon and MetaDefender gave a clean record, their Falcon Sandbox report gave a threat score 100/100!

    The report included the following:

     

    This report has 268 indicators that were mapped to 106 attack techniques and 11 tactics
    - Calls an API typically used to query local/system time as file time
    
    - Reads configuration files (.ini files)
    
    - Marks file for deletion
    
    - Contains ability to load/free library (API string)
    
    - Contains ability to modify registry key/value (API string)
    
    - Contains ability to set file time (API string)
    
    etc.

     

    Micorsoft's "MicrosoftEdgeWebview2Setup.exe" fails miserably as well.

     

    I am not sure any real-world compiled program would pass all these tests.  I don't think there is  much to worry about here.

     

    • Like 2

  7. Use the JAM Software one,  The reasons:

    • It is the official Virtual Treeview repo.  @joachimd took over the project from the component creator Mike Lischke and he is doing a fantastic job.
    • It is very actively maintained. Bug reports are dealt with and fixed very promptly.
    • The GetIt version is based on the Turbopack repo.  This repo was created from an older version of the JAM Software one.  Surprisingly, it was not forked, so it is hard to compare the two or merge changes from one to the other.  If you look at the Commit history it was created in 2014 and since then there have been around 130 commits, mostly creating packages for new versions of Delphi.  In the JAM Software repo there have been as many commits in the last six months.
    • Even if you submit a bug report to the Turbopack repo and it gets fixed (don't bet on it), it will take months before these fixes find their way into GetIt.
    3 hours ago, vmishka said:

    Can both of them exist in the same IDE (I have Delphi CE 12.1)?

    No.

     

     

    • Like 3

  8. It turns out that the workaround for the second issue is quite simple:

     

    procedure TCustomSynEdit.ReadState(Reader: TReader);
    // If the component is inherited from another form, ReadState will be called
    // more than once.  We only clear the collections if it is the first call
    // i.e. when reading the base form.
    begin
      if not FStateRead then
      begin
        FScrollbarAnnotations.Clear;
        FStateRead := True;
      end;
      inherited ReadState(Reader);
    end;

    Thanks to @Uwe Raabe for giving me the idea.


     

    • Like 1

  9. @Uwe Raabe@Anders MelanderThank you for your feedback.

    15 hours ago, Uwe Raabe said:

    Probably no one at Embarcadero is going to change a that old behavior, because no one can say for sure what the consequences would be for existing code.

    Fully agree.  The chances of Embarcadero changing this old code are close, very close, to zero.

     

    However let me elaborate on the problems with the current situation.  There are two issues:

     

    A) Form Inheritance

    Consider the attached project,  There are two forms, one inheriting from the other.  The first contains a TCategoryButtons with two categories (Showing just the relevant part)

    object Form1: TForm1
      object CategoryButtons: TCategoryButtons
        Categories = <
          item
            Caption = 'A'
            Color = 16771839
            Collapsed = False
            Items = <>
          end
          item
            Caption = 'B'
            Color = 16771818
            Collapsed = False
            Items = <>
          end>
      end
    end
    

    If the inherited form does not change the Categories collection then the dfm of the second form does not have any reference to the Categories collection.

    inherited Form2: TForm2
      inherited CategoryButtons: TCategoryButtons
        Width = 505
      end
    end

    If you now remove the two categories in Form2, the form is correctly saved as:

    inherited Form2: TForm2
      inherited CategoryButtons: TCategoryButtons
        Width = 505
        Categories = <>
      end
    end

    However, if you run the application though, Form2 still shows the two categories.  Also if you view the form as text and then back as form, the Categories revert to the inherited value.   The same happens if you close and reopen the form. This is counter intuitive and problematic.  I do not see how clearing the selection on reading would result in any undesired behavior.  It would work correctly whether the collection is changed or not,  Instead, it would solve the above issue.

     

    B) Cannot clear a collection created with items at design time

    Whilst you both focused on inheritance, for me the most important issue is unrelated to form inheritance.  If a custom component contains  a Collection property that is initialized non-empty at component creation, there is no way to clear it at design time.  As an example, Synedit, has a collection property ScrollbarAnnotations.  At construction this is initialized with some default annotations.  The user may want to remove all annotations, but this cannot be achieved at design time.  If you clear all annotations, the form reverts back to the initial state, when you run the project, or just close and open again the form.  

     

    I cannot think of any backward compatibility issues that result from clearing the collection on reading empty collections. Can you?

     

    FormInheritance.zip


  10. 1 hour ago, Anders Melander said:

    Form inheritance would be my guess.

    Could you please explain why not clearing the collection plays better with form inheritance?  I would think the opposite.  Say you inherit from a form with a component that has a collection property with some items.  As it stands, there is no way for the inherited form to clear the inherited collection. 


  11. The code of TReader.ReadCollection is as follows:

    procedure TReader.ReadCollection(const Collection: TCollection);
    var
      Item: TPersistent;
    begin
      Collection.BeginUpdate;
      try
        if not EndOfList then Collection.Clear;
        while not EndOfList do
        begin
          if NextValue in [vaInt8, vaInt16, vaInt32] then ReadInteger;
          Item := Collection.Add;
          ReadListBegin;
          while not EndOfList do ReadProperty(Item);
          ReadListEnd;
        end;
        ReadListEnd;
      finally
        Collection.EndUpdate;
      end;
    end;

    It has been like this forever.   My question is about the statement:  if not EndOfList then Collection.Clear;

    It means that if you read an empty collection, the collection you are reading is not cleared or otherwise changed.   The practical implication of this is that if you have a component that initializes a collection property with some items, there is no way to really clear it from the collection property inspector.  Next time the form is loaded, either at run time or at design time, the collection will revert to the initialized state.

    • Can you think of any reason TReader.ReadCollection does this?  I think that if you read an empty collection, the collection property you are loading should be cleared.   
    • Should I report this as an issue? 
    • Also is there any workaround?  I want a collection property to have a default state with some items created by the component constructor, but the users to be able to clear it at design time.

     

     


  12. Don't you get an error when you run your code?

     

    Vertaal.PArr[j, taalnr] = translated

    should be 

    Vertaal.PArr[j][taalnr] = translated

     

    Sample code:

     

      var VArr: Variant := VarArrayCreate([0, 1, 0, 1], VarVariant);
      VArr[0, 0] := 'I';
      VArr[1, 0] := 'You';
    
      PythonModule1.SetVarFromVariant( 'arr', VArr);

    image.thumb.png.168ccff46cb3139967a894ae886a99c8.png

     

    After you execute the code:

     

      var VArr := PythonModule1.GetVarAsVariant('arr');
      ShowMessage(Varr[1][1]);

     

    image.png

     

    Note that what you get with GetVarAsVariant is not a two-dimensional Variant array, but rather an one-dimensional Variant array containing one-dimensional variant arrays.

     

    Before you rush to criticize my French, I know that I is Je in French :classic_wink:.


  13. 1 hour ago, Dave Novo said:

    It would be cool

    Spring4d does provide you with access to the array of values using IArrayAccess, but what you ask is not spring4d specific.  It applies to any array of records. e.g.

    type
      TMyRec = record
        StrField: string;
      end;
     TMyRecArray = TArray<TMyRec>;

     

    To modify the values you need iterate using an index

    var 
      RecArr: TMyRecArray
    
    for var I := 0 to Length(RecArr) - 1 do
       RecArray[I].StrField := ...

     

    Unfortunately you cannot do:

    for var Rec in RecArr do
      Rec.StrField := ...  // <- compiler error: You cannot modify a for loop variable.

    and in any case what you get in Rec above is a copy of the record not the original one.  I agree it would be cool to have an iterator that gives access to the underlying element.

     


  14. I don't think this is anything to go by, but Embarcadero is sometimes using a suffix instead of a prefix! e.g.

     

    Vcl.CustomizeDialog.dfm

          object CaptionOptionsGrp: TGroupBox

          object ApplyToAllChk: TCheckBox

          object CaptionOptionsCombo: TComboBox

     

    This looks to me worse than using a prefix.  But anything is better than keeping the default names (Button1, Button2, .. Button105 etc.)

×