在日常應用中我們的報表往往因為一二行數據而不得不打印成二張紙,而且這樣的情況時常發生,這樣時間長了對公司的資源造成了很大的浪費,而且原本一張完整的報表就因為一二行數據而分成二張紙,從整體上來說也不太"雅觀"。出於上述因素我用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[li_Count] = ls_ObjHolder
End if
li_Start = li_Tab + 1
li_Tab = Pos(ls_ObJString, "~t", li_Start)
Loop
ls_object[li_Count+1]=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[i]=trim(ls_object[i])+".font.height="+string(li_font)
ls_cfont[i]=trim(ls_object[i])+"_t.font.height="+string(li_font)
ls_tempw=dw_1.Describe(trim(ls_object[i])+".x")
ls_tempw1=dw_1.Describe(trim(ls_object[i])+"_t.x")
dw_1.Modify(ls_font[i])
dw_1.Modify(ls_cfont[i])
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[i]=mid(as_input,i,1)
else
ls_str[i]=mid(as_input,i,2)
i++
end if
next
for i=1 to as_len
ls_strret=ls_strret+ls_str[i]
next
return ls_strret
/*************下面打印的具體實現**************************/
string ls_name,ls_namestr
ll_file = fileopen("lpt1",linemode!,write!)
ll_rows=dw_1.rowcount()
filewrite(ll_file,'代碼 商品名稱 單價 數量 金額')
f
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)這個函數也可以給其它應用所調用,用其實現對任意字符串的截取任意位置的子串