rm_pgtfunction.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 862 行 · 第 1/2 页

PAS
862
字号

{*****************************************}
{                                         }
{          Report Machine v2.0            }
{          PGT Addin Function             }
{                                         }
{    感谢 网友PGT提供  amirery@163.net    }
{*****************************************}

unit RM_PGTFunction;

interface

{$I RM.inc}

uses
  SysUtils, Windows, Classes, Controls, Forms, Dialogs, RM_Class, RM_Common, RM_Parser
{$IFDEF Delphi6}, Variants{$ENDIF};

type
  TRMAddInFunctionLib = class(TComponent);

 { TPGTAddinFunction }
  TRMPGTAddinFunction = class(TRMFunctionLibrary)
  public
    constructor Create; override;
    procedure DoFunction(aParser: TRMParser; FNo: Integer; p: array of Variant; var val: Variant); override;
  end;

function RMPGTGetINI(const KeyName: string; const SubName: string; IniFile: string): string;
{function CutInt(v: Variant): Variant; //提取小数点左边数值
function LeftUpper(S: Variant): Variant; //首字大写
function NumToEn(V: Variant): string; //数字转换为英文大写
function NumToMoney(V: Variant; Dollar: string; Cent: string): string; //数字转换为美元大写
function NumToCn(V: Variant): string; //数字转换为中文大写
function SmallNum(V: Integer): string; //小数字转换为英文大写
function LeftStr(SouStr: string; LeftLen: Word): string; //取左边n位字符
function RightStr(SouStr: string; RightLen: Word): string; //取右边n位字符
function DateToShortStr(V: Variant; StrLx: Integer): string; //英文短日期格式
function DateToLongStr(V: Variant): string; //英文长日期格式
function MyFormatDate(Format: string; DateTime: TDateTime): string; //自定义日期转换为字符串
function Ascii(const Keychr: string): Byte;
function PicExists(var v: string): Boolean; //检查图片文件是否存在
function DayofShortWeek(D: TdateTime): string; //返回短星期格式
function DayofLongWeek(D: TdateTime): string; //返回长星期格式
function myfunction(Name: string; p1, p[1], p[2]: Variant): variant;
function CutRootDir(var v: string): Boolean; //把文件名转换为相对路径
}

{$IFDEF DM_ADO}
(* 注意:此单元请在搜索路径中指定 Sv_Data的路径  *)
function RMPGTInitConnectstring: string; //初始化数据连接字符串 ;
function RMPGTGetFieldValue(TableName: string; WhereCode: string; ReturnFld: string): Variant;
  {例:GetFieldValue('CKHT','合同号=SAMPLE','总金额')  }
{$ENDIF}

var
  ExePath: string; //可执行程序路径
  ReportDir: string; //存放报表文件的目录
  RmRegistOK: Boolean; //程序是否已经注册
  CurOpenFile: string; //当前打开的报表文件
  PrintBase: Boolean = True; //报表打印是否打印背景图
  PrintFrame: Boolean = True; //文本框打印边条
  AllowSetFrame: Boolean = False; //允许设置边条是否打印
  HasBasePic: Boolean; //报表是否带有背景图
  ReportTitle: string = '报表标题'; //报表标题
  ReportSubTitle1: string = '报表子标题一'; //报表子标题1
  ReportSubTitle2: string = '报表子标题二'; //报表子标题2
{$IFDEF DM_ADO}
  SvSetFile: string = 'SerVerConfig.Dll';
{$ENDIF}

implementation

uses Inifiles{$IFDEF DM_ADO}, DB, Clipbrd, Adodb{$ENDIF};

const
  ShortMon: array[0..11] of string = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
  LongMon: array[0..11] of string = ('January', 'February', 'March', 'April',
    'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
  CnNum: array[0..11] of string = ('一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二');
  ShortWeek: array[0..6] of string = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
  LongWeek: array[0..6] of string = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');

{$IFDEF DM_ADO}
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ADO Function}

