代码之家  ›  专栏  ›  技术社区  ›  sddk

使用临时tlistiems填充tlistview

  •  1
  • sddk  · 技术社区  · 8 年前

     var
      lis:TListItems;
      li:TListItem;
    begin
      lis := TListItems.Create(nil);
      try
        li := TListItem.Create(nil);
        li.Caption := 'test'; // at this line av occurs
        lis.AddItem(li);
        ListView1.Items.BeginUpdate;
        try
          ListView1.Items.Assign(lis);
        finally
          ListView1.Items.EndUpdate;
        end;
      finally
        lis.Destroy();
      end;
    

    如果在创建tlistiems时使用listview1作为所有者,则不会显示新行;

     var
      lis:TListItems;
      li:TListItem;
    begin
      lis := TListItems.Create(ListView1);
      try
        li := TListItem.Create(lis);
        li.Caption := 'test';
        lis.AddItem(li);
        ListView1.Items.BeginUpdate;
        try
          ListView1.Items.Assign(lis);
        finally
          ListView1.Items.EndUpdate;
        end;
      finally
        lis.Destroy();
      end;
    

    注意:准备列表需要很长时间,这就是我在后台准备的原因。(我正在用线程填充列表,并使用trtlcriticalsection保护它)

    1 回复  |  直到 8 年前
        1
  •  1
  •   Remy Lebeau    8 年前

    TListItems TListItem TListView

    Caption AddItem()

    TListItems.Add()

    var
      NewList: TStringList;
      Lock: TCriticalSection;
    
    ...
    
    // in a worker thread...
    
    Lock.Enter;
    try
      NewList.Clear;
      NewList.Add('test');
      ...
    finally
      Lock.Leave;
    end;
    // signal main UI thread that a new list is ready ...
    
    ...
    
    // in the main UI thread when the signal is received...
    
    var
      li: TListItem;
      i: Integer;
    begin
      Lock.Enter;
      try
        ListView1.Items.BeginUpdate;
        try
          ListView1.Items.Clear;
          for i := 0 to NewList.Count-1 do
          begin
            li := ListView1.Items.Add;
            li.Caption := NewList[i];
            ...
          end;
        finally
          ListView1.Items.EndUpdate;
        end;
      finally
        Lock.Leave;
      end;
    end;
    

    OwnerData true TListView.OnData...

    var
      NewList: TStringList;
      Lock: TCriticalSection;
    
    ...
    
    // in a worker thread...
    
    Lock.Enter;
    try
      NewList.Clear;
      NewList.Add('test');
      ...
    finally
      Lock.Leave;
    end;
    // signal main UI thread that a new list is ready ...
    
    ...
    
    // in the main UI thread...
    
    private
      MyListItems: TStringList; // or whatever you want to use to store your item data
    
    ...
    
    begin
      Lock.Enter;
      try
        MyListItems.Assign(NewList);
      finally
        Lock.Leave;
      end;
      ListView1.Items.Count := MyListItems.Count;
    end;
    
    procedure TMyForm.ListView1Data(Sender: TObject; Item: TListItem);
    begin
      Item.Caption := MyListItems[Item.Index];
      ...
    end;