AndroidでのFreeAndNilについて

解決


ひろし  2015-01-17 00:18:46  No: 46954

お世話になります。
TEditコントロールを動的に生成して、使用後にすべてクリアするという処理を以下のように書いています。

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.Layouts, FMX.Edit;

type
  TForm1 = class(TForm)
    ButtonGenerate: TButton;
    ButtonClear: TButton;
    FlowLayout1: TFlowLayout;
    procedure ButtonGenerateClick(Sender: TObject);
    procedure ButtonClearClick(Sender: TObject);
  private
    FEditArray: array[0..2] of TEdit;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.ButtonGenerateClick(Sender: TObject);
var
  EditTemp: TEdit;
  I: Integer;
begin
  for I := 0 to Length(FEditArray) - 1 do
  begin
    EditTemp := TEdit.Create(Self);
    EditTemp.Parent := FlowLayout1;
    EditTemp.Text := IntToStr(I);
    FEditArray[I] := EditTemp;
  end;
end;

procedure TForm1.ButtonClearClick(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to Length(FEditArray) - 1 do
    FreeAndNil(FEditArray[I]);
end;

end.

以上についてWindowsだとFreeAndNilをした際に、すべてのTEditが解放されてフォーム画面から消えてくれるのですが、
AndroidだとTEditが消えずに画面上に残ってしまいます。

プログラムに問題があればご指摘ください。また問題がWindowsとAndroidの挙動の違いであればどう対処
すればよいでしょうか。
よろしくお願いいたします。


山本隆  2015-01-17 19:41:49  No: 46955

FreeAndNilでなくDisposeOfを使ってみてください。

procedure TForm1.ButtonClearClick(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to Length(FEditArray) - 1 do
    FEditArray[I].DisposeOf;
//    FreeAndNil(FEditArray[I]);
end;


ひろし  2015-01-22 21:55:48  No: 46956

返事が遅れましてすいません。
お教えいただいたDisposeOfで解決しました。
解放されるタイミングの問題なのですね。
ありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加