Delphi 1 16位(是的,它已经老了,但效果很好)
一些示例代码:
procedure TForm1.Button1Click(Sender: TObject);
var
SL: TStringList;
begin
SL := TStringList.Create;
SL.Sorted := True;
SL.Duplicates := dupIgnore;
SL.AddObject('A', TObject(100));
SL.AddObject('A', TObject(999));
ShowMessage(IntToStr(LongInt(SL.Objects[0]))); {A}
SL.Free;
end;
我正在使用Object字段来存储longints(一个hack,是的,但它可以完成工作)。无论如何,在上面的A行,我希望ShowMessage显示100,而不是显示999(即使设置了dupIgnore)。我在这里错过了什么吗?或者它应该以这种方式工作(我希望stringlist忽略999)?
答案 0 :(得分:6)
刚刚在Delphi 2009中测试过 - 它显示了100个(根据Delphi 2009文档显示100个重复项和dupIgnore)。
可能是Delphi 1的错误。
<强>更新强>
function TStringList.Add(const S: string): integer;
begin
if not Sorted then
Result := FCount
else
if Find(S, Result) then
case Duplicates of
dupIgnore: Exit;
dupError: Error(SDuplicateString, 0);
end;
InsertItem(Result, S);
end;
function TStrings.AddObject(const S: string; AObject: TObject): Integer;
begin
Result := Add(S);
PutObject(Result, AObject);
end;
目前(Delphi 2009)的实施是:
function TStringList.Add(const S: string): Integer;
begin
Result := AddObject(S, nil);
end;
function TStringList.AddObject(const S: string; AObject: TObject): Integer;
begin
if not Sorted then
Result := FCount
else
if Find(S, Result) then
case Duplicates of
dupIgnore: Exit;
dupError: Error(@SDuplicateString, 0);
end;
InsertItem(Result, S, AObject);
end;
看到差异。旧的实现可能被视为错误(内存泄漏等)或未记录的允许行为。在任何情况下,当前的实现都没有问题。
答案 1 :(得分:3)
你没有遗漏任何东西。这正是发生的事情。
AddObject
首先调用Add
,它返回列表中新(或现有)元素的索引。然后它调用PutObject
来为该索引分配对象值。文档中未指定与Duplicates
属性相关的行为。