比方說LISTBOX1串列框中有如下字符:1112,1113,1122,1123,對比串列框字符是否符合變數{設變數為1123456},我們可以這樣實作if (Form1.ListBox3.Items.IndexOf(STR)>0) then {但串列框字符跟變數必須全一致才>0}現在我想實作的是串列框字符只要一部份相同條件就成立如為11就能>0,也就是像POS函式那樣只要符合父串其中一部份就能大于0,請大大們指教下,最好給下代碼
uj5u.com熱心網友回復:
TStrings 沒有部分比較功能,你得自己從 0 到 Count - 1 回圈自己去比較,幾行代碼而已。uj5u.com熱心網友回復:
unit Unit11;
interface
uses
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.
uj5u.com熱心網友回復:
幫你寫個通用函式吧。把要找的字串和 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;
uj5u.com熱心網友回復:
嗯,pos就搞定了
uj5u.com熱心網友回復:
感謝提供,但是串列框里的資料太多,用FOR很慢,要等10秒才有結果,有沒有最快的方法
uj5u.com熱心網友回復:
如果比較是從字串最左開始的,即像sql的like 'xxx%'則可以排序后再二分查找定位,這樣會快非常多倍。。。。。
uj5u.com熱心網友回復:
也可以用正則運算式,這樣程式更簡潔,高效。。uj5u.com熱心網友回復:
樓主:有一事不明,既然那么大的資料量,放在 listbox 里讓用戶操作很困難。也許你并不需要用戶操作,只是借助 listbox 儲存資料。如果真是這樣,不如創建一個 TStringList 物件來操作,也許比 listbox 速度要快。另外,TStrings 有個 CompareStrings 方法,供 Delphi 內部使用比較字串大小。派生物件可以建立一個 override 方法取代原來的內部操作,這樣就可以實作你所需要的部分比較,無需再寫回圈陳述句,直接用 IndexOf 就能完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/146341.html
標籤:數據庫相關
