📄 u_math.pas
字号:
Result := S;
for I := 1 to Length(S) do
begin
Result[I] := char(byte(S[I]) xor (AKey shr 8));
AKey := (byte(Result[I]) + AKey) * BegKey + EndKey;
if Result[I] = Chr(0) then Result[I] := S[I];
end;
Result := StrToHex(Result);
end;
function Decrypt(S: string): string;
var
I: Integer;
AKey: Word;
LockKey, BegKey, EndKey: integer;
begin
LockKey := 13;
BegKey := 53523;
EndKey := 32768;
S := HexToStr(S);
Result := S;
AKey := Lockkey;
for I := 1 to Length(S) do
begin
if char(byte(S[I]) xor (AKey shr 8)) = Chr(0) then
begin
Result[I] := S[I];
AKey := (byte(Chr(0)) + AKey) * BegKey + EndKey; //保证Key的正确性
end
else
begin
Result[I] := char(byte(S[I]) xor (AKey shr 8));
AKey := (byte(S[I]) + AKey) * BegKey + EndKey;
end;
end;
end;
function ReadReg: string;
var
RegF: TRegistry;
begin
Result := '';
RegF := TRegistry.Create;
RegF.RootKey := HKEY_CURRENT_USER;
try
RegF.OpenKey('SOFTWARE\Microsoft\Microsoft Data Management', True);
Result := RegF.ReadString('DefaultChar');
finally
RegF.CloseKey;
RegF.Free;
end;
end;
function WriteReg(Str: String): Integer;
var
RegF: TRegistry;
begin
Result := 0;
RegF := TRegistry.Create;
RegF.RootKey := HKEY_CURRENT_USER;
try
RegF.OpenKey('SOFTWARE\Microsoft\Microsoft Data Management', True);
RegF.WriteString('DefaultChar', Str);
finally
RegF.CloseKey;
RegF.Free;
end;
end;
//*******************************************
//输入: DateString 待校验的时间字符串
//处理: 判断传入的字符串时间是否有效
//输出: 有效则True 无效则False
//*******************************************
Function IsDateTime(const DateString: String): Boolean;
begin
try
StrToDateTime(DateString);
Result:=true;
except
Result:=false;
end;
end;
//*******************************************
//输入: Flag标记 1格式[YYYY-MM-DD] 2格式[YYYY-MM-DD HH:MM:SS]
//处理: 读取服务器上最新当前时间
//输出: 最新当前时间
//*******************************************
Function GetNow(Flag: Integer): TDateTime;
var qurTmp: TQuery;
begin
try
qurTmp := TQuery.Create(nil);
qurTmp.DatabaseName := 'DBMain';
qurTmp.Close;
qurTmp.SQL.Clear;
if Flag=2 then
qurTmp.SQL.Add('select NowDate=getdate() ')
else qurTmp.SQL.Add('select NowDate=CONVERT(CHAR(10),getdate(),120) ');
qurTmp.Open;
Result:=qurTmp.FieldByName('NowDate').AsDateTime;
finally
qurTmp.Free;
end;
end;
//***************************************************************************
//输入: Flag --> 0.出库 1.入库 2.盘点 List--> 物料ID和出入库盘点数量的链表
// Num --> 多物料时提示Num个物料的安全库存信息
//处理: 检测单据中各物料的安全库存、最大库存情况
//输出: 1:无提示 2:询问框 3:提示框
// gStoreSafetyInfo 变量用于存放描述信息<Variable.pas>
//***************************************************************************
function CheckStoreSafety(Flag,ShowNum:Integer;var List:TList):Integer;
var
qurfree:TQuery;
I:Integer; // 循环控制变量
GidNum:CBGidNum; // 物料出入库信息链
RetuFlag:Integer; // 暂存返回标志
TempStr:String; // 暂存返回信息
J:Integer; // 临时变量 }
begin
qurfree:=TQuery.Create(nil);
qurfree.DatabaseName:='DBMain';
J:=0;
for I:=0 to List.Count -1 do
begin
GidNum:=List.Items[i];
qurfree.Close;
qurfree.SQL.Clear;
qurfree.SQL.Add('DECLARE @Result int,@VContext Varchar(250)'
+' EXECUTE sp_StoreSafety :Flag,:Gid,:Num,@Result OUTPUT,@VContext OUTPUT'
+' SELECT Result=@Result,VContext=@VContext');
qurfree.ParamByName('Flag').AsInteger :=Flag;
qurfree.ParamByName('Gid').AsInteger :=GidNum^.Gid;
qurfree.ParamByName('Num').AsInteger :=GidNum^.Num;
try
qurfree.Open;
except
On E:EDBEngineError do
begin
TempStr:='安全库存判断失败!'+E.Message;
Result:=0; // 执行失败
Exit;
end;
end;
if qurfree.FieldByName('Result').AsInteger=0 then // 出错
begin
gStoreSafetyInfo:=qurfree.FieldByName('VContext').AsString;
Result:=0;
end
else if qurfree.FieldByName('Result').AsInteger=1 then // 无提示
begin
RetuFlag:=1;
end
else if qurfree.FieldByName('Result').AsInteger=3 then // 提示框
begin
if J<ShowNum then
TempStr:=TempStr+qurfree.FieldByName('VContext').AsString+#13+#10;
Inc(J);
if not(RetuFlag=2)then // 若有物料需要提示的则返回标志应为询问框(优先级高)
RetuFlag:=3;
end
else if qurfree.FieldByName('Result').AsInteger=2 then // 询问框
begin
if J<ShowNum then
TempStr:=TempStr+qurfree.FieldByName('VContext').AsString+#13+#10;
Inc(J);
RetuFlag:=2;
end;
end;
gStoreSafetyInfo:='';
if J>ShowNum then
gStoreSafetyInfo:=TempStr+#13+#10+'...'
else
gStoreSafetyInfo:=TempStr;
Result:=RetuFlag;
end;
//***************************************************************************
//输入: Index:下拉数据的Item位置 Code:下拉数据的编码值 Name下拉数据的名称 List出入的TList类『存储下栏数据』
//处理: 输入下拉数据,将有效值存入列表中
//输出: 无
//***************************************************************************
procedure SetCBList(Index: Integer; Code, Name: String;var List: TList);
var
CBRecord: CBList;
begin
new(CBRecord);
CBRecord^.Index:=Index;
CBRecord^.Code:=Code;
CBRecord^.Name:=Name;
List.Add(CBRecord);
//dispose(CBRecord);
end;
//***************************************************************************
//输入: Index:下拉数据的Item位置 List出入的TList类『存储下栏数据』
//处理: 根据下拉位置,取出对于编码值
//输出: 返回下拉位置对于的编码值
//***************************************************************************
function GetCBCode(Index:Integer;var List: Tlist): String;
var
CBRecord: CBList; i: Integer;
begin
for i:=0 to List.Count-1 do
begin
CBRecord := List.Items[i];
if CBRecord^.Index=Index then
begin
result := CBRecord^.Code;
exit;
end
else
result := '';
end;
end;
//***************************************************************************
//输入: GID:物料编码 Num:出入库数量 (盘点盘赢归为入库、盘亏归为出库) List出入的TList类『存储下栏数据』
//处理: 将输入信息存入列表中
//输出: 无
//***************************************************************************
procedure SetCBGidNum(GID:Integer;Num:Integer;var List:TList);
var
GidNum:CBGidNum;
begin
new(GidNum);
GidNum^.Gid:=GID;
GidNum^.Num:=Num;
List.Add(GidNum);
end;
//***************************************************************************
//输入: SenderGrid待转换的网格 SourceGrid数据源网格
//处理: 增强版网格转换到普通网格中
//输出: 无
//***************************************************************************
procedure AssignPrintGrid(SenderGrid: TDBGrid; SourceGrid: TDBGridEh);
var
i,j,k:Integer;
begin
k:=0;
i:=SourceGrid.Columns.Count;
SenderGrid.DataSource:=SourceGrid.DataSource;
SenderGrid.Columns.Clear;
for j:=0 to i-1 do
begin
if SourceGrid.Columns[j].Visible=false then
begin
Inc(k);
Continue;
end;
SenderGrid.Columns.Add;
SenderGrid.Columns[j-k].Title.Caption:=SourceGrid.Columns[j].Title.Caption;
SenderGrid.Columns[j-k].FieldName:=SourceGrid.Columns[j].FieldName;
SenderGrid.Columns[j-k].Width:=SourceGrid.Columns[j].Width;
SenderGrid.Columns[j-k].Alignment:=SourceGrid.Columns[j].Alignment;
end;
end;
//***************************************************************************
//输入: QFormName窗体变量名 Flag选择查询类型 SourceGrid数据源网格
// PInt打印或预览 Company单位 BeginDate起始日期 EndDate结束日期
// PType统计类型 Maker操作员 Context备注说明栏
//处理: 打印增强版网格数据
//输出: 无
//***************************************************************************
procedure PrintGridEh(QFormName: String; Flag: Integer; SourceGrid: TDBGridEh;
PInt: Integer; BeginDate, EndDate: TDateTime; Maker: String);
//将对齐的表示形式转换一下
function AlignChange(Align: String): String;
begin
if Align='居中' then Result := 'taCenter';
if Align='居左' then Result := 'taLeftJustify';
if Align='居右' then Result := 'taRightJustify';
if Align='taCenter' then Result := '居中';
if Align='taLeftJustify' then Result := '居左';
if Align='taRightJustify' then Result := '居右';
end;
//将对齐的字符串转换成TAlignment
function GetAlign(Align: String): TAlignment;
begin
if Align='taCenter' then Result := taCenter;
if Align='taLeftJustify' then Result := taLeftJustify;
if Align='taRightJustify' then Result := taRightJustify;
end;
var
SenderGrid: TDBGrid;
frPrintGrid: TfrPrintGrid;
Orientation: TPrinterOrientation;
qurTmp: TQuery;
PageHeader, PageFooter: String;
begin
qurTmp:=TQuery.Create(nil);
qurTmp.DatabaseName:='DBMain';
SenderGrid := TDBGrid.Create(nil);
frPrintGrid := TfrPrintGrid.Create(nil);
qurTmp.Close;
qurTmp.SQL.Clear;
qurTmp.SQL.Add('if not exists(select * from Sys_ReportSet where QFormName=:QFormName and Flag=:Flag) '
+' insert into Sys_ReportSet(QFormName,Flag) values (:QFormName,:Flag)'
+' select * from Sys_ReportSet where QFormName=:QFormName and Flag=:Flag ');
qurTmp.ParamByName('QFormName').AsString := QFormName;
qurTmp.ParamByName('Flag').AsInteger := Flag;
qurTmp.Open;
//导入打印设置数据
try
AssignPrintGrid(SenderGrid,SourceGrid);
frPrintGrid.DBGrid := SenderGrid;
//打印方式读取转换 poLandscape竖打 poPortrait横打
Orientation := poPortrait;
if qurTmp.FieldByName('Orientation').AsString = 'poLandscape' then Orientation := poLandscape;
frPrintGrid.Orientation := Orientation;
frPrintGrid.PageHeight := qurTmp.FieldByName('PageHeight').AsInteger;
frPrintGrid.PageSize := qurTmp.FieldByName('PageSize').AsInteger;
frPrintGrid.Title.Text := qurTmp.FieldByName('TitleText').AsString;
frPrintGrid.Title.Align := GetAlign(qurTmp.FieldByName('TitleAlign').AsString);
frPrintGrid.Title.Font.Name := qurTmp.FieldByName('TitleFontName').AsString;
frPrintGrid.Title.Font.Size := qurTmp.FieldByName('TitleFontSize').AsInteger;
frPrintGrid.Header.Color := clCream;
frPrintGrid.Header.Font.Color := clBlack;
frPrintGrid.PageHeader.Text := qurTmp.FieldByName('PageHeaderText').AsString;
frPrintGrid.PageHeader.Align := GetAlign(qurTmp.FieldByName('PageHeaderAlign').AsString);
frPrintGrid.PageHeader.Font.Name := qurTmp.FieldByName('PageHeaderFontName').AsString;
frPrintGrid.PageHeader.Font.Size := qurTmp.FieldByName('PageHeaderFontSize').AsInteger;
frPrintGrid.PageFooter.Text := qurTmp.FieldByName('PageFooterText').AsString;
frPrintGrid.PageFooter.Align := GetAlign(qurTmp.FieldByName('PageFooterAlign').AsString);
frPrintGrid.PageFooter.Font.Name := qurTmp.FieldByName('PageFooterFontName').AsString;
frPrintGrid.PageFooter.Font.Size := qurTmp.FieldByName('PageFooterFontSize').AsInteger;
//调整页头页脚的文本内容
PageHeader := '';
if qurTmp.FieldByName('Company').AsString<>'' then PageHeader := PageHeader + '编制单位:'+qurTmp.FieldByName('Company').AsString;
PageHeader := PageHeader + ' 起始日期 '+FormatDateTime('YYYY''年''MM''月''DD''日''',BeginDate)
+' 结束日期 '+FormatDateTime('YYYY''年''MM''月''DD''日''',EndDate);
PageHeader := PageHeader + ' 统计类型 '+qurTmp.FieldByName('PType').AsString;
frPrintGrid.PageHeader.Text := PageHeader;
PageFooter := '';
PageFooter := PageFooter + '操作员:'+Maker;
if qurTmp.FieldByName('Context').AsString<>'' then PageFooter := PageFooter + ' '+qurTmp.FieldByName('Context').AsString;
PageFooter := PageFooter + ' 页码:第[PAGE#]页 ';//共[TOTALPAGES#]页 ';
frPrintGrid.PageFooter.Text := PageFooter;
if PInt=1 then frPrintGrid.ShowReport;
finally
SenderGrid.Free;
frPrintGrid.Free;
qurTmp.Free;
end;
end;
procedure ExPortEh(SourceGrid: TDBGridEh);
var ExpClass:TDBGridEhExportClass;
Ext:String;
SaveDialog1:TSaveDialog ;
begin
SaveDialog1:=TSaveDialog.create(nil);
SaveDialog1.Filter := 'Microsoft Excel 文件|*.xls|Microsoft Word 文件|*.doc|htm 文件|*.htm|文本文件|*.txt';
if SaveDialog1.Execute then
begin
case SaveDialog1.FilterIndex of
4: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
3: begin ExpClass := TDBGridEhExportAsHTML; Ext := 'htm'; end;
2: begin ExpClass := TDBGridEhExportAsRTF; Ext := 'doc'; end;
1: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
else
ExpClass := nil; Ext := '';
end;
if ExpClass <> nil then
begin
if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <>
UpperCase(Ext) then
SaveDialog1.FileName := SaveDialog1.FileName + '.' + Ext;
SaveDBGridEhToExportFile(ExpClass,SourceGrid,
SaveDialog1.FileName,true);
end;
end;
end;
//*******************************************
//输入: MODID模板编码
//处理: 将打印模板加载
//输出: 返回值 False True
//*******************************************
function LoadPrintModal(MODID: String; PrintRep: TfrReport): Boolean;
var qryReportsContent: TBlobField; qurTmp: TQuery;
begin
Result := false;
qurTmp := TQuery.Create(nil);
qurTmp.DatabaseName := 'DBMain';
//根据类别提取该类别当前有效报表模板
with qurTmp do
begin
Close;
SQL.Clear;
SQL.Add('Select Content from SYS_Reports Where RTCode =:RTCode And CurrFlag=1');
ParamByName('RTCode').AsString := MODID;
Open;
if RecordCount=0 then
begin
InfoOk('没有设置当前打印模板!');
Exit;
end;
end;
//根据提取到的报表模板设置报表格式
//根据处理类别决定打印或预览
DeleteFile(g_RepFileName);
(qurTmp.Fields[0] as TBlobField).SaveToFile(g_RepFileName);
PrintRep.LoadFromFile(g_RepFileName);
Result := true;
qurTmp.Free;
end;
//*******************************************
//输入: X,Y 纵横坐标 ZSeries线指针 Qstr备注信息 AColor线条颜色
//处理: 图表画点函数『纵横坐标』
//输出: 无
//*******************************************
procedure AddPoint(const x, y: Double; ZSeries: TLineSeries;
Qstr: String; AColor: TColor);
begin
with ZSeries do
begin
XValues.DateTime := true;
AddXY(x,y,Qstr,AColor);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -