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

📄 basicfind.pas

📁 delphi框架可以学习, 写的很好的
💻 PAS
字号:
//==============================================================================
//思路提示:
//  1、这里弹出的快速录入窗口采取先打开数据集,然后传入数据集和过滤条件,刷新数据
//     后再写入弹出列表中,供用户选择。这样可以兼顾到性能和易用性。
//  2、子窗口中的所有控件TAG只能为0,或者超过1000
//==============================================================================
unit BasicFind;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Basic, RzPanel, ActnList, ImgList, RzButton, ExtCtrls, StdCtrls,
  RzLstBox, RzBckgnd, RzEdit, RzLabel, Mask, RzRadChk, Menus, DB, ppBands,
  ppCache, ppClass, ppProd, ppReport, ppRelatv, ppDB, ppDBPipe, ppComm,
  ppEndUsr;

type
  TfrmBasicFind = class(TfrmBasic)
    RzPanel1: TRzPanel;
    RzCheckBox14: TRzCheckBox;
    RzCheckBox15: TRzCheckBox;
    RzCheckBox16: TRzCheckBox;
    RzCheckBox17: TRzCheckBox;
    RzCheckBox18: TRzCheckBox;
    RzCheckBox13: TRzCheckBox;
    RzCheckBox12: TRzCheckBox;
    RzCheckBox11: TRzCheckBox;
    RzCheckBox10: TRzCheckBox;
    RzCheckBox9: TRzCheckBox;
    RzCheckBox8: TRzCheckBox;
    RzCheckBox1: TRzCheckBox;
    RzEdit1: TRzEdit;
    RzCheckBox2: TRzCheckBox;
    RzEdit2: TRzEdit;
    RzCheckBox3: TRzCheckBox;
    RzEdit3: TRzEdit;
    RzCheckBox4: TRzCheckBox;
    RzEdit4: TRzEdit;
    RzCheckBox5: TRzCheckBox;
    RzEdit5: TRzEdit;
    RzCheckBox6: TRzCheckBox;
    RzEdit6: TRzEdit;
    RzCheckBox7: TRzCheckBox;
    RzPanel2: TRzPanel;
    RzLabel1: TRzLabel;
    RzDateTimeEdit1: TRzDateTimeEdit;
    RzDateTimeEdit2: TRzDateTimeEdit;
    RzMenuButton1: TRzMenuButton;
    RzPanel3: TRzPanel;
    RzLabel2: TRzLabel;
    RzDateTimeEdit3: TRzDateTimeEdit;
    RzDateTimeEdit4: TRzDateTimeEdit;
    RzMenuButton2: TRzMenuButton;
    RzPanel4: TRzPanel;
    RzLabel3: TRzLabel;
    RzDateTimeEdit5: TRzDateTimeEdit;
    RzDateTimeEdit6: TRzDateTimeEdit;
    RzMenuButton3: TRzMenuButton;
    RzPanel5: TRzPanel;
    RzLabel4: TRzLabel;
    RzDateTimeEdit7: TRzDateTimeEdit;
    RzDateTimeEdit8: TRzDateTimeEdit;
    RzMenuButton4: TRzMenuButton;
    RzPanel6: TRzPanel;
    RzLabel5: TRzLabel;
    RzDateTimeEdit9: TRzDateTimeEdit;
    RzDateTimeEdit10: TRzDateTimeEdit;
    RzMenuButton5: TRzMenuButton;
    RzPanel7: TRzPanel;
    RzLabel6: TRzLabel;
    RzDateTimeEdit11: TRzDateTimeEdit;
    RzDateTimeEdit12: TRzDateTimeEdit;
    RzMenuButton6: TRzMenuButton;
    RzEdit7: TRzEdit;
    RzEdit8: TRzEdit;
    RzEdit9: TRzEdit;
    RzEdit10: TRzEdit;
    RzEdit11: TRzEdit;
    RzEdit12: TRzEdit;
    plSelBase: TRzPanel;
    RzSeparator3: TRzSeparator;
    RzLabel7: TRzLabel;
    listBase: TRzListBox;
    pmDateSet: TPopupMenu;
    miToday: TMenuItem;
    miYesterday: TMenuItem;
    miThisWeek: TMenuItem;
    miPrevWeek: TMenuItem;
    N8: TMenuItem;
    miThisMonth: TMenuItem;
    miPrevMonth: TMenuItem;
    miThisYear: TMenuItem;
    RzSeparator19: TRzSeparator;
    RzLabel10: TRzLabel;
    procedure FormCreate(Sender: TObject);

    procedure EditChange(Sender: TObject);
    procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure DateButtonEnter(Sender: TObject);

    procedure miTodayClick(Sender: TObject);
    procedure miYesterdayClick(Sender: TObject);
    procedure miThisWeekClick(Sender: TObject);
    procedure miPrevWeekClick(Sender: TObject);
    procedure miThisMonthClick(Sender: TObject);
    procedure miPrevMonthClick(Sender: TObject);
    procedure miThisYearClick(Sender: TObject);

    procedure listBaseKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
    procedure SetDay(_SDate, _EDate: TDateTime);
    function DateTimeReplace(_FieldName: String; _SDate, _EDate: TDateTime): String;
  public
    { Public declarations }
    FindFields:  array[1..18] of String;  //可能需要清空!
    FindSQL:     array[1..18] of String;
    FindDataSet: array[1..18] of TDataSet;

    function WhereSQL: String;
    function SelfWhereSQL: String; virtual;
  end;

