unit U_Fun10;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ToolWin, StdCtrls, BtnEdit, cxStyles, cxCustomData,
  cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DBGrids, DB, cxDBData,
  cxGridLevel, cxClasses, cxControls, cxGridCustomView, ADODB, StrUtils, Midas,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxTimeEdit,
  cxTreeView, cxGrid, cxDBLookupComboBox, cxCalendar, cxCurrencyEdit,
  cxGridExportLink, ExtCtrls, Buttons, DBClient, FTComboBox, cxDropDownEdit,
  cxGridBandedTableView, cxGridDBBandedTableView, cxRichEdit, cxButtonEdit,
  IniFiles, WinSock;
//Function sendarp(ipaddr:ulong;temp:dword;ulmacaddr:pointer;ulmacaddrleng:pointer) : DWord; StdCall; External 'Iphlpapi.dll' Name 'SendARP';

type
  TA = class(TComponent)
  public
    S: string;
  end;

function SGetMaxId(AdoQueryTemp: TADOQuery; MyTable: string; MyField: string; var MaxId: Integer): Boolean;

function SIsRepeated(AdoQueryTemp: TADOQuery; MyTable: string; MyField: string; MyCode: string): Boolean;

function SSetSaveDataCDS(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

function SSetSaveDataCDS10(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

function SGetServerDate(ADOQueryTmp: TADOQuery): TdateTime;

procedure SSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

procedure SSetWinData(ADOQueryTmp: TADOQuery; mParent: TWinControl);

function SDelData(ADOQueryCmd: TADOQuery; mDelStr: string): Boolean;

function SGetFilters(TMPanel: TPanel; EquTag, LikeTag: Integer): string;

function SGetFiltersHint(TMPanel: TPanel; EquTag, LikeTag: Integer): string;

procedure SDofilter(ADOQry: TADOQuery; FilterStr: string);

function SGetMaxNo(MyAdoQuery: TADOQuery; MyTable: string; MyField: string; MyFlag: string): string;

procedure SCreateCDS20(SADOQry: TADOQuery; mClientDataset: TclientDataSet);

procedure SInitCDSData20(fromADO: TADOQuery; toCDS: TclientDataSet);

procedure SInitFtComBoxBySql(ADOQueryTmp: TADOQuery; cb: TFtComboBox; FlagType: string; Boxtype: integer; showMsg: string; emptyFlag: Boolean; mSql: string);

procedure SInitComBoxBySql(ADOQueryTmp: TADOQuery; cb: TComboBox; emptyFlag: Boolean; mSql: string);

procedure SInitComBoxByCustCode(ADOQueryTmp: TADOQuery; cb: TComboBox; FlagType: string; Boxtype: integer; showMsg: string; emptyFlag: Boolean);

procedure SInitCxGridComboBoxByCustCode(ADOQueryTmp: TADOQuery; c3: TcxGriddbColumn; FlagType: string; PState: Integer; IsNull: Boolean; Shmeg: string);

procedure SSetsavedata10(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

procedure SSetWinData10(ADOQueryTmp: TADOQuery; mParent: TWinControl);

procedure SInitCxGridComboBoxBySql(ADOQueryTmp: TADOQuery; c3: TcxGriddbColumn; FSql: string; PState: Integer; IsNull: Boolean; Shmeg: string);

function SSWR(s: real): real; //*****四舍五入 *****//

procedure SSetWinData20(ADOQueryTmp: TADOQuery; mParent: TWinControl);

procedure SSetWinData30(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);

procedure SCSHData(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);

procedure SSetsavedataNew(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

function SGetServerDate10(ADOQueryTmp: TADOQuery): TDateTime;

function SGetServerDateTime(ADOQueryTmp: TADOQuery): TDateTime;

procedure SCreateCDSSel(SADOQry: TADOQuery; mClientDataset: TclientDataSet);

procedure SInitCDSDataSel(fromADO: TADOQuery; toCDS: TclientDataSet);

procedure CopyAddRow(Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet); //复制增行。（groupformat标记值）

procedure CopyAddRowBand(Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet);

procedure OneKeyPost(Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet); //一键替换粘贴

procedure CopyAddRowCDS(CDS_Sub: TClientDataSet);

function SSetSaveDataCDSNew(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

function SGetFinds(TMPanel: TPanel; EquTag, LikeTag: Integer): string;

function SSetSaveDataCDSBandNew(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

function GetLSNo(ADOQueryTmp: TADOQuery; var mMaxNo: string; mFlag: string; mTable: string; mlen: integer; mtype: integer = 0): Boolean;

procedure SSetsaveSql(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

procedure ReadCxGrid(fileName: string; cxgrid: TcxGridDBTableView; filePack: string = '公用');

procedure ReadCxBandedGrid(fileName: string; cxgrid: TcxGridDBBandedTableView; filePack: string = '公用');

procedure WriteCxGrid(fileName: string; cxgrid: TcxGridDBTableView; filePack: string = '公用');

procedure WriteCxBandedGrid(fileName: string; cxgrid: TcxGridDBBandedTableView; filePack: string = '公用');

procedure CreateGroupSummarry(tv1: TcxGridDBTableView);

procedure TcxGridToExcel(mfileName: string; gridName: TcxGrid);

function ReadINIFileStr(ininame, TypeName: string; ValueName, ValueMR: string): string;

procedure SClearData(mParent: TWinControl; FTag: Integer);
//  procedure SelExportData(FTv:TcxGridDBTableView;FAdoQry:TADOQuery;FTile:string);

procedure SDofilter10(cds_Main: TClientDataSet; FilterStr: string);

procedure SInitCxBandGridComboBoxBySql(ADOQueryTmp: TADOQuery; c3: TcxGridDBBandedColumn; FSql: string; PState: Integer; IsNull: Boolean; Shmeg: string);

procedure ColumnView(AdoQueryTemp: TADOQuery; Tv1: TcxGridDBTableView; MKName10: string);
//  procedure ColumnSet(TV10:TcxGridDBTableView;MKName10:String);
//  procedure ColumnBandSet(TV10:TcxGridDBBandedTableView;MKName10:String);

procedure ColumnBandView(AdoQueryTemp: TADOQuery; Tv1: TcxGridDBBandedTableView; MKName10: string);

procedure SCSHDataWTag(ADOQueryTmp: TADOQuery; mParent: TWinControl);

procedure GetSWLDZ(IPStr: string);

procedure SCSHDataCDS(CDS_Main: TClientDataSet; mParent: TWinControl; FTag: Integer);
 // procedure SelPrintData(FTv:TcxGridDBTableView;FAdoQry:TADOQuery;FTitle:string;FLTitle:string;FRTile:string);
//  procedure SelPrintDataMore(FTv:TcxGridDBTableView;FAdoQry:TADOQuery;FTitle:string;FLTitle:string;FRTile:string;FKK:Integer;FiniName:string);
//  procedure SelExportDataBand(FTv:TcxGridDBBandedTableView;FAdoQry:TADOQuery;FTile:string);

procedure SSetsaveSqlNew(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

procedure SCSHDataNew(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);

function RTSetSaveDataCDS(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

function RTSetSaveDataCDSBand(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

procedure SCreateCDSOnly(SADOQry: TADOQuery; mClientDataset: TclientDataSet);

procedure SInitCDSDataOnly(fromADO: TADOQuery; toCDS: TclientDataSet);

procedure SelOKNo(CDS_MainSel: TClientDataSet; FSel: Boolean);

function num2cengnum(strArabic: string): string;

function num2ceng(strArabic: string): string;

procedure RTSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

procedure InitOrderColor(OrdMainId: string; Combox: TComboBox; FAdoQry: TADOQuery);

procedure InitBCGangNo(OrdSubId: string; Combox: TComboBox; FAdoQry: TADOQuery);

procedure InitRCGangNo(OrdSubId: string; Combox: TComboBox; FAdoQry: TADOQuery);

procedure InitCDSToCDS(fromADO: TclientDataSet; toCDS: TclientDataSet);

procedure clearControl(Myparent: TWinControl; MyTag: integer);

procedure InitDllEvt(FromFile: string; FormID: Integer; Para: string; FormType: Integer; Title: string; Def1: string; Def2: string; Def3: string; Def4: string; Def5: string; Def6: string; Def7: string; Def8: string; Def9: string; Def10: string);

type
  TMyF = function(App: TApplication; //主应用程序 (对Delphi而言)
    FormH: HWND;       //创建窗口的父窗口句柄 (对PB而言)
    FormID: Integer;   //要调用dll中功能窗体的Id号; 如果只有一个功能窗口，FormID默认为0
    Language: Integer; //0=Delphi; 1=PB
    WinStyle: Integer; //0=子窗口; 1：普通窗口 (PB中都为普通窗口)
    UID: PChar;        //用户Id
    UName: PChar;      //用户名
    Para: PChar; Title: PChar; Defstr1: PChar; Defstr2: PChar; Defstr3: PChar; Defstr4: PChar; Defstr5: PChar; Defstr6: PChar; Defstr7: PChar; Defstr8: PChar; Defstr9: PChar; Defstr10: PChar; Datalink: PChar): HWND; stdcall;

var
  TP: FARPROC;
  Tf: TMyF;

implementation

uses
  U_DataLink;

procedure InitDllEvt(FromFile: string; FormID: Integer; Para: string; FormType: Integer; Title: string; Def1: string; Def2: string; Def3: string; Def4: string; Def5: string; Def6: string; Def7: string; Def8: string; Def9: string; Def10: string);
var
  Th: HMODULE;
begin
  Th := LoadLibrary(PChar(FromFile));
  if Th > 0 then
  begin
    TP := GetProcAddress(Th, 'GetDllForm');
    if TP <> nil then
    begin
      Tf := TMyF(Tp);
      Tf(Application, 0, FormID, 0, FormType, PChar(DCode), PChar(DName), PChar(Para), PChar(Title), PChar(Def1), PChar(Def2), PChar(Def3), PChar(Def4), PChar(Def5), PChar(Def6), PChar(Def7), PChar(Def8), PChar(Def9), PChar(Def10), pchar(DConString));
    end;
  end
  else
  begin
    Application.MessageBox(PChar('打不开文件' + FromFile + '！'), '错误', MB_ICONERROR);
  end;
end;

procedure clearControl(Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
  MCode: string;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          TEdit(Controls[i]).Text := '';
        end;
        if Controls[i] is TMemo then
        begin
          TMemo(Controls[i]).Lines.Text := '';
        end;
        if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := '';
        end;
        if Controls[i] is TComboBox then
        begin
          TComboBox(Controls[i]).ItemIndex := 0;
        end;
        if Controls[i] is TDateTimePicker then
        begin
          TDateTimePicker(Controls[i]).Date := date();
        end;
      end;
    end;
  end;
end;

///////////////////取表中Int型字段最大值///////////////////////////////////////
function SGetMaxId(AdoQueryTemp: TADOQuery; MyTable: string; MyField: string; var MaxId: Integer): Boolean;
begin
  try
    with AdoQueryTemp do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select Max(' + MyField + ')+1 MaxId from ' + MyTable);
      Open;
    end;
    with AdoQueryTemp do
    begin
      if (Trim(FieldByName('MaxId').AsString) = '') or (Trim(FieldByName('MaxId').AsString) = NULL) then
        MaxId := 1
      else
        MaxId := (fieldbyname('MaxId').AsInteger);
      Close;
      SQL.Clear;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('取最大值失败！', '提示', 0);
  end;
end;

procedure InitBCGangNo(OrdSubId: string; Combox: TComboBox; FAdoQry: TADOQuery);
var
  fsj: string;
begin
  fsj := 'select distinct(AOrdDefStr1) Code from JYOrder_Sub_AnPai ' + ' where Subid=''' + Trim(OrdSubId) + '''';
  with FAdoQry do
  begin
    Close;
    sql.Clear;
    sql.Add(fsj);
    Open;
  end;
  Combox.Clear;
  with FAdoQry do
  begin
    First;
    while not Eof do
    begin
      Combox.Items.Add(Trim(FAdoQry.fieldbyname('Code').AsString));
      Next;
    end;
  end;
  Combox.Items.Add('');
end;

procedure InitRCGangNo(OrdSubId: string; Combox: TComboBox; FAdoQry: TADOQuery);
var
  fsj: string;
begin
  fsj := 'select distinct(gangno) Code from JYOrder_Sub_AnPai ' + ' where Subid=''' + Trim(OrdSubId) + '''';
  with FAdoQry do
  begin
    Close;
    sql.Clear;
    sql.Add(fsj);
    Open;
  end;
  Combox.Clear;
  with FAdoQry do
  begin
    First;
    while not Eof do
    begin
      Combox.Items.Add(Trim(FAdoQry.fieldbyname('Code').AsString));
      Next;
    end;
  end;
  Combox.Items.Add('');
end;

procedure InitOrderColor(OrdMainId: string; Combox: TComboBox; FAdoQry: TADOQuery);
var
  fsj: string;
begin
  fsj := 'select distinct(PRTColor) Code from JYOrder_Sub ' + ' where Mainid=''' + Trim(OrdMainId) + '''';
  with FAdoQry do
  begin
    Close;
    sql.Clear;
    sql.Add(fsj);
    Open;
  end;
  Combox.Clear;
  with FAdoQry do
  begin
    First;
    while not Eof do
    begin
      Combox.Items.Add(Trim(FAdoQry.fieldbyname('Code').AsString));
      Next;
    end;
  end;
  Combox.Items.Add('');
end;


///////////////////////判断表中数据是否重复///////////////////////////////////
function SIsRepeated(AdoQueryTemp: TADOQuery; MyTable: string; MyField: string; MyCode: string): Boolean;
begin
  try
    Result := False;
    with AdoQueryTemp do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select * from ' + MyTable + ' where ' + MyField + '=''' + Trim(MyCode) + '''');
      Open;
      if IsEmpty then
        Result := True;
      Close;
      SQL.Clear;
    end;
  except
    Result := False;
    Application.MessageBox('表名或字段名错误！', '提示', 0);
  end;
end;
////////////////////设置ClientDataSet的保存信息/////////////////////////////

function SSetSaveDataCDS(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin
        if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
        begin
          AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
        end;

      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('设置Cds保存信息失败!', '提示', 0);
  end;
end;
////////////////////设置ClientDataSet的保存信息/////////////////////////////

function SSetSaveDataCDSNew(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin
        if Trim(Tv1.Columns[i].Summary.GroupFooterFormat) <> '1' then
        begin
          if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
          end{ else
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value:=null;
          end};
        end;
        if Trim(Tv1.Columns[i].Summary.GroupFormat) <> '' then
        begin
          if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].Summary.GroupFormat).AsString) <> '' then
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].Summary.GroupFormat).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].Summary.GroupFormat).Value;
          end; { else
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value:=null;
          end; }
        end;

      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('设置Cds保存信息失败!', '提示', 0);
  end;
end;

function RTSetSaveDataCDS(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin

        begin
          if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
          end
          else
          begin
            if Trim(Tv1.Columns[i].Summary.GroupFooterFormat) = '0' then
            begin
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := 0;
            end
            else
            begin
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := null;
            end;
          end;

        end;

      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('设置Cds保存信息失败!', '提示', 0);
  end;
end;

function RTSetSaveDataCDSBand(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin

        begin
          if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
          end
          else
          begin
            if Trim(Tv1.Columns[i].Summary.GroupFooterFormat) <> '' then
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := 0
            else
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := Trim(Tv1.Columns[i].Summary.GroupFooterFormat);
          end;

        end;

      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('设置Cds保存信息失败!', '提示', 0);
  end;
end;

function SSetSaveDataCDSBandNew(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin
        if Trim(Tv1.Columns[i].Summary.GroupFooterFormat) <> '1' then
        begin
          if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
          end;
        end;
        if Trim(Tv1.Columns[i].Summary.GroupFormat) <> '' then
        begin
          if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].Summary.GroupFormat).AsString) <> '' then
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].Summary.GroupFormat).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].Summary.GroupFormat).Value;
          end;
        end;

      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('设置Cds保存信息失败!', '提示', 0);
  end;
end;
////////////////////设置ClientDataSet的保存信息/////////////////////////////

function SSetSaveDataCDS10(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin
        if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
          AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('设置Cds保存信息失败!', '提示', 0);
  end;
end;
 ///////////////////////////服务器日期//////////////////////////////////////

function SGetServerDate(ADOQueryTmp: TADOQuery): TdateTime;
begin
  try
    with ADOQueryTmp do
    begin
      close;
      sql.Clear;
      sql.Add('select getDate()as dt');
      open;
      result := StrToDate(formatdatetime('yyyy-MM-dd', fieldByName('dt').AsDatetime));
      close;
      SQL.Clear;
    end;
  except
    application.MessageBox('获取当前日期发生错误!', '提示信息', 0);
  end;

end;

function SGetServerDateTime(ADOQueryTmp: TADOQuery): TdateTime;
begin
  try
    with ADOQueryTmp do
    begin
      close;
      sql.Clear;
      sql.Add('select getDate()as dt');
      open;
      result := fieldByName('dt').AsDatetime;
      close;
      SQL.Clear;
    end;
  except
    application.MessageBox('获取当前日期发生错误!', '提示信息', 0);
  end;

end;

function SGetServerDate10(ADOQueryTmp: TADOQuery): TdateTime;
begin
  try
    with ADOQueryTmp do
    begin
      close;
      sql.Clear;
      sql.Add('select getDate()as dt');
      open;
      result := StrToDate(formatdatetime('yyyy-MM-dd', fieldByName('dt').AsDatetime));
      close;
      SQL.Clear;
    end;
  except
    application.MessageBox('获取当前日期发生错误!', '提示信息', 0);
  end;

end;

/////////////////////////////////////////////////////
//保存数据时字段赋值
/////////////////////////////////////////////////////
procedure SSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TEdit(Controls[i]).Text);
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TcxRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TcxRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TMemo(Controls[i]).Text;
        end;
        if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TCheckBox then
        begin
          if TCheckBox(Controls[i]).Checked = True then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := 1
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := 0;
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
          end
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          if TBtnEditA(Controls[i]).Hint = '名称' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).Text)
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxTimeEdit(Controls[i]).Text);
        end;
      end;
    end;
  end;
end;

procedure SSetsavedataNew(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TEdit(Controls[i]).Text);
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TMemo(Controls[i]).Text;
        end;
        if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
          end
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
          if (TBtnEditA(Controls[i]).Hint <> '') and (TBtnEditA(Controls[i]).ParentCtl3D = True) then
            ADOQueryCmd.FieldByName(Trim(TBtnEditA(Controls[i]).Hint)).Value := Trim(TBtnEditA(Controls[i]).Text);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
          //if (TBtnEditC(Controls[i]).Hint<>'') and (TBtnEditC(Controls[i]).ParentCtl3D=True)then
            //ADOQueryCmd.FieldByName(Trim(TBtnEditC(Controls[i]).Hint)).Value:=Trim(TBtnEditC(Controls[i]).Text);
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxTimeEdit(Controls[i]).Text);
        end;
      end;
    end;
  end;
end;

procedure RTSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
        //  if Trim(TEdit(Controls[i]).Text)<>'' then
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TEdit(Controls[i]).Text);
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TMemo(Controls[i]).Text;
        end;
        if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
          end
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).Text);
          if (TBtnEditA(Controls[i]).Hint <> '') then
            ADOQueryCmd.FieldByName(Trim(TBtnEditA(Controls[i]).Hint)).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditC(Controls[i]).Text);
          if (TBtnEditC(Controls[i]).Hint <> '') then
            ADOQueryCmd.FieldByName(Trim(TBtnEditC(Controls[i]).Hint)).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxTimeEdit(Controls[i]).Text);
        end;
      end;
    end;
  end;
end;

procedure SSetsaveSql(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
  MCode: string;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TEdit(Controls[i]).Text);
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TcxRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TcxRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TMemo(Controls[i]).Text;
        end
        else if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
          end
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
          if (TBtnEditA(Controls[i]).Hint <> '') and (TBtnEditA(Controls[i]).ParentCtl3D = True) then
            ADOQueryCmd.FieldByName(Trim(TBtnEditA(Controls[i]).Hint)).Value := Trim(TBtnEditA(Controls[i]).Text);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
          //if (TBtnEditC(Controls[i]).Hint<>'') and (TBtnEditC(Controls[i]).ParentCtl3D=True)then
            //ADOQueryCmd.FieldByName(Trim(TBtnEditC(Controls[i]).Hint)).Value:=Trim(TBtnEditC(Controls[i]).Text);
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxTimeEdit(Controls[i]).Text);
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          if (TcxButtonEdit(Controls[i]).BeepOnEnter = True) or (TcxButtonEdit(Controls[i]).ParentShowHint = True) then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxButtonEdit(Controls[i]).Text);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            MCode := Copy(Trim(Controls[i].Name), 1, Length(Trim(Controls[i].Name)) - 4);
            ADOQueryCmd.FieldByName(MCode).Value := Trim(TcxButtonEdit(Controls[i]).Hint);
          end;
        end;
      end;
    end;
  end;
end;

procedure SSetsaveSqlNew(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
  MCode: string;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
          begin
            if Trim(TEdit(Controls[i]).Hint) <> '' then
              ADOQueryCmd.FieldByName(Trim(TEdit(Controls[i]).Hint)).Value := Trim(TEdit(Controls[i]).Text)
            else
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TEdit(Controls[i]).Text);
          end;
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TCheckBox then
        begin
          if TCheckBox(Controls[i]).Checked = True then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := 1
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := 0;
        end
        else if Controls[i] is TcxRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TcxRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          if Trim(TMemo(Controls[i]).Hint) <> '' then
            ADOQueryCmd.FieldByName(Trim(TMemo(Controls[i]).Hint)).Value := Trim(TMemo(Controls[i]).Text)
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TMemo(Controls[i]).Text;
        end
        else if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime
            else
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := null;
          end
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).Text);
          if (TBtnEditA(Controls[i]).Hint <> '') then
          begin
            if Pos('/', TBtnEditA(Controls[i]).Hint) > 0 then
            begin

            end
            else
              ADOQueryCmd.FieldByName(Trim(TBtnEditA(Controls[i]).Hint)).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
          end;
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditC(Controls[i]).Text);
          if (TBtnEditC(Controls[i]).Hint <> '') then
          begin
            if Pos('/', TBtnEditC(Controls[i]).Hint) > 0 then
            begin

            end
            else
              ADOQueryCmd.FieldByName(Trim(TBtnEditC(Controls[i]).Hint)).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
          end;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TcxCurrencyEdit(Controls[i]).Value;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxTimeEdit(Controls[i]).Text);
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          if (TcxButtonEdit(Controls[i]).BeepOnEnter = True) or (TcxButtonEdit(Controls[i]).ParentShowHint = True) then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxButtonEdit(Controls[i]).Text);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            MCode := Copy(Trim(Controls[i].Name), 1, Length(Trim(Controls[i].Name)) - 4);
            ADOQueryCmd.FieldByName(MCode).Value := Trim(TcxButtonEdit(Controls[i]).Hint);
          end;
        end;
      end;
    end;
  end;
end;

procedure SSetsavedata10(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
  FFName: string;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      FFName := Trim(Copy(Controls[i].Name, 1, (Length(Controls[i].Name) - 1)));
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(FFName).Value := Trim(TEdit(Controls[i]).Text);
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(FFName).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(FFName).Value := TMemo(Controls[i]).Text;
        end;
        if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(FFName).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(FFName).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(FFName).Value := TDateTimePicker(Controls[i]).DateTime;
          end
          else
            ADOQueryCmd.FieldByName(FFName).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          ADOQueryCmd.FieldByName(FFName).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(FFName).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
        end;
      end;
    end;
  end;
end;
/////////////////////////////////////////////////////
  //函数功能:初始化窗口数据
/////////////////////////////////////////////////////

procedure SSetWinData(ADOQueryTmp: TADOQuery; mParent: TWinControl);
var
  i, idx: integer;
  mfield: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag >= 999 then
          continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
         { if Trim(Controls[i].Hint)='数值' then
            continue
          else }
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TRichEdit then
        begin
         { if Trim(Controls[i].Hint)='数值' then
            continue
          else }
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          if Controls[i].Tag = 99 then
          begin
            idx := TftComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end
          else
          begin
            idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end;
        end        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            //idx:=getCombIdx(TComboBox(Controls[i]),i,trim(fieldByName(mfield).AsString));
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          if TBtnEditA(Controls[i]).Tag = 1 then
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
          end
          else
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield).AsString);
          end;
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          TBtnEditC(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if IsEmpty or fieldByName(mfield).IsNull then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              TDateTimePicker(Controls[i]).Date := strToDate('1990-01-01');
          end
          else
            TDateTimePicker(Controls[i]).Date := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SSetWinData30(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);
var
  i, idx: integer;
  mfield: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag <> FTag then
          continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditA(Controls[i]).Hint) <> '' then
            TBtnEditA(Controls[i]).text := trim(fieldByName(Trim(TBtnEditA(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditC(Controls[i]).Hint) <> '' then
            TBtnEditC(Controls[i]).text := trim(fieldByName(Trim(TBtnEditC(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if IsEmpty or fieldByName(mfield).IsNull then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              TDateTimePicker(Controls[i]).Date := strToDate('1990-01-01');
          end
          else
            TDateTimePicker(Controls[i]).DateTime := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        else if Controls[i] is TRichEdit then
        begin
          TRichEdit(Controls[i]).Text := fieldbyname(mfield).AsString;
        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SClearData(mParent: TWinControl; FTag: Integer);
var
  i, idx: integer;
begin
  with mParent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i] is TLabel then
        continue;
      if Controls[i].Tag <> FTag then
        continue;
      if Controls[i] is TEdit then
      begin
        TEdit(Controls[i]).Text := '';
      end
      else if Controls[i] is TRichEdit then
      begin
        TRichEdit(Controls[i]).Text := '';
      end
      else if Controls[i] is TcxRichEdit then
      begin
        TcxRichEdit(Controls[i]).Text := '';
      end
      else if Controls[i] is TBtnEditC then
      begin
        TBtnEditC(Controls[i]).Text := '';
        TBtnEditC(Controls[i]).TxtCode := '';
      end
      else if Controls[i] is TBtnEditA then
      begin
        TBtnEditA(Controls[i]).Text := '';
        TBtnEditA(Controls[i]).TxtCode := '';
      end
      else if Controls[i] is TComboBox then
      begin
        idx := -1;
        TComboBox(Controls[i]).ItemIndex := idx;
      end
    end;
  end;
end;

procedure SCSHData(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);
var
  i, idx: integer;
  mfield, mfieldCode: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag <> FTag then
          continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditA(Controls[i]).Hint) <> '' then
            TBtnEditA(Controls[i]).text := trim(fieldByName(Trim(TBtnEditA(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditC(Controls[i]).Hint) <> '' then
            TBtnEditC(Controls[i]).text := trim(fieldByName(Trim(TBtnEditC(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if Trim(fieldByName(mfield).AsString) = '' then
          begin
            TDateTimePicker(Controls[i]).Checked := False;
          end
          else
            TDateTimePicker(Controls[i]).DateTime := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          TcxButtonEdit(Controls[i]).Text := Trim(fieldbyname(mfield).AsString);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            mfieldCode := Trim(Copy(mfield, 1, Length(mfield) - 4));
            TcxButtonEdit(Controls[i]).Hint := Trim(fieldbyname(mfieldCode).AsString);
          end;

        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SCSHDataNew(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);
var
  i, idx: integer;
  mfield, mfieldCode: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag <> FTag then
          continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString)
          else
            TEdit(Controls[i]).Text := '';
        end        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          TBtnEditA(Controls[i]).Text := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditA(Controls[i]).Hint) <> '' then
          begin
            if Pos('/', TBtnEditA(Controls[i]).Hint) > 0 then
            begin

            end
            else
              TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(Trim(TBtnEditA(Controls[i]).Hint)).AsString);
          end;
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).Text := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditC(Controls[i]).Hint) <> '' then
          begin
            if Pos('/', TBtnEditC(Controls[i]).Hint) > 0 then
            begin

            end
            else
              TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(Trim(TBtnEditC(Controls[i]).Hint)).AsString);
          end;
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if Trim(fieldByName(mfield).AsString) = '' then
          begin
            TDateTimePicker(Controls[i]).Checked := False;
          end
          else
            TDateTimePicker(Controls[i]).DateTime := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          if FieldByName(mfield).Value = null then
            TcheckBox(Controls[i]).Checked := False
          else
            TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          TcxButtonEdit(Controls[i]).Text := Trim(fieldbyname(mfield).AsString);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            mfieldCode := Trim(Copy(mfield, 1, Length(mfield) - 4));
            TcxButtonEdit(Controls[i]).Hint := Trim(fieldbyname(mfieldCode).AsString);
          end;

        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SCSHDataCDS(CDS_Main: TClientDataSet; mParent: TWinControl; FTag: Integer);
var
  i, idx: integer;
  mfield, mfieldCode: string;
  ma: TA;
begin
  with CDS_Main do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag <> FTag then
          continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditA(Controls[i]).Hint) <> '' then
            TBtnEditA(Controls[i]).text := trim(fieldByName(Trim(TBtnEditA(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditC(Controls[i]).Hint) <> '' then
            TBtnEditC(Controls[i]).text := trim(fieldByName(Trim(TBtnEditC(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if Trim(fieldByName(mfield).AsString) = '' then
          begin
            TDateTimePicker(Controls[i]).Checked := False;
          end
          else
            TDateTimePicker(Controls[i]).DateTime := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          TcxButtonEdit(Controls[i]).Text := Trim(fieldbyname(mfield).AsString);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            mfieldCode := Trim(Copy(mfield, 1, Length(mfield) - 4));
            TcxButtonEdit(Controls[i]).Hint := Trim(fieldbyname(mfieldCode).AsString);
          end;

        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SCSHDataWTag(ADOQueryTmp: TADOQuery; mParent: TWinControl);
var
  i, idx: integer;
  mfield, mfieldCode: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        //if Controls[i].Tag<>FTag then  continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditA(Controls[i]).Hint) <> '' then
            TBtnEditA(Controls[i]).text := trim(fieldByName(Trim(TBtnEditA(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditC(Controls[i]).Hint) <> '' then
            TBtnEditC(Controls[i]).text := trim(fieldByName(Trim(TBtnEditC(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if Trim(fieldByName(mfield).AsString) = '' then
          begin
            TDateTimePicker(Controls[i]).Checked := False;
          end
          else
            TDateTimePicker(Controls[i]).DateTime := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          TcxButtonEdit(Controls[i]).Text := Trim(fieldbyname(mfield).AsString);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            mfieldCode := Trim(Copy(mfield, 1, Length(mfield) - 4));
            TcxButtonEdit(Controls[i]).Hint := Trim(fieldbyname(mfieldCode).AsString);
          end;

        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SSetWinData10(ADOQueryTmp: TADOQuery; mParent: TWinControl);
var
  i, idx: integer;
  mfield: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag >= 999 then
          continue;
        //mfield:=Copy(Trim(Controls[i].Name),1,(Length(Trim(Controls[i].Name))-1));
        mfield := Trim(Controls[i].Name);
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          if Controls[i].Tag = 99 then
          begin
            idx := TftComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end
          else
          begin
            idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end;
        end        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          if TBtnEditA(Controls[i]).Tag = 1 then
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
          end
          else
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield).AsString);
          end;
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          TBtnEditC(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if IsEmpty or fieldByName(mfield).IsNull then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              TDateTimePicker(Controls[i]).Date := strToDate('1990-01-01');
          end
          else
            TDateTimePicker(Controls[i]).Date := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end        {else if Controls[i] is TcxLookupComboBox then
        begin
          TcxLookupComboBox(Controls[i]).EditValue:=fieldByName(mfield).AsString;
          TcxLookupComboBox(Controls[i]).EditingText:=fieldByName(mfield+'name').AsString;
        end};
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SSetWinData20(ADOQueryTmp: TADOQuery; mParent: TWinControl);
var
  i, idx: integer;
  mfield: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag >= 999 then
          continue;
        mfield := Copy(Trim(Controls[i].Name), 1, (Length(Trim(Controls[i].Name)) - 1));
        //mfield:=Trim(Controls[i].Name);
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          if Controls[i].Tag = 99 then
          begin
            idx := TftComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end
          else
          begin
            idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end;
        end        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          if TBtnEditA(Controls[i]).Tag = 1 then
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
          end
          else
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield).AsString);
          end;
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          TBtnEditC(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if IsEmpty or fieldByName(mfield).IsNull then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              TDateTimePicker(Controls[i]).Date := strToDate('1990-01-01');
          end
          else
            TDateTimePicker(Controls[i]).Date := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end        {else if Controls[i] is TcxLookupComboBox then
        begin
          TcxLookupComboBox(Controls[i]).EditValue:=fieldByName(mfield).AsString;
          TcxLookupComboBox(Controls[i]).EditingText:=fieldByName(mfield+'name').AsString;
        end};
      end; // end for
    end; // end with
  end;  //end for with

end;

//////////////////////////////////////////////
//////函数功能：根据SQL语句删除数据
//////////////////////////////////////////////
function SDelData(ADOQueryCmd: TADOQuery; mDelStr: string): Boolean;
begin
  try
    result := False;
    with ADOQueryCmd do
    begin
      Close;
      SQL.Clear;
      SQL.Add(mDelStr);
      ExecSQL;
    end;
    result := True;
  except
    result := False;
    Application.MessageBox('数据删除失败！', '提示', 0);
  end;
end;

  ////////////////////////////////////////////
 ////************获取过滤条件***********/////
////////////////////////////////////////////
function SGetFilters(TMPanel: TPanel; EquTag, LikeTag: Integer): string;
var
  i, j, k: Integer;
  fsj, fsj1: string;
begin
  Result := '';
  with TMPanel do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i] is TLabel then
        Continue;
      if Controls[i] is TEdit then
      begin
        if Trim(TEdit(Controls[i]).Text) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TEdit(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
          begin
            j := Pos(' ', Trim(TEdit(Controls[i]).Text));
            if j > 0 then
            begin
              Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Copy(Trim(TEdit(Controls[i]).Text), 1, j - 1) + '%');
              fsj1 := Copy(Trim(TEdit(Controls[i]).Text), j + 1, Length(Trim(TEdit(Controls[i]).Text)));
              while Trim(fsj1) <> '' do
              begin
                j := Pos(' ', Trim(fsj1));
                if j > 0 then
                begin
                  Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Copy(Trim(fsj1), 1, j - 1) + '%');
                  fsj1 := Copy(Trim(fsj1), j + 1, Length(Trim(fsj1)));
                end
                else
                begin
                  Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(fsj1) + '%');
                  fsj1 := '';
                end;
              end;
            end
            else
              Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TEdit(Controls[i]).Text) + '%');
          end;
        end;
      end
      else if Controls[i] is TBtnEditA then
      begin
        if Trim(TBtnEditA(Controls[i]).Text) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TBtnEditA(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TBtnEditA(Controls[i]).Text) + '%')
          else if Controls[i].Tag = 99 then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr(Trim(TBtnEditA(Controls[i]).TxtCode) + '%');
        end;
      end
      else if Controls[i] is TBtnEditC then
      begin
        if Trim(TBtnEditC(Controls[i]).TxtCode) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TBtnEditC(Controls[i]).TxtCode))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + 'Name' + ' like ' + QuotedStr('%' + Trim(TBtnEditC(Controls[i]).Text) + '%');
        end;
      end
      else if Controls[i] is TFTComboBox then
      begin
        if Trim(TFTComboBox(Controls[i]).Text) <> '' then
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TFTComboBox(Controls[i]).Item2))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TFTComboBox(Controls[i]).Item2) + '%');
      end
      else if Controls[i] is TComboBox then
      begin
        if Trim(TComboBox(Controls[i]).Text) <> '' then
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TComboBox(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TComboBox(Controls[i]).Text) + '%');
      end;
    end;
  end;
  if Trim(Result) <> '' then
    Result := Trim(RightBStr(Result, Length(Result) - 4));
end;

function SGetFiltersHint(TMPanel: TPanel; EquTag, LikeTag: Integer): string;
var
  i, j, k: Integer;
  fsj, fsj1: string;
begin
  Result := '';
  with TMPanel do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i] is TLabel then
        Continue;
      if Controls[i] is TEdit then
      begin
        if Trim(TEdit(Controls[i]).Text) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Hint + '=' + QuotedStr(Trim(TEdit(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
          begin
            j := Pos(' ', Trim(TEdit(Controls[i]).Text));
            if j > 0 then
            begin
              Result := Result + 'and ' + Controls[i].Hint + ' like ' + QuotedStr('%' + Copy(Trim(TEdit(Controls[i]).Text), 1, j - 1) + '%');
              fsj1 := Copy(Trim(TEdit(Controls[i]).Text), j + 1, Length(Trim(TEdit(Controls[i]).Text)));
              while Trim(fsj1) <> '' do
              begin
                j := Pos(' ', Trim(fsj1));
                if j > 0 then
                begin
                  Result := Result + 'and ' + Controls[i].Hint + ' like ' + QuotedStr('%' + Copy(Trim(fsj1), 1, j - 1) + '%');
                  fsj1 := Copy(Trim(fsj1), j + 1, Length(Trim(fsj1)));
                end
                else
                begin
                  Result := Result + 'and ' + Controls[i].Hint + ' like ' + QuotedStr('%' + Trim(fsj1) + '%');
                  fsj1 := '';
                end;
              end;
            end
            else
              Result := Result + 'and ' + Controls[i].Hint + ' like ' + QuotedStr('%' + Trim(TEdit(Controls[i]).Text) + '%');
          end;
        end;
      end;
    end;
  end;
  if Trim(Result) <> '' then
    Result := Trim(RightBStr(Result, Length(Result) - 4));
end;

function SGetFinds(TMPanel: TPanel; EquTag, LikeTag: Integer): string;
var
  i: Integer;
begin
  Result := '';
  with TMPanel do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i] is TLabel then
        Continue;
      if Controls[i] is TEdit then
      begin
        if Trim(TEdit(Controls[i]).Text) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TEdit(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TEdit(Controls[i]).Text) + '%');
        end;
      end
      else if Controls[i] is TBtnEditA then
      begin
        if Trim(TBtnEditA(Controls[i]).Text) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TBtnEditA(Controls[i]).TxtCode))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + 'Name' + ' like ' + QuotedStr('%' + Trim(TBtnEditA(Controls[i]).Text) + '%');
        end;
      end
      else if Controls[i] is TBtnEditC then
      begin
        if Trim(TBtnEditC(Controls[i]).TxtCode) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TBtnEditC(Controls[i]).TxtCode))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + 'Name' + ' like ' + QuotedStr('%' + Trim(TBtnEditC(Controls[i]).Text) + '%');
        end;
      end
      else if Controls[i] is TFTComboBox then
      begin
        if Trim(TFTComboBox(Controls[i]).Text) <> '' then
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TFTComboBox(Controls[i]).Item2))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TFTComboBox(Controls[i]).Item2) + '%');
      end
      else if Controls[i] is TComboBox then
      begin
        if Trim(TComboBox(Controls[i]).Text) <> '' then
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TComboBox(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TComboBox(Controls[i]).Text) + '%');
      end;
    end;
  end;
end;

////////////////////////////////////////////////////////////
  //公用过滤函数
////////////////////////////////////////////////////////////
procedure SDofilter(ADOQry: TADOQuery; FilterStr: string);
begin
  try
    ADOQry.DisableControls;
    with ADOQry do
    begin
      if Trim(FilterStr) = '' then
      begin
        Filtered := False;
      end
      else
      begin
        Filtered := False;
        Filter := FilterStr;
        Filtered := True;
      end;
    end;
  finally
    ADOQry.EnableControls;
  end;
end;

procedure SDofilter10(cds_Main: TClientDataSet; FilterStr: string);
begin
  try
    cds_Main.DisableControls;
    with cds_Main do
    begin
      if Trim(FilterStr) = '' then
      begin
        Filtered := False;
      end
      else
      begin
        Filtered := False;
        Filter := FilterStr;
        Filtered := True;
      end;
    end;
  finally
    cds_Main.EnableControls;
  end;
end;

function SGetMaxNo(MyAdoQuery: TADOQuery; MyTable: string; MyField: string; MyFlag: string): string;
var
  fsj: string;
  i: Integer;
begin
  try
    result := '';
    fsj := Trim(Formatdatetime('yyyyMMdd', Now));
    i := Length(Trim(MyFlag));
    with MyAdoQuery do
    begin
      Close;
      SQL.Clear;
      sql.Add('select Max(' + MyField + ') MaxNo from ' + MyTable);
      SQL.Add('where ' + MyField + ' like ' + QuotedStr('%' + fsj + '%'));
      Open;
    end;
    with MyAdoQuery do
    begin
      if Trim(fieldbyname('MaxNo').AsString) = '' then
      begin
        Result := Trim(MyFlag) + Trim(Formatdatetime('yyyyMMdd', Now)) + '1001';
        Exit;
      end;
    end;
    {fsj:=Trim(MyAdoQuery.fieldbyname('MaxNo').AsString);


    with MyAdoQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select Max('+MyField+') MaxNo from '+MyTable);
      SQL.Add('where '+MyField+' like '+QuotedStr('%'+copy(fsj,3,8)+'%'));
      Open;
      ShowMessage(copy(fsj,3,8));
      if Trim(fieldbyname('MaxNo').AsString)='' then
      begin
        Result:=Trim(MyFlag)+Trim(Formatdatetime('yyyyMMdd',Now))+'1001';
        Exit;
      end;
    end;}
    fsj := Trim(MyAdoQuery.fieldbyname('MaxNo').AsString);
    result := Trim(MyFlag) + Trim(Formatdatetime('yyyyMMdd', Now)) + IntToStr(StrtoInt(Copy(fsj, i + 9, Length(fsj) - i - 8)) + 1);

  except
    Result := '';
    Application.MessageBox(PChar('字段取值MaxNo有误，查看表<' + Trim(MyTable) + '>及表字段<' + MyField + '>'), '提示', 0);
  end;
end;

procedure SCreateCDS20(SADOQry: TADOQuery; mClientDataset: TclientDataSet);
var
  i: integer;
  mfieldName: string;
  mSize: integer;
begin
  mfieldName := '';
  mClientDataset.FieldDefs.Clear;
  with SADOQry do
  begin
    for i := 0 to fieldCount - 1 do     //
    begin
      if (Fields[i].DataType = ftString) and (Fields[i].Size = 0) then
      begin
        mSize := 1;
      end
      else
        mSize := Fields[i].Size;
      mfieldName := trim(fields[i].FieldName);
      mClientDataset.FieldDefs.Add(mfieldName, Fields[i].DataType, mSize);

    end;
  end;
  mClientDataset.FieldDefs.Add('Sflag', ftString, 1);
  mClientDataset.FieldDefs.Add('XHNoTemp', ftFloat, 0);
  mClientDataset.FieldDefs.Add('Sindex', ftInteger, 0);
  mClientDataset.FieldDefs.Add('Ssel', ftBoolean, 0);
  mClientDataset.FieldDefs.Add('SDefNote', ftString, 100);
  mClientDataset.Close;
  mClientDataset.CreateDataSet;
end;

procedure SCreateCDSOnly(SADOQry: TADOQuery; mClientDataset: TclientDataSet);
var
  i: integer;
  mfieldName: string;
  mSize: integer;
begin
  mfieldName := '';
  mClientDataset.FieldDefs.Clear;
  with SADOQry do
  begin
    for i := 0 to fieldCount - 1 do     //
    begin
      if (Fields[i].DataType = ftString) and (Fields[i].Size = 0) then
      begin
        mSize := 1;
      end
      else
        mSize := Fields[i].Size;
      mfieldName := trim(fields[i].FieldName);
      mClientDataset.FieldDefs.Add(mfieldName, Fields[i].DataType, mSize);

    end;
  end;
  mClientDataset.Close;
  mClientDataset.CreateDataSet;
end;

procedure InitCDSToCDS(fromADO: TclientDataSet; toCDS: TclientDataSet);
var
  i: integer;
  k: integer;
begin
  k := 1;
  try
    with toCDS do
    begin
      Append;
      for i := 0 to fromADO.FieldCount - 1 do
      begin
        fields[i].value := fromADO.Fields[i].Value;
      end;
      Post;
    end;
  finally

  end;
end;

procedure SInitCDSData20(fromADO: TADOQuery; toCDS: TclientDataSet);
var
  i: integer;
  k: integer;
begin
  if fromADO.IsEmpty then
    exit;
  fromADO.first;
  k := 1;
  try
    toCDS.DisableControls;
    toCDS.Filtered := false;

    while not fromADO.Eof do
    begin
      with toCDS do
      begin
        Append;
        for i := 0 to fromADO.FieldCount - 1 do
        begin
          fields[i].value := fromADO.Fields[i].Value;
        end;
        fieldByName('Sflag').AsString := '1';
        fieldByName('Sindex').value := k;
        fieldByName('Ssel').value := false;
        fieldByName('SDefNote').value := '';
        inc(k);
        Post;
      end;
      fromADO.Next;
    end;
    if not toCDS.IsEmpty then
    begin
      toCDS.First;
    end;
  finally
    toCDS.EnableControls;
  end;
end;

procedure SInitCDSDataOnly(fromADO: TADOQuery; toCDS: TclientDataSet);
var
  i: integer;
  k: integer;
begin
  if fromADO.IsEmpty then
    exit;
  fromADO.first;
  k := 1;
  try
    toCDS.DisableControls;
    toCDS.Filtered := false;

    while not fromADO.Eof do
    begin
      with toCDS do
      begin
        Append;
        for i := 0 to fromADO.FieldCount - 1 do
        begin
          fields[i].value := fromADO.Fields[i].Value;
        end;
        inc(k);
        Post;
      end;
      fromADO.Next;
    end;
    if not toCDS.IsEmpty then
    begin
      toCDS.First;
    end;
  finally
    toCDS.EnableControls;
  end;
end;

procedure SInitFtComBoxBySql(ADOQueryTmp: TADOQuery; cb: TFtComboBox; FlagType: string; Boxtype: integer; showMsg: string; emptyFlag: Boolean; mSql: string);
begin
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add(mSql);
    Open;
    if isEmpty then
    begin
      application.MessageBox(pChar(showMsg), '', 0);
      exit;
    end;
    cb.Clear;
    while not EOF do
    begin
      if Boxtype = 0 then
      begin
        cb.Items.Add(trim(fieldByName('Name').AsString));
      end
      else
      begin
        cb.AddItem2(trim(fieldByName('Name').AsString), nil, trim(fieldByName('code').AsString));
      end;
      next;
    end;

    if not emptyFlag then
      cb.Items.Add('');

    if emptyFlag and (cb.Items.Count > 0) then
      cb.ItemIndex := 0;
  end;
end;

procedure SInitComBoxBySql(ADOQueryTmp: TADOQuery; cb: TComboBox; emptyFlag: Boolean; mSql: string);
begin
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add(mSql);
    Open;
    if isEmpty then
    begin
      //plication.MessageBox(pChar(showMsg),'',0);
      exit;
    end;
    cb.Clear;
    if not emptyFlag then
      cb.Items.Add('');
    while not EOF do
    begin
      cb.Items.Add(trim(fieldByName('Name').AsString));
      next;
    end;

    if emptyFlag and (cb.Items.Count > 0) then
      cb.ItemIndex := 0;
  end;
end;
//////////////////////////////////////////////
  //函数：初试化combox中的数据
  //从XC_CustCode表中取定义数据
  //Boxtype:0; 带编号：1;
//////////////////////////////////////////////

procedure SInitComBoxByCustCode(ADOQueryTmp: TADOQuery; cb: TComboBox; FlagType: string; Boxtype: integer; showMsg: string; emptyFlag: Boolean);
var
  A: TA;
begin
  cb.Items.Clear;
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add('exec P_Get_XC_Custcode');
    sql.Add(quotedStr(trim(FlagType)));
    Open;
    if isEmpty then
    begin
      application.MessageBox(pChar('客户基础信息维护模块中未找到：' + showMsg), '', 0);
      exit;
    end;

    while not EOF do
    begin
      if Boxtype = 0 then
      begin
        cb.Items.Add(trim(fieldByName('name').AsString));
      end
      else
      begin
        A := TA.Create(Nil);
        A.s := trim(fieldByName('code').AsString);
        cb.Items.AddObject(trim(fieldByName('name').AsString), TObject(A));
      end;
      next;
    end;

    if not emptyFlag then
      cb.Items.Add('');

    if emptyFlag and (cb.Items.Count > 0) then
      cb.ItemIndex := 0;
  end;
end;

procedure SInitCxGridComboBoxByCustCode(ADOQueryTmp: TADOQuery; c3: TcxGriddbColumn; FlagType: string; PState: Integer; IsNull: Boolean; Shmeg: string);
var
  A: TA;
begin

  (c3.Properties as TcxComboBoxProperties).Items.Clear;
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add(' select * from XC_CustCode  ' + ' where Flag=''' + trim(FlagType) + ''' ' + ' order by orderno ');
    Open;
    if isEmpty then
    begin
      Application.MessageBox(PChar('客户基础信息维护模块中未找到:' + Shmeg), '', 0);
      exit;
    end;
    while not EOF do
    begin
      A := TA.Create(Nil);
      A.s := trim(fieldByName('Code').AsString);
      if PState = 1 then
        (c3.Properties as TcxComboBoxProperties).Items.AddObject(trim(fieldByName('name').AsString), TObject(A))
      else if PState = 0 then
      begin
        (c3.Properties as TcxComboBoxProperties).Items.Add(trim(fieldByName('name').AsString));
      end;
      next;
    end;
    if not IsNull then
      (c3.Properties as TcxComboBoxProperties).Items.Add('');
  end;

end;

procedure SInitCxGridComboBoxBySql(ADOQueryTmp: TADOQuery; c3: TcxGriddbColumn; FSql: string; PState: Integer; IsNull: Boolean; Shmeg: string);
var
  A: TA;
begin

  (c3.Properties as TcxComboBoxProperties).Items.Clear;
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add(FSql);
    Open;
    if isEmpty then
    begin
      //Application.MessageBox(PChar('未找到:'+shmeg),'',0);
      exit;
    end;
    while not EOF do
    begin
      A := TA.Create(Nil);
      A.s := trim(fieldByName('Code').AsString);
      if PState = 1 then
        (c3.Properties as TcxComboBoxProperties).Items.AddObject(trim(fieldByName('name').AsString), TObject(A))
      else if PState = 0 then
      begin
        (c3.Properties as TcxComboBoxProperties).Items.Add(trim(fieldByName('name').AsString));
      end;
      next;
    end;
    if not IsNull then
    begin
      (c3.Properties as TcxComboBoxProperties).Items.Add('');
    end;
  end;

end;

procedure SInitCxBandGridComboBoxBySql(ADOQueryTmp: TADOQuery; c3: TcxGridDBBandedColumn; FSql: string; PState: Integer; IsNull: Boolean; Shmeg: string);
var
  A: TA;
begin

  (c3.Properties as TcxComboBoxProperties).Items.Clear;
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add(FSql);
    Open;
    if isEmpty then
    begin
      Application.MessageBox(PChar('未找到:' + Shmeg), '', 0);
      exit;
    end;
    while not EOF do
    begin
      A := TA.Create(Nil);
      A.s := trim(fieldByName('Code').AsString);
      if PState = 1 then
        (c3.Properties as TcxComboBoxProperties).Items.AddObject(trim(fieldByName('name').AsString), TObject(A))
      else if PState = 0 then
      begin
        (c3.Properties as TcxComboBoxProperties).Items.Add(trim(fieldByName('name').AsString));
      end;
      next;
    end;
    if not IsNull then
    begin
      (c3.Properties as TcxComboBoxProperties).Items.Add('');
    end;
  end;

end;


///////////////////////////////////////////////////
//*****四舍五入 *****                           //
/////////////////////////////////////////////////
function SSWR(s: real): real;
var
  r1, r2: real;
  s1, s2: string;
begin
  r1 := int(s);
  r2 := frac(s);
  s1 := copy(floattostr(r1), 1, length(floattostr(r1)));
  if length(floattostr(r2)) >= 5 then
  begin
    if strtoint(copy((floattostr(r2)), 5, 1)) >= 5 then
      if strtoint(copy((floattostr(r2)), 4, 1)) = 9 then
        if strtoint(copy((floattostr(r2)), 3, 1)) = 9 then
        begin
          s1 := inttostr(strtoint(s1) + 1);
          s2 := '';
        end
        else
          s2 := inttostr(strtoint(copy((floattostr(r2)), 3, 1)) + 1)
      else if copy((floattostr(r2)), 3, 1) = '0' then
        s2 := '0' + inttostr(strtoint(copy(floattostr(r2), 3, 2)) + 1)
      else
        s2 := inttostr(strtoint(copy(floattostr(r2), 3, 2)) + 1)
    else
      s2 := copy(floattostr(r2), 3, 2);
  end
  else
    s2 := copy(floattostr(r2), 3, 2);
  result := strtofloat(s1 + '.' + s2);
end;

procedure SInitCDSDataSel(fromADO: TADOQuery; toCDS: TclientDataSet);
var
  i: integer;
  k: integer;
begin
  if fromADO.IsEmpty then
    exit;
  fromADO.first;
  k := 1;
  try
    toCDS.DisableControls;
    toCDS.Filtered := false;

    while not fromADO.Eof do
    begin
      with toCDS do
      begin
        Append;
        for i := 0 to fromADO.FieldCount - 1 do
        begin
          fields[i].value := fromADO.Fields[i].Value;
        end;
        //fieldByName('Sflag').AsString :='1';
        //fieldByName('Sindex').value :=k;
        fieldByName('Ssel').value := false;
        inc(k);
        Post;
      end;
      fromADO.Next;
    end;
    if not toCDS.IsEmpty then
    begin
      toCDS.First;
    end;
  finally
    toCDS.EnableControls;
  end;
end;

procedure SCreateCDSSel(SADOQry: TADOQuery; mClientDataset: TclientDataSet);
var
  i: integer;
  mfieldName: string;
  mSize: integer;
begin
  mfieldName := '';
  mClientDataset.FieldDefs.Clear;
  with SADOQry do
  begin
    for i := 0 to fieldCount - 1 do     //
    begin
      if (Fields[i].DataType = ftString) and (Fields[i].Size = 0) then
      begin
        mSize := 1;
      end
      else
        mSize := Fields[i].Size;
      mfieldName := trim(fields[i].FieldName);
      mClientDataset.FieldDefs.Add(mfieldName, Fields[i].DataType, mSize);

    end;
  end;
  mClientDataset.FieldDefs.Add('Sflag', ftString, 1);
  mClientDataset.FieldDefs.Add('Sindex', ftInteger, 0);
  mClientDataset.FieldDefs.Add('Ssel', ftBoolean, 0);
  mClientDataset.FieldDefs.Add('SDefNote', ftString, 10);
  mClientDataset.Close;
  mClientDataset.CreateDataSet;
end;
//复制增行

procedure CopyAddRow(Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet);
var
  AA: array[0..50] of string;
  i, j: Integer;
begin
  if CDS_Sub.IsEmpty then
  begin
    CDS_Sub.Append;
    CDS_Sub.Post;
    Exit;
  end;
  for i := 0 to Tv1.ColumnCount - 1 do
  begin
    AA[i] := Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString);
  end;
  with CDS_Sub do
  begin
    Append;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if AA[i] <> '' then
      begin
        CDS_Sub.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := AA[i];
      end;
    end;
    Post;
  end;
end;

procedure CopyAddRowBand(Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet);
var
  AA: array[0..50] of string;
  i, j: Integer;
begin
  if CDS_Sub.IsEmpty then
  begin
    CDS_Sub.Append;
    CDS_Sub.Post;
    Exit;
  end;
  for i := 0 to Tv1.ColumnCount - 1 do
  begin
    AA[i] := Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString);
  end;
  with CDS_Sub do
  begin
    Append;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if AA[i] <> '' then
      begin
        CDS_Sub.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := AA[i];
      end;
    end;
    Post;
  end;
end;
//复制增行

procedure CopyAddRowCDS(CDS_Sub: TClientDataSet);
var
  AA: array[0..100] of string;
  i, j: Integer;
begin

  if CDS_Sub.IsEmpty then
    Exit;
  for i := 0 to CDS_Sub.FieldCount - 1 do
  begin
    AA[i] := Trim(CDS_Sub.fieldbyname(CDS_Sub.Fields[i].FieldName).AsString);
  end;
  with CDS_Sub do
  begin
    Append;
    for i := 0 to CDS_Sub.FieldCount - 1 do
    begin
      if AA[i] <> '' then
      begin
        CDS_Sub.FieldByName(CDS_Sub.Fields[i].FieldName).Value := AA[i];
      end;
    end;
    Post;
  end;
end;

procedure OneKeyPost(Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet);
var
  FValue, FFValue, FColumn, FFColumn: string;
begin
  //FColumn:=tv1.Columns[Tv1.Controller.FocusedColumnIndex].DataBinding.FieldName;
  //FFColumn:=Tv1.Columns[Tv1.Controller.FocusedColumnIndex].Summary.GroupFormat;
  FColumn := Tv1.Controller.FocusedColumn.DataBinding.FilterFieldName;
  FFColumn := Tv1.Controller.FocusedColumn.Summary.GroupFormat;
  FValue := Trim(CDS_Sub.fieldbyname(FColumn).AsString);
  if Trim(FFColumn) <> '' then
  begin
    FFValue := Trim(CDS_Sub.fieldbyname(FFColumn).AsString);
  end;
  with CDS_Sub do
  begin
    DisableControls;
    First;
    while not Eof do
    begin
      Edit;
      if FValue = '' then
      begin
        CDS_Sub.FieldByName(FColumn).Value := null;
      end
      else
      begin
        CDS_Sub.FieldByName(FColumn).Value := FValue;
      end;
      if Trim(FFColumn) <> '' then
      begin
        if FFValue = '' then
        begin
          CDS_Sub.FieldByName(FFColumn).Value := null;
        end
        else
        begin
          CDS_Sub.FieldByName(FFColumn).Value := FFValue;
        end;
      end;

      Post;
      Next;
    end;
    EnableControls;
  end;
end;

///////////////////////////////////////////////////
//函数功能：取流水号
//mFlag:前缀；mTable:表名
//mlen:流水号长度; mtype:是否带日期  1：带 0 不带
///////////////////////////////////////////////////
function GetLSNo(ADOQueryTmp: TADOQuery; var mMaxNo: string; mFlag: string; mTable: string; mlen: integer; mtype: integer = 0): Boolean;
begin
  try
    with ADOQueryTmp do
    begin
      Close;
      sql.Clear;
      sql.Add('exec Get_SY_MaxBH ');
      sql.Add(' ' + quotedStr(mFlag));
      sql.Add(',' + quotedStr(mTable));
      sql.Add(',' + intTostr(mlen));
      sql.Add(',' + intTostr(mtype));
//      ShowMessage(SQL.Text);
      Open;

      if RecordCount > 0 then
      begin
        mMaxNo := trim(fieldByName('MaxBH').AsString);
        if mMaxNo <> '' then
          result := true
        else
          Result := false;
      end
      else
      begin
        result := false;
      end;

    end;
    if not Result then
      application.MessageBox(Pchar('无法生成流水号(' + mFlag + ')'), '提示信息', MB_ICONINFORMATION);

  except
    result := false;
    application.MessageBox(Pchar('无法生成流水号(' + mFlag + ')'), '提示信息', MB_ICONINFORMATION);

  end;
end;

procedure ReadCxGrid(fileName: string; cxgrid: TcxGridDBTableView; filePack: string = '公用');
var
  mFileName: string;
begin
  mFileName := ExtractFilePath(Application.ExeName) + 'Layout\' + filePack + '\' + trim(fileName) + '.dbg';
  //从布局文件中恢复
  if FileExists(mFileName) then
    cxgrid.RestoreFromIniFile(mFileName, false, false);
  CreateGroupSummarry(cxgrid);
end;
///////////////////////////////////////////////////////////////
  //函数功能：从文件中读取cxGridCol设置
  //fileName 推荐为窗口的caption名字caption名字
///////////////////////////////////////////////////////////////

procedure ReadCxBandedGrid(fileName: string; cxgrid: TcxGridDBBandedTableView; filePack: string = '公用');
var
  mFileName: string;
begin
  mFileName := ExtractFilePath(Application.ExeName) + 'Layout\' + filePack + '\' + trim(fileName) + '.dbg';
  //从布局文件中恢复
  if FileExists(mFileName) then
    cxgrid.RestoreFromIniFile(mFileName, false, false);

end;
///////////////////////////////////////////////////////////////
  //函数功能：写cxGridCol设置到.dbg文件中
  //默认推荐为窗口的caption名字
///////////////////////////////////////////////////////////////

procedure WriteCxGrid(fileName: string; cxgrid: TcxGridDBTableView; filePack: string = '公用');
var
  mFileName: string;
begin
  mFileName := ExtractFilePath(Application.ExeName) + 'Layout\' + filePack + '\' + trim(fileName) + '.dbg';
  if not DirectoryExists(ExtractFileDir(mFileName)) then
    CreateDir(ExtractFileDir(mFileName));
  //保存为布局文件
  cxgrid.StoreToIniFile(mFileName);

end;
///////////////////////////////////////////////////////////////
  //函数功能：写cxGridCol设置到.dbg文件中
  //默认推荐为窗口的caption名字
///////////////////////////////////////////////////////////////

procedure WriteCxBandedGrid(fileName: string; cxgrid: TcxGridDBBandedTableView; filePack: string = '公用');
var
  mFileName: string;
begin
  mFileName := ExtractFilePath(Application.ExeName) + 'Layout\' + filePack + '\' + trim(fileName) + '.dbg';
  if not DirectoryExists(ExtractFileDir(mFileName)) then
    CreateDir(ExtractFileDir(mFileName));
   //保存为布局文件
  cxgrid.StoreToIniFile(mFileName);
end;

procedure CreateGroupSummarry(tv1: TcxGridDBTableView);
var
  csg: TcxDataSummaryGroup;
  csglink: TcxDataSummaryGroupItemLink;
  csgItem: TcxDataSummaryItem;
  i: integer;
  mFieldName: string;
begin
    ///创建汇总列
  with tv1.DataController.Summary do
  begin
    try
      csg := DataController.Summary.SummaryGroups.Add;   //创建汇总项

      csg.Links.Clear;
      for i := 0 to tv1.ColumnCount - 1 do
      begin
        if not tv1.Columns[i].Visible then
          continue;
        mFieldName := tv1.Columns[i].DataBinding.FieldName;

        if tv1.Columns[i].Summary.FooterKind = skSum then
        begin
            // (tv1.DataController.DataSet.Fields[i] as TNumericField).DisplayFormat := '#,0.00;-#,0.00;#';
             //tv1.Columns[i].Summary.FooterFormat:='0.0';
             //tv1.Columns[i].Summary.FooterKind := skSum;
             //这个与Group Row上的汇总同时使用时好象只能有一个有效
             //创建行分组行上的汇总项

          csgItem := csg.SummaryItems.Add;
          csgItem.ItemLink := tv1.Columns[i];   //汇总字段1
          csgItem.Position := spGroup;
          csgItem.Kind := skSum;
          csgItem.Format := trim(tv1.Columns[i].Caption) + '小计=#,0.0';

          tv1.Columns[i].Summary.GroupFooterKind := skSum;
          tv1.Columns[i].Summary.GroupFooterFormat := '#,0.00';

        end
        else if tv1.Columns[i].Summary.FooterKind = skCount then
        begin
            // (tv1.DataController.DataSet.Fields[i] as TNumericField).DisplayFormat := '#,0.00;-#,0.00;#';
             //tv1.Columns[i].Summary.FooterFormat:='0.0';
          tv1.Columns[i].Summary.FooterKind := skCount;

          tv1.Columns[i].Summary.GroupFooterKind := skCount;

             //tv1.Columns[i].Summary.GroupFooterFormat := '#,0.00';
             //这个与Group Row上的汇总同时使用时好象只能有一个有效
             //创建行分组行上的汇总项
          csgItem := csg.SummaryItems.Add;
          csgItem.ItemLink := tv1.Columns[i];   //汇总字段1
          csgItem.Kind := skCount;
             //csgItem.Format := '小计=#,0.0';

        end
        else
        begin
          csglink := csg.Links.Add;
          csglink.ItemLink := tv1.Columns[i];  //分类字段
              //所有不参与汇总的列都有可能用来分组，必须将这些列加入到
              //SummaryGroupItemLink中，没有加入该连接的列用来分组时
              //汇总值不会显示
        end;

      end;
    finally
    end;
  end;

end;

procedure TcxGridToExcel(mfileName: string; gridName: TcxGrid);
var
  saveDialog: TSaveDialog;
begin
  try
    saveDialog := TSaveDialog.Create(nil);
    saveDialog.Filter := 'xls(*.xls)|*.xls|全部(*.*)|*.*';
    saveDialog.Options := [ofOverwritePrompt];
    saveDialog.FileName := mfileName;
    if saveDialog.Execute then
      if Assigned(gridName) then
      begin
        try

          ExportGridToExcel(saveDialog.FileName, gridName, false);
        except
          application.MessageBox('创建失败,源文件可能处于编辑状态!', '提示信息', 0);
          exit;
        end;
        application.MessageBox('成功导出!', '提示信息', 0);
      end
      else
        application.MessageBox('导出失败!', '提示信息', 0);
  finally
    saveDialog.Free;
  end;
end;

function ReadINIFileStr(ininame, TypeName: string; ValueName, ValueMR: string): string;
var
  programIni: Tinifile;  //配置文件名
  FileName, ValueZS: string;
begin
  FileName := ExtractFilePath(Paramstr(0)) + ininame;
  programIni := Tinifile.create(FileName);
  ValueZS := programIni.ReadString(TypeName, ValueName, ValueMR);
  Result := ValueZS;
  programIni.Free;
end;

procedure ColumnView(AdoQueryTemp: TADOQuery; Tv1: TcxGridDBTableView; MKName10: string);
begin
  with AdoQueryTemp do
  begin
    Close;
    sql.Clear;
    sql.Add('select * from Table_Column where CxTabName=''' + Trim(MKName10) + ''' and Owner=''' + Trim(DCode) + '''');
    sql.Add(' and TCNotVisble=1 ');
    open;
  end;
  if AdoQueryTemp.IsEmpty = False then
  begin
    with AdoQueryTemp do
    begin
      First;
      while not eof do
      begin

        Tv1.GetColumnByFieldName(AdoQueryTemp.fieldbyname('ColName').AsString).Visible := False;
        Tv1.GetColumnByFieldName(AdoQueryTemp.fieldbyname('ColName').AsString).Hidden := True;
        Next;
      end;
    end;
  end;
end;

procedure ColumnBandView(AdoQueryTemp: TADOQuery; Tv1: TcxGridDBBandedTableView; MKName10: string);
var
  fsj: string;
begin
  with AdoQueryTemp do
  begin
    Close;
    sql.Clear;
    sql.Add('select * from Table_Column where CxTabName=''' + Trim(MKName10) + ''' and Owner=''' + Trim(DCode) + '''');
    sql.Add(' and TCNotVisble=1 ');
    open;
  end;
  if AdoQueryTemp.IsEmpty = False then
  begin
    with AdoQueryTemp do
    begin
      First;
      while not eof do
      begin
        fsj := Trim(AdoQueryTemp.fieldbyname('ColName').AsString);
       // Tv1.Controller.ge
        Tv1.GetColumnByFieldName(fsj).Visible := False;
        Tv1.GetColumnByFieldName(fsj).Hidden := True;
        Next;
      end;
    end;
  end;
end;

procedure GetSWLDZ(IPStr: string);
var
  myip: ulong;
  mymac: array[0..5] of byte;
  mymaclength: ulong;
  r: integer;
begin
  {myip:=inet_addr(PChar(Trim(IPStr)));
  mymaclength:=length(mymac);
  r:=sendarp(myip,0,@mymac,@mymaclength);
  IpCall:=r;      
  IpWLDZStr:=format('%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x',[mymac[0],mymac[1],mymac[2],mymac[3],mymac[4],mymac[5]]);}
end;

procedure SelOKNo(CDS_MainSel: TClientDataSet; FSel: Boolean);
begin
  if CDS_MainSel.IsEmpty then
    Exit;
  CDS_MainSel.DisableControls;
  with CDS_MainSel do
  begin
    First;
    while not Eof do
    begin
      if FieldByName('SSel').AsBoolean = not FSel then
      begin
        Edit;
        FieldByName('SSel').Value := FSel;
        Post;
      end;
      Next;
    end;
  end;
  CDS_MainSel.EnableControls;
end;

function num2ceng(strArabic: string): string;//不带小数点数字转换英文
const
  sw: array[2..9] of string = ('twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety');
  gw: array[1..19] of string = ('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen');
  exp: array[1..4] of string = ('', 'thousand', 'million', 'billion');
var
  t, j, glb, t1: integer;
  ts: string;

  function readu1000(ss: string): string;
  var
    t, code: integer;
  begin
    result := '';
    while ss[1] = '0' do
    begin
      delete(ss, 1, 1);
      if length(ss) = 0 then
        exit; //控制全是0情况
    end;
    if length(ss) = 3 then
    begin
      appendstr(result, gw[ord(ss[1]) - ord('0')]);
      //appendstr(result,' hundred ');
      appendstr(result, ' hundred  ');
      delete(ss, 1, 1);
    end;
    while ss[1] = '0' do
    begin
      delete(ss, 1, 1);
      if length(ss) = 0 then
        exit;
    end;
    if length(ss) <> 0 then
      if result <> '' then
        appendstr(result, 'and ');
    if (glb = 1) and (t1 <> 1) then //超过百位时候处理最后3位
      if result = '' then
        appendstr(result, 'and ');
    begin
      val(ss, t, code);
      if t < 20 then
        result := result + gw[t]
      else if t mod 10 = 0 then
        result := result + sw[t div 10]
      else
      //result := result+sw[trunc(t/10)]+'-'+gw[t mod 10];
        result := result + sw[trunc(t / 10)] + ' ' + gw[t mod 10];
    end;
  end;

begin
  result := '';
  t := pos('.', strArabic);
  if t = 0 then
    t := length(strArabic) + 1;
  while (t mod 3 <> 1) do
  begin
    t := t + 1;
    strArabic := '0' + strArabic;
  end;
  t1 := (t - 1) div 3;
  for glb := t1 downto 1 do
  begin
    ts := '';
    for j := 1 to 3 do
    begin
      ts := ts + strArabic[1];
      delete(strArabic, 1, 1);
    end;
    result := result + readu1000(ts);
    if ts <> '000' then
      result := result + ' ' + exp[glb] + ' ';
  end;
  if length(strArabic) <> 0 then
  begin
    delete(strArabic, 1, 1);
    appendstr(result, 'and ');
    result := result + readu1000(strArabic);
  end;
end;

function num2cengnum(strArabic: string): string;
const
  gw: array[1..10] of string = ('0', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');
var
  p, i, j, x: integer;
  s: string;
begin
  result := '';
  s := strArabic;
  p := pos('.', strArabic);
  if p = 0 then
  begin
    result := num2ceng(strArabic) + 'Only';
    exit;
  end
  else
  begin
    i := length(s) - p; //计算小数点后面有几位
    delete(strArabic, p, i + 1); //删除小数点后面数字
    result := num2ceng(strArabic) + 'Point';
  end;
  for x := 1 to i do //转换小数点后面数字
  begin
    j := strtoint(copy(s, p + x, 1));
    case j of
      0:
        result := result + ' ' + gw[1];
      1:
        result := result + ' ' + gw[2];
      2:
        result := result + ' ' + gw[3];
      3:
        result := result + ' ' + gw[4];
      4:
        result := result + ' ' + gw[5];
      5:
        result := result + ' ' + gw[6];
      6:
        result := result + ' ' + gw[7];
      7:
        result := result + ' ' + gw[8];
      8:
        result := result + ' ' + gw[9];
      9:
        result := result + ' ' + gw[10];
    end;
  end;
end;

end.

