亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? poscontrol.~pas

?? 小票樣式打印模板設計,和管家婆的pos收銀系統小票樣式設計差不多
?? ~PAS
?? 第 1 頁 / 共 3 頁
字號:
unit PosControl;

interface

uses
  SysUtils,windows,Graphics,Dialogs,Classes,Controls,stdCtrls,DB,GridsEh,DBGrideh,ytxStringGridEh,strUtils,
  Printers,PosPrintFunction,ExtCtrls;

const
  FileVersion=$AB71;
type
  TDriveMode=(DMNone,DMWindows);
  TDataType=(DtNone,DtTitleFields,DtBodyFields,DtSysFields);
  TBodyType=(btGrid,btDataSet);

  TReportVar=Class;
  TReportVars=Class;
  {表報主體}
  TPosReport = class(TComponent)
  private
    { Private declarations }
        {Private}
    FDriveMode:TDriveMode;        //驅動模式
    FComName:String;              //端口名稱
    FComByte:Integer;             //波特率
    FOpenBoxCode:String;          //開錢箱指令
    FAutoOpenBox:Boolean;         //打印后自動開錢箱
    FFootSpaceRow:integer;        //走紙行數
    FPageWidth:Integer;           //頁寬
    FPageHeight:integer;          //頁高
    FTitleRowCount:integer;       //頁頭行數,用于換頁加表頭
    FQuantityDiciaLength: integer;  //數量小數點長度
    FMoneyDiciaLength:integer;    //金額小數點長度

    FSysVars:TReportVars;         //系統變量
    FTitleVars:TReportVars;       //表頭字段

    FPageNo:integer;                //頁碼
    FPageCount:integer;             //頁數
    FDetailRowCount:integer;        //行數
    FFont:TFont;
    FFontSize:integer;
    FBodyStartRow:integer;          //表體開始行數
    FBodyEndRow:integer;            //表體結束行數
    FStepRow:integer;               //表體占用行數

    FBodyType:TBodyType;           //表體類型

    FGrid:TYTXStringGridEh;
    FDataSet:TDataSet;
    FOpenFlag:Boolean;   //模板打開標示
    FFilePathName:String; //械板文件位置

    FReportLines:TStringList;

    procedure CreateSysValues;
    procedure InitSysValues;
    Procedure SetTitleVars(TitleVars:TReportVars);
    Function GetTitleVars:TReportVars;
    Function GetVarValue(VarType:char;VarName:String):String;
    function FilterVar(S: String;out OutS: String): Boolean;
    function FilterFields(S: String;Row:integer; out OutS: String): Boolean;
    Procedure SetFont(Value:TFont);
    Function GetFont:TFont;
    function GetPrintData: TStringList;

  protected
    { Protected declarations }
  public
    { Public declarations }
     Constructor Create(AOwner:TComponent);Override;
     Destructor Destroy;override;
     Procedure ShowVarList(VarType:TDataType;Out ListFields:TListBox);
     Procedure SetBodyFields(AValue:TYTXStringGridEh);overload;
     Procedure SetBodyFields(AValue:TDataSet);Overload;
     Procedure SaveToFile(FileName:String);
     Procedure LoadFromFile(FileName:String);
     function PrintReport(OutMemo:TMemo):Boolean;overload;
     function PrintReport(OutMemo:TImage):boolean;overload;
     Function UpcaseCurrency(Value:extended):string;
     Function PrintNoDrive(Source:TStringList):Boolean;   //硬字庫打印
     Function PrintWithDrive(Source:TStringList):boolean;overload; //windows驅動打印
     Function PrintWithDrive(Source:TStringList;AImage:TImage):Boolean;overload;
     procedure InitReportFile;
     Function Print:boolean;
     procedure ShowDesign;
     procedure PrintPreview;
    { Procedure ShowDesign;
     Procedure Print;
     Procedure PrintPreview; }
  published
    { Published declarations }
    Property ReportVars:TReportVars Read GetTitleVars Write SetTitleVars;
    Property AutoOpenBox:boolean Read FAutoOpenBox Write FAutoOpenBox;
    Property OpenBoxCode:String Read FOpenBoxCode Write FOpenBoxCode;
    Property DriveMode:TDriveMode Read FDriveMode Write FDriveMode;
    Property ComName:String Read FComName Write FComName;
    Property ComByte:Integer Read FComByte Write FComByte;
    Property FootSpaceRow:Integer Read FFootSpaceRow Write FFootSpaceRow;
    Property PageWidth:integer Read FPageWidth Write FPageWidth;
    Property PageHeight:integer Read FPageHeight Write FPageHeight;
    Property TitleRowCount:Integer Read FTitleRowCount Write FTitleRowCount;
    Property QuantityDicial:integer Read FQuantityDiciaLength Write FQuantityDiciaLength;
    Property MoneyDicial:integer Read FMoneyDiciaLength Write FMoneyDiciaLength;
    Property ReportLines:TStringList Read FReportLines Write FReportLines;
    Property BodyType:TBodyType Read FBodyType Write FBodyType;
    Property Grid:TytxStringGridEh Read FGrid;
    Property DataSet:TDataSet Read FDataSet;
    Property Font:TFont Read GetFont Write SetFont;

  end;

    {報表變量}
  TReportVar=Class(TCollectionItem)
  Private
    {Private}
    FVarName:String;
    FVarCaption:String;
    FVarValue:Variant;
    Procedure SetVarName(Value:String);
    Function GetVarName:String;
    Procedure SetVarCaption(Value:String);
    Function GetVarCaption:String;
    Procedure SetVarValue(Value:Variant);
    Function GetVarValue:Variant;
  Protected
    {Protected}
    procedure Assign(Source:TPersistent);override;
    function GetDisplayName: string; override;
    Function Index:integer;
  Public
    {Public}
    Constructor Create(ReportVars:TCollection);
  Published
    {Published}
    Property Name:String Read GetVarName Write SetVarName;
    Property Caption:String Read GetVarCaption Write SetVarCaption;
    Property Value:Variant Read GetVarValue Write SetVarValue;
  end;
    TReportVarClass=class of TReportVar;

  {報表變量集合}
  TReportVars=Class(TCollection)
  Private
    {Private}
    FPosReport:TPosReport;
    Function GetCount:integer;
    Function GetReportVar(Index:integer):TReportVar;
    Procedure SetReportVar(Index:integer;Value:TReportVar);
  protected
    {Protected}
    function GetOwner: TPersistent; override;
  Public
    {Public}
    Constructor Create(Report:TPosReport;ReportVarClass:TReportVarClass);
    Function Add:TReportVar;
    Procedure AddVar(ACaption,AName:String;Value:Variant);
    Procedure Clear;
    Function GetValueByName(VarName:String):Variant;
    Function GetValueByCaption(VarCaption:String):Variant;
    Function GetNameByCaption(Caption:String):String;
    Procedure SetValueByName(varName:String;Value:Variant);
    Procedure SetValueByCaption(varCaption:String;Value:Variant);
    Property Items[Index:integer]:TReportVar Read GetReportVar Write SetReportVar;default;
    Property PosReport:TPosReport Read FPosReport;
  Published
    {Published}
    Property ItemCount:integer Read GetCount;
  end;

