TStringList的addObject方法

时间:2012-01-20 20:21:30

标签: delphi

我想知道这个方法调用的作用:

stringList.addObject(String,Object);

我也想知道这个属性的作用:

stringList.Objects[i]

添加时看起来像键,值对。但是在循环中检索什么会被检索?

我也看到[i]号电话。

我对TStringList操作和TList操作感到困惑。

3 个答案:

答案 0 :(得分:17)

它添加了一对项目: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;

这显然是一个人为的例子,因为它不是你真正觉得有用的东西。不过,它证明了这一概念。

另一个方便的用途是存储整数值和字符串(例如,显示TComboBoxTListBox中的项列表以及用于数据库查询的相应ID。在这种情况下,您只需要在Objects数组中对整数(或其他任何SizeOf(指针))进行类型转换。

// 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本身之外没有什么可以自由的。

答案 1 :(得分:5)

AddObject方法允许您存储与Item属性中存储的字符串关联的TObject地址(指针)。 Objects属性用于访问存储的对象。

检查这个简单的samplem,它使用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.

答案 2 :(得分:2)

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是一个存储指针的列表。它们与字符串无关。