PB CONTROL

一、运行程序时报错提示

1> 在应该程式里的systemerror[]returns(none)
   如下代码:
   if err_sys=1 then
 err_sys=0
 return
   else
 open(w_system_error)
   end if

2> 新建一个窗口命名:w_system_error
   在窗口上列出以下内容

   st_1:error code   sle_1:error_code
   st_2:error        sle_2:error_programe
   st_3:error line   sle_3:error_line
   st_4:error text   sle_4:error_message

   在open[]returns long[]
   如下代码:
   error_code.text=string(error.number)
   if error.object=error.windowmenu then
         error_programe.text="object:"+error.windowmenu + "~r~nevent:"+error.objectevent
   else
 error_programe.text="object:"+error.windowmenu + "." + error.object+ "~r~nevent:"+error.objectevent
   end if 
   error_line.text=string(error.line)
   error_message.text=(error.text)

***************************************************************************************************************
二、通用按钮的代码

 1> ADD按钮的click事件

    long tot,tot1,tot2
    tot1 = dw_1.rowcount()
    tot2=dw_1.insertrow(0)
    tot=tot1+1
    dw_1.setitem(tot2,1,tot)
    dw_1.SetFocus()
    dw_1.ScrollToRow(tot2)
    dw_1.SetColumn(1)
    st_rows.text=string(dw_1.rowcount()) //显示数据行数
----------------------------------------------------------------------------
 2> DELETE按钮的click事件

    if dw_1.rowcount()=0 then
 return
    end if
    int p_message
    p_message= MessageBox("WARNING","do you delete?",Exclamation!, OKCancel!, 2)
    //删除数据后要做一次刷新
    choose  case p_message
 case 1
 dw_1.deleterow(dw_1.getrow())
 cb_save.PostEvent(Clicked!)
    end choose
-------------------------------------------------------------------------------
 3> SAVE按钮的click事件

   if dw_1.rowcount()=0 then
 return
   end if
   if dw_1.update(true,false)=1 then
 dw_1.resetUpdate()
 commit;
   messagebox("OK","The data is saved successfully!")
   else
 rollback;
   end if

   dw_1.SetRedraw(FALSE)
   cb_search.PostEvent(Clicked!)  //SAVE数据后从新SERACH数据
   dw_1.SetRedraw(TRUE)
-------------------------------------------------------------------------------

4> 排序

定义:instance variables

 

Int click_time=0
String pre_col=""

String clicked_pos,col,format
Long il_pos
clicked_pos = dwo.Name // 取点击的对象
il_pos = Pos(clicked_pos,'_t') //对于列表题,取得的对象是列名+“_t”
If il_pos >0 Then
col = Left(clicked_pos,il_pos -1)
If col=pre_col Then
If click_time=0 Then
click_time = 1
format = col+" A"
Else
click_time=0
format = col+" D"
End If
Else
click_time = 0
format = col+" A"
End If
pre_col = col
dw_2.SetSort(format)
dw_2.Sort()
End If

-------------------------------------------------------------------------------

5> COPY按钮的click事件

   if dw_1.rowcount()=0 then
 return
   end if
   int selectrow,objectrow
   selectrow=0
   selectrow=dw_1.getrow()
   if selectrow=1 then return
   objectrow=selectrow+1
   dw_1.RowsCopy(selectrow,selectrow, Primary!,dw_1,objectrow,primary!)
   dw_1.ScrollToRow(objectrow) //滾動行copy本行到下一行
   dw_1.object.detail[objectrow]=""
   st_rows.text=string(dw_1.rowcount())
-------------------------------------------------------------------------------
6> EXCEL按钮的click事件

if dw_1.rowcount()=0 then
 return
end if
dw_1.saveas('',excel!,true)
-------------------------------------------------------------------------------
7> PRINT按钮的click事件

if dw_1.rowcount()=0 then
 return
