Пример
function Poisk(Table1: TVKDBFNTX; PoiskFields, PoiskKey: string; LowNo: Integer = 1; HighNo: Integer = 1): Boolean; var LowNomer, HighNomer, mid, i: Integer; slist: TStringList; sKey: string; function GetFieldSumm: string; var i1: Byte; begin Result := ''; for i1 := 0 to slist.Count - 1 do Result := Result + Table1.FieldByName(slist[i1]).AsString; end; begin slist := TStringList.Create; slist.Text := stringReplace(PoiskFields, ';', #13#10, [rfReplaceAll]); HighNomer := IfThen(HighNo = 1, Table1.RecordCount, HighNo); LowNomer := LowNo; //функция AnsiCompareStr сравнивает 2 строки без учета регистра // возвращает значение -1 если S1S2 Table1.SetTmpRecord(LowNomer); sKey := GetFieldSumm; if AnsiCompareText(sKey, PoiskKey) > 0 then Result := False else begin Table1.SetTmpRecord(HighNomer); sKey := GetFieldSumm; if AnsiCompareText(sKey, PoiskKey) < 0 then Result := False else begin while (HighNomer - LowNomer) > 1 do begin mid := (LowNomer + HighNomer) div 2; Table1.SetTmpRecord(mid); sKey := GetFieldSumm; if AnsiCompareText(sKey, PoiskKey) >= 0 then HighNomer := mid else LowNomer := mid; end; Table1.SetTmpRecord(LowNomer); sKey := GetFieldSumm; i := LowNomer; if AnsiCompareText(sKey, PoiskKey) < 0 then begin Table1.SetTmpRecord(HighNomer); sKey := GetFieldSumm; i := HighNomer; end; Table1.CloseTmpRecord; if AnsiCompareText(sKey, PoiskKey) = 0 then begin Result := True; Table1.RecNo := i; end else Result := False; end; end; FreeAndNil(slist); end;
0 коммент.:
Отправить комментарий