如何使用破坏和正确创建

时间:2017-11-12 22:38:06

标签: pascal lazarus freepascal

我有一张表格。当用户单击TESTBUTON时,将生成一个数组(此处为循环)并填充数组。 (这样可行)。 现在,用户可以再次点击按钮更改某些参数。 比我想要清除/释放/销毁旧数组一样,创建它。

我找到了很多检查但是它们不起作用(因为我不知道在哪里放置不同的程序)。 所以我用所有部分制作了这个样本。 有人可以将我的程序移到安装位置,或者给我一个显示正确实现的示例。

unit frmmywindow;

interface

uses 
type 

  TArrayA = record
        Field1:integer;
        Field2:integer;
        Field3:integer;
        Field4:integer;
        String5:string;
         //other fields, strings, integers..
      end; 

  private
    { private declarations }

  public
    { public declarations }
    destructor Destroy; override;
  end;

var
  var ArrayA : array of TarrayA;

implementation 

destructor TArrayA.Destroy;
begin
  ArrayA.Free;
  inherited;
end; 

procedure TArrayA.Free;
begin
     if Assigned(self) then Destroy;
end;     

procedure TForm1.btnTest(Sender: TObject);
var
  x: integer;
  reccount: integer;
begin
  ArrayA.free:
  ArrayA.create;
  reccount := 1000;
  for x := 1 to reccount do
  begin
        setLength(ArrayA,x+1); 
         ArrayA[x].field1 := 2000 - x;
         ArrayA[x].field2 := x;
         ArrayA[x].field3 := x;
         ArrayA[x].field4 := x;
         ArrayA[x].string5 := 'str' + inttostr(x);
  end;    
end;

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题。

  • 主要问题是TArrayA记录(通常我会链接到结构化类型的DocWiki文档,但它似乎是正确的现在)。记录不是没有析构函数 您不应该在其上调用Free 即可。记录被称为value types。他们甚至没有合适的构造函数,即使语法暗示他们这样做。记录"构造函数"仅仅是初始化者。
  • 另一个问题是,您不应该自己编写Free代码,即使也是如此。 Free从所有类实例TObject的根继承。对于类,如果要为其提供析构函数覆盖继承的析构函数:

    destructor Destroy; override;
    

所以答案是:你根本不使用也不定义它们来记录。

文档中描述了如何为声明,定义和使用它们。

正如我已经评论过的那样,你应该更好地熟悉这门语言。我建议你阅读 Delphi Object Pascal语言指南(名称不同,具体取决于版本),这是与Delphi一起安装的文档的一部分。