1

このルーチンで複数のTButtonオブジェクトを作成する場合:

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

次に、次のような別の方法を使用して、特定のオブジェクト インスタンスを参照して解放するにはどうすればよいですか。

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

もちろん、これはコンパイルされませんが、問題は明らかだと思いますBtn。また、複数のインスタンスを解放するにはどうすればよいですか?

4

1 に答える 1

1

フォームの一部ではない場所を作成することはあまり意味がありませTButtonん (コードで行います)。

そうは言っても、後で参照して解放するには、どこかに参照を保存する必要があります。

「複数のボタン」を参照し、削除ルーチンで配列コードを使用しているため、おそらくボタンの配列を追跡したいと考えています。これを行う例を次に示します。

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;

このコードを新しい空の VCL フォーム アプリケーションに入力して実行すると、フォームに 10 個のボタン ('Btn 0 throughBtn 9`) が表示されます。ボタンをクリックすると、フォーム (および配列) から削除されます。

于 2013-05-10T16:24:25.580 に答える