Jump to content

Edwin Yip

Members
  • Content Count

    435
  • Joined

  • Last visited

  • Days Won

    3

Posts posted by Edwin Yip


  1. Oh I thought THtCanvasGDI is the default one...So I tried THtCanvasGDI has no issue.

    Question now: I assume changing `HtDefaultCanvasClass` only affects text rendering, but not other parts such as imaging rendering, is that correct?

    If so, I can use THtCanvasGDI to workaround the issue...

     

    Conclusion: With HCL 3.7 (not sure about the other versions), THtCanvasGP has text overlapping rendering issue, but both THtCanvasGDI and THtCanvasDX are OK.


  2. Thanks for the help Alexander.

    So I've just tried:

    - THtCanvasGDI: I assume this the default so it has the issue.
    - THtCanvasGP: Tried `HtDefaultCanvasClass := THtCanvasGP`, and it's the same issue.

    - THtCanvasDX: `HtDefaultCanvasClass := THtCanvasDX` solves the issue!

     

    And the html code is updated at runtime like this:

    `pnlMsg.HTML.Text := aHtmlCode`

     

    PS, I prefer `THtCanvasGDI` because the text rendering is the same as the system.


  3. Hi,

     

    I wonder if anyone, especially @Alexander Sviridenkov can give me any advise as to solving the following ThtPanel (a control from delphihtmlcomponents.com) rendering issue (text overlapped) under win 10/11 (ok under win 7).

    - The screenshot of the issue is attached.

    - I'm using HCL 3.7 (not the latest, I know, but I'm afraid I need to solve this issue with this version at the moment).

    - The html code used:

    Trial Period's Expiring in 21 Day(s)<br />When in trial mode only <strong>20</strong> blabla.<br /><br /><a href="#buy">Buy MyProduct here</a><br /><br /><a href="#activate">Activate MyProduct</a> if you already have a license key

    - The `ThtPanel` object:

    var
      pnlMsg := THtPanel.Create(Self);
      pnlMsg.Parent := Self;
      pnlMsg.AlignWithMargins := True;
      pnlMsg.Hint := '[Ctrl + C] to copy the message to clipboard';
      pnlMsg.Align := alClient;
      pnlMsg.Caption := 'pnlMsg';
      pnlMsg.ParentBackground := False;
      pnlMsg.ParentColor := True;
      pnlMsg.ParentFont := False;
      pnlMsg.ParentShowHint := False;
      pnlMsg.PopupMenu := pmMsg;
      pnlMsg.ShowHint := True;
      pnlMsg.TabOrder := 1;
      pnlMsg.Styles.Clear;
      pnlMsg.Styles.Add('a {');
      pnlMsg.Styles.Add('  color: #0088cc;');
      pnlMsg.Styles.Add('}');
      pnlMsg.TouchScroll := False;
      pnlMsg.VerticalScrollBar := hsbAuto;
      pnlMsg.HighlightTextColor := 0;
      pnlMsg.EnableSelection := True;

     

    hcl overlapped under win10and11.png


  4. I use mORMot for this because calling a method or an interface in another process is just like calling a method/interface in the same process.

    And the communication protocol can be tcp/ip or named pipes.

     

    On process B you define and implement an interface:

    type
      ICalculator = interface(IInvokable)
        ['{9A60C8ED-CEB2-4E09-87D4-4A16F496E5FE}']
        /// add two signed 32-bit integers
        function Add(n1,n2: integer): integer;
      end;
    
      TServiceCalculator = class(TInterfacedObject, ICalculator)
      public
        function Add(n1,n2: integer): integer;
      end;
    
    function TServiceCalculator.Add(n1, n2: integer): integer;
    begin
      result := n1+n2;
    end;

    And you expose it:

    Server.ServiceRegister(TServiceCalculator,[TypeInfo(ICalculator)],sicShared);

     

    On process A, you can now call the above interface served by process B:

    Client.ServiceRegister([TypeInfo(ICalculator)],sicShared);
    
    var I: ICalculator;
    begin
      I := Client.Service<ICalculator>;
      if I<>nil then
        result := I.Add(10,20);
    end;

    More details: https://synopse.info/files/html/Synopse mORMot Framework SAD 1.18.html#TITLE_415

     

    Sample code:

    https://github.com/synopse/mORMot/tree/master/SQLite3/Samples/14 - Interface based services

     

    It's even simpler if you use the so-called "method-based service".

     

    Hope it helps.


  5. Another open source Delphi project worth spreading - a pure Delphi implementation of a rich text editor, like TRichEdit, in BSD license.

     

    But be aware - although the classes/methods/vars are well named in English, the comments and documents are in Chinese.

    So feel free to ignore it if you mind that.

     

    https://github.com/59079096/HCView-Pascal

    • Like 1

  6. 20 minutes ago, Angus Robertson said:

    It's unclear to me from the readme and help whether ZipMaster is a linkable Delphi component or a DLL with a Delphi interface. 

     

    The documentation seem to assume you are familiar with the component and not migrating from something like VCLZip.   

     

    Angus


    - TZipMaster has a full set of features for writing/reading zip archives, most of the logics are implemented in Delphi, but it relies on a 300+KB DLL for the underlying operations.
    - TZipMaster supports both 64bit and 32bit Delphi compilers.
    - TZipMaster supports Zip64 (for zip files larger than 4GB).
     

    I edited the readme.md file


  7. Well, I didn't exactly make this, but DelphiZip should be the most feature-rich open source zip component for Delphi, and since 2019 due to a health issue Russell Peters the previous maintainer has stop the maintenance.

    I fixed several minor issues for the library, but there is no place to submit my changes now (even delphizip.org is down), so I created a github repository and welcome anyone to contribute:

    https://github.com/edwinyzh/ZipMaster


  8. 19 hours ago, Henry Olive said:

    Thank You so much Peter, Edwin

    Edwin, exactly yes

     

    I wrote below code ( Delphi 10.3)  and everything is OK mouse wheel works

    but to me, there should not need below code, mouse wheel should work

    without any code.


    procedure TMeetNote2.ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    var
      aPos: SmallInt;
    begin
      aPos:= ScrollBox1.VertScrollBar.Position - WheelDelta div 10;
      aPos:= Max(aPos, 0);
      aPos:= Min(aPos, ScrollBox1.VertScrollBar.Range);
      ScrollBox1.VertScrollBar.Position := aPos;
      Handled := True;
    end;

    Yes, you have to write such code, and such code only works if the scrollbox has the focus.

×