Метод добавления объекта TStringList

Я хочу знать, что делает этот вызов метода:

stringList.addObject(String,Object);

Я также хочу знать, что это свойство делает:

stringList.Objects[i]

Он выглядит как ключ, пара значений при добавлении. Но при получении в цикле то, что получает?

Я также вижу пункты [i].

Я запутался с операциями TStringList и действиями TList.

Ответ 1

Он добавляет пару элементов: запись в списке TStringList.Strings и соответствие TObject в списке TStringList.Objects.

Это позволяет, например, хранить список строк, которые содержат имя для элемента, и объект, который является классом, содержащим соответствующий элемент.

type
  TPerson=class
    FFirstName, FLastName: string;
    FDOB: TDateTime;
    FID: Integer;
  private
    function GetDOBAsString: string;
    function GetFullName: string;
  published
    property FirstName: string read FFirstName write FFirstName;
    property LastName: string read FLastName write FLastName;
    property DOB: TDateTime read FDOB write FDOB;
    property DOBString: string read GetDOBAsString;
    property FullName: string read GetFullName;
    property ID: Integer read FID write FID;
  end;

implementation

{TPerson}
function TPerson.GetDOBAsString: string;
begin
  Result := 'Unknown';
  if FDOB <> 0 then
    Result := DateToStr(FDOB);
end;

function TPerson.GetFullName: string;
begin
  Result := FFirstName + ' ' + FLastName; // Or FLastName + ', ' + FFirstName
end;

var
  PersonList: TStringList;
  Person: TPerson;
  i: Integer;
begin
  PersonList := TStringList.Create;
  try
    for i := 0 to 9 do
    begin
      Person := TPerson.Create;
      Person.FirstName := 'John';
      Person.LastName := Format('Smith-%d', [i]); // Obviously, 'Smith-1' isn't a common last name.
      Person.DOB := Date() - RandRange(1500, 3000);  // Make up a date of birth
      Person.ID := i;
      PersonList.AddObject(Person.LastName, Person);
    end;

    // Find 'Smith-06'
    i := PersonList.IndexOf('Smith-06');
    if i > -1 then
    begin
      Person := TPerson(PersonList[i]);
      ShowMessage(Format('Full Name: %s, ID: %d, DOB: %s',
                         [Person.FullName, Person.ID, Person.DOBString]));
    end;
  finally
    for i := 0 to PersonList.Count - 1 do
      PersonList.Objects[i].Free;
    PersonList.Free;
  end;

Это явно надуманный пример, поскольку это не то, что вы действительно найдете полезным. Однако это демонстрирует концепцию.

Еще одно удобное использование - сохранение целочисленного значения вместе со строкой (например, отображение списка элементов в TComboBox или TListBox и соответствующий идентификатор для использования в запросе базы данных). В этом случае вам просто нужно придумать целое число (или что-то еще, что является SizeOf (Pointer)) в массиве Objects.

// Assuming LBox is a TListBox on a form:
while not QryItems.Eof do
begin
  LBox.Items.AddObject(QryItem.Fields[0].AsString, TObject(QryItem.Fields[1[.AsInteger));
  QryItems.Next;
end;

// User makes selection from LBox
i := LBox.ItemIndex;
if i > -1 then
begin
  ID := Integer(LBox.Items.Objects[i]);
  QryDetails.ParamByName('ItemID').AsInteger := ID;
  // Open query and get info.
end;

В случае хранения вещей, отличных от фактического TObject, вам не нужно освобождать содержимое. Поскольку они не являются реальными объектами, там ничего не освобождать, кроме самого TStringList.

Ответ 2

Метод AddObject позволяет хранить адрес TObject (указатель), связанный с строкой, хранящейся в свойстве Item. свойство Objects предназначено для доступа к сохраненным объектам.

Проверьте этот простой примерm, который использует AddObject для хранения целочисленного значения, связанного с каждой строкой.

var
 List : TStringList;
 I    : integer;
begin
  try
    List:=TStringList.Create;
    try
      List.AddObject('Item 1', TObject(332));
      List.AddObject('Item 2', TObject(345));
      List.AddObject('Item 3', TObject(644));
      List.AddObject('Item 4', TObject(894));

      for I := 0 to List.Count-1 do
        Writeln(Format('The item %d contains the string "%s" and the integer value %d',[I, List[I], Integer(List.Objects[i])]));
    finally
      List.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Ответ 3

TStringList - это больше, чем список строк.

Его можно использовать для пар значений имени:

stringlist.Values['apple'] := 'one';
stringlist.Values['banana'] := 'two';

Но он также может использоваться для связывания строк с любым объектом (или любым указателем).

stringlist.AddObject('apple', TFruit.Create);
stringlist.AddObject('banana', TFruit.Create);


i := stringlist.IndexOf('apple');
if i >= 0 then
  myfruit := stringlist.Objects[i] as TFruit;

TList - это список, в котором хранятся указатели. Они не связаны со строками.