【问题标题】:Delphi - Clean TListBox ItemsDelphi - 清理 TListBox 项
【发布时间】:2010-04-22 12:25:32
【问题描述】:

我想通过对照其他两个列表框检查一个列表框来清理它。

  • Listbox1 将有大的项目列表
  • Listbox2 会包含我想从 listbox1 中删除的字词
  • Listbox3 必须存在强制字词才能保留在 listbox1 中

下面是我目前得到的代码,对于大型列表来说非常慢。

// not very efficient 
Function checknegative ( instring : String; ListBox : TListBox ) : Boolean;
Var
  i : Integer;
Begin
  For I := listbox.Items.Count - 1 Downto 0 Do
  Begin
    If ExistWordInString ( instring, listbox.Items.Strings [i], 
      [soWholeWord, soDown] ) = True 
    Then
    Begin
      result := True;  //True if in list, False if not.
      break; 
    End
    Else
    Begin
      result := False;
    End;
  End;
  result:=false;
End;

Function ExistWordInString ( aString, aSearchString : String;
  aSearchOptions : TStringSearchOptions ) : Boolean;
Var
  Size : Integer;
Begin
  Size := Length ( aString );
  If SearchBuf ( Pchar ( aString ), Size, 0, 0, aSearchString, aSearchOptions ) <> Nil Then
  Begin
    result := True;
  End
  Else
  Begin
    result := False;
  End;
End;

【问题讨论】:

  • 我不明白您如何在代码中使用这两个函数。 checknegative 函数中的“instring”参数是什么?
  • instring 是一个字符串。如果单词“chicken”在列表框中,则返回 true,否则返回 false。

标签: delphi listbox string delphi-2009


【解决方案1】:

如果您在控件中使用TStrings 实例循环执行任何操作,创建一个临时TStringList 实例,将控件项分配给它,然后使用临时列表可能会有所帮助。

原因是列表框、组合框或类似内容中的Items 属性是通过代理类实现的,该代理类本身不保存字符串,但使用LB_GETCOUNT 和@987654325 等Windows 消息@ 直接从本机 Windows 控件检索元素。如果您多次访问一个字符串列表项,那么重复消息处理的开销加起来。

【讨论】:

    【解决方案2】:

    如果这适用于列表框,则每次重新绘制所有内容可能会花费大量时间。您可以禁用此行为。用这个包围最外面的循环:

    listbox.Items.BeginUpdate;
    try
      //do the loop here
    finally
      listbox.Items.EndUpdate;
    end;
    

    此外,您可以将布尔值直接分配给布尔表达式的求值,这将节省您内部循环的一些时间。所以:

    Function ExistWordInString ( aString, aSearchString : String; aSearchOptions : TStringSearchOptions ) : Boolean;
    Var
      Size : Integer;
    Begin
      Size := Length ( aString );
      result := SearchBuf ( Pchar ( aString ), Size, 0, 0, aSearchString, aSearchOptions ) <> Nil;
    End;
    

    但不确定会产生多大的影响。如果您进行了这些更改但仍然太慢,请尝试通过诸如 Sampling Profiler 之类的分析器运行您的程序,这将帮助您了解您的代码大部分时间都在做什么。

    【讨论】:

    • 我正在做开始/结束更新,我会毫不犹豫地查看采样分析器。
    • 看看你的 StringListComp,它可能会给我一些更好的方法来解决我正在做的事情......
    • @Brad:你是说我博客上的图书馆?这实际上只对比较整个字符串有用。但是当你可以使用它时,它非常有用。
    • 是的,你博客上的库,只是希望它能够比较单词和字符串..:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2014-08-15
    • 2017-07-30
    • 2013-06-17
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多