u_tools_leo.pas

来自「一个仓库管理中的子系统--采购子系统」· PAS 代码 · 共 1,257 行 · 第 1/3 页

PAS
1,257
字号
{*******************************************************}
{                                                       }
{         Leo Application Program Tool Library          }
{                                                       }
{       Copyright (c) 2000,2005 Leo ToolKit Group       }
{                                                       }
{*******************************************************}
{*******************************************************}
{                                                       }
{               王瑜 应用程序开发工具包                 }
{                                                       }
{            版权所有 2000,2005 大家随便了 :)           }
{                                                       }
{*******************************************************}
//最后更新时间 20001.6.3

unit u_tools_leo;
//
//
//
//
//
//
//
//
//
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,db,DBTables,grids, Quickrpt, QRCtrls;
const
  headsizelength=20;
  system_error_caption='系统提示';
  system_erroor_button=mb_ok+mb_iconstop;
type
/////////////////////////////////////////////////////////////////////////////////
  TFunction_Class=class(twincontrol)
  procedure beforePrint(sender: TObject; var Value: String);
  end;

  TStreams=class
  private
  flist:tlist;
  function getcount:integer;
  public
  property count:integer read getcount;
  function add(stream:tstream):integer;
  function delete(index:integer):boolean;
  function write(stream:tstream;index:integer):boolean;
  function savetostream(stream:tmemorystream):boolean;
  function loadfromstream(stream:tstream):boolean;
  function savetofile(filename:string):boolean;
  function loadfromfile(filename:string):boolean;
  constructor create;
  destructor  Destroy;override;
  end;
/////////////////////////////////////////////////////////////////////////////////
  TMsgPacket=class
    private
      flist:tstringlist;
      fmem:tmemorystream;
      fstreamcount:integer;
      function getvalue(const name:string):string;
      function getheadsize:integer;
      procedure setvalue(const name,value:string);
      function getsize:integer;
      function isempty:boolean;
    public
      constructor create;
      destructor destory;
      function loadfromstream(stream:tstream):boolean;
      function savetostream(stream:tmemorystream):boolean;
      function loadfromfile(filename:string):boolean;
      function savetofile(filename:string):boolean;
    property headsize:integer read getheadsize;
    property parameters:tstringlist read flist;
    property mem:tmemorystream read fmem write fmem;
    property values[const name:string]:string read getvalue write setvalue;
    property size:integer read getsize;
    property empty:boolean read isempty;
    property streamcount:integer read fstreamcount;
    end;
/////////////////////////////////////////////////////////////////////////////////
TSqlGenerater=class
//这个类主要是用来生成SQL语句的
//可以生成删除,插入,选择,条件等语句。
  private
  public
    function GenInsert(TableName:string;Fields:Array of String;Values:Array of Const):String;overload;
    function GenSelect(Tables:Array of string;Fields:Array of String;WhereSql:string):String;
    function GenUpdate(TableName:String;Fields:Array of String;Values:Array of Const;WhereSql:String):String;overload;
    function GenNormalWhere(fields:array of string;values:array of const):string;overload;
    function GenWhere(items:array of const):string;
    function GenDelete(TableName:string;WhereString:string):string;
  end;
/////////////////////////////////判断有效性函数//////////////////////
function changedateformat(str:string):string;
function isinteger(str:string):boolean;
function isfloat(str:string):boolean;
function isdate(str:string):boolean;
function istime(str:string):boolean;
/////////////////////////////////时间日期函数//////////////////////
function nextday(d:string):string;overload;
//取下一天的日期
function priorday(d:string):string;overload;
//取前一天的日期
function nextday(d:string;num:integer):string;overload;
//取下面指定多少天的日期
function priorday(d:string;num:integer):string;overload;
//取前面指定多少天的日期
//////////下面一组函数用于把一个表单的信息显示在一个report上面
function replace_stringgrid(grid:tstringgrid;Band:TQRStringsBand;function_class:tfunction_class):boolean;
function replace_qrlabel_all(form:tform;Rep:TQuickRep):boolean;
function replace_qrlabel(control:tcontrol;Band:twincontrol):boolean;
function FindChildControl(const control:tcontrol;ControlName: string): tcomponent;

