简体   繁体   English

引用对象实例并释放它

[英]Refer to an object instance and free it

If I create multiple TButton objects with this routine: 如果我使用此例程创建多个TButton对象:

procedure CreateButton;
begin
  Btn := TButton.Create(nil);
end;

Then, how can I refer to a specific object instance to free it using another method like: 然后,如何使用另一个方法引用特定的对象实例以释放它:

procedure FreeButton;
begin
  Btn[0].Free;  //???
end;

Of course, this does not compile, but I think the question is clear: How do I declare Btn ? 当然,这不能编译,但是我认为问题很明确:如何声明Btn And how do I free multiple instances? 以及如何释放多个实例?

It doesn't make much sense to create a TButton anywhere that isn't part of a form (which your code does). 在不属于表单一部分的地方创建TButton并没有多大意义(您的代码这样做)。

With that being said, in order to refer to it later to free it, you need to store a reference to it somewhere. 话虽如此,为了稍后引用它以释放它,您需要在某个地方存储对它的引用。

Since you're referring to "multiple buttons" and using array code in your delete routine, I think you're probably wanting to track an array of buttons. 由于您是指“多个按钮”并在删除例程中使用数组代码,因此我认为您可能想跟踪一个按钮数组。 Here's an example of doing just that: 这是一个这样做的例子:

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);   // Add via Object Inspector Events tab
  private
    { Private declarations }
    // Add these yourself
    BtnArray: array of TButton;
    procedure CreateButtons(const NumBtns: Integer); 
    procedure DeleteBtn(BtnToDel: TButton);
    procedure BtnClicked(Sender: TObject);  
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DeleteBtn(BtnToDel: TButton);
var
  i: Integer;
begin
  // Check each button in the array to see if it's BtnToDel. If so,
  // remove it and set the array entry to nil so it can't be deleted
  // again.
  for i := Low(BtnArray) to High(BtnArray) do
  begin
    if BtnArray[i] = BtnToDel then
    begin
      FreeAndNil(BtnArray[i]);
      Break;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Create 10 buttons on the form
  CreateButtons(10);
end;

// Called when each button is clicked. Assigned in CreateButtons() below    
procedure TForm1.BtnClicked(Sender: TObject);
begin
  // Delete the button clicked
  if (Sender is TButton) then
    DeleteBtn(TButton(Sender));
end;

procedure TForm1.CreateButtons(const NumBtns: Integer);
var
  i: Integer;
begin
  // Allocate storage for the indicated number of buttons
  SetLength(BtnArray, NumBtns);

  // For each available array item
  for i := Low(BtnArray) to High(BtnArray) do
  begin
    BtnArray[i] := TButton.Create(nil);              // Create a button
    BtnArray[i].Parent := Self;                      // Tell it where to display
    BtnArray[i].Top := i * (BtnArray[i].Height + 2); // Set the top edge so they show
    BtnArray[i].Name := Format('BtnArray%d', [i]);   // Give it a name (not needed)
    BtnArray[i].Caption := Format('Btn %d', [i]);    // Set a caption for it
    BtnArray[i].OnClick := BtnClicked;               // Assign the OnClick event
  end;
end;

If you put this code in a new blank VCL forms application and run it, you'll see 10 buttons ('Btn 0 through Btn 9`) on a form. 如果将此代码放在新的空白VCL表单应用程序中并运行它,您将在表单上看到10个按钮(“ Btn 0 through Btn 9”)。 Clicking on a button will remove it from the form (and the array). 单击一个按钮会将其从窗体(和数组)中删除。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM