📄 commonroutines.pas
字号:
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 + -