打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
delphi 套打

http://www.delphibbs.com/keylife/iblog_show.asp?xid=31333

利用DELPHI开发套打辅助设计软件


思想是在计算机屏幕上模拟真实纸张的大小,让设计人员在模拟纸张上添加打印域,并根据需要设置打印域大小及字体属性,还可把扫描所得的纸张格式作为背景图片来参照,以增强设计时的视觉定位能力,在设计完成后将纸张相关数据及纸张中打印域的相关数据保存到文件中,以便在报表打印程序中打开,并读取相关数据来加以利用。

设计第一步:构造屏幕模拟纸张
套打辅助设计的关键是在计算机屏幕上模拟真实纸张的大小,考虑到要在模拟纸张上放置打印域及设置背景图片,因此决定从Tpanel控件中继承,创建一个新的Panel控件,使其既具有Panel的特点又具有Canvas的特点,并对构造函数和Paint过程进行重写。
TDSNPanel=class(TPanel)
public
constructor Create(AOwner: TComponent); override;
procedure Paint; override;
property Canvas;
end;

FDSNPanel:TDSNPanel;

constructor TDSNPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Color:=clWhite;
Visible:=False;
end;

procedure TDSNPanel.Paint;
begin
with Canvas do
begin
SetMapMode(Canvas.Handle,mm_AnIsotropic);
//设置比例可变的映射模式,X、Y轴单位相同,纵横的比例为1:1
//用这种映射模式可以做到当窗口大小发生变化时图形的大小也会相应的发生改变
SetWindowExtEx(Canvas.Handle,Printer.PageWidth,Printer.PageHeight,nil);
//设置指定设备场景窗口范围为打印机默认纸张大小
//按微软定义A4纸的类型值为9 自定义纸张类型值为$100
SetViewportExtEx(Canvas.Handle,Width,Height,nil);
//设置设备场景视口范围为Canvas大小
SetViewportOrgEx(Canvas.Handle,0,0,nil);
//设置设备场景视口起点为Canvas左上角
Brush.Color:=clWhite;
Brush.Style:=bsSolid;
FillRect(ClientRect);
//填充模拟纸张为白色
Font.PixelsPerInch:=GetDeviceCaps(Printer.Handle,LOGPIXELSX);
if Font.PixelsPerInch>GetDeviceCaps(Printer.Handle,LOGPIXELSY) then
Font.PixelsPerInch:=GetDeviceCaps(Printer.Handle,LOGPIXELSY);
//设置Canvas字符分辨率
end;
end;
//下面这段FormCreate描述了如何建立模拟纸张
procedure TDSNForm.FormCreate(Sender: TObject);
begin
Application.HintPause:=0;
Application.HintHidePause:=-1;
//永久显示打印域Hint;
FDSNMode:=smFullPage;
FDSNPanel:=TDSNPanel.Create(Self);
with FDSNPanel do
begin
Parent:=sbxMain;//sbxMain为ScrollBox类控件
BorderStyle:=bsSingle;
Ctl3D:=False;
Left:=8;
Top:=8;
end;
FImage:=TImage.Create(Self);//创建背景图片载体FImage
with FImage do
begin
Parent:=FDSNPanel;
Align:=alClient;//设置背景图片随FDSNPanel而改变大小
Stretch:=True;//设置图象缩放
OnClick:=FImageClick;
end;
AFIdx:=0;
ChangedID:='N';
FPageDet.PBKPic:='';
CreateUPDID:=-1;
CloseFormID:=-1;
PPaper:=DMPAPER_A4; //Default is A4 DMPAPER_A4=9
UpdatePageSetup;
end;

设计第二步:实现模拟纸张按显示比例显示
为了让设计人员能够统观全局或更清淅地观察模拟纸张上的打印域,提供按不同比例显示模拟纸张大小的功能是不可缺少的,并且,在改变纸张显示大小的同时,要对纸张上的所有打印域进行同步处理,使其能适应纸张的变化。在此,我借助模拟纸张前后大小的比例来重新设定打印域的位置及大小。

TDSNMode = (sm200,sm150,sm100,sm75,sm50,sm25,sm10,smPageWidth,smFullPage);
//显示比例模式为200%、150%、100%、75%、50%、25%、10%、页宽、全景

DSNForm: TDSNForm;
FDSNMode:TDSNMode;
FDSNPanel:TDSNPanel;
CreateUPDID,CloseFormID:Integer;
//CreateUPDID控制FDNSPanel上的字段是否随纸张的变化而变化:0(变化)
//CloseFormID控制在窗体关闭时是否UpdatePageSetUp:0(不要)
//初始值都为-1

