?? poscontrol.~pas
字號(hào):
FSysVars.AddVar('行數(shù)','[@.行數(shù)]','');
FSysVars.AddVar('開發(fā)商','[@.開發(fā)商]','');
end;
destructor TPosReport.Destroy;
begin
FTitleVars.Free;
FSysVars.Free;
FFont.Free;
inherited;
end;
function TPosReport.FilterVar(S: String;Out outS:String):Boolean;
Var
I:integer;
begin
OutS:=S;
For I:=0 to FSysVars.Count-1 do
begin
OutS:=StringReplace(OutS,FSysVars.Items[I].Name,FSysVars.Items[I].Value,[rfReplaceAll{,rfIgnoreCase}]);
end;
For I:=0 To FTitleVars.Count-1 do
begin
OutS:=StringReplace(OutS,'[!.' + FTitleVars.Items[I].Name + ']',FTitleVars.Items[I].Value,[rfReplaceAll{,rfIgnoreCase}]);
end;
Result:=true;
end;
Function tPosReport.FilterFields(S:String;Row:integer;Out OutS:String):Boolean;
var
I,J:integer;
begin
OutS:=S;
if (FBodyType=btGrid) and (Assigned(FGrid)) then
begin
For J:=0 to FGrid.ColCount-1 do
begin
OutS:=StringReplace(S,'[#.'+FGrid.Columns[J].Title.Caption +']',FGrid.Cells[J,Row],[rfReplaceAll]);
S:=OutS;
end;
end;
if (FBodyType=btDataSet) and (Assigned(FDataSet)) and (FDataSet.Active) then
begin
For J:=0 to FDataSet.Fields.Count-1 do
begin
OutS:=stringReplace(S,'[#.'+FDataSet.Fields[J].Name +']',FDataSet.Fields[J].AsString,[rfReplaceAll]);
S:=OutS;
end;
end;
end;
function TPosReport.GetTitleVars: TReportVars;
begin
if Assigned(FTitleVars) then
Result:=FTitleVars;
end;
function TPosReport.GetVarValue(VarType: char; VarName: String): String;
begin
{由變量名及類型獲取變量值}
if VarType in ['@','!','#'] then
begin
if VarType='@' then //系統(tǒng)變量
begin
InitSysValues;
Result:=FSysVars.GetValueByCaption(VarName);
end;
if VarType='!' then
begin
Result:=VarName;
end;
if VarType='#' then
begin
Result:=VarName;
end;
end else
begin
Result:=VarName;
end;
end;
function TPosReport.GetPrintData:TStringList;
var
I,J,K:integer;
RetS:String;
BodyRow:Array of Integer; //保存表體行數(shù)
OutMemo:TStringList;
Procedure GetBodyRow;
Var
I:integer;
ArrayLen:integer;
begin
ArrayLen:=0;
For I:=0 to FReportLines.Count-1 do
begin
if Pos('[#.',FReportLines[I])>0 then
begin
inc(ArrayLen);
setLength(BodyRow,ArrayLen);
BodyRow[ArrayLen-1]:=I;
end;
end;
end;
begin
OutMemo:=TStringList.Create;
if not assigned(OutMemo) then exit;
OutMemo.Clear;
//OutMemo.Font.Assign(FFont);
FilterVar(FReportLines.Text,RetS); //表頭及系統(tǒng)變量
FReportLines.Text:=RetS;
K:=0;
while K<FReportLines.Count do
begin
if Pos('[#.',FReportLines[K])<=0 then
begin
OutMemo.Add(FReportLines[K]);
inc(k);
end else
begin
//如果是表格
GetBodyRow;
if (FBodyType=btGrid) and (Assigned(FGrid)) then
begin
For I:=FGrid.FixedRows to FGrid.RowCount-FGrid.FixedRows do
begin
For J:=BodyRow[low(BodyRow)] to BodyRow[High(BodyRow)] do
begin
FilterFields(FReportLines[J],I,RetS);
if trim(RetS)<>'' then
OutMemo.Add(RetS);
end;
end;
end;
//如果是記錄集
if (FBodyType=btDataSet) and (Assigned(FDataSet)) and (FDataSet.Active) then
begin
For I:=0 to FDataSet.RecordCount-1 do
begin
For J:=BodyRow[low(BodyRow)] to BodyRow[High(BodyRow)] do
begin
FilterFields(FReportLines[J],I,RetS);
OutMemo.Add(RetS);
if trim(RetS)<>'' then
FDataSet.Next;
end;
end;
end;
K:=BodyRow[high(BodyRow)]+1;
end;
end;
Result:=TStringList.Create;
Result.Assign(OutMemo);
OutMemo.Free;
end;
Function TPosReport.PrintReport(OutMemo:TMemo):Boolean;
begin
OutMemo.Font.Assign(Font);
OutMemo.Lines.Assign(TStrings(GetPrintData));
Result:=true;
end;
procedure TPosReport.InitSysValues;
begin
FSysVars.SetValueByCaption('日期',FormatDateTime('YYYY-MM-DD',Now));
FSysVars.SetValueByCaption('長(zhǎng)日期',FormatDateTime('YYYY-MM-DD HH:MM:SS',Now));
FSysVars.SetValueByCaption('時(shí)間',FormatDateTime('HH:MM:SS',now));
FSysVars.SetValueByCaption('頁碼',intToStr(FPageNo));
FSysVars.SetValueByCaption('頁數(shù)',intToStr(FPageCount));
FSysVars.SetValueByCaption('行數(shù)',intToStr(FDetailRowCount));
FSysVars.SetValueByCaption('開發(fā)商','貴陽欣安博科技');
end;
procedure TPosReport.LoadFromFile(FileName: String);
var
FileFlag:Word;
PosFile:TFileStream;
I:integer;
RowCount:Integer;
tmpLine:String;
tmpPChar:Array[0..3000] of Char;
J,charCount:integer;
begin
if not fileExists(fileName) then exit;
PosFile:=TFileStream.Create(FileName,fmOpenRead);
try
with PosFile do
begin
Read(FileFlag,SizeOf(FileFlag));
if FileFlag<>FileVersion then
begin
Raise Exception.Create('打開的文件不是有效的小票文件或已不支持該版本!');
Exit;
end;
Read(FDriveMode,SizeOf(FDriveMode));
Read(CharCount,sizeOf(CharCount));
for J:=0 to CharCount-1 do
Read(tmpPChar[J],1);
tmpPChar[CharCount]:=#0;
FComName:=strPas(tmpPChar);
Read(FComByte,SizeOf(FComByte));
Read(charCount,sizeOf(CharCount));
For J:=0 to CharCount-1 do
Read(tmpPChar[J],1);
tmpPChar[CharCount]:=#0;
FOpenBoxCode:=strPas(tmpPChar);
Read(FAutoOpenBox,SizeOf(FAutoOpenBox));
Read(FFootSpaceRow,SizeOf(FFootSpaceRow));
Read(FPageWidth,SizeOf(FPageWidth));
Read(FTitleRowCount,SizeOf(FTitleRowCount));
Read(FQuantityDiciaLength,SizeOf(FQuantityDiciaLength));
Read(FMoneyDiciaLength,SizeOf(FMoneyDiciaLength));
Read(RowCount,SizeOf(RowCount));
FReportLines.Clear;
For I:=0 to RowCount-1 do
begin
Read(CharCount,sizeOf(CharCount));
for J:=0 to CharCount-1 do
Read(tmpPChar[J],1);
tmpPChar[CharCount]:=#0;
FReportLines.Add(strPas(tmpPChar));
end;
Read(FFontSize,sizeOf(FFontSize));
end;
FOpenFlag:=True;
FFilePathName:=FileName;
FFont.Size:=FFontSize;
Finally
PosFile.Free;
end;
end;
procedure TPosReport.SaveToFile(FileName: String);
var
FileFlag:Word;
PosFile:TFileStream;
I:integer;
RowCount:integer;
tmpPChar:Array[0..3000] of Char;
J,charCount:integer;
begin
FFontSize:=FFont.Size;
PosFile:=TFileStream.Create(FileName,fmOpenWrite Or fmCreate);
try
with PosFile do
begin
FileFlag:=FileVersion;
Write(FileFlag,SizeOf(FileFlag)); //保存文件版本類型
{保存小票參數(shù)}
Write(FDriveMode,SizeOf(FDriveMode));
CharCount:=length(FComName);
strPCopy(tmpPchar,FComName);
write(CharCount,sizeOf(charCount));
for J:=0 to CharCount-1 do
Write(tmpPchar[J],1);
Write(FComByte,SizeOf(FComByte));
CharCount:=length(FOpenBoxCode);
write(CharCount,sizeOf(CharCount));
strPCopy(tmpPChar,FOpenBoxCode);
For J:=0 to CharCount-1 do
Write(TmpPChar[J],1);
Write(FAutoOpenBox,SizeOf(FAutoOpenBox));
Write(FFootSpaceRow,SizeOf(FFootSpaceRow));
Write(FPageWidth,SizeOf(FPageWidth));
Write(FTitleRowCount,SizeOf(FTitleRowCount));
Write(FQuantityDiciaLength,SizeOf(FQuantityDiciaLength));
Write(FMoneyDiciaLength,SizeOf(FMoneyDiciaLength));
RowCount:=FReportLines.Count;
Write(RowCount,SizeOf(RowCount));
For I:=0 to RowCount-1 do
begin
CharCount:=length(FReportLines[i]);
write(charCount,SizeOf(CharCount));
strPCopy(tmpPChar,FReportLines[I]);
For J:=0 to CharCount-1 do
Write(tmpPChar[J],1);
end;
Write(FFontSize,sizeOf(FFontSize));
end;
FOpenFlag:=True;
FFilePathName:=FileName;
Finally
PosFile.Free;
end;
end;
procedure TPosReport.SetBodyFields(AValue: TDataSet);
begin
FBodyType:=btDataSet;
FDataSet:=AValue;
end;
procedure TPosReport.SetBodyFields(AValue: TYTXStringGridEh);
begin
FBodyType:=btGrid;
FGrid:=AValue;
end;
procedure TPosReport.SetTitleVars(TitleVars: TReportVars);
begin
if FTitleVars<>TitleVars then
FTitleVars:=TitleVars;
end;
procedure TPosReport.ShowVarList(VarType: TDataType;
out ListFields: TListBox);
var
I:integer;
ListVars:TReportVars;
begin
ListFields.Clear;
if VarType<>DtBodyFields then //系統(tǒng)及表頭字段處理
begin
if VarType=DtSysFields then
ListVars:=FSysVars;
if VarType=DtTitleFields then
ListVars:=FTitleVars;
ListFields.Clear;
if Assigned(ListVars) then
begin
for I:=0 to ListVars.ItemCount-1 do
begin
ListFields.Items.AddObject(ListVars.Items[i].Caption,TObject(ListVars.Items[i]));
end;
end;
end else //表體處理
begin
if (FBodyType=btGrid) and assigned(FGrid) then
begin
For I:=1 to FGrid.ColCount-1 do
begin
if FGrid.Columns[I].Visible then
begin
ListFields.Items.AddObject(FGrid.Columns[i].Title.Caption,TObject(FGrid.Columns[I]));
end;
end;
end;
if (FBodyType=btDataSet) and assigned(FDataSet) then
begin
if TDataSet(FDataSet).Fields[i].Visible then
begin
ListFields.Items.AddObject(TDataSet(FDataSet).Fields[I].DisplayName,TObject(TDataSet(FDataSet).Fields[I]));
end;
end;
end;
end;
function TPosReport.GetFont: TFont;
begin
Result:=FFont;
end;
procedure TPosReport.SetFont(Value: TFont);
begin
if FFont<>Value then
FFont.Assign(Value);
end;
function TPosReport.UpcaseCurrency(Value: extended): string;
begin
Result:=CurrencyToStr(Value);
end;
{不用Windows驅(qū)動(dòng)打印}
function TPosReport.PrintNoDrive(Source: TStringList): Boolean;
var
PrtFile:TextFile;
I:integer;
Pstr:string;
PHandle:THandle;
FileHandle:integer;
begin
try
//查檢端口是否可用
PHandle:=Createfile(PChar(ComName),0,0,nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
if PHandle=INVALID_HANDLE_VALUE then
begin
ShowMessage(ComName + ' 端口不可用,打印將被取消!');
exit;
end;
//檢查是否有打印機(jī)
{filehandle:=fileopen(ComName,fmopenwrite);
fileclose(filehandle);
if filehandle>=0 then
begin
showmessage('在端口[' + ComName + ']上沒有安裝打印機(jī),打印將被取消!');
exit;
end;}
Assignfile(PrtFile,ComName);
Rewrite(PrtFile);
for I:=0 to Source.Count-1 do
begin
Pstr:=Source.Strings[I] + char(10); //打印的數(shù)量源
write(PrtFile,Pstr);
end;
if AutoOpenBox then
begin
Rewrite(PrtFile);
Write(PrtFile,OpenBoxCode); //如果啟用打印后開錢箱,則自動(dòng)打開錢箱
end;
write(PrtFile,'眾智金軟 13668510783');
except
On E:Exception do
begin
showMessage(E.Message);
Result:=false;
end;
end;
CloseFile(PrtFile);
end;
function TPosReport.PrintWithDrive(Source: TStringList): boolean;
var
txtWidth:integer;
txtHeight:integer;
Row:integer;
RowHeight:Integer;
PosY:integer;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -