我如何防止在delphi中的listview中添加重复项

时间:2014-11-14 23:32:20

标签: delphi

我在列表视图中有一些列表我想防止添加已经存在的项目并且只允许不存在的项目我在发布我的问题之前搜索了我找到一些删除重复项目的代码但这不是我的观点,一个实现目标的小例子,例如

listview1.Items.Add.caption := 'item1'
listview1.Items.Add.subitems.add:= 'content'

listview1.Items.Add.caption := 'item2'
listview1.Items.Add.subitems.add:= 'content2'

listview1.Items.Add.caption := 'item3'
listview1.Items.Add.subitems.add:= 'content3'

//duplicated line
listview1.Items.Add.caption := 'item1'// here what i want to ignore if exist and add any other items comes below
listview1.Items.Add.subitems.add:= 'content'


listview1.Items.Add.caption := 'item4'
listview1.Items.Add.subitems.add:= 'content4'

关于如何实现忽略现有项目并添加其他项目的任何想法?

当前代码

if Command = 'CallThis' then
  begin
    if Assigned(MS) then
    begin
      SL := TStringList.Create;
      try
        SL.LoadFromStream(MS);
        for I := 0 to SL.Count -1  do
        begin
            Line := SL.Strings[I];
            ExplodeLine(Line, item, content, num);
            with vieform.list.Items.Add do
            begin
              Caption := StripHTML(item);
              Subitems.Add(content);
              Subitems.Add(num)
            end;
        end;
      finally
        SL.Free;
      end;
      MS.Free;
    end;
  end; 

2 个答案:

答案 0 :(得分:5)

您不应使用可视化控件来存储和管理数据。拥有所有数据的列表,并在列表视图或您喜欢的任何其他控件中显示数据。

// class to store data (shortend)
TMyData = class
  constructor Create( const Item, Content : string );
  property Item : string;
  property Content : string;
end;

// list to organize the data
MyList := TObjectList<TMyData>.Create(
  // comparer, tell the list, when are items equal 
  TComparer<TMyData>.Construct(
    function ( const L, R : TMyData ) : integer
    begin
      Result := CompareStr( L.Item, R.Item );
    end ) );

// create an item
MyData := TMyData.Create( 'item1', 'content1' );

// check for duplicate in list
if not MyList.Contains( MyData ) then
  MyList.Add( MyData )
else
  MyData.Free;

// present the list in a ListView
ListView1.Clear;
for MyData in MyList do
begin
  ListItem := ListView1.Items.Add;
  ListItem.Data := MyData; // store a reference to the data item
  ListItem.Caption := MyData.Item;
  ListItem.SubItems.Add( MyData.Content );
end;

多数人

答案 1 :(得分:2)

只需编写自己的程序,为您完成所有工作。除了我不确定您在代码中尝试做什么之外,还有助于您的子项目(这就是我假设您尝试做的事情)...

procedure TForm1.Add(const Caption, Sub: String);
var
  I: TListItem;
  X: Integer;
begin
  for X := 0 to ListView1.Items.Count-1 do
    if SameText(ListView1.Items[X].Caption, Caption) then Exit;
  I:= ListView1.Items.Add;
  I.Caption:= Caption;
  I.SubItems.Add(Sub);
end;

然后,您只需将其称为:

Add('Item1', 'Content');
Add('Item2', 'Content2');
Add('Item3', 'Content3');
Add('Item1', 'Content1');

这将导致列表中的3个项目,因为第4个项目已经存在。

但请注意,这实际上可能无法解决您真正的潜在问题。如果您觉得需要执行此检查,那么可能是重新考虑您的设计的好时机。您使用的方法让我相信您正在使用TListView来存储数据。 UI控件永远不应该是实际数据的容器,它应该只为用户提供接口。