Delphi - 清理 TListBox 项目

标签 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;

最佳答案

如果您在控件中执行任何与 TStrings 实例循环的操作,那么创建一个临时的 TStringList 实例,将控件项分配给它,然后使用临时列表。

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

关于Delphi - 清理 TListBox 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2690698/

相关文章:

delphi - 使用LIKE语句进行过滤

algorithm - 键/值对的最佳算法,其中键是 Delphi 中的 int64,Delphi 2009 之前?

regex - 正则表达式,匹配不以#,$,

wpf - WPF ListBox 的组面板

c# - 导致自动滚动的列表框 RemoveAt 方法

image - 如何在TImage或其他东西上制作水效果?

delphi - 从列表框中选择一个代理(IDHTTP)

java - 如何用空格拆分字符串并将任何内容单独留在引号内?

python - python在哪里存储str的原始值

c# - 如何删除字符串中特定字符之间的空格?