Delphi - 清理TListBox项目

时间:2010-04-22 12:25:33

标签: delphi listbox string delphi-2009

我想通过在另外两个列表框中进行检查来清理列表框。

  • 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;

2 个答案:

答案 0 :(得分:4)

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

原因是列表框,组合框或类似文件中的Items属性是通过代理类实现的,该代理类本身不包含字符串,但使用{{1}之类的Windows消息和LB_GETCOUNT直接从本机Windows控件中检索元素。如果多次访问字符串列表项,则重复的消息处理的开销将加起来。

答案 1 :(得分:3)

如果这对列表框起作用,那么每次重绘所有内容可能需要花费大量时间。您可以禁用此行为。用这个:

包围最外层的循环
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等分析器运行程序,这将有助于您了解代码在大部分时间内所花费的时间。