第二十一讲 深入窗体 利用PB事件实现ENTER代替TAB跳转
- 格式:doc
- 大小:20.50 KB
- 文档页数:1
VB6.0控件编程技巧汇编在Visual Basic中,文本框(TextBox)是最常用的控件,熟练运用文本框是开发出高质量的应用程序的基础。
笔者在从事应用程序开发中,摸索出有关文本框的应用技巧,写出来与VB爱好者共享。
1、设置只读文本框。
有些时候在窗口显示一段信息,但又不希望用户去改变它,怎样实现文本的只读呢?首先,我们可以利用标签框(label )的只读属性,以标签来代替文本框以实现只读属性,但也可以用小程序实现真正的文本框的只读。
Sub Text1_KeyPress (keyascii As Integer)keyascii = 0End Sub或者也可以用sendkey方法使文本框失去焦点,如以下程序:Sub Text1_KeyDown (KeyCode As Integer, Shift As Integer)SendKeys "{tab}"End Sub2、限定文本框的输入内容和格式。
以下程序可以实现限定文本框只能输入数字:Sub Text1_KeyPress (keyascii As Integer)If keyascii <48 Or keyascii> 57 ThenBeepBeepjohny@keyascii = 0End IfEnd Sub若想限定文本框输入格式,可以使用VB的FORMA T函数,也可以使用专业版的屏蔽控件(Masked Edit),通过设定屏蔽控件的Mask属性可以对文本框的输入格式作精确控制。
3、为TextBox 创建快捷键。
VB规定,添加在窗体上的控件均在其Tabindex 属性中记载其加载顺序,程序运行时焦点按Tabindex 属性规定的顺序在控件间跳转。
而为了简化操作,可VB中为任何具有caption的属性的控制创建快捷键,这通过caption 属性中在想作为快捷键的字母前加&号实现。
但有一个问题值得注意,而类似文本框这样的控件无caption 这样的属性,这时可将标签与文本框同时使用。
03PowerBuilder (PB )是一种高效能的应用程序开发工具,用于构建企业级的数据库应用。
PB 概述从官方网站下载安装包,按照安装向导逐步完成安装过程,包括同意许可协议、选择安装路径、配置组件等。
安装步骤支持Windows 操作系统,需要安装相应的数据库客户端或服务器。
环境要求pb 概述与安装界面布局PB的集成开发环境(IDE)包括菜单栏、工具栏、代码编辑器、对象浏览器等部分,方便开发者进行各种操作。
编码风格PB支持多种编程风格,如事件驱动、面向对象等,可根据项目需求选择合适的风格。
调试工具PB提供了强大的调试工具,包括断点设置、单步执行、变量监视等功能,帮助开发者快速定位并解决问题。
编程环境介绍01基本语法PB的语法基于Pascal语言,包括赋值语句、条件语句、循环语句等,易于学习和掌握。
02数据类型PB支持多种数据类型,如整型、浮点型、字符型、日期型等,满足不同类型数据的处理需求。
03数据类型转换PB提供了丰富的数据类型转换函数,方便开发者在不同数据类型之间进行转换。
基本语法与数据类型变量、常量与运算符变量PB中的变量用于存储程序运行过程中的临时数据,可根据作用域和生命周期进行分类。
常量常量是在程序运行过程中保持不变的量,可用于定义程序中的固定值。
运算符PB支持多种运算符,包括算术运算符、比较运算符、逻辑运算符等,用于实现各种复杂的计算和控制逻辑。
掌握`If...Then...Else`语句,实现基于条件的程序流程控制。
条件语句熟悉`For`、`While`等循环语句,实现重复执行某段代码的功能。
循环语句了解`Select Case`语句,根据不同情况执行不同代码块。
选择性语句学会使用`Exit`语句退出循环或程序,以及`End`语句结束程序。
退出与结束控制结构掌握如何定义函数,包括函数名、参数列表和返回值类型等。
函数定义明确过程与函数的区别,过程不返回值,而函数可以返回值。
过程与函数区别了解如何在程序中调用函数,传递参数并接收返回值。
run("notpad.exe") ////pb 运行记事本run("calc.exe") ////pb 运行计算器记住:当我们用PB导出数据到EXCEL时,不管是用Saveas 还是clipboard 它输出的数据是定义了字段类型的列的数据,也就是说,不管列是可见还是不可见,只要该列定义了列属性,在查询时主缓冲区中该列有数据,则就会导出出来~用方法得到列名或其他属性也是一样的~及时隐藏了也可以得到当中间的某列给隐藏时,下次打开后它会显示在末尾的位置,但是用Saveas 输出数据时,不管它是否隐藏,是否改变了位置,它仍可输出数据而且位置还是不变的~也就是说没有改变数据窗口对象的源,数据窗口对象上显示的列位置只会影响我们在程序界面上看到的位置,而不会影响它在后台存储的实际位置。
但是这样会改变界面显示的位置,记住,没有改变源如何用PB程序在excel 画表格边框线,如何改变文字大小1. 创建Excel 对象eole=CREATEOBJECT′(Excel.application ′)2. 添加新工作簿eole.Workbooks.add3. 设置第 3 个工作表为激活工作表eole.Worksheets( ″sheet3 ″).Activate4.打开指定工作簿eole.Workbooks.Open( ″c:\temp\ll.xls ″)5.显示Excel 窗口eole.visible=.t.6. 更改Excel 标题栏eole.Caption= ″VFP应用程序调用Microsoft Excel ″7. 给单元格赋值eole.cells(1,4).value=XM(XM 为数据库字段名)8.设置指定列的宽度( 单位:字符个数)eole.ActiveSheet.Columns(1).ColumnWidth=59.设置指定行的高度( 单位:磅)eole.ActiveSheet.Rows(1).RowHeight=1/0.035( 设定行高为 1 厘米,1 磅=0.035 厘米)10.在第18 行之前插入分页符eole.Worksheets( ″Sheet1 ″).Rows(18).PageBreak=111.在第 4 列之前删除分页符eole.ActiveSheet.Columns(4).PageBreak=012.指定边框线宽度(Borders 参数如下)ole.ActiveSheet.Range( ″b3:d3 ″).Borders(2).Weight=313.设置四个边框线条的类型eole.ActiveSheet.Range( ″b3:d3 ″).Borders(2).LineStyle=1( 其中Borders 参数:1-左、2-右、3-顶、4-底、5-斜、6-斜/ ;LineStyle 值:1 与7-细实、2-细虚、4-点虚、9-双细实线)14. 设置页眉eole.ActiveSheet.PageSetup.CenterHeader= ″报表1″15. 设置页脚eole.ActiveSheet.PageSetup.CenterFooter= ″第&P 页″16.设置页眉到顶端边距为 2 厘米eole.ActiveSheet.PageSetup.HeaderMargin=2/0.03517.设置页脚到底边距为 3 厘米eole.ActiveSheet.PageSetup.FooterMargin=3/0.03518.设置顶边距为 2 厘米eole.ActiveSheet.PageSetup.TopMargin=2/0.03519.设置底边距为 4 厘米eole.ActiveSheet.PageSetup.BottomMargin=4/0.03520.设置左边距为 2 厘米veole.ActiveSheet.PageSetup.LeftMargin=2/0.03521.设置右边距为 2 厘米eole.ActiveSheet.PageSetup.RightMargin=2/0.03522.设置页面水平居中eole.ActiveSheet.PageSetup.CenterHorizontally=.t.23.设置页面垂直居中eole.ActiveSheet.PageSetup.CenterVertically=.t.24.设置页面纸张大小(1 -窄行8 5 11 39 -宽行14 11) eole.ActiveSheet.PageSetup.PaperSize=125.打印单元格网线eole.ActiveSheet.PageSetup.PrintGridlines=.t.26.拷贝整个工作表edRange.Copy27. 拷贝指定区域eole.ActiveSheet.Range( ″A1:E2″).Copy28.粘贴eole.WorkSheet( ″Sheet2 ″).Range( ″A1″).PasteSpecial29.在第2 行之前插入一行eole.ActiveSheet.Rows(2).Insert30.在第2 列之前插入一列eole.ActiveSheet.Columns(2).Insert31.设置字体eole.ActiveSheet.Cells(2,1)= ″黑体″32.设置字体大小eole.ActiveSheet.Cells(1,1).Font.Size=2533.设置字体为斜体eole.ActiveSheet.Cells(1,1).Font.Italic=.t.34.设置整列字体为粗体eole.ActiveSheet.Columns(1).Font.Bold=.t.35.清除单元格公式eole.ActiveSheet.Cells(1,4).ClearContents36.打印预览工作表eole.ActiveSheet.PrintPreview37.打印输出工作表eole.ActiveSheet.PrintOut38.工作表另为eole.ActiveWorkbook.SaveAs( ″c:\temp\22.xls ″)39.放弃存盘eole.ActiveWorkbook.saved=.t.40.关闭工作簿eole.Workbooks.close41.退出Exceleole.quit先把标题放到剪贴板上,再PASTE()到EXCEL中,代码如下:::clipboard(ls_value)ao_object.range(ls_col+string(1)+":"+ls_col+string(1)).select()ao_object.activesheet.Paste()/*************************************************************下面的函数f_excel_hb ,可以实现“将工作簿filename_s 中的工作表sheetname_s 以新的工作表名称sheetname_t ,复制到工作簿filename_t 的最后”1. public function boolean f_excel_hb (string filename_s, string filename_t, string sheetname_s, string sheetname_t);2. //==========================================================3. // 合并两个工作簿中的某个工作表4. //==========================================================5. // 作者:yyoinge 2011-10-12 18:006. //==========================================================7. // 将工作簿filename_s 中的工作表sheetname_s 以新的8. // 工作表名称sheetname_t ,复制到工作簿filename_t 的最后9. //==========================================================10. if not fileexists(filename_s) then11. messagebox( '' , ' 工作簿【' + filename_s + ' 】(源)不存在' )12. return false13. end if14. if not fileexists(filename_t) then15. messagebox( '' , ' 工作簿【' + filename_t + ' 】(目标)不存在' )16. return false17. end if18. long ll_val19. // 声明ole 对象20. oleobject ole_object_s21. // 创建ole 对象22. ole_object_s=create oleobject23. // 连接到excel24. ll_val = ole_object_s.connecttonewobject( "excel.application" )25. if ll_val <> 0 then26. messagebox( '' , 'ole 无法连接Excel!' )27. goto error28. end if29. // 打开源和目标工作簿30. ole_object_s.workbooks.open(filename_s)31. ole_object_s.workbooks.open(filename_t)32. string ls_t33. ls_t = filename_t34. filename_s = of_splitpath(filename_s, 2)35. filename_t = of_splitpath(filename_t, 2)36. // 隐藏excel37. ole_object_s.visible = false38. ole_object_s.displayalerts = false39. int n,t40. int li41. boolean isexists= false42. oleobject lworksheet43. // 判断源工作簿中的工作表是否存在44. try45. lworksheet = ole_object_s.Workbooks(filename_s).sheets(sheetname_s)46. isexists = true47. catch ( oleruntimeerror er)48. isexists = false49. end try50. if isexists= false then51. messagebox( '' , ' 工作簿【' + filename_s + ' 】中工作表不存在工作表[' + sheetname_s + ']' )52. goto error53. end if54. // 当目标工作簿中存在sheet 名为sheetname_t 的工作表时,为sheetname_t 增加后缀(1) ,然后再重复进行判断,直到表名不存在55. isexists = true56. do while isexists57. try58. lworksheet = ole_object_s.Workbooks(filename_t).sheets(sheetname_t)59. isexists = true60. sheetname_t += '(1)'61. catch ( oleruntimeerror er1)62. isexists = false63. end try64. loop65. // 进行工作表合并(移到目标工作簿的最后)66. //int li67. setnull(li)68. ole_object_s.workbooks(filename_s).Sheets(sheetname_s).copy(li, ole_object_s.workbooks(filename_t).Sheets( long (ole_object_s.workbooks(filename_t).Sheets.count)))69. // 重命名工作表70. ole_object_s.workbooks(filename_t).sheets( long (ole_object_s.workbooks(filename_t).Sheets.count)).name = sheetname_t71. // 保存目标工作簿72. isexists = true73. //ole_object_s.visible = true74. //ole_object_s.displayalerts = true75. //messagebox('', '')76. try77. ole_object_s.workbooks(filename_t).save()78. catch ( oleruntimeerror er2)79. messagebox( ' 提示' , ' 无法保存工作簿【' + filename_t + ' 】' )80. isexists = false81. end try82. if not isexists then goto error83. // 关闭工作簿84. ole_object_s.workbooks(filename_s).close85. ole_object_s.workbooks(filename_t).close86. // 退出excel87. ole_object_s.workbooks.close88. ole_object_s.Application.quit();89. // 断开连接90. ole_object_s.disconnectobject();91. // 注销ole 对象92. destroy ole_object_s;93. return true94. error:95. ole_object_s.workbooks(filename_s).close96. ole_object_s.workbooks(filename_t).close97. ole_object_s.workbooks.close98. ole_object_s.Application.quit();99. ole_object_s.disconnectobject();100. destroy ole_object_s;101. return false102.103.104. end function/**********************************************************//* 函数名称:uf_dwsaveas_excel功能:将数据窗口数据导出EXCEL文件,并将EXCEL文件默认英文标题替换成中文。
PB的小技巧1.如何使DataWindow中的数据只能追加新记录而不能修改。
利用Column 的Protect 属性可以很方便的做到这一点,方法如下:将每一列的Protect 属性设置为:If( IsRowNew(), 0, 1) )在PowerScript 中可以动态修改Protect 属性:dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")2. 允许从空的非字符字段跳离string ss = this.dwDescribe(this.GetColumnName()+".coltype")//s = this.dwDescribe("#"+String(this.GetColumn())+".coltype")CHOOSE CASE sCASE "number"IF Trim(this.GetText()) = "" THENint null_numSetNull(null_num)this.SetItem(this.GetRow(),this.GetColumn(),null_num)this.SetActionCode(3)END IFCASE "date"IF Trim(this.GetText()) = "" THENdate null_dateSetNull(null_date)this.SetItem(this.GetRow(),this.GetColumn(),null_date)this.SetActionCode(3)END IFCASE "time"IF Trim(this.GetText()) = "" THENtime null_timeSetNull(null_time)this.SetItem(this.GetRow(),this.GetColumn(),null_time)this.SetActionCode(3)END IFCASE "datetime"IF Trim(this.GetText()) = "" THENdate null_datetimeSetNull(null_datetime)this.SetItem(this.GetRow(),this.GetColumn(),null_datetime)this.SetActionCode(3)END IFEND CHOOSE3. 当我们为Datawindow的每一行显示行号时可以简单的放一个表达式为GetRow() -- 计算列。
PowerBuilder编程技巧1、数据的转储和调入功能的实现一个数据处理系统的安全性部分是整个系统的关键部分,对于一些需要长期保存的历史数据来说更是必不可少。
对于现代的大型数据库管理系统来说,数据的安全性独立交给DBA来专门管理,一般的系统较少涉及数据的备份工作。
为了减少计算机专业人员的负担,一个好的MIS系统应该提供数据的转储和调入功能,这样对数据库管理系统不太了解的用户也可以进行数据安全方面的处理。
PowerBuilder中SaveAs()、ImportFile()两函数可以实现这方面的操作,dwcontrol.SaveAs()提供了多种数据的存储格式,如dBase的DBF格式、以TAB 作为分隔符的文本TXT格式、Excel格式、SQLInsert格式、CSV格式。
dwcontrol.ImportFile()将数据从各种格式的文本文件中调入数据窗口控制里。
2、简洁美观的数据报表的创建一个系统里的报表应该具有一致的风格,报表至少应该具有如下几种项目:报表的标题、报表的日期和时间、报表的页序、报表涉及的对象和条件。
PowerBuilder 提供了各种类型的数据窗口,报表中主要用到如下几种类型: Free风格,该数据窗口的数据排列,用户可以任意调整,有最大的自由性。
Grid风格,以表格的方式显示数据,外观比较工整,美观明了。
Graph风格,以图形方式显示数据,有直方格、圆饼图、曲线图、三维立体柱图。
Group风格的数据窗口提供了一种对数据进行分组的简便途径,它生成了一个具有分组属性的Tabular风格的数据窗口对象。
3、Mdi窗体技术的应用随着Windows系统的出现,图形交互界面得到了用户的喜爱,已成为一种潮流,其中Mdi窗体技术更是吸引人。
Mdi窗体,即是多文档交互式窗体,亦叫无模式窗体。
这种窗体包括一个Mdi主窗口及多个Mdi子窗口,子窗口只能在框架之内出现和移动,可以同时打开多个Mdi子窗口,但同一时刻只能有一个窗口处于被激活状态,当主窗口关闭时,同时关闭所有子窗口。
VB6VBA中跟踪⿏标移出窗体控件事件(类模块成员函数指针CHooker类应⽤)⼀、关于起因前⼏天发了⼀篇博⽂,是关于获取VB类模块成员函数指针的内容();今天我就发⼀下我的应⽤实例。
VB中默认是没有⿏标移出事件响应的,⽽这个事件其实在项⽬开发中,实⽤性很强,很多时候需要在⿏标移出窗体或控件时做些事情;没有这个事件会感觉很费⼒;今天我所说的实际案例就是,在窗体上,设计⼀个SplitterBar控件,窗体的最终⽤户使⽤这个控件可以在运⾏程序时任意调整其内部控件⼤⼩。
⼆、修改CHooker类我在第⼆篇参考博⽂作者开发的CHooker类上做了部分修改(对应以下代码中的中⽂注释部分代码),使该类能够跟踪⿏标移开事件,代码如下:1Option Explicit23Private Type TRACKMOUSEEVENTTYPE4 cbSize As Long5 dwFlags As Long6 hwndTrack As Long7 dwHoverTime As Long8End Type910Private Declare Sub CopyMemory Lib"kernel32"Alias"RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)11Private Declare Function SetWindowLong Lib"user32"Alias"SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long12Private Declare Function GetWindowLong Lib"user32"Alias"GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long13Private Declare Function IsWindow Lib"user32" (ByVal hWnd As Long) As Long14Private Declare Function CallWindowProc Lib"user32"Alias"CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 15Private Declare Function TrackMouseEvent Lib"user32" (lpEventTrack As TRACKMOUSEEVENTTYPE) As Long1617Private Const GWL_WNDPROC = (-4)18Private Const WM_NCDESTROY = &H8219Private Const WM_MOUSEMOVE = &H20020Private Const TME_LEAVE = &H2&21Private Const WM_MOUSELEAVE = &H2A3&2223Public Event WindowProc(ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long, bCallNext As Boolean, lReturn As Long)2425Private m_hwnd As Long, m_NewProc As Long, m_OldProc As Long26Private m_TrackMouseLeave As Boolean'm_TrackMouseLeave设置在Hook时是否开启跟踪⿏标移开事件,是否正在跟踪移动事件27Private m_Tracking As Boolean'跟踪移开事件时,标识当前是否正在跟踪移动事件2829Private Sub Class_Initialize()30 m_NewProc = GetClassProcAddr(Me, 5, 4, True)31End Sub3233Private Sub Class_Terminate()34Call Unbind35End Sub3637Public Function Bind(ByVal hWnd As Long, Optional TrackMouseLeave As Boolean = False) As Boolean38Call Unbind39If IsWindow(hWnd) Then m_hwnd = hWnd40 m_OldProc = SetWindowLong(m_hwnd, GWL_WNDPROC, m_NewProc)41 Bind = CBool(m_OldProc)42 m_TrackMouseLeave = TrackMouseLeave '保存⽤户传递的跟踪⿏标移开事件设置43End Function4445Public Function Unbind() As Boolean46If m_OldProc <> 0Then Unbind = CBool(SetWindowLong(m_hwnd, GWL_WNDPROC, m_OldProc))47 m_OldProc = 048End Function4950Private Function WindowProcCallBack(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long51Dim bCallNext As Boolean, lReturn As Long52Dim tTrackML As TRACKMOUSEEVENTTYPE '⼀个移开事件结构声明5354 bCallNext = True5556RaiseEvent WindowProc(Msg, wParam, lParam, bCallNext, lReturn)57'当⽤户需要跟踪⿏标移开事件时58If m_TrackMouseLeave Then59'⿏标在其上移动,当前未标识为跟踪状态(第⼀次或者移开⿏标后重新移动回来时)60If Msg = WM_MOUSEMOVE And m_Tracking = False Then61 m_Tracking = True62'initialize structure63 tTrackML.cbSize = Len(tTrackML)64 tTrackML.hwndTrack = hWnd65 tTrackML.dwFlags = TME_LEAVE66'start the tracking67 TrackMouseEvent tTrackML68End If69'⿏标移开时,取消跟踪状态70If Msg = WM_MOUSELEAVE Then m_Tracking = False71End If7273If bCallNext Then74 WindowProcCallBack = CallWindowProc(m_OldProc, hWnd, Msg, wParam, lParam)75Else76 WindowProcCallBack = lReturn77End If78If hWnd = m_hwnd And Msg = WM_NCDESTROY Then Call Unbind79End Function8081Private Function GetClassProcAddr(obj As Object, ByVal Index As Long, _82Optional ByVal ParamCount As Long = 4, Optional ByVal HasReturnValue As Boolean) As Long83Static lReturn As Long, pReturn As Long84Static AsmCode(50) As Byte8586Dim i As Long, pThis As Long, pVtbl As Long, pFunc As Long8788 pThis = ObjPtr(obj)89 CopyMemory pVtbl, ByVal pThis, 490 CopyMemory pFunc, ByVal pVtbl + (6 + Index) * 4, 491 pReturn = VarPtr(lReturn)92For i = 0To UBound(AsmCode) '填充nop93 AsmCode(i) = &H9095 AsmCode(0) = &H55 'push ebp96 AsmCode(1) = &H8B: AsmCode(2) = &HEC 'mov ebp,esp97 AsmCode(3) = &H53 'push ebx98 AsmCode(4) = &H56 'push esi99 AsmCode(5) = &H57 'push edi100If HasReturnValue Then101 AsmCode(6) = &HB8 'mov offset lReturn102 CopyMemory AsmCode(7), pReturn, 4103 AsmCode(11) = &H50 'push eax104End If105For i = 0To ParamCount - 1'push dword ptr[ebp+xx]106 AsmCode(12 + i * 3) = &HFF107 AsmCode(13 + i * 3) = &H75108 AsmCode(14 + i * 3) = (ParamCount - i) * 4 + 4109Next110 i = i * 3 + 12111 AsmCode(i) = &HB9 'mov ecx,this112 CopyMemory AsmCode(i + 1), pThis, 4113 AsmCode(i + 5) = &H51 'push ecx114 AsmCode(i + 6) = &HE8 'call 相对地址115 CopyMemory AsmCode(i + 7), pFunc - VarPtr(AsmCode(i + 6)) - 5, 4116If HasReturnValue Then117 AsmCode(i + 11) = &HB8 'mov eax,offset lReturn118 CopyMemory AsmCode(i + 12), pReturn, 4119 AsmCode(i + 16) = &H8B 'mov eax,dword ptr[eax]120 AsmCode(i + 17) = &H0121End If122 AsmCode(i + 18) = &H5F 'pop edi123 AsmCode(i + 19) = &H5E 'pop esi124 AsmCode(i + 20) = &H5B 'pop ebx125 AsmCode(i + 21) = &H8B: AsmCode(i + 22) = &HE5 'mov esp,ebp126 AsmCode(i + 23) = &H5D 'pop ebp127 AsmCode(i + 24) = &HC3 'ret128 GetClassProcAddr = VarPtr(AsmCode(0))129End Function三、CHooker类的使⽤那么如何使⽤这个新构建的类,来实现我们的需求了?⾸先创建⼀个窗体,放置三个PictureBox,其中⼀个做为SplitterBar(name属性picture4),其余2个图⽚框的宽度将会由SplitterBar在运⾏时调整。
用pb写的第一个数据窗口用PowerBuilder写了一个数据窗口,数据窗口写好了以后运行报错DataWindow ErrorDatabase transaction information not availableCall SetTrans or SetTransObject function最后检查发现程序没有写错,是我的运行方式不对,应该从主程序开始运行。
下面的程序是在网上找到的判断是否连接的语句if sqlca.dbhandle()>0 thenmessagebox('test connection','连接着')elsemessagebox('test connection','没连接')end if连接通了以后运行时发现不能添加数据,报违反主键的唯一性约束的错误,SQLSTATE = 23000[Sybase][ODBC Driver][Adaptive Server Anywhere]Integrity constraint violation: Column 'sys_num' in table 'student' cannot be NULLNo changes made to database.INSERT INTO "student" ( "sys_num", "s_id", "s_name", "tel" ) VALUES ( ?, ?, ?, ? )这个是主键的问题,直接把主键删除就可以了,删除之后在从新添加主键也可以正常使用。
1.Error c0030:Syntax errorError c0003:Condition for if statement must be a boolean这个问题我上网找到的原因是因为编程语言的不同把==和=用混的原因,但是我的语句里没有=这个是我出错的语句If GetFileOpenName("在路径中选择任一文件",ls_Path,ls_File,ls_Type,ls_Mask) = 1 最后找到原因是其中的一个逗号用成了中文输入法的,所以报这个错的原因可能就是标点符号用错。
利用PB事件实现ENTER代替TAB跳转
在前面几讲,我们已经简单探讨了PB的窗口画笔和数据窗口画笔。
从这一讲起,我们将深入理解窗口,进一步和大家体会数据窗口的奥妙,并用例子来说明它。
熟悉Windows编程的人员都知道,Windows的API为程序员提供了大量的消息,约有200多个。
在PowerBuilder中,系统将每个Windows消息作为事件传递给程序员处理,并且为大多数普通的事件提供了缺省处理。
PowerBuilder在语句描绘器中给每一个标准的控件设定了一些常用事件,一般的编程人员基于这些事件就基本可以完成常见的操作。
但是现在我们还是要如何自定义一个新的事件,并将这个新的事件与WINDOWS消息对应起来,用于完成一个特殊的操作。
这就是我这一讲要讲的例子:利用PB事件实现ENTER 代替TAB跳转
[插入video_22]
建立一个新的Application对象。
作一个Datawindow,采用外部数据源,并且用FreeFrom格式。
加入五个数据字段,存储为d_input。
新建一个窗口,并在Window对象中加入控件。
加入一个CommandButton,命名为cb_add,设置它的text为“&A增加”。
在它的Clicked 事件中添加程序:
dw_input.reset()
dw_input.insertrow(0)
dw_input.setcolumn(1)
dw_input.setrow(1)
dw_input.setfocus()
再增加一个CommandButton,命名为cb_exit,设置它的text为“&X退出”。
在它的Clicked 事件中添加程序:
close(parent)
增加一个用户自定义事件,打开cb_exit的Script,点击Declare菜单中的User Events,定义一个自定义事件起名为ue_dwnkey,选择Windows的消息ID为pbm_dwnkey。
单击确定。
加入如下程序:
if key=keyenter! Then
this.triggerevent(clicked!)
end if
实现同一个窗口下的多个输入列之间聚焦的转换用键入回车键来实现跳转:
在d_input DataWindow控件中定义定义名为ue_dwnprocessenter事件,以捕捉用户在DataWindow中输入的回车,并对其应实现的功能进行转换。
它的消息ID是pbm_dwnprocessenter。
这个事件表示在datawindow控件中按下回车键时,将发生的事件。
在ue_dwnprocessenter事件中加入以下程序:
Send(Handle(this),256, 9,0)。