【问题标题】:Deleting checked item from CheckListBox从 CheckListBox 中删除选中的项目
【发布时间】:2021-12-15 15:02:08
【问题描述】:

我想通过单击 TButton 从 CheckListBox 中删除选中的项目,但我只找到了如何删除选定的项目,这不是我想要的。我希望你能帮助我

【问题讨论】:

    标签: delphi delphi-10.1-berlin


    【解决方案1】:

    此代码将执行您想要的操作。请注意,CheckBoxList1.Items.Count 每删除一个项目就会减一。出于这个原因,我们在 for 循环中使用 downto 而不是 do

    procedure TForm1.Button1Click(Sender: TObject);
    var
      index: Integer;
    begin
      CheckListBox1.Items.BeginUpdate;
      try
        for index := (CheckListBox1.Items.Count - 1) downto 0 do
          if (CheckListBox1.Checked[index]) then
            CheckListBox1.Items.Delete(index);
      finally
        CheckListBox1.Items.EndUpdate;
      end;
    end;
    

    CheckListBox1.Items.BeginUpdate;CheckListBox1.Items.EndUpdate; 语句确保控件在我们处理其项目时不会重新绘制自身。

    【讨论】:

    • 始终使用try..finally 保护BeginUpdate..EndUpdate
    • 这段代码永远不会引发任何异常,所以不需要用异常处理来膨胀它。
    • @fritten 只是因为您之前没有见过它引发异常并不意味着它不能引发异常。因为它实际上可以,即如果操作系统在对底层ListBox进行操作时遇到错误,或者存在内存分配错误(Checked[]属性getter 可以分配内存)等等。所以,不要对可以不能发生什么做出假设。无论哪种方式,都要安全并准备好处理这两种情况。
    • @RemyLebeau:私有属性 getter 只会在索引超出范围时抛出。但无论如何,我正在改变我的答案。不想以良性的名义传播不安全的编码模式。
    • @fritten "只有在索引超出范围时,私有属性 getter 才会抛出" - 这不是唯一可以引发异常的条件。
    【解决方案2】:

    如果我了解您的需求,请尝试以下代码:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      count : Integer;
    begin
      i:= 0;
      count :=   CheckListBox1.Items.Count - 1;
      while i <= count  do
           if CheckListBox1.Checked[i] = true then
           begin
                   CheckListBox1.Items.Delete(i);
                   count := count - 1;
           end else i:=i+1;
    end;
    

    诅咒,有更好的解决方案,但它已经为你准备好了。

    【讨论】:

    • 没有错,但不必要的复杂。也不喜欢= true 部分。 (而count 应该真的是high。)
    • 这是一个解决方案,一分钟内没有答案,请随意编辑。
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2014-10-14
    • 1970-01-01
    • 2010-09-27
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多