【发布时间】:2020-04-26 00:30:47
【问题描述】:
使用 Delphi 10.2(在 Windows 10“19H2”下),我可以创建一个新应用程序,在其上放置一个面板,以及一个包含两个项目的操作列表。这两个项目调用相同的例程,其目的是删除面板上的任何按钮,然后添加新的:
procedure TForm1.CreateNavPanelButtons(Action: TAction);
begin
NavPanel.RemoveObject(Btn);
Btn.DisposeOf; //problem line
Btn := MakeButton(Action);
NavPanel.AddObject(Btn);
end;
(我在这里简化为只使用一个按钮。)删除现有按钮,添加新按钮。如果我调用 DisposeOf(释放按钮的内存),Window 对象变得无响应(无法调整大小、移动、关闭),直到我将注意力从应用上移开。
我在下面包含了整个代码:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation, System.Actions, FMX.ActnList;
type
TForm1 = class(TForm)
NavPanel: TPanel;
ActionList: TActionList;
acNextMenu: TAction;
acBackToMainMenu: TAction;
procedure FormCreate(Sender: TObject);
procedure acNextMenuExecute(Sender: TObject);
private
{ Private declarations }
public
Btn: TButton;
procedure CreateNavPanelButtons(Action: TAction);
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
function MakeButton(A: TAction): TButton;
begin
Result := TButton.Create(nil);
Result.Action := A;
Result.Text := (A as TAction).Text;
end;
procedure TForm1.acNextMenuExecute(Sender: TObject);
begin
CreateNavPanelButtons(acBackToMainMenu);
end;
procedure TForm1.CreateNavPanelButtons(Action: TAction);
begin
NavPanel.RemoveObject(Btn);
Btn.DisposeOf;
Btn := MakeButton(Action);
NavPanel.AddObject(Btn);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateNavPanelButtons(acNextMenu);
end;
end.
这是表格:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 480
ClientWidth = 640
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnCreate = FormCreate
DesignerMasterStyle = 0
object NavPanel: TPanel
Align = Top
Size.Width = 640.000000000000000000
Size.Height = 73.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
end
object ActionList: TActionList
Left = 392
Top = 192
object acNextMenu: TAction
Category = 'Navigation'
Text = 'NextMenu'
OnExecute = acNextMenuExecute
end
object acBackToMainMenu: TAction
Category = 'Navigation'
Text = 'Back To &Main Menu'
OnExecute = FormCreate
end
end
end
【问题讨论】:
-
请显示与此相关的所有代码,尤其是声明。我不知道 NvPanelButtons、NavPanel、MakeButton 是什么或做什么......
-
包括那些并简化了 MakeButton。
-
我可以使用 RemoveObject 但内存仍然被占用。我正在尝试处理内存,但我采取的任何步骤都会导致这种行为。
-
请提供重现问题的minimal reproducible example。您已经完全断章取义地发布了两个程序。 minimal reproducible example 将包括完整的源(包括 .fmx 文件的文本内容)和源 .pas 文件。它应该可以直接复制并粘贴到 IDE 中并运行以重现您描述的问题。
-
好的。这就是全部内容。
标签: delphi firemonkey