TAdvMemo 3.1

I was doing a quick code review of your bug fixes and enhancements when a couple of things jumped out at me.

Line # 13563 in AdvMemo.pas in procedure TAdvCustomMemo.WMContextMenu

    if Assigned(StdMenu) then
      FreeAndNil(StdMenu);

This line will never free StdMenu because it is a local var object to the method, and at this point in the code it will always be Nil.  For this to work StdMenu must be private to the Memo object itself.  So the end result is still multiple menu objects being created for a single memo object.

Line # 13582 in AdvMemo.pas in procedure TAdvCustomMemo.WMContextMenu

The menu item is being declared as "Redo", but Ctrl Z is declared as the hot key.  It should be Ctrl R

    mnu.Caption := FUILanguage.Redo + #9 + SmkcCtrl + 'Z';

Another issue is at line 13627...

    for i := 0 to StdMenu.Items.Count - 1 do
      StdMenu.Items.OnClick := DoContextMenuClick;

This overrides any custom onClick methods the developer assigns in DoCustomizeContextMenu,

It should be something like:

    for i := 0 to StdMenu.Items.Count - 1 do begin
      Is Not Assigned(StdMenu.Items.OnClick) Then

         StdMenu.Items.OnClick := DoContextMenuClick;
   
end;