end if
int p_message
p_message= MessageBox("WARNING","do you print?,~r~n YES,~r~n NO! ", &
Exclamation!, OKCancel!, 2)
choose case p_message
 case 1
 dw_1.print()
end choose
-------------------------------------------------------------------------------
8> SEARCH按钮的click事件

   要在数据窗口里ARGUMENT设置三个参数
string s,c,w
s=trim(ddlb_s.text)
c=trim(ddlb_c.text)
w=trim(sle_w.text)

w=lower(w)
if s="" then
 s="%"
else
 s=s+"%"
end if

if c="" then
 c="%"
else
 c=c+"%"
end if 
if w="" then
 w="%"
else
 w="%"+w+"%"
end if

dw_1.retrieve(s,c,w)
st_rows.text=string(dw_1.rowcount())
-------------------------------------------------------------------------------
9> RESET按钮的click事件
   有数据的全部置空
dw_1.reset()
st_rows.text="0"
sle_w.text=""
ddlb_c.text=""
ddlb_s.text=""
-------------------------------------------------------------------------------
10> 鼠标右键功能的事件
   首先:要做一个菜单 m_popup,子菜单为add,detele,copy
  
   add的click事件代码:
     long newrow
     newrow=w_wording.dw_1.insertrow(0)
     w_wording.dw_1.scrolltorow(newrow)
   detele的click事件代码:
     w_wording.dw_1.deleterow(0)
   copy的click事件代码:
     if w_wording.dw_1.rowcount()=0 then
 return
     end if
     int selectrow,objectrow
     selectrow=0
     selectrow=w_wording.dw_1.getrow()
     if selectrow=1 then return
     objectrow=selectrow+1
   第二步:在DW_1数据窗口的rbuttondown的事件下写如下代码
    m_popup=CREATE m_popup 
 m_popup.PopMenu(parent.PointerX()+1, parent.PointerY()+1)                
           在DW_1数据窗口的click的事件下写如下代码
    this.selectrow(0,false)
        this.selectrow(row,true)
-------------------------------------------------------------------------------
三、导数据到EXCEL的方法:
   
   1> 先COPY行,在写数据到行的单元格
      做一个EXCEL模板 启用巨集 巨集代码如下:
      Sub copy()
      Range("a4:r4").Select //复制行
      Selection.copy
      End Sub

      Sub paste(xrows As String)
      Range(xrows).Select
      ActiveSheet.paste
      End Sub
   在PB各式里写一个按钮的click事件(也可以写一个转EXCEL的函数)
   long ret,i, rows
   OLEObject xlapp
   pointer oldpointer
   oldpointer=setpointer(hourglass!)
   xlApp = Create OLEObject
   ret = xlApp.ConnectToNewObject( "Excel.Application" )
      if ret < 0  then
 MessageBox("Connect to Excel Failed !",string(ret))
 setpointer(oldpointer)
    return
    end if
    xlApp.Application.Workbooks.Open("C:/excel/test.xls")
    xlApp.Application.Visible = true
    xlapp.application.activeworkbook.sheets("test").select //调用模板

    xlApp.Application.run("copy") //COPY行
    rows=dw_2.rowcount()
    if rows<=0 then return 1
    for i=2 to rows
    if i<=dw_2.rowcount() then xlApp.Application.run("paste","a"+string(i+1))
   
