Delphi DPI缩放运行时创建的具有弹出菜单的控件

Delphi DPI缩放运行时创建的具有弹出菜单的控件,delphi,dpi,Delphi,Dpi,我正在使用Delphi 10.4.1 Sydney,并创建了一个简单的控件,在运行时设置了它的父控件: constructor TMyTree.Create(AOwner: TComponent); begin inherited Create(Owner); PopupMenu := TPopupMenu.Create(Self); end; procedure TMyTree.ChangeScale(M, D: Integer; isDpiChange: boolean); beg

我正在使用Delphi 10.4.1 Sydney,并创建了一个简单的控件,在运行时设置了它的
父控件

constructor TMyTree.Create(AOwner: TComponent);
begin
  inherited Create(Owner);
  PopupMenu := TPopupMenu.Create(Self);
end;

procedure TMyTree.ChangeScale(M, D: Integer; isDpiChange: boolean);
begin
  inherited ChangeScale(M, D, isDpiChange);
  OutputDebugString(PChar(Format('M: %d, D: %d', [M, D])));
  //The program is started at 150% DPI and DPI changed to 175% DPI
  //Debug Output: M: 168, D: 96 - ERROR! It should be M: 168, D: 144
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  fTree := TMyTree.Create(Self);
  fTree.Parent := Self;
  OutputDebugString(PChar(Format('CurrentPPI: %d', [fTree.CurrentPPI])));
  //Debug Output at 150% DPI scale: CurrentPPI: 144 - OK!
end;
问题在于VCL使用错误的参数调用了
ChangeScale()
(请参见代码中的注释)

我认为这是因为当
PopupMenu:=TPopupMenu.Create(Self)TMyTree
构造函数中调用code>,VCL将树的
组件状态设置为
[csFreeNotification]

我已经检查了VCL代码,更具体地说是
TControl.SetParent()
。如果
csFreeNotification
处于
ComponentState
状态,则不会调用
ScaleForPPI
,并且在设置其
Parent
时不会缩放我们的树视图

这是VCL中的一个错误,还是有其他一些首选方法来创建运行时控件并设置它们的
父项


顺便说一句,如果我在
TMyTree
构造函数中使用
TImageList.Create(Self)
,同样的问题也会发生。

这是VCL中已知的问题。在中报告了与此相关的多张票证:


我对这些问题投了赞成票。我们希望EMBA不会再花三年的时间来解决这些问题。我认为这是一个重大问题。