我想通过在另外两个列表框中进行检查来清理列表框。
以下是我到目前为止所获得的代码,大型列表的速度非常慢。
// 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;
答案 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等分析器运行程序,这将有助于您了解代码在大部分时间内所花费的时间。