procedure TDSNForm.UpdatePageSetUp;
var
Scaling: Integer;
OWidth,OHeight,NWidth,NHeight:Integer;
//Owidth,Oheigh为改变大小前的纸张大小,NWidth,Nheight为改变大小后的纸张大小
WBL,HBL:Real;
//WBL为宽度前后比例,HBL为高度前后比例
begin
pnlShadow.Visible:=False;
with FDSNPanel,Printer do
begin
Visible:=False;
OWidth:=Width;
OHeight:=Height;
case FDSNMode of
sm200: Scaling:=200;
sm150: Scaling:=150;
sm100: Scaling:=100;
sm75: Scaling:=75;
sm50: Scaling:=50;
sm25: Scaling:=25;
sm10: Scaling:=10;
smPageWidth: begin
with sbxMain do
begin
VertScrollBar.Position:=0;
HorzScrollBar.Position:=0;
end;
Scaling:=1;
Left:=8;
Top:=8;
Width:=sbxMain.Width-20-GetSystemMetrics(sm_CXVScroll);
Height:=Width*GetDeviceCaps(Printer.Handle,VertSize) div
GetDeviceCaps(Printer.Handle,HorzSize);
with sbxMain do
begin
VertScrollBar.Range:=FDSNPanel.Height+16;
HorzScrollBar.Range:=0;
end;
end;
smFullPage: begin
Scaling:=1;
with sbxMain do
begin
VertScrollBar.Range:=0;
HorzScrollBar.Range:=0;
VertScrollBar.Position:=0;
HorzScrollBar.Position:=0;
end;
Height:=sbxMain.ClientHeight-16;
Width:=Height*GetDeviceCaps(Printer.Handle,HorzSize) div
GetDeviceCaps(Printer.Handle,VertSize);
if Width>sbxMain.ClientWidth-16 then
begin
Width:=sbxMain.ClientWidth-16;
Height:=Width*GetDeviceCaps(Printer.Handle,VertSize) div
GetDeviceCaps(Printer.Handle,HorzSize);
end;
Left:=(sbxMain.ClientWidth-Width) div 2;
Top:=(sbxMain.ClientHeight-Height) div 2;
end;
else Scaling:=1;
end;
case FDSNMode of
sm200..sm10: begin
with sbxMain do
begin
VertScrollBar.Position:=0;
HorzScrollBar.Position:=0;
end;
Left:=8;
Top:=8;
Width:=Scaling*PageWidth*PixelsPerInch div
GetDeviceCaps(Printer.Handle,LOGPIXELSX) div 100;
Height:=Width*GetDeviceCaps(Printer.Handle,VertSize) div
GetDeviceCaps(Printer.Handle,HorzSize);
with sbxMain do
begin
VertScrollBar.Range:=FDSNPanel.Height+16;
HorzScrollBar.Range:=FDSNPanel.Width+16;
end;
end;
end;
Visible:=True;
NWidth:=Width;
NHeight:=Height;
end;
with pnlShadow do
begin
Left:=FDSNPanel.Left+4;
Top:=FDSNPanel.Top+4;
Width:=FDSNPanel.Width;
Height:=FDSNPanel.Height;
Visible:=True;
end;
if CreateUPDID=0 then
begin
WBL:=NWidth/OWidth;
HBL:=NHeight/OHeight;
UpdateCompPos('FDSNPanel',WBL,HBL);
//将双亲为FDSNPanel的Panel控件,即打印域,按WBL、HBL重置
end
else
CreateUPDID:=0;
end;

AField:array of TPanel;
//记录打印域的动态数组
AFIdx:integer;
//动态数组元素个数,即模拟纸张上打印域个数
procedure TDSNForm.UpdateCompPos(ParentName: string; WBL, HBL: Real);
var
i:integer;
begin
for i:= 0 to AFIdx-1 do
begin
AField[i].Left:=Round(AField[i].Left*WBL);
AField[i].Top:=Round(AField[i].Top*HBL);
AField[i].Width:=Round(AField[i].Width*WBL);
AField[i].Height:=Round(AField[i].Height*HBL);
end;
end;

设计第三步:添加打印域及改变打印域属性
打印域在本程序中以Panel控件来实现,考虑到最大限度地给设计人员提供方便,每一个打印域的位置及大小的改变除了通过拖曳来实现外,还可通过键盘进行操作,并且通过键盘和鼠标的联合操作,能够实现全选、选择部分、移位,并结合弹出菜单改变所选打印域的大小、位置、字符属性、和进行删除。

AField:array of TPanel;
AFIdx:integer;
//动态数组元素个数,即模拟纸张上打印域个数
CurField:TPanel;
//标注为黄色的打印域,即当前焦点所在的打印域或选中的打印域

procedure TDSNForm.CompMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i:integer;
begin
CurField:=Sender As TPanel;
//获取当前鼠标左键所点中的打印域
if ssRight in Shift then Exit;//检查鼠标右键是否按下
if ssLeft in Shift then
if ssShift in shift then //检查鼠标左键和SHIFT键是否按下
begin //如果当前打印域是选取中过的则撤消选择
if (Sender As TPanel).Color=clYellow then
(Sender As TPanel).Color:=clBtnFace
else //否则进行选择
(Sender As TPanel).Color:=clYellow;
(Sender As TPanel).Repaint;
end
else //检查只有鼠标左键按下
begin
for i:=0 to AFIdx-1 do
begin
AField[i].Color:=clBtnFace;
AField[i].Repaint;
end;
(Sender As TPanel).Color:=clYellow;
(Sender As TPanel).Repaint;
end;
ReleaseCapture;
if (x>=0)and(x<=6) then
begin
//左上角方向改变大小
if (y>=0)and(y<=6) then
(Sender As TControl).Perform(WM_SysCommand,$F004,0);
//左侧方向改变大小
if (y>6)and(y<(Sender As TControl).Height-6) then
(Sender As TControl).Perform(WM_SysCommand,$F001,0);
//左下角方向改变大小
if (y>=(Sender As TControl).Height-6)and(y<=(Sender As TControl).Height) then
(Sender As TControl).Perform(WM_SysCommand,$F007,0);
ChangedID:='Y';
end
else
if (x>6)and(x<(Sender As TControl).Width-6) then
begin
//上侧方向改变大小
if (y>=0)and(y<=6) then
(Sender As TControl).Perform(WM_SysCommand,$F003,0);
//移动控件
if (y>6)and(y<(Sender As TControl).Height-6) then
(Sender As TControl).Perform(WM_SysCommand,$F012,0);
//下侧方向改变大小
if (y>=(Sender As TControl).Height-6)and(y<=(Sender As TControl).Height) then
(Sender As TControl).Perform(WM_SysCommand,$F006,0);
ChangedID:='Y';
end
else
if (x>=(Sender As TControl).Width-6)and(x<=(Sender As TControl).Width) then
begin
//右上角方向改变大小
if (y>=0)and(y<=6) then
(Sender As TControl).Perform(WM_SysCommand,$F005,0);
//右侧方向改变大小
if (y>6)and(y<(Sender As TControl).Height-6) then
(Sender As TControl).Perform(WM_SysCommand,$F002,0);
//右下角方向改变大小
if (y>=(Sender As TControl).Height-6)and(y<=(Sender As TControl).Height) then
(Sender As TControl).Perform(WM_SysCommand,$F008,0);
ChangedID:='Y'; //打印域发生变化
end;
end;

procedure TDSNForm.CompMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
(Sender As TControl).Hint:='左:'+IntToStr((Sender As TControl).Left)+
' 顶:'+IntToStr((Sender As TControl).Top)+
' 宽:'+IntToStr((Sender As TControl).Width)+
' 高:'+IntToStr((Sender As TControl).Height);
//显示打印域位置及大小
if (x>=0)and(x<=6) then
begin
if (y>=0) and (y<=6) then (Sender As TControl).Cursor:=crSizeNWSE;
if (y>6) and (y<(Sender As TControl).Height-6) then
(Sender As TControl).Cursor:=crSizeWE;
if (y>=(Sender As TControl).Height-6)and(y<=(Sender As TControl).Height) then (Sender As TControl).Cursor:=crSizeNESW;
end
else
if (x>6)and(x<(Sender As TControl).Width-6) then
begin
if (y>=0)and(y<=6) then (Sender As TControl).Cursor:=crSizeNS;
if (y>6)and(y<(Sender As TControl).Height-6) then
(Sender As TControl).Cursor:=crArrow;
if (y>=(Sender As TControl).Height-6)and(y<=(Sender As TControl).Height) then
(Sender As TControl).Cursor:=crSizeNS;
end
else
if (x>=(Sender As TControl).Width-6)and(x<=(Sender As TControl).Width) then
begin
if (y>=0)and(y<=6) then (Sender As TControl).Cursor:=crSizeNESW;
if (y>6)and(y<(Sender As TControl).Height-6) then
(Sender As TControl).Cursor:=crSizeWE;
if (y>=(Sender As TControl).Height-6)and(y<=(Sender As TControl).Height) then
(Sender As TControl).Cursor:=crSizeNWSE;
end;
end;

