Могу ли я добавить запись как объект в список строк? - PullRequest
6 голосов
/ 05 февраля 2012

В настоящее время я добавляю объект, создавая его следующим образом:

type    
  TRecord = class
  private
    str: string;
    num: Integer;
  public
    constructor Create;
  end;

...

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
  rec: TRecord;
  Alist: TStringList;
begin
  Alist := TStringList.create;
  Alist.Clear;
  for i := 0 to 9 do 
  begin
    rec := Trecord.Create; //create instance of class
    rec.str := 'rec' + IntToStr(i);
    rec.num := i * 2;
    Alist.AddObject(IntToStr(i), rec);
  end;
end;

Этот метод правильный или неэффективный? Или я могу напрямую добавить объект, не создавая его, как используя запись?

type    
  PRec = ^TRec;
  TRec = record
    str: string;
    num: Integer;
  end;

...
var
  rec: TRec;
...

for i := 0 to 9 do 
begin
  //how to write here to have a new record, 
  //can i directly Create record in delphi 7 ?
  rec.str := 'rec' + IntToStr(i);
  rec.num := i*2;
  Alist.AddObject(IntToStr(i), ???); // how to write here?
end;

Или другой быстрый и простой способ?

Я использую Delphi 7.

Заранее спасибо.

1 Ответ

8 голосов
/ 05 февраля 2012

То, как вы делаете это сейчас, прекрасно.

Вы не можете сделать это с записью, не выделяя память, когда добавляете новую запись в TStringList.Objects, и впоследствии вам придется ее освобождать. Вы так же хорошо используете класс, как и сейчас; Вы должны освободить объекты перед освобождением списка строк. (В более поздних версиях Delphi TStringList имеет свойство OwnsObjects, которое автоматически освобождает их для вас, когда список строк свободен, но его нет в Delphi 7.)

Если вы действительно хотите сделать это с записью, вы можете:

type    
  PRec = ^TRec;
  TRec = record
    str: string;
    num: Integer;
  end;

var
  rec: PRec;
begin
  for i := 0 to 9 do 
  begin
    System.New(Rec);
    rec.str := 'rec' + IntToStr(i);
    rec.num := i*2;
    Alist.AddObject(IntToStr(i), TObject(Rec)); // how to write here?
  end;
end;

Вам нужно будет использовать System.Dispose(PRec(AList.Objects[i])) для освобождения памяти перед освобождением списка строк. Как я уже сказал, то, как вы делаете это сейчас, на самом деле намного проще; вам не нужно выполнять приведение типов при добавлении и удалении из списка строк.

Кстати, вам не нужен AList.Clear. Поскольку вы создаете список строк, в нем не может быть ничего для удаления.

...