📄 basicfind.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 + -