procedure TDSNForm.tbtNewFieldClick(Sender: TObject);
//添加新的打印域
begin
Inc(AFIdx);
SetLength(AField,AFIdx);
AField[AFIdx-1]:=TPanel.Create(Self);
with AField[AFIdx-1] do
begin
Parent:=FDSNPanel;
Caption:='AField['+IntToStr(AFidx-1)+']';
PopupMenu:=PanelPopMenu;
Ctl3D:=False;
Left:=8;
Width:=100;
Height:=20;
Top:=8;
ShowHint:=True;
OnMouseDown:=CompMouseDown;
OnMouseMove:=CompMouseMove;
end;
ChangedID:='Y';
end;

procedure TDSNForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
//用鼠标和键盘联合控制打印域大小及位置
var
FPosL,FPosT,FSizeW,FSizeH,i:integer;
//FposL为Left向位移、FposT为Top向位移
//FsizeW为打印域宽度变化值、FsizeH为打印域高度变化值
begin
FPosL:=0; FPosT:=0; FSizeW:=0; FSizeH:=0;
if (ssCtrl in Shift) and (Key=$41) then
begin
for i:=0 to AFIdx-1 do AField[i].Color:=clYellow;
Exit;
end; //Ctrl+A全选打印域
if (ssCtrl in Shift) and (Key=$25) then FPosL:=-1; //Ctrl+Left向左移动打印域
if (ssCtrl in Shift) and (Key=$26) then FPosT:=-1; //Ctrl+Top向上移动打印域
if (ssCtrl in Shift) and (Key=$27) then FPosL:=1; //Ctrl+Right向右移动打印域
if (ssCtrl in Shift) and (Key=$28) then FPosT:=1; //Ctrl+Down向下移动打印域
if (ssShift in Shift) and (Key=$25) then FSizeW:=-1; //Shift+Left向左增加打印域宽度
if (ssShift in Shift) and (Key=$26) then FSizeH:=-1; //Shift+Top向上增加打印域高度
if (ssShift in Shift) and (Key=$27) then FSizeW:=1; //Shift+Right向右增加打印域宽度
if (ssShift in Shift) and (Key=$28) then FSizeH:=1; //Shift+Down向下增加打印域高度
for i:=0 to AFIdx-1 do
//重置打印域
if AField[i].Color=clYellow then
with AField[i] do
begin
Left:=Left+FPosL;
Top:=Top+FPosT;
Width:=Width+FSizeW;
Height:=Height+FSizeH;
ChangedID:='Y';
end;
end;

设计第四步:添加、删除背景图片
由于在空白的模拟纸张上设置打印域没有参照物,在一定程度上设计人员还是要借助尺来进行,为了解决这一问题,我在程序中引入了背景图片这一概念,通过将扫描所得的格式图片设为背景图片,设计人员就可以快速为每一个打印域设置大小。

procedure TDSNForm.LoadBackGroundPic(PicFileName: string);
var
JpegImage1:TJpegImage;
TmpBit:TBitMap;
begin
if UpperCase(ExtractFileExt(PicFileName))='.BMP' then
FImage.Picture.LoadFromFile(PicFileName);
if UpperCase(ExtractFileExt(PicFileName))='.JPG' then
//处理JPEG图片
begin
JpegImage1:=TJpegImage.Create ;
JpegImage1.LoadFromFile(PicFileName);
TmpBit:=TBitMap.Create;
TmpBit.Width:=JpegImage1.Width;
TmpBit.Height:=JpegImage1.Height;
TmpBit.Canvas.StretchDraw(Rect(0,0,TmpBit.Width,TmpBit.Height),JpegImage1);
FImage.Picture.Bitmap:=TmpBit;
JpegImage1.Free;
TmpBit.Free;
end;
end;

procedure TDSNForm.tbtBPicClearClick(Sender: TObject);
begin
FImage.Picture:=nil;
UpdatePageSetUp;
FPageDet.PBKPic:='';//将背景图片置空
ChangedID:='Y';
end;