var
  frmBasicFind: TfrmBasicFind;
  CurrentBtnTag: Integer;
  INPUTCONTROL: TObject;

implementation

uses MyPublic, DateProcess, dmc32;

{$R *.dfm}

procedure TfrmBasicFind.FormCreate(Sender: TObject);
var li_Count: integer;
begin
  inherited;

  //清空系统数组
  for li_Count := 0 to High(FindFields) do FindFields[li_Count] := '';
  for li_Count := 0 to High(FindSQL)    do FindSQL[li_Count]    := '';

  //初始化日期控件
  for li_Count:=0 to Self.ComponentCount-1 do
    if Self.Components[li_Count] is TRzDateTimeEdit then
       (Self.Components[li_Count] as TRzDateTimeEdit).Date := Now();  

  //关联快捷数据集
  FindDataSet[1] := dmc.qryFind1;
  FindDataSet[2] := dmc.qryFind2;
  FindDataSet[3] := dmc.qryFind3;
  FindDataSet[4] := dmc.qryFind4;
  FindDataSet[5] := dmc.qryFind5;
  FindDataSet[6] := dmc.qryFind6;
  FindDataSet[7] := dmc.qryFind7;
  FindDataSet[8] := dmc.qryFind8;
  FindDataSet[9] := dmc.qryFind9;
  FindDataSet[10]:= dmc.qryFind10;
  FindDataSet[11]:= dmc.qryFind11;
  FindDataSet[12]:= dmc.qryFind12;
  FindDataSet[13]:= dmc.qryFind13;
  FindDataSet[14]:= dmc.qryFind14;
  FindDataSet[15]:= dmc.qryFind15;
  FindDataSet[16]:= dmc.qryFind16;
  FindDataSet[17]:= dmc.qryFind17;
  FindDataSet[18]:= dmc.qryFind18;
end;

procedure TfrmBasicFind.EditChange(Sender: TObject);
var li_Count, li_tag: Integer;
    edt_tmp: TRzEdit;
    dtp_tmp: TRzDateTimeEdit;
    bl_Check: Boolean;
    ls_tmp: String;
