⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fastsearch.~pas

📁 一个快速查询控件
💻 ~PAS
字号:
//***************************************************************************
//志强软件工作室热情奉献志强delphi开发包
//历史版本:
//v1.2
  //加入多条件查询
//v1.21
// 悠改非模试窗口在顶部时压于底层看不见。

//***************************************************************************

unit FastSearch;

interface

{$R FASTSEARCH.dcr}

uses
  SysUtils, Classes,DB,fsSearch;

type
  TDatabaseType=(SQLServer,Access,Oracle);
  TFastSearch = class(TComponent)
  private
    { Private declarations }
    //FQueryStr:string;
    //FQuerySql:string;
    FFields:TFields;
    FCaption:string;
    FDataSet:TDataSet;
    FDatabaseType:TDatabaseType;
    FDateSeparator:string;
    FCompItemIndex,FConditionIndex:integer;
    FCompareValue,FCompareRange1,FCompareRange2:string;
    FMultiCondition:boolean;
    FSaveCondition:boolean;
    FQueryList:TList;
    procedure SetDataSet(value:TDataSet);
    procedure SetDatabaseType(value:TDatabaseType);
    procedure LoadStatus(fm:TfSearchDlg);
    procedure SaveStatus(fm:TfSearchDlg);
    function Pos(SubStr,sourceStr:string;Index:integer=1):integer;
    function AddWhere(sql,where:string):string;
  protected
    { Protected declarations }
  public
    { Public declarations }
    QueryCondition:string;
    //QuerySQl:string;
    function Search():boolean;
    function QuerySql(sql:string):string;
    constructor Create(AOwner:TComponent);override;
    destructor Destroy();override;
  published
    { Published declarations }
    //property Fields:TFields read FFields write SetFields;
    property Caption:string Read FCaption write FCaption;
    property DataSet:TDataSet read FDataSet write SetDataSet;
    property DatabaseType:TDatabaseType read FDatabaseType write SetDatabaseType;
    property MultiCondition:boolean read FMultiCondition write FMultiCondition default false;
    property SaveCondition:boolean read FSaveCondition write FSaveCondition default true;
  end;

procedure Register;

implementation

constructor TFastSearch.Create(AOwner:TComponent);
begin
  inherited;
  FCaption:='快速查询---ZQSoft';  
  SetDatabaseType(SQLServer);
  FCompItemIndex:=0;
  FConditionIndex:=0;
  FCompareValue:='';
  FCompareRange1:='';         
  FCompareRange2:='';
  FMultiCondition:=false;
  FSaveCondition:=true;
  FQueryList:=TList.Create();
end;

destructor TFastSearch.Destroy();
begin
  FQueryList.Free;
  inherited;
end;

procedure TFastSearch.SetDataSet(value:TDataSet);
begin
  if Value<>FDataSet then
  begin
    FDataSet:=Value;
    FFields:=FDataSet.Fields;
  end;  
end;

procedure TFastSearch.SetDatabaseType(value:TDatabaseType);
begin
  FDataBaseType:=value;
  case Value of
    SQLServer:FDateSeparator:='''';
    Access:FDateSeparator:='#';
    Oracle:FDateSeparator:='''';
  end;
end;

function TFastSearch.Search():boolean;
var
  fm:TfSearchDlg;
begin
  fm:=TfSearchDlg.Create(nil);
  try
    fm.Fields:=FFields;
    fm.Caption:=FCaption;
    fm.DateSeparator:=FDateSeparator;
    LoadStatus(fm);
    fm.ShowModal;
    if fm.SearchSuccess then
    begin
      QueryCondition:=fm.QueryStr;
      SaveStatus(fm);
      result:=true;
    end
    else
      result:=false;
  finally
    fm.Free;
  end;
end;

function TFastSearch.QuerySql(sql:string):string;
begin
  if Search() then
  begin
    result:=AddWhere(sql,self.QueryCondition);
  end
  else begin
    result:='';
  end;  
end;

function TFastSearch.AddWhere(sql,where:string):string;
var
  sOrderBy,s,sSql:string;
  i:integer;
begin
  sSql:=sql;
  if where<>'' then
  begin
    i:=pos('order by',sSql,-1);
    if i<>0 then
    begin
      sOrderBy:=copy(sSql,i,MaxInt);
      s:=copy(sSql,1,i-1);
    end
    else begin
      s:=sSql;
      sOrderBy:='';
    end;
    if pos('where',s,-1)=0 then
      s:=s+' where ('+where+') '+sOrderBy
    else
      s:=s+' and ('+where+') '+sOrderBy;
    result:=s;
  end
  else
    result:=sql;
end;

procedure TFastSearch.LoadStatus(fm:TfSearchDlg);
begin
   //加载状态信息
  fm.CompItemIndex:=FCompItemIndex;
  fm.ConditionIndex:=FConditionIndex;
  fm.CompareValue:=FCompareValue;
  fm.CompareRange1:=FCompareRange1;
  fm.CompareRange2:=FCompareRange2;
  fm.MultiCondition:=FMultiCondition;
  fm.SaveCondition:=FSaveCondition;
  if FMultiCondition and FSaveCondition then
    fm.QueryList.Assign(FQueryList);
end;

procedure TFastSearch.SaveStatus(fm:TfSearchDlg);
begin
  //保存状态信息
  FDateSeparator:=fm.DateSeparator;
  FCompItemIndex:=fm.CompItemIndex;
  FConditionIndex:=fm.ConditionIndex;
  FCompareValue:=fm.CompareValue;
  FCompareRange1:=fm.CompareRange1;
  FCompareRange2:=fm.CompareRange2;
  FMultiCondition:=fm.MultiCondition;
  FSaveCondition:=fm.SaveCondition;
  if FSaveCondition then
    FQueryList.Assign(fm.QueryList);
end;

function TFastSearch.Pos(SubStr,sourceStr:string;Index:integer=1):integer;
var
  s:string;
  i,j,Len:integer;
  PosList:TList;
  pi:^integer;
begin
  s:=SourceStr;
  Len:=Length(SubStr);
  result:=0;
  if Index>0 then
  begin
    for i:=1 to Index do
    begin
      j:=System.pos(SubStr,SourceStr);
      if j>0 then
      begin
        result:=result+j;
        delete(SourceStr,1,j+Len-1);
      end
      else begin
        result:=0;
        exit;
      end;
    end; //end for

    result:=result+(index-1)*(len-1);
  end
  else begin
    PosList:=TList.Create();
    i:=0;
    j:=System.pos(SubStr,SourceStr);
    while j>0 do
    begin
      new(pi);
      pi^:=i+j;
      posList.Add(pi);
      i:=j+len-1;
      delete(SourceStr,1,i);
      j:=System.pos(SubStr,SourceStr);
    end;
    index:=-index;
    if posList.Count>=Index then
    begin
      pi:=PosList.Items[posList.count-Index];
      result:=pi^;
    end
    else
      result:=0;
    for i:=posList.Count-1 downto 0 do
    begin
      dispose(posList.Items[i]);
      PosList.Delete(i);
    end;
    PosList.Free;
  end;
end;

procedure Register;
begin
  RegisterComponents('ZQSoft', [TFastSearch]);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -