Jump to content

shineworld

Members
  • Content Count

    350
  • Joined

  • Last visited

  • Days Won

    4

Posts posted by shineworld


  1. Could be the server is below DDoS...
    Many forums are in same state, also our:
    image.thumb.png.d9d96debcb66022e5bedd38472c4e10b.png

     

    In my case, massive guest access to the pages, till 150000 for day, continuously increases the session table and session keys in the server database,

    which slows down more and more every day, paralyzing the forum.

     

    At the moment, the only solution I have is to periodically clean up the two tables, but this also disconnects all connected users...

     

    I hope this is not the problem in this forum.


  2. Personally, I don't mind paying for a product like Delphi.

    I always hate having to wait months for updates before a product is truly usable and seeing major bugs that carry over from version to version without being fixed with updates.

     

    Every transition from version k-1 to k is a huge time investment, and the libraries I use aren't always so quick to provide updates, but I think that's common.

     

    I've also used .NET, of course, but things change even faster there, and products developed years ago are a huge headache to update to the current framework.

     

    Delphi already has many open libraries, under various licenses, so I don't feel the need to have an open environment as well.
    No one would touch it, and if they did, in my opinion, it would do more harm than good.


    To support the IDE, I use many plugins that already do a lot of good things (I have often wondered why they have never become an integral part of the IDE,
    o name a few: GXEperts' Grep or DDevExtesnions' multi-project Version Info management).
     

    The fact remains that I bring code into projects, even complex code from 20 years ago, and it works smoothly, or with minimal issues. No time is wasted.

    Creating installation packages is fast, as millions of lines of code can be reduced to little more than an exe file:

    Compilation is so fast that in just a few minutes I have everything I need to test and release the product.
     

     


  3. I've been using Delphi since it came out, although I stuck with certain versions for a long time, even though I always had them all, for reasons of stability between the various versions. Now I'm happy with 12.3, even though it drives me crazy with refactoring, an indispensable feature when you have really large projects like mine. I installed 13 on a VM, but when I realized that even that minimal refactoring had been removed, I left it there waiting for something to be done.

     

    • Like 1

  4. Antialiased polyline is very simple to do with Image32 library:

    Untitled.thumb.png.356d01c18c8384987669c1d3785f0f24.png

     

    uses
      Img32,
      Img32.Draw,
      Img32.Vector;
    
    ...
    
    Procedure TTagComponent.Paint;
    var
      W: Integer;
      H: Integer;
      Path: TPathD;
      Img: TImage32;
      PenWidth: Integer;
      PenColor: TColor32;
      BrushColor: TColor32;
      textrect: TRect;
      s: String;
    const
      BORDER = 4;
      SPINER = BORDER + 8;
      TEXT_H_OFFSET = SPINER + 3;
      TEXT_V_OFFSET = BORDER + 3;
    begin
      W := Self.ClientWidth;
      H := Self.ClientHeight;
      Img := TImage32.Create(W, H);
      try
        BrushColor := Color32(TStyleManager.ActiveStyle.GetStyleColor(scEdit));
    
        If _drawactive Then
        Begin
          PenColor := Color32(TStyleManager.ActiveStyle.GetStyleFontColor(sfWindowTextDisabled));
          PenWidth := 2;
        End
        Else
        Begin
          PenColor := Color32(TStyleManager.ActiveStyle.GetStyleColor(scBorder));
          PenWidth := 1;
        End;
    
        Img.Clear(BrushColor);
    
        Path := MakePath
        (
          [
            BORDER, BORDER,
            Self.ClientWidth - SPINER, BORDER,
            Self.ClientWidth - BORDER, Self.ClientHeight div 2,
            Self.ClientWidth - SPINER, Self.ClientHeight - BORDER,
            BORDER, Self.ClientHeight - BORDER,
            SPINER, Self.ClientHeight div 2
          ]
        );
        DrawPolygon(Img, Path, frEvenOdd, BrushColor);
        DrawLine(Img, Path, PenWidth, PenColor, esPolygon);
    
        Img.CopyToDc(Self.Canvas.Handle, 0, 0, False);
    
        textrect := TRect.Create(TEXT_H_OFFSET, TEXT_V_OFFSET, W - TEXT_H_OFFSET, H - TEXT_V_OFFSET);
        s := Trim(Self.Caption);
    
        Self.Canvas.Font.Assign(Self.Font);
        Self.Canvas.Font.Color := TStyleManager.ActiveStyle.GetStyleFontColor(sfWindowTextNormal);
        Self.Canvas.TextRect(textrect, s, [tfSingleLine, tfVerticalCenter, tfCenter, tfEndEllipsis]);
    
      finally
        Img.Free;
      end;
    end;

     

    sample.7z

    • Like 1

  5. 3 hours ago, Uwe Raabe said:

    GetIt only installs in the current IDE. Not in any other registry node nor in the 64-bit one.

     

    Nevertheless, the packages exist and you can simply add them via Components - Install packages.

    Manually installed and works fine.
    Thanks.


  6. In a Python program, with DelphiVCL, I'm trying to use the TreeNode.Data field to contain extra node infos.


     

            def add_node_recursive(treeview: TreeView, parent_node: TreeNode, data: dict):
                axis_label = ''
                axis_id = data['id']
                if axis_id in ['X', 'Y', 'Z', 'A', 'B', 'C']:
                    axis_label = f'{axis_id}-axis'
                elif axis_id == 'TP':
                    axis_label = f'Toolpath'
                elif axis_id == 'MCS':
                    axis_label = f'Machine Zero Point'
                else:
                    axis_label = f'{axis_id}'
                axis_node = treeview.Items.AddChild(parent_node, axis_label)
                print(type(axis_node))
                print(type(axis_node.Data))
    
                
    [Dbg]>> print(type(axis_node))
    <class 'TreeNode'>
    [Dbg]>> print(type(axis_node.Data)) 
    <class 'NoneType'>
    [Dbg]>>> dir(axis_node)
    ['AbsoluteIndex', 'AfterConstruction', 'AlphaSort', 'Assign', 'BeforeDestruction', 'CPP_ABI_1', 'CPP_ABI_2', 'CPP_ABI_3', 'CheckState', 'Checked', 'ClassInfo', 'ClassName', 'ClassNameIs', 'ClassParent', 'ClassType', 'CleanupInstance', 'Collapse', 'Count', 'Create', 'CustomSort', 'Cut', 'Data', 'DefaultHandler', 'Delete', 'DeleteChildren', 'Deleting', 'Destroy', 'Dispatch', 'DisplayRect', 'DisposeOf', 'DropHighlighted', 'DropTarget', 'EditText', 'Enabled', 'EndEdit', 'Equals', 'Expand', 'Expanded', 'ExpandedImageIndex', 'FieldAddress', 'Focused', 'Free', 'FreeInstance', 'GetHandle', 'GetHashCode', 'GetInterface', 'GetInterfaceEntry', 'GetInterfaceTable', 'GetLastChild', 'GetNamePath', 'GetNext', 'GetNextChild', 'GetNextVisible', 'GetPrev', 'GetPrevChild', 'GetPrevVisible', 'Handle', 'HasAsParent', 'HasChildren', 'ImageIndex', 'Index', 'IndexOf', 'InheritsFrom', 'InitInstance', 'InstanceSize', 'IsFirstNode', 'IsVisible', 'Item', 'ItemId', 'Level', 'MakeVisible', 'MethodAddress', 'MethodName', 'MoveTo', 'NewInstance', 'OverlayIndex', 'Owner', 'Parent', 'QualifiedClassName', 'SafeCallException', 'Selected', 'SelectedIndex', 'SetProps', 'StateIndex', 'Text', 'ToList', 'ToString', 'ToTuple', 'TreeView', 'UnitName', 'UnitScope', '__bound__', '__class__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__owned__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'getFirstChild', 'getNextSibling', 'getPrevSibling']

    Initially node Data is set to NoneType but If I try to assign something I get:
     

    AttributeError: Error in setting property Data
    Error: Expected a PPyObject

     


  7. I'm using TreeView and I'm trying to disable the node collapsing with event OnCollapsing(Sender, Node, AllowCollapse).

    The Python method is called when a TreeView node is clicked for collapse:

        def TreeViewCollapsing(self, Sender, Node, AllowCollapse):
            AllowCollapse = False

    In the event I've set AllowCollapse to False, but in engine code the AllowCollapse := PyObject_IsTrue(LVarParam.Value) = 1; returns True:

    procedure TTVCollapsingEventHandler.DoEvent(Sender: TObject; Node: TTreeNode;
      var AllowCollapse: Boolean);
    var
      LPyObject, LPyNode, LPyTuple, LPyResult, LPyAllowCollapse: PPyObject;
      LVarParam: TPyDelphiVarParameter;
    begin
      Assert(Assigned(PyDelphiWrapper));
      if Assigned(Callable) and PythonOK() then
        with GetPythonEngine() do begin
          LPyObject := PyDelphiWrapper.Wrap(Sender);
          LPyNode := PyDelphiWrapper.Wrap(Node);
          LPyAllowCollapse := CreateVarParam(PyDelphiWrapper, AllowCollapse);
          LVarParam := PythonToDelphi(LPyAllowCollapse) as TPyDelphiVarParameter;
          LPyTuple := PyTuple_New(3);
          PyTuple_SetItem(LPyTuple, 0, LPyObject);
          PyTuple_SetItem(LPyTuple, 1, LPyNode);
          PyTuple_SetItem(LPyTuple, 2, LPyAllowCollapse);
          try
            LPyResult := PyObject_CallObject(Callable, LPyTuple);
            if Assigned(LPyResult) then begin
              Py_DECREF(LPyResult);
              AllowCollapse := PyObject_IsTrue(LVarParam.Value) = 1;
            end;
          finally
            Py_DECREF(LPyTuple);
          end;
          CheckError();
        end;
    end;

     


  8. I have always used and will always continue to use Delphi, as long as I am allowed in the company.

    Other languages and IDE environments have been added but it will be out of affection, I find the Delphi one very friendly, complex to the point and with things that are really needed.

    Of course, this depends a lot on the scope of the software, but in mine it is perfectly apt, where other environments become scattershot (too many things and not congruent with each other).

    What I admire about the Delphi RAD developers is their dedication.

    It has been dozens of years, that despite the fact that for many it is an outdated environment and language that they are dedicated to keeping it active, to meet new needs, limited as they all are by budget problems.

    But Delphi is still alive, and I easily shame the final products made by other colleagues with “newer” environments.

    Like everyone I would like to have more and more, and think that every problem it has can be magically solved in a short time, but you know, that is not the case for any of us who develop code for a living.

    You always look for a compromise between investment availability and goals to be achieved.

     

    • Like 2
    • Thanks 1

  9. Actually I've installaed Eclipse Temurin JDK with Hostspot 17.0.9+9 (x64) and shoud go fine ?
    PS: I'm used with RAD ISO which does not install JDK so it's necessary to be in the OS before to start.
    I don't know if web install does things to install also required JDK.


  10. Mmmm,
    I've tried a simple console program in Athens 12:
     

    program Project4;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils,
      System.DateUtils,
      Winapi.Windows;
    
    var
      I: Integer;
      T1: Int64;
      T2: Int64;
      TD: Double;
      D1: TDateTime;
      D2: TDateTime;
      DiffMs: Int64;
      Frequency: Int64;
    
    function Delay: Integer;
    var
      I: Integer;
    begin
      Result := 0;
      for I := 0 to 1000000 do
        Inc(Result);
    end;
    
    begin
      FormatSettings.DecimalSeparator := '.';
      FormatSettings.ThousandSeparator := ',';
      try
        QueryPerformanceFrequency(Frequency);
    
        D1 := Now();
        QueryPerformanceCounter(T1);
        Delay;
        D2 := Now();
        QueryPerformanceCounter(T2);
    
        TD := (T2 - T1) * 1000 / Frequency;
        DiffMs := MilliSecondsBetween(D2, D1);
        Writeln(Format('Now() delta            = %d ms', [DiffMs]));
        Writeln(Format('QueryPerformance delta = %f ms', [TD]));
    
    
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.

    Result:

    Now() delta            = 2 ms
    QueryPerformance delta = 2.15 ms
    

    The Delay is empirical, necessary just to have a little delay.
    Now() seems to capture 2ms of delta.


    Increasing delay of 10:

    Now() delta            = 17 ms
    QueryPerformance delta = 16.42 ms

    I don't know why they report 1 sec of precision in the documentation, but if it can be so, is terribile, because my OPC UA server timings are based on TDateTime and 1ms of resolutions is already 10 time bigger than OPC-UA tick of 100ns.

    • Like 1

  11. I work only on Windows but to get precise timings (below 1ms of accuracy) I use QueryPerformanceFrequency() and QueryPerformanceCounter().
    In case precise timings are not available I switch to timeGetTime()

    A messy unit is in attachment.

    PS:
    You can improve Windwos timeGetTime, gettickcount and sleep (DELPHI IDE does that) with:

    program XXX;
    
    uses
      System.SysUtils,
      Winapi.MMSystem,
      ...;
    
    {$R *.res}
    
    var
      TimeCaps: TTimeCaps;
      NeedToChangeTimerPrecsion: Boolean;
    
    begin
      // starts high precision timer
      if timeGetDevCaps(@TimeCaps, SizeOf(TTimeCaps)) = TIMERR_NOERROR then
        NeedToChangeTimerPrecsion := timeBeginPeriod(TimeCaps.wPeriodMin) = TIMERR_NOERROR
      else
        NeedToChangeTimerPrecsion := False;
    
      // initializes and runs application
      Application.Initialize;
      ...;
      Application.Run;
    
      // stops high precision timer
      if NeedToChangeTimerPrecsion then
        timeEndPeriod(TimeCaps.wPeriodMin);
    end.


     

    osTimeUtils.pas


  12. I use UPX by decade without any issue also with Virustotal and installed BitDefender. I guess it expand program in RAM.
    My 38.681.088 byte exe are compressed with LZMA to 10.189.312 byte with "upx-4.2.2.exe --best --lzma normal-version.exe upx-version.exe"


  13. 11 hours ago, DelphiUdIT said:

    The bundle compiled files (Bpl, Dcu, etc ...) are in the same paths of delphi system libraries, I think you must move them from there. So you must maintain them and the github version switching the windows registry.

    I think that @shineworld has done those steps.

    I've downloaded (cloned) Indy repository from github (https://github.com/IndySockets/Indy.git).
    Manually copied needed file in a source folder of my project.
    Added that folder in the project search path.
    Created the class only with code (no IDE objects placement) so I use only custom sources for Indy.

    This permitted me to add changes and work with latest git repository code, without remove native Indy tools from IDE.

    • Like 1
×