function RMPGTGetFieldValue(TableName: string; WhereCode: string; ReturnFld: string): Variant;
var
  Adoc: TAdoConnection;
  tbl: TadoDataSet;
  SqlStr: string;
  i: integer;
  s: string;
begin
  Screen.Cursor := crHourGlass;
  Adoc := TAdoConnection.Create(Application);
  Adoc.LoginPrompt := False;
  Adoc.Provider := 'MSDASQL';
  if Trim(Adoc.ConnectionString) = '' then
  begin
    Adoc.ConnectionString := RMPGTInitConnectstring;
    Adoc.Open;
  end;
  TableName := Trim(TableName);
  WhereCode := Trim(WhereCode);
  ReturnFld := Trim(ReturnFld);
  if (TableName = '') or (ReturnFld = '') then
  begin
    Result := 'GetFieldValue 函数参数缺少';
    Adoc.Close;
    Adoc.Free;
    Screen.Cursor := CrDefault;
    Exit;
  end;
  s := '';
  for i := 1 to Length(WhereCode) do
  begin
    if WhereCode[i] <> '"' then
      s := s + WhereCode[i]
    else
      s := s + '''';
  end;
  WhereCode := S;
  if WhereCode <> '' then
  begin
    if Pos('WHERE', UpperCase(WhereCode)) = 0 then
      WhereCode := 'Where ' + WhereCode;
  end;
  WhereCode := ' ' + WhereCode + ' ';
  tbl := TadoDataSet.Create(nil);
  tbl.Connection := AdoC;
  SQLStr := 'Select * From ' + TableName + WhereCode;
  Tbl.CommandText := SQLStr;
  Tbl.CommandType := cmdText;
  try
    Tbl.Open;
  except
    Clipboard.AsText := SQLstr;
    Result := '表' + TableName + '不能打开!';
    Adoc.Close;
    Adoc.Free;
    Screen.Cursor := CrDefault;
    Exit;
  end;
  if Tbl.FindField(ReturnFld) = nil then
  begin
    Result := '没有发现字段[' + ReturnFld + ']';
    Screen.Cursor := CrDefault;
    Exit;
  end;
  case Tbl.FieldByName(ReturnFld).DataType of
    FtString, FtMemo, ftFixedChar, ftWideString:
      Result := Trim(Tbl.FieldByName(ReturnFld).AsString);
    ftDate, ftTime, ftDateTime:
      Result := Tbl.FieldByName(ReturnFld).AsDateTime;
    ftBoolean:
      Result := Tbl.FieldByName(ReturnFld).AsBoolean;
    ftSmallint, ftInteger, ftWord, ftLargeint,
      ftFloat, ftCurrency, ftBCD, ftBytes, ftVarBytes:
      Result := Tbl.FieldByName(ReturnFld).AsFloat;
  else
    Result := Tbl.FieldValues[ReturnFld];
  end;
  Tbl.Close;
  Tbl.free;
  Adoc.Close;
  Adoc.Free;
  Screen.Cursor := CrDefault;
end;

function RMPGTInitConnectstring: string; //初始化数据连接字符串 ;
var
  SaveFile: string;
  Tstr: TStringList;
  SaveStr: string;
  SysPath: PChar;
begin
  GetMem(SysPath, 255);
  GetSystemDirectory(SysPath, 255); //获取WINDOWS 系统SYSTEM 目录
  SaveFile := SysPath + '\' + SvSetFile;
  SaveStr := '';
  if FileExists(SaveFile) then
  begin
    TStr := TStringList.Create;
    TStr.LoadFromFile(SaveFile);
    SaveStr := Tstr.Text;
    TStr.Free;
  end;
  SaveStr := Trim(SaveStr);
  Result := SaveStr;
end;
{$ENDIF}

{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{Other Function}

function RMPGTGetINI(const KeyName: string; const SubName: string; IniFile: string): string; // 从INI文件中提取数据
var
  MyIni: TiniFile;
begin
  if IniFile = '' then
    IniFile := 'System.Ini';
  if Pos(UpperCase('.'), UpperCase(IniFile)) = 0 then
    IniFile := IniFile + '.ini';
  if Pos('\', IniFile) = 0 then
    IniFile := ExtractFilePath(Application.ExeName) + IniFile;
  if FileExists(IniFile) then
  begin
    MyIni := TiniFile.Create(IniFile);
    if MyIni.ValueExists(KeyName, SubName) then
      Result := MyIni.ReadString(KeyName, SubName, '')
    else
      Result := '不存在关键字[' + KeyName + '][' + SubName + ']';
    MyIni.Free;
  end
  else
  begin
    Result := Inifile + '不存在!';
  end;
end;

function LeftStr(SouStr: string; LeftLen: Word): string; //取左边n位字符
begin
  Result := Copy(SouStr, 1, LeftLen);
end;

function RightStr(SouStr: string; RightLen: Word): string; //取右边n位字符
begin
  Result := Copy(SouStr, Length(SouStr) - RightLen + 1, RightLen);
end;

function LeftUpper(S: Variant): Variant; //首字大写
var
  i: Integer;
  BeginUpper: Boolean;
  TmpStr, Restr: string;
begin
  try
    TmpStr := VarAsType(s, VarString);
  except
    Result := S;
    Exit;
  end;
  BeginUpper := True; ReStr := '';
  for I := 1 to Length(TmpStr) do
  begin
    if BeginUpper = True then
      ReStr := ReStr + UpperCase(TmpStr[i])
    else
      ReStr := ReStr + LowerCase(TmpStr[i]);
    if Pos(TmpStr[i], ' \/`~!@#$%^&*()_+-=|{}[]: ; "" '' <> ?') <> 0 then
      BeginUpper := True
    else
      BeginUpper := False;
  end;
  Result := ReStr;
end;

function SmallNum(V: Integer): string; //小数字转换为英文大写
var
  I_Str: string;
  R_Str: string;
  H_str: string;
begin
  if V > 999 then
  begin
    Result := '数据太大' + FormatFloat('##0', V);
    Exit;
  end;
  R_Str := '';
  I_str := Trim(FormatFloat('##0', V));
  I_str := RightStr('000' + I_str, 3);
  case StrToInt(RightStr(I_str, 2)) of
    0: R_str := '';
    1: R_str := 'ONE';
    2: R_str := 'TWO';
    3: R_str := 'THREE';
    4: R_str := 'FOUR';
    5: R_str := 'FIVE';
    6: R_str := 'SIX';
    7: R_str := 'SEVEN';
    8: R_str := 'EIGHT';
    9: R_str := 'NINE';
    10: R_str := 'TEN';
    11: R_str := 'ELEVEN';
    12: R_str := 'TWELVE';
    13: R_str := 'THIRTEEN';
    14: R_str := 'FOURTEEN';
    15: R_str := 'FIFTEEN';
    16: R_str := 'SIXTEEN';
    17: R_str := 'SEVENTEEN';
    18: R_str := 'EIGHTEEN';
    19: R_str := 'NINETEEN';
    20: R_str := 'TWENTY';
    30: R_str := 'THIRTY';
    40: R_str := 'FORTY';
    50: R_str := 'FIFTY';
    60: R_str := 'SIXTY';
    70: R_str := 'SEVENTY';
    80: R_str := 'EIGHTY';
    90: R_str := 'NINETY';
  else
    case StrToInt(Copy(I_str, 2, 1)) of
      0: R_str := '';
      1: R_str := '';
      2: R_str := 'TWENTY-';
      3: R_str := 'THIRTY-';
      4: R_str := 'FORTY-';
      5: R_str := 'FIFTY-';
      6: R_str := 'SIXTY-';
      7: R_str := 'SEVENTY-';
      8: R_str := 'EIGHTY-';
      9: R_str := 'NINETY-';
    end;
    case StrToInt(Copy(I_str, 3, 1)) of
      0: R_str := R_str + '';
      1: R_str := R_str + 'ONE';
      2: R_str := R_str + 'TWO';
      3: R_str := R_str + 'THREE';
      4: R_str := R_str + 'FOUR';
      5: R_str := R_str + 'FIVE';
      6: R_str := R_str + 'SIX';
      7: R_str := R_str + 'SEVEN';
      8: R_str := R_str + 'EIGHT';
      9: R_str := R_str + 'NINE';
    end;
  end;
  H_Str := '';
  case StrToInt(Copy(I_str, 1, 1)) of
    0: H_str := '';
    1: H_str := 'ONE';
    2: H_str := 'TWO';
    3: H_str := 'THREE';
    4: H_str := 'FOUR';
    5: H_str := 'FIVE';
    6: H_str := 'SIX';
    7: H_str := 'SEVEN';
    8: H_str := 'EIGHT';
    9: H_str := 'NINE';
  else
    ShowMessage('不可预料的情况');
  end;
  if (H_Str <> '') and (R_Str <> '') then
    I_str := H_Str + ' HUNDRED AND ' + R_Str
  else if (H_Str <> '') and (R_Str = '') then
    I_str := H_Str + ' HUNDRED ' + R_Str
  else if (H_Str = '') and (R_Str <> '') then
    I_str := R_Str
  else if (H_Str = '') and (R_Str = '') then
    I_str := '';
  Result := I_Str;
end;

function DayofShortWeek(D: TdateTime): string; //返回短星期格式
begin
  Result := ShortWeek[DayOfWeek(d) - 1];
end;

function DayofLongWeek(D: TdateTime): string; //返回长星期格式
begin
  Result := LongWeek[DayOfWeek(d) - 1];
end;

function CutRootDir(var v: string): Boolean; //把文件名转换为相对路径
var
  sv, RootDir: string;
begin
  sv := v;
  RootDir := ExtractFileDir(Application.ExeName) + '\';
  if CompareText(RootDir, LeftStr(sv, Length(RootDir))) = 0 then
  begin
    v := Copy(sv, Length(RootDir) + 1, 255);
    Result := True;
  end
  else
    Result := False;
end;

function PicExists(var V: string): Boolean; //检查图片文件是否存在
var
  S, Sdir, Sname, PicDir: string;
begin
  s := V;
  Result := True;
  if FileExists(s) then
    Exit;
  if Trim(CurOpenFile) <> '' then
  begin //首先在报表所在目录中查找
    SName := ExtractFileName(s);
    Sdir := ExtractFileDir(CurOpenFile);
    if FileExists(Sdir + '\' + sName) then
    begin
      v := Sdir + '\' + sName;
      Exit;
    end;
    Sdir := ExtractFileDir(Sdir); //再一次减去子目录+\BitMaps
    if FileExists(Sdir + '\BitMaps\' + sName) then
    begin
      v := Sdir + '\BitMaps\' + sName;
      Exit;
    end;
    if FileExists(Sdir + '\BitBmps\' + sName) then
    begin
      v := Sdir + '\BitBmps\' + sName;
      Exit;
    end;
  end;
  if not FileExists(s) then
  begin //其次在程序运行的目录中查找
    Sdir := Trim(ExtractFileDir(S));
    SName := ExtractFileName(S);
    if (Pos('\', Sdir) = 0) and (Sdir <> '') then
      PicDir := ExtractFileDir(Application.ExeName) + '\' + Sdir + '\'
    else
      PicDir := ExtractFileDir(Application.ExeName) + '\BitMaps\';
    if FileExists(Picdir + sName) then
      V := PicDir + sName
    else
    begin
      PicDir := ExtractFileDir(Application.ExeName) + '\BitBmps\';
      if FileExists(Picdir + s) then
        V := PicDir + s
      else
        Result := False;
    end;
  end;
end;

⌨️ 快捷键说明

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