PB实现报表字体放大缩小功能
所众周知PB的绝活是datawindow,可以说通过datawindow能够完成任何一切对数据库的操作,因此介绍PB对数据库的操作的文章与例子可以说"比比皆是"。今天我为大家介绍一个用datawindow的Describe函数实现实现"报表字体放大缩小功能"。在日常应用中我们的报表往往因为一二行数据而不得不打印成二张纸,而且这样的情况时常发生,这样时间长了对公司的资源造成了很大的浪费,而且原本一张完整的报表就因为一二行数据而分成二张纸,从整体上来说也不太"雅观"。出于上述因素我用PB开发了一个"报表字体放大缩小功能"的模板,供我所有的报表所继承。
下面把这功能向大家介绍一下:
开发具为PB7.0,连接的数据库为"EAS Demo DB"。
1、首先我们先建一个application命名为"datawindowprint",再建一个window命名为"w_main",建一个 datawindw明名为"d_emp";
2、在windows"w_main"建一个"DropDownListBox"控件命名"ddlb_1"用于控制"字体"的大小,一个"editmask"控件命名"em_1"用于控制"行距",一个"datawindow"命名为"dw_1";
3、我们主要代码在如图如示的"确定"按钮中,主要代码如下:
int li_font,li_width
string ls_height
ls_height=dw_1.object.datawindow.detail.height//首先得到报表中原始的行高,这样可以为我们在往下的报表缩放中起参照作用。
messagebox(','当前行距为:'+string(ls_height))
li_font=integer(trim(ddlb_1.text))*(-1)//控制字体大小
string ls_ObjString,ls_object[],ls_ObjHolder,ll,ls_font[],ls_cfont[],ls_width[],ls_widtht[]
int li_Tab,li_Start,li_Count=1
ls_ObjString = dw_1.Describe("Datawindow.Objects")
li_Tab = Pos(ls_ObjString, "~t", 1)
//下面我们通过循环得到每一列的列名及每一列的标题名
Do While li_Tab > 0
ls_ObjHolder = Mid(ls_ObjString, li_Start, (li_Tab - li_Start))
If (dw_1.Describe(ls_ObjHolder + ".type") = "column" Or "column" = "*") And &
(dw_1.Describe(ls_ObjHolder + ".band") = "detail" Or "detail" = "*") Then
li_Count ++
ls_object = ls_ObjHolder
End if
li_Start = li_Tab + 1
li_Tab = Pos(ls_ObjString, "~t", li_Start)
Loop
ls_object=mid(ls_ObjString,li_Start)//保证最后一列也在里面
int li_upp,i
li_upp=UpperBound(ls_object[])//得到列数
string ls_tempw,ls_tempw1
//下面实现每一列字体的缩放
for i=1 to li_upp
ls_font=trim(ls_object)+".font.height="+string(li_font)
ls_cfont=trim(ls_object)+"_t.font.height="+string(li_font)
ls_tempw=dw_1.Describe(trim(ls_object)+".x")
ls_tempw1=dw_1.Describe(trim(ls_object)+"_t.x")
dw_1.Modify(ls_font)
dw_1.Modify(ls_cfont)
next
string ls_data
ls_data =trim(em_1.text)
dw_1.object.datawindow.detail.height=ls_data//控制行距
dw_1.SetTransObject(SQLCA)
PB开发在商业POS中的应用
--------------------------------------------------------------------------------
几年前我们的商场内的POS系统可以基本上都是C的杰作,但是用C开发系统的周期大家皆知很长,随着PB应用的日益完美,商业POS机硬件的不断长级,我们现行的商场中的POS机跑WIN95已经不成问题,这样为我们开发POS应用程序提供了一个十分完善的前提,而用PB开发系统的开发周期比其它一些开发工具要快的多,而和C比较的话开发周期至少也能缩短三分之二,如至大的诱惑我相信无论谁都会心动。
大家都知道现在商品的名称的越来越长,而我们POS机的打印纸一般都在8厘米左右,我们的收款一般打印的为商品代码、商品名称、单价、数量、金额,然而8厘米的宽只打印"商品名称"都不够,这样在打印前必须对"商品名称"进行折行处理。下面我为大家叙述一下我对"商品名称"是如何处理的。
由于POS机的主要任务是收款,所以我们在应用的窗口中要建一个datawindow,有人肯定会说这样我们可以通过设置datawindow的属性就可以完成对"商品名称"的折行处理。不行,折行处理的datawindow为grid时可以但打印时打出来的收款小票一种情况会有一个个网格另一种情况是"一串字符给截掉了",这样会非常难看而且没有一个商家的收款小票是这样,如果datawindow为group则会很费纸而且也不好看。我们建的datawindow为grid类型的,其作用只是暂存数据而已。
datawindow的列有s_gdsno(商品代码)、s_gdsname(商品名称)、d_price(单价)、d_count(数量)、d_amt(金额)
此函数用于在PB中任意取子串(其中含有汉字,数字,字母,符号等),在此的功能是完成对"商品名称"的折行
/*********as_input为一字符串,as_len为从起始位置开始的长度********/
function wf_midstring(string as_input,long as_len) return string
string ls_strret,ls_str[]
long ll_lens,i
ll_lens=len(as_input)
for i=1 to ll_lens
if asc(mid(as_input,i,1))<128 then
ls_str=mid(as_input,i,1)
else
ls_str=mid(as_input,i,2)
i++
end if
next
for i=1 to as_len
ls_strret=ls_strret+ls_str
next
return ls_strret
/*************下面打印的具体实现**************************/
string ls_name,ls_namestr
ll_file = fileopen("lpt1",linemode!,write!)
ll_rows=dw_1.rowcount()
filewrite(ll_file,'代码 商品名称 单价 数量 金额')
for i=1 to ll_rows
ls_name=dw_1.GetItemString(i, "s_gdsname")
if len(ls_name)>30 then
ls_namestr=wf_midstring(ls_name,30)
filewrite(ll_file,dw_1.GetItemString(i, "s_gdsno")+'
'+wf_midstring(ls_name,30)+' '+string(dw_1.GetItemNumber(i,d_price))+'
'+string(dw_1.GetItemNumber(i,d_count))+string(dw_1.GetItemNumber(i,d_amt))+'~n')
if len(ls_namestr)<>30 then
filewrite(ll_file,' '+wf_midstring(ls_name,32,100)+'~n')
else
filewrite(ll_file,' '+wf_midstring(ls_name,31,100)+'~n')
end if
else
filewrite(ll_file,dw_1.GetItemString(i, "s_gdsno")+' '+ls_name+'
'+string(dw_1.GetItemNumber(i,d_price))+'
'+string(dw_1.GetItemNumber(i,d_count))+string(dw_1.GetItemNumber(i,d_amt))+'~n')
end if
next
fileclose(ll_file)
wf_midstring(string as_input,long as_len)这个函数也可以给其它应用所调用,用其实现对任意字符串的截取任意位置的子串
页:
[1]