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

📄 commonroutines.pas

📁 《delphi数据库设计与实例开发》随书光盘
💻 PAS
📖 第 1 页 / 共 2 页
字号:
              selectedIndex := selectedIndex-1
            else begin
              datasource.DataSet.Prior;
              if Not datasource.DataSet.Bof then
                selectedIndex:=columns.Count-1;
            end
        else begin  {??óD°′??shift?ü}
            if selectedIndex < columns.Count-1 then
              selectedIndex := selectedIndex+1
            else with datasource.DataSet do
            try
              if state <> dsInsert then
              begin
                Next;
                if Eof and CanModify then append;
              end
              else begin
                post; //ìá??2?è?2ù×÷,?éò??ú?aà?μ÷ó?ò???′|àí2?è?2ù×÷μ?1y3ì
                refresh;
                last;
                append;
              end;
              selectedIndex:=0;
                //ì?1y???á×???oí×??ˉì?3?×???
              while ( not selectedField.CanModify )
                 or ( ( selectedField.dataset is TTable ) and
                      ((selectedField.dataset as TTable ).MasterSource<>nil) and
                      ( pos( uppercase(selectedField.FieldName),
                             uppercase((selectedField.dataset as TTable ).IndexFieldNames) ) =1 )
                    ) do selectedIndex := selectedIndex + 1;  
            except
              on e:exception do
                if not (e is EAbort) then
                  reportException(e,'','','commonRoutines.DBGridKeyDown');
            end;
        end;
      end;
  end;
end;

/////////////////////////////////////////////////////////////////////////

function TheCompleteDateStr( UserDatabaseName:string ;
                             inputStr:string='';
                             const UserDateFormat : string ='' ;
                             const ShowErrorMessage : boolean=false
                            ):string;
  {***注意: 此函数只处理日期信息(即年月日信息),时间信息(时分秒)将被忽略***}
    //把用户输入的日期补充完整的函数,
    //如果用户输入了完整的日期,则返回原字符串,
    //如果用户只输入了月、日信息,没有输入年度信息,则从服务器读取年度信息
    //并将用户输入补充完整然后返回 ,
    //若输入非法则返回空串
    //若输入空串则返回服务器时间中的日期信息(年月日)
const
  ValidDateSeparators : ShortString = '-/,.';  //允许用户使用的分隔符
var
  i:integer;
  InputIsValid:boolean;
  tmpYear, tmpMonth, tmpDay : word;
  tmpDateTime : TDateTime;
  FormatSettings: TFormatSettings;
begin
  result   := '';    //出错则返回空串
  inputStr := trim(inputStr);
  try
    try     //定义时间日期的输入和转换格式
           //如果用户没有指定转换格式则使用yyyy-mm-dd格式
      GetLocaleFormatSettings(GetSystemDefaultLCID,FormatSettings);
      if UserDateFormat = '' then
        FormatSettings.ShortDateFormat := 'yyyy-mm-dd'
      else
        FormatSettings.ShortDateFormat := UserDateFormat;

        //如果输入了空串,就返回服务器日期信息
      if inputStr='' then
      with TMPQuery do
      begin
         close;
         unprepare;
         DatabaseName:=UserDatabaseName;
         sql.Clear;
         sql.Add('select convert(char(10), GetDate(), 120) as NowDate');
         prepare;
         open;
         first;
         tmpDateTime:=strtodate(Fieldbyname('NowDate').AsString); //进行格式转换
         result:= datetostr ( tmpDateTime, FormatSettings );
         exit;  //退出之前仍然会执行Finally语句块
      end;

             // 如果输入不是空串则尝试进行转换,转换失败则返回空串并退出
      InputIsValid := false;
      for i:= 1 to high(ValidDateSeparators) do
      begin
        FormatSettings.DateSeparator:=ValidDateSeparators[i];
        if trystrtodate( inputStr , tmpDateTime, FormatSettings ) then//转换成功
        begin
          InputIsValid:=true;
          break;
        end;
      end;
      if not InputIsValid then exit; //输入非法,退出
                                 //退出之前仍然会执行Finally语句块

       {****** 输入非空且合法下面的代码才会执行*******}

      if strScan(Pansichar(inputStr),FormatSettings.DateSeparator)
      = strRScan(Pansichar(inputStr),FormatSettings.DateSeparator) then
                //如果没有输入年度
      begin
        decodedate(tmpDateTime, tmpYear, tmpMonth, tmpDay); //提取用户输入的月、日信息

        with TMPQuery do //从服务器提取年度信息
        begin
          close;
          unprepare;
          DatabaseName:=UserDatabaseName;
          sql.Clear;
          sql.Add('select datePart(year, GetDate()) as ThisYear');
          prepare;
          open;
          tmpYear:= strtoint(FieldValues['ThisYear']);
        end;

        tmpDateTime := EncodeDate(tmpYear, tmpMonth, tmpDay); //生成完整的日期信息
        result:=datetostr( tmpDateTime , FormatSettings );    //转换成字符串
      end
      else begin  //用户输入了完整的日期字符串,不作变动
                  //作一下转换可以将用户输入的两位年份转换成四位年份
        tmpDateTime := strtodate ( inputStr, FormatSettings );
        result := datetostr ( tmpDateTime, FormatSettings );
      end;
    except
      on e:exception do if ShowErrorMessage then
           ReportException( e,'处理时间信息时出现异常,信息如下:','',
                            'CommonRoutines.TheCompleteDateTimeStr');
    end;
  finally
    TMPQuery.close;
    TMPQuery.UnPrepare;
  end;
end;

/////////////////////////////////////////////////////////////////////////////

class procedure TMyClass.DateFieldSetText(sender: TField; const text: string);
               //检验时间日期字段的有效性,
var
  tmpStr,inputstr : string;

begin
   inputstr:=text;
  tmpStr := text;
  with sender  do
  if (not ReadOnly) and
     (dataset.State in [dsEdit, dsInsert]) and
     (datatype in [ftDatetime, ftDate])    then
  begin
    tmpStr := TheCompleteDateStr((DataSet as TTable).DatabaseName,tmpStr,'',true);
    if  tmpStr<>'' then
      AsDateTime:=strtodate(tmpstr)
    else begin
      ReportError(''''+displayName+'''无效'+#13#10+''''+inputstr+'''不是一个合法的日期');
      abort;
    end;
  end ;  
end;

///////////////////////////////////////////////////////////////////////////

class procedure TMyClass.SetDateFields( Dataset : Tdataset );
         //把时间日期类型字段的OnSetText指向DateFieldSetText;
var
  i : integer;
begin
  with dataset do
  for i:=0 to fieldCount-1 do
  if fields[i].dataType in [ftDatetime,ftDate] then
    fields[i].OnSetText:=DateFieldSetText;
end;

//////////////////////////////////////////////////////////////////////////

procedure SetDateFields( DataSet:Tdataset );
   //把时间日期类型字段的OnSetText指向DateFieldSetText;
   //调用: 在对应的数据集的afterOpen事件中调用此过程
begin
  TMyClass.SetDateFields( DataSet );
end;


////////////////////////////////////////////////////////////////////////////


initialization
  TMPQuery := TQuery.Create(nil);

finalization
  if assigned(TMPQuery) then
  with TMPQuery do
  begin
    close;
    UnPrepare;
    Free;
  end;

end.

⌨️ 快捷键说明

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