procedure Register;
Function CurrencyToStr(Value:Extended):string;
function GetMoneySwitch(AMoney: string): string;

function com_init(com:Integer; baud:Dword):Boolean;stdcall;external 'api_com.dll';
function com_rest:Boolean;stdcall;external 'api_com.dll';
function com_send(buf:PChar; len:Integer):Boolean;stdcall;external 'api_com.dll';
function StringAlign(mStr: string; mLength:Integer;
      mAlignment: TAlignment; mBackChar: Char= #32):string;
implementation
uses frmPreviewDlg,FrmPrintManUnit;

procedure Register;
begin
  RegisterComponents('ytx工具',[TPosReport]);
end;

const
  NumberArray: array[0..9] of string =
    ('零', '壹','貳','叁','肆','伍','陸','柒','捌','玖');
  XSArray:array[0..2] of string =
    ('角','分','厘');
Function CurrencyToStr(Value:Extended):string;
var
  sMoney:string;
  sMoneyLen:integer;
  DiciaLen:integer;
  I,J:integer;
begin
  J:=0;
  sMoney:=GetMoneySwitch(FloatToStr(Value));
  sMoneyLen:=length(sMoney);
  DiciaLen:=0;
  Result:='';
  For I:=1 to sMoneyLen do
  begin
    if midStr(sMoney,I,1)<>'.' then
    begin
      Result:=Result + MidStr(sMoney,I,1);
      DiciaLen:=I;
    end else
    begin
      DiciaLen:=I;
      Break;
    end;
  end;
  if DiciaLen=sMoneyLen then
    Result:=Result+'元整'
  else
    Result:=Result + '元';
  
  For I:=DiciaLen+1 to sMoneyLen do
  begin
     if J<2 then
     begin
        Result:=Result + midStr(sMoney,I,1) + XSArray[J];
        Inc(J);
     end else
     begin
        Result:=Result + midStr(sMoney,I,1);
        Inc(J);
     end;
  end;
end;

// 數字轉成大寫
function GetMoneySwitch(AMoney: string): string;

  // 去除所有分隔符
  procedure ClearComma(var AValue: string);
  begin
    while Pos(',', AValue) > 0 do
      Delete(AValue, Pos(',', AValue), 1);
  end;

  // 測試如果為零將不返回值
  function FiltrateValue(const AValue, AStr: string): string;
  var
    IntValue: Integer;
  begin
    IntValue:= StrToIntDef(AValue, 0);
    if IntValue > 0 then Result:= AStr; 
  end;

  // 直接將數字翻譯成大寫
  function Direct(const AValue: string): string;
  var
    ResultStr: string;
    iCount: Integer;
  begin
    for iCount:= 1 to Length(AValue) do
      ResultStr:= ResultStr + NumberArray[StrToInt(AValue[iCount])];
    Result:= ResultStr;
  end;

  // 將四位長度的數字翻譯與大寫
  function FourBit(const AValue: string): string;
  var
    i, x, j: Integer;
    IntValue: Integer;
    ResultStr: string;
  begin

    IntValue:= StrToIntDef(AValue, 0);
    x:= IntValue;

    i := x div 1000;
    j := x mod 1000;
    if i <> 0 then ResultStr:= NumberArray[i] + '仟'
    else begin
      if Length(AValue) > 3 then ResultStr:= '零';
    end;

    i := j div 100;
    j := j mod 100;
    if i <> 0 then  ResultStr:= ResultStr + NumberArray[i] + '佰'
    else begin
      if (ResultStr <> '') and (Length(AValue) > 2) and
        (Copy(ResultStr, Length(ResultStr)-1, 2) <> '零') then
        ResultStr:= ResultStr + '零';
    end;

    i := j div 10;
    j := j mod 10;
    if i <> 0 then ResultStr := ResultStr + NumberArray[i] + '拾'
    else begin
      if (ResultStr <> '') and (Length(AValue) > 1) and
        (Copy(ResultStr, Length(ResultStr)-1, 2) <> '零') then
        ResultStr:= ResultStr + '零';
    end;

    ResultStr := ResultStr + NumberArray[j];

    while Copy(ResultStr, Length(ResultStr)-1, 2) = '零' do
      Delete(ResultStr, Length(ResultStr)-1, 2);

    Result := ResultStr;
  end; 

var
  IntegerValue: string;   // 整數部分的值
  KilomegaValue: string;  // 存儲大于千兆的數字
  AccountValue: string;   // 在千兆以內的整數部分
  DecimalValue: string;   // 存在小數點后的值

  ResultKilomega: string; // 大于千兆并翻譯后的大寫字符
  ResultAccount: string;  // 在千兆以內的整數部分并翻譯后的大寫字符
  ResultDecimal: string;  // 小數點后的值并翻譯后的大寫字符

  FourBitStr: string;     // 最大四位值的字符
begin

  // 清除分隔符
  ClearComma(AMoney);

  // 驗證字符串是否合法
  try
    AMoney:= FloatToStr(StrToFloat(AMoney));
  except
    raise Exception.Create('無效的數值字符串');
  end;

  // 取到小數據點后的值
  // 取出整數部分的值
  if Pos('.', AMoney) > 0 then
  begin
    DecimalValue:= Copy(AMoney, Pos('.', AMoney) + 1, Length(AMoney));
    IntegerValue:= Copy(AMoney, 0, Pos('.', AMoney)-1);
    ResultDecimal:= '.' + Direct(DecimalValue);
  end
  else IntegerValue:= AMoney;

  // 取到大于千兆的數字
  // 取到在千兆以內的整數部分
  if Length(IntegerValue) > 16 then
  begin
    KilomegaValue:= Copy(IntegerValue, 0, Length(IntegerValue) - 12);
    AccountValue:= Copy(IntegerValue,
      Length(IntegerValue) - 11, Length(IntegerValue));
    ResultKilomega:= Direct(KilomegaValue) + '兆';
  end
  else AccountValue:= IntegerValue;

  { 翻譯在千兆以內的整數部分 }

  // 翻譯在兆與仟兆之間的部份
  if Length(AccountValue) > 12 then
  begin
    FourBitStr:= Copy(AccountValue, 0, Length(AccountValue) - 12);
    ResultAccount:= ResultAccount +
      FourBit(FourBitStr) + FiltrateValue(FourBitStr, '兆');
    Delete(AccountValue, 1, Length(AccountValue) - 12);
  end;
  // 翻譯在億與仟億之間的部份
  if Length(AccountValue) >= 8 then
  begin
    FourBitStr:= Copy(AccountValue, 0, Length(AccountValue) - 8);
    ResultAccount:= ResultAccount +
      FourBit(FourBitStr) + FiltrateValue(FourBitStr, '億');
    Delete(AccountValue, 1, Length(AccountValue) - 8);
  end;
  // 翻譯在萬與仟萬之間的部份
  if Length(AccountValue) >= 5 then
  begin
    FourBitStr:= Copy(AccountValue, 0, Length(AccountValue) - 4);
    ResultAccount:= ResultAccount +
      FourBit(FourBitStr) + FiltrateValue(FourBitStr, '萬');
    Delete(AccountValue, 1, Length(AccountValue) - 4);
  end;
  // 翻譯萬以下的部份
  if Length(AccountValue) > 0 then
  begin
    ResultAccount:= ResultAccount +
      FourBit(Copy(AccountValue, 0, Length(AccountValue)));
  end;

  // 組合字符串
  Result:= ResultKilomega + ResultAccount + ResultDecimal;
  
end;


{ TPosReport }

constructor TPosReport.Create(AOwner: TComponent);
begin
  inherited;
  FAutoOpenBox:=false;
  FBodyEndRow:=0;
  FBodyStartRow:=0;
  FBodyType:=BtGrid;
  FComByte:=9600;
  FDataSet:=nil;
  FDetailRowCount:=0;
  FDriveMode:=dmNone;
  FFilePathName:='';
  FFootSpaceRow:=3;
  FGrid:=nil;
  FMoneyDiciaLength:=2;
  FOpenBoxCode:='Chr(27)+''p''+Chr(0)+Chr(60)+Chr(255)';
  FOpenFlag:=False;
  FPageCount:=0;
  FPageWidth:=53;
  FPageHeight:=20;
  FQuantityDiciaLength:=0;
  FStepRow:=0;
  FTitleRowCount:=0;
  FFont:=TFont.Create;
  FFontSize:=9;  
  FTitleVars:=TReportVars.Create(self,TReportVar);
  FSysVars:=TReportVars.Create(self,TReportVar);
  FReportLines:=TStringList.Create;
  CreateSysValues;   //添加系統變
  InitSysValues;
end;

procedure TPosReport.CreateSysValues;
begin
  FSysVars.AddVar('長日期','[@.長日期]','');
  FSysVars.AddVar('日期','[@.日期]','');
  FSysVars.AddVar('時間','[@.時間]','');
  FSysVars.AddVar('頁碼','[@.頁碼]','');
  FSysVars.AddVar('頁數','[@.頁數]','');

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品美女久久久久久2018| 精品国产区一区| 国产精品白丝av| 美国欧美日韩国产在线播放| 图片区小说区区亚洲影院| 亚洲综合在线免费观看| 亚洲欧美二区三区| 成人欧美一区二区三区白人| 久久久久久免费| 国产日产精品一区| 国产日韩欧美电影| 亚洲色图一区二区| 亚洲成人免费视| 美女脱光内衣内裤视频久久网站 | 亚洲欧美日韩成人高清在线一区| 国产亚洲精品超碰| 中文字幕一区二区三区在线观看 | 日本网站在线观看一区二区三区| 亚洲午夜在线视频| 日韩1区2区3区| 国模一区二区三区白浆| 成人精品免费网站| 在线观看免费亚洲| 欧美一区二区女人| 国产亚洲欧美日韩俺去了| 中文字幕一区在线观看| 亚洲成人先锋电影| 国产精品一区二区视频| 一本大道久久精品懂色aⅴ| 欧美三级在线看| 久久久精品天堂| 亚洲综合在线五月| 国产精品99久久久久久宅男| 91理论电影在线观看| 91麻豆精品国产综合久久久久久| 欧美成人猛片aaaaaaa| 国产女主播一区| 亚洲风情在线资源站| 狠狠色狠狠色合久久伊人| 99综合影院在线| 欧美一区二区三级| 亚洲欧美日韩久久| 国产在线精品不卡| 欧美日韩国产天堂| 国产精品久久久久久久久搜平片| 亚洲6080在线| 91女厕偷拍女厕偷拍高清| 91精品国产麻豆| 最新成人av在线| 国产麻豆午夜三级精品| 欧美喷水一区二区| 亚洲免费在线电影| 国产精品亚洲а∨天堂免在线| 欧美色图第一页| 国产精品丝袜一区| 精品中文字幕一区二区小辣椒| 91网页版在线| 国产精品青草久久| 国产乱码精品一品二品| 欧美裸体bbwbbwbbw| 亚洲欧洲日产国产综合网| 国精产品一区一区三区mba视频| 欧美亚洲国产一区二区三区va | 91在线观看免费视频| 日韩欧美的一区二区| 婷婷中文字幕综合| 欧美日韩国产片| 亚洲欧美电影院| 91在线码无精品| 国产精品国产馆在线真实露脸| 激情丁香综合五月| 精品日韩一区二区| 蜜桃av噜噜一区| 日韩一区二区三区视频在线| 亚洲电影在线播放| 欧美久久久一区| 天堂影院一区二区| 欧美妇女性影城| 日韩av中文在线观看| 欧美一级在线免费| 另类小说欧美激情| 久久婷婷色综合| 国产精品18久久久久久vr| 久久久精品日韩欧美| 国产成人精品免费| 自拍视频在线观看一区二区| 99精品欧美一区二区蜜桃免费| 国产精品午夜春色av| av电影在线观看一区| 亚洲人成网站色在线观看| 91成人免费在线视频| 久久精品这里都是精品| 国产色产综合色产在线视频| 国产福利精品一区| 欧美一区二区三区在线看| 琪琪一区二区三区| 精品成人免费观看| 国产99精品国产| 国产精品高清亚洲| 精品久久久久久亚洲综合网| 1024成人网| 欧美日本乱大交xxxxx| 色菇凉天天综合网| 成人免费视频caoporn| 狠狠色狠狠色综合系列| 日本不卡一区二区三区 | 中文字幕一区二区在线观看| 精品嫩草影院久久| 欧美一级久久久久久久大片| 欧美丝袜自拍制服另类| 91福利社在线观看| 91高清在线观看| 99久久夜色精品国产网站| 国产91精品入口| 成人黄色av网站在线| 东方aⅴ免费观看久久av| 国产一区二区精品久久99| 久久精品99国产精品| 久久国产精品色婷婷| 精品一区二区三区在线播放| 久久电影国产免费久久电影| 首页欧美精品中文字幕| 日本不卡的三区四区五区| 人禽交欧美网站| 久久se这里有精品| 国产一区二区导航在线播放| 国产乱子伦一区二区三区国色天香| 精品亚洲成a人| 国产成人av福利| 成人免费av资源| 色欧美日韩亚洲| 欧美日本乱大交xxxxx| 日韩精品中午字幕| 国产欧美一区二区三区在线看蜜臀| 中文字幕欧美激情一区| 自拍偷拍亚洲综合| 亚洲电影一级黄| 欧美aaaaaa午夜精品| 国产伦精一区二区三区| 成人黄色小视频在线观看| av一区二区三区| 欧美日韩一区二区三区四区 | 精品国产一区二区三区忘忧草| 欧美电视剧免费观看| 精品国产露脸精彩对白| 国产精品嫩草影院com| 亚洲欧美日韩一区| 美女在线视频一区| 成人av电影在线| 在线成人av网站| 久久久美女毛片| 亚洲一区二区三区四区不卡| 免费不卡在线观看| 97久久精品人人做人人爽50路| 欧美另类一区二区三区| 久久精品一区二区三区不卡| 亚洲精选一二三| 国产在线视频精品一区| 在线免费av一区| 精品国产一区二区亚洲人成毛片| 最新高清无码专区| 久久福利视频一区二区| 99精品视频一区二区三区| 8x8x8国产精品| 最新不卡av在线| 国产在线一区观看| 欧美日韩不卡一区二区| 中文字幕一区二区三区在线观看| 日韩国产精品91| 91麻豆精品视频| 久久精品欧美一区二区三区麻豆| 亚洲成人动漫在线免费观看| 国产成人精品aa毛片| 欧美一区午夜视频在线观看 | 亚洲在线中文字幕| 粉嫩av一区二区三区在线播放| 欧美羞羞免费网站| 一区在线播放视频| 国产一区二区伦理片| 欧美精品1区2区| 亚洲已满18点击进入久久| 波多野结衣亚洲| 国产欧美一区二区精品秋霞影院| 日韩精品色哟哟| 色妹子一区二区| 国产精品福利av| 福利一区二区在线观看| 精品免费视频.| 蜜桃av一区二区三区电影| 欧美日韩国产另类不卡| 亚洲曰韩产成在线| 91黄视频在线观看| 成人免费小视频| 成人av电影在线观看| 中文字幕av不卡| 成人亚洲一区二区一| 国产日韩欧美麻豆| 东方欧美亚洲色图在线| 国产亚洲制服色| 国产精品综合久久|