设计第五步:保存设计结果
在完成辅助设计后,需要将设计结果存档成文件,以便在报表类程序中打开并利用设计数据来完成套打。存档数据分成二部分,一部分是文件识别标志、纸张类型、大小、偏移及背景图片,另一部分是打印域在模拟纸张中的比例位置、打印域名称及字符属性。

PageDetails=Record
RptID:string[30];//文件识别标志
PPaperSize,PWidth,PHeight,POffsetX,POffsetY:Integer;//纸张类型、大小、位移
PBKPic:string[255];//背景图片存放位置
end;

FieldPosType=Record
FPLeft,FPTop,FPWidth,FPHeight:Real;//占整张纸的打印域比例位置
FCaption:string[20];//打印域名称
FFontsCharSet:TFontCharset;//字符属性
FFontsColor:TColor;
FFontsHeight:Integer;
FFontName:String[50];
FFontPitch:TFontPitch;
FFontSize:Integer;
FFontStyle:TFontStyles;
end;

procedure TDSNForm.tbtSaveClick(Sender: TObject);
var
i:integer;
PageSize:TPoint;
begin
SavDlg.DefaultExt :='*.rpt';
SavDlg.Filter :='报表文件 (*.rpt)|*.rpt';
SavDlg.Title :='存为报表文件';
if SavDlg.Execute then
begin
if FileExists(SavDlg.Filename) then
begin
if Application.MessageBox('文件已存在要覆盖吗?','文件检查',MB_OKCANCEL)<>IDOK then Exit;
end
else
begin
FCFile:=FileCreate(SavDlg.FileName);
if FCFile<0 then
begin
STB.Panels[1].Text:='错误:文件创建错误。';
STB.Repaint;
ShowMessage('文件创建错误,请作相应检查。');
Exit;
end
else
FileClose(FCFile);
end;
FCFile:=FileOpen(SavDlg.FileName,fmOpenWrite);
if FCFile<0 then
begin
STB.Panels[1].Text:='错误:文件写打开错误。';
STB.Repaint;
ShowMessage('文件写打开错误,请作相应检查。');
Exit;
end;
with FPageDet do
begin
Escape(Printer.Handle,GETPHYSPAGESIZE,0,nil,@PageSize);
//取得纸张的物理大小,单位为像素。
POffsetX:=GetDeviceCaps(Printer.Handle,PHYSICALOFFSETX);
POffsetY:=GetDeviceCaps(Printer.Handle,PHYSICALOFFSETY);
//取得纸张的物理位移。
PWidth:=Round(PageSize.x*254/GetDeviceCaps(Printer.Handle,LOGPIXELSX));
PHeight:=Round(PageSize.y*254/GetDeviceCaps(Printer.Handle,LOGPIXELSY));
//1英寸=25.4mm 此为纸张的物理尺寸,单位为0.1mm
RptID:='ChenKais Report Designer';
PPaperSize:=PPaper;
end;
try
FileWrite(FCFile,FPageDet,SizeOf(FPageDet));
for i:=0 to AFIdx-1 do
begin
FCRec.FPLeft:=AField[i].Left/FDSNPanel.Width;
FCRec.FPTop:=AField[i].Top/FDSNPanel.Height;
FCRec.FPWidth:=AField[i].Width/FDSNPanel.Width;
FCRec.FPHeight:=AField[i].Height/FDSNPanel.Height;
FCRec.FCaption:=AField[i].Caption;
FCRec.FFontsCharSet:=AField[i].Font.Charset;
FCRec.FFontsColor:=AField[i].Font.Color;
FCRec.FFontsHeight:=AField[i].Font.Height;
FCRec.FFontName:=AField[i].Font.Name;
FCRec.FFontPitch:=AField[i].Font.Pitch;
FCRec.FFontSize:=AField[i].Font.Size;
FCRec.FFontStyle:=AField[i].Font.Style;
FileWrite(FCFile,FCRec,SizeOf(FCRec));
end;
FileClose(FCFile);
STB.Panels[1].Text:='报表文件就绪';
DSNForm.Caption:='报表设计工具'+'--['+SavDlg.FileName+']';
ChangedID:='N';
except
FileClose(FCFile);
ShowMessage('文件写入错误,文件已被关闭。');
STB.Panels[1].Text:='错误:报表文件写入错误。';
end;
end;
end;