begin
  //主要用各个控件间的TAG来联系。
  li_tag := -1;

  if Sender is TRzEdit then
  begin
    edt_tmp := (Sender as TRzEdit);
    bl_Check:= edt_tmp.Text <> '';
    li_tag  := edt_tmp.Tag;

    //显示快速输入窗口
    if (FindSQL[li_tag] <> '') and bl_Check then
    begin
      //计算坐标
      plSelBase.Top := edt_tmp.Parent.Top + edt_tmp.Top + edt_tmp.Height + 3;
      plSelBase.Left:= edt_tmp.Left;

      //生成快捷数据,并且显示快捷框
      if not FindDataSet[li_tag].Active then OpenDataSet(FindDataSet[li_tag], FindSQL[li_tag]);
      with FindDataSet[li_tag] do
      begin
        Filter   := '';
        Filtered := False;

        if Active then
        if not IsEmpty then
        if (edt_tmp.Text <> '') and (edt_tmp.Text <> '*') then
        begin
          Filter   := Fields.Fields[0].FieldName + ' LIKE ''' + edt_tmp.Text + '%''';
          Filtered := True;
        end;
      end;

      ShowFastInputPanel(Sender, listBase, FindDataSet[li_tag]);
      plSelBase.BringToFront;
      plSelBase.Visible := True;
    end;
  end;

  //日期控件
  if Sender is TRzDateTimeEdit then
  begin
    dtp_tmp := (Sender as TRzDateTimeEdit);
    bl_Check:= True;
    ls_tmp  := IntToStr(dtp_tmp.Tag);
    li_tag  := StrToInt(Copy(ls_tmp, 1, Length(ls_tmp)-1));
  end;

  if li_tag <> -1 then
  begin
    for li_Count:=0 to Self.ComponentCount-1 do
      if Self.Components[li_Count] is TRzCheckBox then
        if (Self.Components[li_Count] as TRzCheckBox).Tag = li_Tag then
           (Self.Components[li_Count] as TRzCheckBox).Checked := bl_Check;
  end;
end;

procedure TfrmBasicFind.DateButtonEnter(Sender: TObject);
begin
  CurrentBtnTag := (Sender as TRzMenuButton).tag;
end;

procedure TfrmBasicFind.SetDay(_SDate, _EDate: TDateTime);
var i: integer;
begin
  //设置日期控件
  for i:=0 to Self.ComponentCount-1 do
  begin
    if Self.Components[i] is TRzCheckBox then
    begin
      if (Self.Components[i] as TRzCheckBox).Tag = CurrentBtnTag then
        (Self.Components[i] as TRzCheckBox).Checked := True;
    end else
    if (Self.Components[i].Tag div 10) = CurrentBtnTag then
    begin
      if Self.Components[i] is TRzDateTimeEdit then
      if Self.Components[i].Tag = (CurrentBtnTag * 10 + 1) then
        (Self.Components[i] as TRzDateTimeEdit).Date := _SDate;
      if Self.Components[i].Tag = (CurrentBtnTag * 10 + 2) then
        (Self.Components[i] as TRzDateTimeEdit).Date := _EDate;
    end;

  end;
end;

procedure TfrmBasicFind.miTodayClick(Sender: TObject);
begin
  SetDay(Now, Now);
end;

procedure TfrmBasicFind.miYesterdayClick(Sender: TObject);
begin
  SetDay(Now-1, Now-1);
end;

procedure TfrmBasicFind.miThisWeekClick(Sender: TObject);
begin
  SetDay(GetWeekNoToDate_Mon(ThisWeekNo, ThisYear)-5,
         GetWeekNoToDate_Mon(ThisWeekNo, ThisYear)+1);
end;

procedure TfrmBasicFind.miPrevWeekClick(Sender: TObject);
begin
  SetDay(GetWeekNoToDate_Mon(ThisWeekNo-1, ThisYear)-5,
         GetWeekNoToDate_Mon(ThisWeekNo-1, ThisYear)+1);
end;

procedure TfrmBasicFind.miThisMonthClick(Sender: TObject);
begin
  SetDay(GetFirstDayForMonth(Now), GetLastDayForMonth(Now));
end;

procedure TfrmBasicFind.miPrevMonthClick(Sender: TObject);
begin
  SetDay(GetFirstDayForPeriorMonth(Now), GetLastDayForPeriorMonth(Now));
end;

procedure TfrmBasicFind.miThisYearClick(Sender: TObject);
begin
  SetDay(GetFirstDayOfYear(ThisYear), GetLastDayOfYear(ThisYear));
end;

procedure TfrmBasicFind.listBaseKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var edtTmp: TRzEdit;
begin
  //返回值到输入框
  if not (INPUTCONTROL is TRzEdit) then Exit;
  edtTmp := INPUTCONTROL as TRzEdit;

  if Key=VK_ESCAPE then
    edtTmp.SetFocus;

  if Key=VK_RETURN then
  begin
    edtTmp.Text := GetKeyValue(listBase.SelectedItem);
    edtTmp.SetFocus;
    plSelBase.Visible := False;
    //edtTmp.Perform(WM_KEYUP, VK_RETURN, 0);   因为是查询专用的,不能每选一个就打开一下数据集。
  end;