function changelength_back(str:string;fillchar:char;strlength:integer):string;
//在字符串的后面补齐
function getsql_cal_ware(warename:string;wareidnames:array of string;wareslname,xbname,xbzbidname:string;xbxbidnames:array of string;xbslname,zbid,caltype:string):string;overload
function getsql_cal_ware(warename,wareidname,wareslname,xbname,xbzbidname,xbxbidname,xbslname,zbid,caltype:string):string;overload;
//巨好的函数,可以将一个明细表的的数据更改反映到仓库的总数据中去
{参数说明:
warename,仓库表的表名
wareidname,仓库表的ID号,也就是物资的ID号
wareslname,仓库表中需要修改的数量字段号
xbname,明细表的表名
xbzbidname,明细表对应的主表ID号字段名称
xbxbidname,明细表中对应的物资ID号字段名称
xbslname,明细比中对应的数量字段名称
zbid,需要倒库的主表ID号,例如'00067845'
caltype,倒库操作的类型,'+'代表往仓库加,'-'代表从仓库减出来
}
function VarrecToString(rec:TVarRec):String;
// 将一个tvarrec类型的变量转化为一个string类型的变量
function OpenQuery(query:tquery;sqlstring:string;action:string):boolean;overload;
// 这个函数用语执行一个SQL语句
//action参数用于指明是open,还是 execsql
//当action='open'时 调用 open 函数;当action='execsql'时,调用execsql函数。
function OpenQuery(query:tquery;sqllist:tstringlist;action:string):boolean;overload;
// 这个函数用语执行一个SQL语句序列
//action参数用于指明是open,还是 execsql
//当action='open'时 调用 open 函数;当action='execsql'时,调用execsql函数。
function movequery(query:tquery;tablename:string;keyfieldname:string;keyvalue:string;action:string):string;
//这个函数用于将一个query往前或往后移动一个游标,或是到头或是到尾。
//query是调用的query名字
//table是移动的表名字
//keyfieldname是依据移动的关键字段名字
//keyvalue是当前移动关键字的值
//action 是需要移动的动作 可以是 last,first,search,open,next,prior
//返回的是当前关键字段的值。
function changelength(str:string;fillchar:char;strlength:integer):string;
//用于将一个字符串前面添满字符
function formatdatetime(str:string):string;
//用于将一个时间字符串格式化成规定格式 例如:1998-09-23 15:56
function setdata(var cs:string;datatype:string;data:string):boolean;
//用于将一个参数存储于一个字符串中。
function getdata(cs:string;datatype:string):string;
//用于从一个字符串中取出一个参数值
function StreamToOlevariant(const stream:tstream;out v:olevariant):boolean;
//在madias程序中使用,用于将stream流转换为variant变量
function OlevariantToStream(stream:tstream; v:olevariant;size:longint):boolean;
//在madias程序中使用,用于将variant流转换为stream变量
Procedure distributetext (canvas:tcanvas; width: integer; font: tfont; text:string; strings: tstringlist);
//按照画布的canvas,在width的范围内将text划分几个子string 并放在strings中
Procedure writetext (canvas:tcanvas; x1,y1,x2,y2: integer; textxdirectionspace,textydirectionspace:integer;text: string; font: tfont; alignflag: integer; ifrh: boolean);
//用于将一个字符串写到一个画布上,
//alignflag:对齐标志 0:左对齐,1:中对齐,2:右对齐。
//ifrh:是否绕行标志 true:绕行,false:不绕行
function isnextmonth(year1,month1,year2,month2:integer):integer;
//判断两个月份之间是否连续
//相等0
//连续1
//不连续2
implementation
function changedateformat(str:string):string;
begin
result:=copy(str,1,4)+'-'+copy(str,5,2)+'-'+copy(str,7,2);
end;
////////////////////////////////////////////////////////////////
function isinteger(str:string):boolean;
begin
result:=false;
try
  strtoint(str);
except
  application.MessageBox('输入的字符串不能转换为整数。',system_error_caption,system_erroor_button);
  exit;
end;
result:=true;
end;
////////////////////////////////////////////////////////////////////
function isfloat(str:string):boolean;
begin
result:=false;
try
  strtofloat(str);
except
  application.MessageBox('输入的字符串不能转换为浮点数。',system_error_caption,system_erroor_button);
  exit;
end;
result:=true;
end;
////////////////////////////////////////////////////////////////////
function isdate(str:string):boolean;
begin
result:=false;
shortdateformat:='yyyymmdd';
try
  strtodate(changedateformat(str));
except
  application.MessageBox('输入的字符串不能转换为有效日期。',system_error_caption,system_erroor_button);
  exit;
end;
result:=true;
end;
////////////////////////////////////////////////////////////////////
function istime(str:string):boolean;
begin
result:=false;
shortdateformat:='yyyymmddhhnnss';
try
  strtotime(str);
except
  application.MessageBox('输入的字符串不能转换为有效时间。',system_error_caption,system_erroor_button);
  exit;
end;
result:=true;
end;
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
function nextday(d:string):string;
var
  year,month,day:word;
begin
shortdateformat:='yyyymmdd';
decodedate(strtodate(copy(d,1,4)+'-'+copy(d,5,2)+'-'+copy(d,7,2)),year,month,day);
try
if (month=2) and (day=28) and ((year mod 4)=0) then
  begin
  day:=29;
  exit;
  end;
if (month=2) and (day=28) and ((year mod 4)<>0) then
  begin
  day:=1;
  month:=3;
  exit;
  end;
if (month=12) and (day=31) then
  begin
  day:=1;
  month:=1;
  inc(year);
  exit;
  end;
if ((month=1) or (month=3) or (month=5) or (month=7) or (month=8) or (month=10)) and (day=31) then
  begin
  inc(month);
  day:=1;
  exit;
  end;