设计第六步:在报表类程序中应用
在完成辅助设计并将设计结果存档成文件后,我们就可在报表类程序中打开并利用设计数据来完成套打,而且还可继续使用设计工具进行打印域微调。在应用时,你需要了解上面的文件存档格式,以便正确读取数据。这里,我把辅助设计在我公司船、货代发票管理系统中的应用作为示例来展示并一同结束这篇文章。

procedure TInvForm.WriteFieldValue(Canvas: TCanvas; FieldName,
FieldValue: String; uFormat: Cardinal);
//Canvas为打印机画布
var
Idx:integer;
ValStr:string;
R:TRect;
begin
ValStr:=FieldValue;
for Idx:=0 to AFIdx-1 do
if AField[Idx].FCaption=FieldName then
with AField[Idx] do
begin
R.Left:=Round(Printer.PageWidth*FPLeft);
R.Top:=Round(Printer.PageHeight*FPTop);
R.Right:=R.Left+Round(Printer.PageWidth*FPWidth);
R.Bottom:=R.Top+Round(Printer.PageHeight*FPHeight);
with Canvas do
begin
Font.Charset := FFontsCharSet;
Font.Color := FFontsColor;
Font.Height := FFontsHeight;
Font.Name := FFontName;
Font.Pitch := FFontPitch;
Font.Size := FFontSize;
Font.Style := FFontStyle;
DrawText(Handle,PChar(ValStr),Length(ValStr),R,uFormat);
end;
end;
end;

procedure TInvForm.PSDraw(Sender: TObject; Canvas: TCanvas;
PageNumber: Integer; DrawTarget: TDrawTarget);
var
PX,PY: Integer;
R: TRect;
SRow:integer;
RSID:string;
begin
with Canvas do
begin
PX:=Printer.PageWidth;
PY:=Printer.PageHeight;
R.Left:=FPageDet.POffsetX;
R.Right:=PX+FPageDet.POffsetX;
R.Top:=FPageDet.POffsetY;
R.Bottom:=PY+FPageDet.POffsetY;
if PrintBMP then StretchDraw(R,Image2.Picture.Bitmap);
//如果有背景图片则处理背景图片
end;
WriteFieldValue(Canvas,'ISSCNNM',ISSCNNM.Text,dt_Left or dt_WordBreak);
//在打印机画布上打印名为ISSCNNM的打印域,打印方向从左至右并自动折行
WriteFieldValue(Canvas,'ISSENNM',ISSENNM.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'ACTNO',ACTNO.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'COMPNM',COMPNM.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'ISSDATE',ISSDATE.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'BANKNM',BANKNM.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'BANKACT',BANKACT.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'VSLVOY',VSLVOY.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'VOYDATE',VOYDATE.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'PFROM',PFROM.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'LPORT',LPORT.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'DPORT',DPORT.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'DEST',DEST.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'MEMO',MEMO.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'INVTOTAL',BANKCUR.Text+INVTOTAL.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'MONEYBIG',FEMBig.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'ISSADDR',ISSADDR.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'ISSTELP',ISSTELP.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'ISSLICN',ISSLICN.Text,dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'NAMEDSC',NAMEDSC.Text,dt_Left or dt_WordBreak);
for SRow:=0 to 6 do
begin
RSID:=IntToStr(SRow);
WriteFieldValue(Canvas,'BLNO'+RSID,SAG.Cells[0,SRow],dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'ITEMNM'+RSID,SAG.Cells[1,SRow],dt_Left or dt_WordBreak);
WriteFieldValue(Canvas,'QUANTITY'+RSID,SAG.Cells[2,SRow],dt_Right or dt_WordBreak);
WriteFieldValue(Canvas,'RATE'+RSID,SAG.Cells[3,SRow],dt_Right or dt_WordBreak);
WriteFieldValue(Canvas,'AMOUNT'+RSID,SAG.Cells[4,SRow],dt_Right or dt_WordBreak);
end;
end;


以上应用在IBM AS/400 9406-510上,操作系统为OS/400 VER3.7, 数据库为DB2/400,客户端开发工具为BORLAND/INPRISE公司的DELPHI VER4.0,数据库驱动程序为IBM AS/400 CLIENT ACCESS VER3.2
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
让窗体自适应屏幕分辨率的变化
delphi实现屏幕截图
Delphi多线程编程 - 编程技巧文章 - 蓝鸟软件-19
delphi7编程技巧与实例精解之图形图像(修正重绘变形)
简单的 "双缓冲" 绘图的例子
Delphi 6 程序员代码编写标准指南三
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服