xlApp.application.activeworkbook.worksheets[1].cells[i+1,4]=string(dw_2.object.c_date[i],"mm/dd/yyyy")//写日期数据到EXCEL单元格里

  next

  //save  EXCEL 
   integer value
   string docname, named
   value = GetFileSaveName("Select File", docname, named, "xls", " Excel Files (*.xls), *.xls")
  // 导出图片
        pictname=dw_4.object.i_photoname[r]
 xlsub1.Range("N9").Select
 if pictname<>'' and not(isnull(pictname)) then
  if flg = 0 then flg = photoexist(pictname)
  if FILEEXISTS(pictname) = true then
  xlapp.Application.ActiveSheet.Pictures.Insert(string(pictname)).select
  xlapp.Application.Selection.ShapeRange.height=180 //图片的大小
 end if
 end if

   xlApp.DisConnectObject()
   Destroy xlapp
   setpointer(oldpointer)

  2> COPY多行,在写数据到行的单元格
    不同的ITEM在一个页面放的数量>3个以上
    转数据到EXCEL时,要对模板多行COPY格式
    代码如下
 //定义变量 
   double jpgsize
   string pictname,aa,ff,ctn
   long i=1,k,m,b,numrows,f,flg
   numrows=dw_2.rowcount()// 取总行数

   K=CEILING(numrows/5) //每页总行数除去5个ITEM
   xls=xlapp.application.activeworkbook
   xlsub=xlapp.application.activeworkbook.worksheets[1]

   for i=1 to k - 1
   b=50*i+1
   aa='A'+string(B) 
   xlapp.Application.range("A1:N50").Select
  xlapp.Application.Selection.Copy
  xlapp.Application.range(AA).Select
    xlapp.Application.Selection.Insert()
next
xlapp.Application.cutcopymode=false
//每次10 COPY
for i=1 to numrows
   xlsub.Cells[10*(i - 1)+9,12]=string(round(dw_2.object.q_l[i],2),"#,##0.00")+" x "+string(round(dw_2.object.q_w,2),"#,##0.00")+" x "+string(round(dw_2.object.q_h[i],2),"#,##0.00")// 长*宽*高

//转图片  
   pictname=dw_2.object.i_photoname[i]
      f=10*(i - 1)+2
    ff="N"+string(f)
    xlapp.Application.ActiveWorkbook.Worksheets[1].Range(ff).Select
   if pictname<>'' and not(isnull(pictname)) then
   if GetJpgSize(pictname)<>0 then
   xlapp.Application.ActiveSheet.Pictures.Insert(string(pictname)).select
   if GetJpgSize(pictname)<1.29 then
   xlapp.Application.Selection.ShapeRange.height = 215
   else
   xlapp.Application.Selection.ShapeRange.Width = 255
        end if
   end if
end if
next
-------------------------------------------------------------------------------------------------
   

 

 

利用Win API Kernel32.dll 实现与串口通迅。 原先的程序数据缓冲区采用String类型,因此无法发送H00,现将数据缓冲区修改为BLOB类型,可以发送任意数据了。 在原先程序的基础上,增加了两个对象:pfc_n_cst_numerical,uo_bit_operator Email: leio88@126.com 以下是原作者的话: 本程序通过调用WINDOWS API函数,实现了类似MSCOMM控件的功能。使PB可以很方便地访问串口。由于所有功能都是PB代码实现的,因此比使用OCX控件访问串口的方式更稳定。 为了方便使用已将所有功能都封装在uo_comm._control用户对象中。使用时只需在窗口中像放置普通对象(如:按钮)一样放置一个uo_comm_control对象即可对串口进行访问。 访问串口时先调用of_setcommport(string commport)和of_setcommsettings(string commsettings)来设置要访问的端口及端口初始化参数,然后调用of_open()初始化端口。或直接使用of_open(string comport,string commsettings)带参数初始化端口。端口初始化成功后即可使用of_send(string sendstring)向串口发送数据,或使用of_read()读取串口数据。当串口有数据到达时,触发ue_received事件,该事件提供给用户用来存放读取串口数据的代码(值得注意的是,当数据到达接收端时,由于发送的数据很长或通讯速率较低,会多次触发ue_receieved事件,并且在ue_received事件中使用of_read()得到的数据仅只是整个发送数据的一部分,需要将多次接收到的数据连接起来才是完整的接收数据)。若对串口所有操作结束不再需要对串口进行操作,则调用of_close()将端口关闭。 Email: blazingstar@sina.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值