if ((month=4) or (month=6) or (month=9) or (month=11)) and (day=30) then
  begin
  inc(month);
  day:=1;
  exit;
  end;
inc(day);
finally
shortdateformat:='yyyymmdd';
result:=datetostr(encodedate(year,month,day));
end;

end;
////////////////////////////////////////////////////////////////////
function priorday(d:string):string;
var
  year,month,day:word;
begin
try
  shortdateformat:='yyyymmdd';
  decodedate(strtodate(copy(d,1,4)+'-'+copy(d,5,2)+'-'+copy(d,7,2)),year,month,day);
  if (day=1) and ((month=2) or (month=4) or (month=6) or (month=8)or(month=9) or(month=11))  then
    begin
    day:=31;
    dec(month);
    exit;
    end;
  if (day=1) and ((month=5) or (month=7) or (month=10) or(month=12) )  then
    begin
    day:=30;
    dec(month);
    exit;
    end;
  if (day=1) and (month=3) then
    if (year mod 4)=0 then
      begin
      day:=29;
      month:=2;
      exit;
      end
    else
      begin
      day:=28;
      month:=2;
      exit;
      end;
  if (day=1) and (month=1) then
    begin
    day:=31;
    month:=12;
    dec(year);
    exit;
    end;
  dec(day);
finally
  shortdateformat:='yyyymmdd';
  result:=datetostr(encodedate(year,month,day));
end;
end;
////////////////////////////////////////////////////////////////////
function nextday(d:string;num:integer):string;
var
  count1:integer;
  buf:string;
begin
buf:=d;
for count1:=1 to num do
  buf:=nextday(buf);
result:=buf;  
end;
////////////////////////////////////////////////////////////////////
function priorday(d:string;num:integer):string;
var
  count1:integer;
  buf:string;
begin
buf:=d;
for count1:=1 to num do
  buf:=priorday(buf);
result:=buf;
end;
////////////////////////////////////////////////////////////////////

procedure Tfunction_class.beforePrint(sender: TObject; var Value: String);
var
  buf:string;
  count1:integer;
begin
buf:=tstringgrid(TQRStringsBand(TQRLabel(sender).parent).items.objects[0]).cells[strtoint(TQRLabel(sender).hint),TQRStringsBand(TQRLabel(sender).parent).index];
//说明,这里有一点比较特殊的地方,就是时间日期的显示,如果判断全部是数字,并且为8位则转换为日期格式。
if value='' then exit;
if (length(buf)<>8) or (pos('.',buf)>0) then
  begin
  value:=buf;
  exit;
  end;
for count1:=1 to length(value) do
  if not ((ord(value[count1])>=48) and (ord(value[count1])<=57)) then break;
if count1=length(value)+1 then
  value:=formatdatetime(buf)
else value:=buf;
end;
/////////////////////////////////////////////////////////////////////////////////
function replace_stringgrid(grid:tstringgrid;Band:TQRStringsBand;function_class:tfunction_class):boolean;
var
  count1,count2:integer;
  qrlabel:tqrlabel;
  shape:tqrshape;
begin
//即计算需要显示多少行数据,这里假定如果一行为全空,则表示显示数据结束.
for count1:=0 to grid.RowCount-1 do
  begin
  for count2:=0 to grid.colcount-1 do
      if grid.cells[count2,count1]<>'' then break;
  if count2=grid.colcount then break;
  end;
if count1=0 then exit;
band.Items.clear;
for count2:=0 to count1-1 do
  band.items.add(inttostr(count2));
for count1:=0 to grid.colcount-1 do
  begin
  qrlabel:=tqrlabel.Create(band);
  qrlabel.parent:=band;
  qrlabel.AutoSize:=true;
  qrlabel.Caption:='leo';
  qrlabel.hint:=inttostr(count1);
  qrlabel.ShowHint:=false;
  qrlabel.Font:=grid.font;
  qrlabel.font.color:=clblack;
  qrlabel.Left:=round(grid.cellrect(count1,0).left/grid.width*band.Width)+5;
  qrlabel.top:=round((band.Height-qrlabel.height)/2);
  qrlabel.onprint:=function_class.beforePrint;
  qrlabel.visible:=true;
  if count1<>grid.colcount-1 then
    begin
    shape:=tqrshape.Create(band);
    shape.parent:=band;
    shape.Width:=3;
    shape.Height:=band.Height-2;
    shape.left:=round(grid.cellrect(count1,0).right/grid.width*band.Width);
    shape.top:=0;
    shape.Shape:=qrsVertLine;
    shape.visible:=true;
    end;
  end;
band.items.objects[0]:=grid;
end;
/////////////////////////////////////////////////////////////////////////////////
function FindChildControl(const control:tcontrol;ControlName: string): tcomponent;
var
  count1:integer;
begin
for count1:=0 to control.ComponentCount-1 do
  if uppercase(control.components[count1].name)=uppercase(controlname) then break;
if count1=control.ComponentCount then result:=nil
else result:=control.components[count1];
end;

⌨️ 快捷键说明

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