diff --git a/funcext/tvclib/utslvclauxiliary.tsf b/funcext/tvclib/utslvclauxiliary.tsf index 546f914..76c8a68 100644 --- a/funcext/tvclib/utslvclauxiliary.tsf +++ b/funcext/tvclib/utslvclauxiliary.tsf @@ -934,7 +934,7 @@ type tnumindexarray = Class() //栈模 len := fdlength; for i := len-1 downto 0 do begin - if v=FData[i]then return i; + if v=FData[i] then return i; end return -1; end @@ -1005,11 +1005,13 @@ type tnumindexarray = Class() //栈模 if not(vs) and length(vs) then return r; r := fdlength; r1 := r; - for i := 0 to length(vs)-1 do - begin - FData[r]:= vs[i]; - r++; - end + FData union=vs; + r := length(FData); + //for i,v in vs do //20230724 修改 减少循环 + //begin + // FData[r]:= v; + // r++; + //end fdlength := r; if r1 <> r then LengthChanged(r1-r); return r; @@ -1055,6 +1057,16 @@ type tnumindexarray = Class() //栈模 if len <> fdlength then LengthChanged(fdlength-len); return r; end + function set_len(n); //设置长度 + begin + if fdlength<>n and n>=0 then + begin + ol := fdlength; + fdlength := n; + FData := nils(n); + LengthChanged(n-ol); + end + end function LengthChanged(n);virtual; begin end @@ -1729,6 +1741,7 @@ type TTire = class FSub; FEnd; Ficase; + _tag; function Create(v); begin FChar := v; @@ -1749,10 +1762,11 @@ type TTire = class end ls := length(s); if ls>1 then - vsub.Add(s[2:]); + return vsub.Add(s[2:]); else begin vsub.FEnd := true; + return vsub; end end function Find(s,slen,idx); @@ -1768,6 +1782,19 @@ type TTire = class end return FEnd ; end + function find_node(s,slen,idx); + begin + if idx>slen then return (FEnd?self:0); + v0 := s[idx]; + if Ficase then v0 := lowercase(v0); + vsub := FSub[v0]; + if vsub then + begin + idx++; + return vsub.find_node(s,slen,idx); + end + return (FEnd?self:0); + end function seticase(i); begin ni := i?true:false; @@ -1793,7 +1820,7 @@ type TTire = class end function Add(s); begin - FRoot.Add(s); + return FRoot.Add(s); end function Create(); begin @@ -1801,6 +1828,11 @@ type TTire = class FRoot := new TTireNode(); FRoot.Ficase := false; end + function find_node(s,oidx); + begin + oidx := 1; + return FRoot.find_node(s,length(s),oidx); + end function Find(s,slen,idx,outidx,ostr); begin tid := idx; @@ -2275,9 +2307,7 @@ type tstr_step_match=class() **} function create(its); //送入匹配的字符串数组 begin - fits := array(); - findstaks := array(); - findidxs := array(""); + fits := array(); set_items(its); end function step_find_idx(s:string); //匹配的序号 @@ -2287,34 +2317,19 @@ type tstr_step_match=class() @param(s)(string) 匹配的目标 %% @return(array of integer) 成功的位置 %% **} - idx := 0; - d := getsdata(s); - if ifarray(d) then return d; //已经存在了,返回 - for i := 1 to length(s) do //失效判断 + if not ftree then return array(); + o := ftree.find_node(s,idx); + if o and ((idx-1)=length(s)) then return o._tag; + if not o then o := ftree.FRoot; + for i := idx to length(s) do begin si := s[1:i]; - if findidxs[i]<>si then //判断失效位置 - begin - findidxs := findidxs[0:(i-1)]; - break; - end + oi := ftree.add(si); + asi := get_same_idexs(si,o._tag); + oi._tag := asi; + o := oi; end - for i:= length(findidxs) to length(s) do //从有效位置开始处理 - begin - si := s[1:i]; - asi := array(); - asidx := 0; - for ii,v in findstaks[i-1] do //判断每个值 - begin - if checksame(si,v) then - begin - asi[asidx++] := v; - end - end - findstaks[i] := asi; //得到新的值 - findidxs[i] := si; - end - return findstaks[length(findidxs)-1];//fits[]; + return o._tag; end function step_find(s); //查找匹配的字符 begin @@ -2325,11 +2340,24 @@ type tstr_step_match=class() if fits<> its and check_legal(its) then begin fits := its; - findstaks := array(0->(length(fits)-1)); - findidxs := array(""); + ftree := new TTire(); + ftree.FRoot._tag := mrows(fits,1); end end private + function get_same_idexs(si,idxs);virtual; //直接判断全部 + begin + asi := array(); + asidx := 0; + for ii,v in idxs do + begin + if checksame(si,v) then + begin + asi[asidx++] := v; + end + end + return asi; + end function checksame(a,b);virtual;//判断相等 begin return pos(a,fits[ b]); @@ -2338,17 +2366,10 @@ type tstr_step_match=class() begin return ifarray(its); end - function getsdata(s);//获取成功的位置 - begin - for i,v in findidxs do - begin - if v=s then return findstaks[i]; - end - end - private + protected fits; //原始数据 - findstaks; //历史匹配记录 - findidxs;//字符串 + ftree; + private end implementation function iffuncptr(fn); diff --git a/funcext/tvclib/utslvclstdctl.tsf b/funcext/tvclib/utslvclstdctl.tsf index da3fb0c..a3d3954 100644 --- a/funcext/tvclib/utslvclstdctl.tsf +++ b/funcext/tvclib/utslvclstdctl.tsf @@ -3801,7 +3801,8 @@ type TcustomListBox=class(TCustomListBoxbase) end function clean();virtual; begin - FitemData.splice(0,FitemData.Length()); + //FitemData.splice(0,FitemData.Length()); + FitemData := new tnumindexarray(); cleanAllSelectedState(); class(TCustomListBoxbase).ItemCount := 0; end @@ -3827,11 +3828,14 @@ type TcustomListBox=class(TCustomListBoxbase) protected function CheckListItems(s); begin - if ifarray(s)then + if ifarray(s) then begin - for i := 0 to length(s)-1 do if not CheckListItem(s[i])then return 0; + if ((thisfunction(class(TcustomListBox).checklistitem))<>(thisfunction(self.checklistitem))) then + begin + for i,v in s do if not CheckListItem(v) then return 0; + end return 1; - end else + end return 0; end function CheckListItem(s);virtual;