end;

function TfrmBasicFind.DateTimeReplace(_FieldName: String; _SDate, _EDate: TDateTime): String;
var ls_Field: String;
begin
  //处理日期型字段的替换
  if _SDate = _EDate then
    Result := _FieldName + ' >= '''+ FormatDateTime('yyyy-mm-dd',_SDate) + ' 00:00:00'' AND '+
              _FieldName + ' <= '''+ FormatDateTime('yyyy-mm-dd',_SDate) + ' 23:59:59'''
  else begin
    Result := _FieldName + ' >= '''+ FormatDateTime('yyyy-mm-dd',_SDate) + ' 00:00:00'' AND '+
              _FieldName + ' <= '''+ FormatDateTime('yyyy-mm-dd',_EDate) + ' 23:59:59''';
  end;
end;

function TfrmBasicFind.SelfWhereSQL: String;
begin
  //由子窗口继续,以便实现部分自定义的条件。
end;

function TfrmBasicFind.WhereSQL: String;
var ls_where, ls_SelfWhere: String;
    li_Count, i, li_Tag, li_tmpTag, li_DateOK: Integer;
    dt_Start, dt_End: TDateTime;
begin
  //父窗口生成SQL语句过程
  ls_where := '0=0 ';

  //开始生成
  for li_Count:=0 to Self.ComponentCount-1 do
    if Self.Components[li_Count] is TRzCheckBox then
       if (Self.Components[li_Count] as TRzCheckBox).Checked then
       if FindFields[Self.Components[li_Count].Tag] <> '' then
       begin
         //获取CheckBox的TAG
         li_Tag := (Self.Components[li_Count] as TRzCheckBox).Tag;
         //设置日期范围型参数已经获取到的日期数
         li_DateOK := 0;

         for i:=0 to Self.ComponentCount-1 do
         begin
           //匹配输入框
           li_tmpTag := Self.Components[i].Tag;
           //1、考虑TAG与EDIT相同的情况只有RzEdit会发生
           if li_tmpTag = li_Tag then
           if (Self.Components[i] is TRzEdit) then
             ls_where := ls_where + ' AND '+
                         StringReplace(FindFields[li_tag],
                                       REPLACEKEY,
                                       (Self.Components[i] as TRzEdit).Text,
                                       [rfReplaceAll]);
           //2、考虑日期范围型的数据
           if (li_tmpTag >100) then
           if (li_tmpTag div 10) = li_tag then
           if (Self.Components[i] is TRzDateTimeEdit) then
           begin
             //获取开始日期
             if li_tmpTag = (li_tag * 10 + 1) then
             begin
               inc(li_DateOK);
               dt_Start := (Self.Components[i] as TRzDateTimeEdit).Date;
             end;
             //获取结束日期
             if li_tmpTag = (li_tag * 10 + 2) then
             begin
               inc(li_DateOK);
               dt_End   := (Self.Components[i] as TRzDateTimeEdit).Date;
             end;
             //开始与结束日期都已经齐备了
             if li_DateOK = 2 then
             ls_where := ls_where + ' AND '+
                         DateTimeReplace(FindFields[li_tag], dt_Start, dt_End);

           end;
         end; //end of find value
       end; //end of check

  ls_SelfWhere := SelfWhereSQL;  //获取子定的自定义SQL语句。
  if ls_SelfWhere <> '' then ls_where := ls_where + ' AND '+ ls_SelfWhere;

  if ls_where = '0=0 '  then ShowMess('提示','请至少选择一个查询条件!', MB_OK)
                        else Result := ls_where;
end;

procedure TfrmBasicFind.EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_DOWN) or (Key = VK_UP) then
  if plSelBase.Visible then
  begin
    INPUTCONTROL := Sender;
    listBase.SetFocus;
    listBase.Perform(WM_KEYDOWN, VK_DOWN, 0);
    Exit;
  end;

  if Key = VK_RETURN then
  if plSelBase.Visible then
  begin
    INPUTCONTROL := Sender;
    listBase.SetFocus;
    listBase.Perform(WM_KEYDOWN, VK_DOWN, 0);
  end else
    actOpenExecute(nil);
end;

end.

⌨️ 快捷键说明

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