比方说LISTBOX1列表框中有如下字符:1112,1113,1122,1123,对比列表框字符是否符合变量{设变量为1123456},我们可以这样实现if  (Form1.ListBox3.Items.IndexOf(STR)>0) then  {但列表框字符跟变量必须全一致才>0}现在我想实现的是列表框字符只要一部份相同条件就成立如为11就能>0,也就是像POS函数那样只要符合父串其中一部份就能大于0,请大大们指教下,最好给下代码 

解决方案 »

  1.   

    TStrings 没有部分比较功能,你得自己从 0 到 Count - 1 循环自己去比较,几行代码而已。
      

  2.   


    unit Unit11;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm11 = class(TForm)
        lst1: TListBox;
        btn1: TButton;
        edtSourceStr: TEdit;
        edtLength: TEdit;
        procedure btn1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        procedure SelItems(const ASourceStr: string; const Len: Integer);
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form11: TForm11;implementation{$R *.dfm}procedure TForm11.SelItems(const ASourceStr : string; const Len : Integer);
    var
      i : integer;
      str : string;
    begin
      for i := 0 to lst1.Items.Count - 1 do
      begin
        str := Copy(lst1.Items[i], 0, Len);
        if Pos(str, ASourceStr) > 0 then
          lst1.Selected[i] := True;
      end;
    end;procedure TForm11.btn1Click(Sender: TObject);
    begin
      lst1.ClearSelection;
      SelItems(edtSourceStr.Text, StrToInt(edtLength.Text));
    end;procedure TForm11.FormCreate(Sender: TObject);
    begin
      lst1.Clear;
      lst1.Items.Add('1112');
      lst1.Items.Add('1113');
      lst1.Items.Add('1122');
      lst1.Items.Add('1123');
      lst1.MultiSelect := True;  edtSourceStr.Text := '1123456';
      edtLength.Text := '4';
    end;end.
      

  3.   

    帮你写个通用函数吧。把要找的字符串和 ListBox.Items 作为参数。查到后返回 S 所在的 Index 值,否则返回 -1。function PartOfStrings(const S: string; Items: TStrings): Integer;
    var 
      I: Integer;
    begin
      Result := -1;
      if (S = '') or (Items = nil) then Exit;  for I := 0 to Items.Count - 1 do begin
        if Pos(S, Items[I]) > 0 then begin
          Result := I;
          Exit;
        end;
      end;
    end;
      

  4.   


    嗯,pos就搞定了
      

  5.   


    感谢提供,但是列表框里的数据太多,用FOR很慢,要等10秒才有结果,有没有最快的方法
      

  6.   

    如果比较是从字符串最左开始的,即像sql的like 'xxx%'
    则可以排序后再二分查找定位,这样会快非常多倍。。
      

  7.   

    楼主:有一事不明,既然那么大的数据量,放在 listbox 里让用户操作很困难。也许你并不需要用户操作,只是借助 listbox 储存数据。如果真是这样,不如创建一个 TStringList 对象来操作,也许比 listbox 速度要快。另外,TStrings 有个 CompareStrings 方法,供 Delphi 内部使用比较字符串大小。派生对象可以建立一个 override 方法取代原来的内部操作,这样就可以实现你所需要的部分比较,无需再写循环语句,直接用 IndexOf 就能完成。