1、VB数据库编程中MSHFlexGrid控件用法详解 添加MSHFlexGrid将Name改成flex1 添加text 将name 改成txtedit Public rs1 As New ADODB.Recordset, rs2 As New ADODB.Recordset '定义数据集对象 Dim i As Integer, j As Integer Sub EditKeyCode(MSHFlexGrid As Control, Edt As Control, KeyCode As Integer, Shift As Integer) '标准编辑控
2、件处理。 Select Case KeyCode Case 27 'ESC:隐藏焦点并将其返回 MSFlexGrid Edt.Visible = False MSHFlexGrid.SetFocus Case 13 'ENTER 将焦点返回 MSFlexGrid。 MSHFlexGrid.SetFocus DoEvents If MSHFlexGrid.Col < MSHFlexGrid.Cols - 1 Then
3、 MSHFlexGrid.Col = MSHFlexGrid.Col + 1 Else If MSHFlexGrid.Col = MSHFlexGrid.Cols - 1 Then MSHFlexGrid.Row = MSHFlexGrid.Row + 1 MSHFlexGrid.Col = 1 End If End If Case 38 '向上 MSHFlexGrid.SetF
4、ocus DoEvents If MSFlexGrid.Row > MSFlexGrid.FixedRows Then MSFlexGrid.Row = MSFlexGrid.Row - 1 End If End Select End Sub Sub view_DP() If flex1.Col = 4 Or flex1.Col = 5 Or flex1.Col = 6 Then '格式化Flex1表的第7列、第8列、第9列、第11列 flex1.T
5、extMatrix(flex1.Row, 5) = Format(flex1.TextMatrix(flex1.Row, 5), "0.00") flex1.TextMatrix(flex1.Row, 6) = Val(flex1.TextMatrix(flex1.Row, 4)) * Val(flex1.TextMatrix(flex1.Row, 5)) flex1.TextMatrix(flex1.Row, 6) = Format(flex1.TextMatrix(flex1.Row, 6), "0.00") End If Dim
6、 A, B As Single '声明单精度浮点型变量 On Error Resume Next For i = 1 To flex1.Rows - 1 If flex1.TextMatrix(i, 1) <> "" And flex1.TextMatrix(i, 4) <> "" And flex1.TextMatrix(i, 6) <> "" Then A = Val(flex1.TextMatrix(i, 6)) + A '求合计金额 B = Val(flex1.TextMat
7、rix(i, 4)) + B '求合计数量 End If Next i lblCount = B lblSum = Format(A, "0.00") '格式化合计金额 End Sub Sub SetButtons(bVal As Boolean) cmdRegister.Enabled = Not bVal cmdSave.Enabled = bVal cmdCancel.Enabled = bVal flex1.Enabled = bVal Frame
8、1.Enabled = bVal End Sub Private Sub DataGrid2_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyReturn Then With Adodc2.Recordset '赋值给flex1表格 If .Fields("商品名称") <> "" Then flex1.TextMatrix(flex1.Row, 1) = Trim(.Fields("商品名称")) If .Fields
9、"规格") <> "" Then flex1.TextMatrix(flex1.Row, 2) = Trim(.Fields("规格")) If .Fields("单位") <> "" Then flex1.TextMatrix(flex1.Row, 3) = Trim(.Fields("单位")) flex1.TextMatrix(flex1.Row, 5) = .Fields("成本价") End With flex1.Col = 4 DataGrid2.Visible = False '
10、DataGrid2不可见 txtEdit.Text = "" txtEdit.SetFocus End If If KeyCode = vbKeyEscape Then '按ESC键DataGrid2不可见 DataGrid2.Visible = False ' txtEdit.SetFocus 'txtEdit获得焦点 End If End Sub Private Sub delone_Click() For i = 1 To flex1.Cols
11、 1 flex1.TextMatrix(flex1.Row, i) = "" Next i view_DP End Sub Private Sub flex1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) '利用PopupMenu方法 If Button And vbRightButton Then PopupMenu edit '弹出菜单 End If End Sub P
12、rivate Sub Form_Load() Dim i As Integer '使第一列较窄。 flex1.ColWidth(0) = flex1.ColWidth(0) / 2 '初始化编辑框 txtEdit = "" flex1.Rows = 101 flex1.Cols = 8 '设置列标头。 s$ = "^|^商品名称 |^规格 |^单位 |^数量 |^进货价
13、 |^金额 |^备注 " flex1.FormatString = s$ End Sub Private Sub flex1_KeyPress(KeyAscii As Integer) If flex1.Col >= 4 Or flex1.Col = 1 Then MSHFlexGridEdit flex1, txtEdit, KeyAscii End If End Sub '添加下列例程以初始化文本框,并将焦点从 Hierarchical FlexGrid 传递到 TextBox 控件
14、 Sub MSHFlexGridEdit(MSHFlexGrid As Control, Edt As Control, KeyAscii As Integer) '使用已输入的字符。 Select Case KeyAscii '空格表示编辑当前的文本。 Case 0 To 32 Edt = MSHFlexGrid Edt.SelStart = 1000 '其它所有字符表示取代当前的文本。 Case Else Edt = Chr(KeyAscii)
15、 Edt.SelStart = 1 End Select '在合适的位置显示 Edt。 Edt.Move MSHFlexGrid.Left + MSHFlexGrid.CellLeft - 15, _ MSHFlexGrid.Top + MSHFlexGrid.CellTop - 15, _ MSHFlexGrid.CellWidth, _ MSHFlexGrid.CellHeight Edt.Visible = True Edt.SetFocus End Sub Private Sub fle
16、x1_DblClick() If flex1.Col >= 4 Or flex1.Col = 1 Then MSHFlexGridEdit flex1, txtEdit, 32 '模拟一个空格。 End If End Sub Private Sub lblSum_Click() End Sub Private Sub txt1_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyRe
17、turn And Index = 0 Then Adodc1.RecordSource = "供应商信息表 where 供应商编号 like +'%'+'" + txt1(0) + "'+'%'or 供应商全称 like +'%'+'" + txt1(0) + "'+'%'or 简称 like +'%'+'" + txt1(0) + "'+'%'" Adodc1.Refresh If Adodc1.Recordset.RecordCount > 0 Then DataGrid1.Visible = True
18、 DataGrid1.SetFocus Else Adodc1.RecordSource = "供应商信息表" Adodc1.Refresh If Adodc1.Recordset.RecordCount > 0 Then DataGrid1.Visible = True DataGrid1.SetFocus Else MsgBox "无可选的供应商信息,请首先录入供应商数据!", , "提示窗口"
19、 End If End If End If If KeyCode = vbKeyReturn And Index = 1 Then flex1.Col = 1 flex1.Row = 1 flex1.SetFocus End If End Sub Private Sub DataGrid1_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyReturn Then txt1(0
20、) = Adodc1.Recordset.Fields("供应商全称") txt1(1).SetFocus DataGrid1.Visible = False End If End Sub Private Sub txtEdit_KeyPress(KeyAscii As Integer) '删除回车符,以消除嘟嘟声。 If KeyAscii = Asc(vbCr) Then KeyAscii = 0 End Sub Private Sub txtEdit_KeyDown(KeyCode As Integer, Sh
21、ift As Integer) If KeyCode = vbKeyReturn And flex1.Col = 1 Then Adodc2.RecordSource = "商品信息表 where 商品名称 like +'%'+'" + txtEdit + "'+'%'" Adodc2.Refresh If Adodc2.Recordset.RecordCount > 0 Then DataGrid2.Visible = True DataGrid2.SetFocus Els
22、e Adodc2.RecordSource = "商品信息表" Adodc2.Refresh If Adodc2.Recordset.RecordCount > 0 Then DataGrid2.Visible = True DataGrid2.SetFocus Else MsgBox "无可选的商品信息,请首先录入商品数据!", , "提示窗口" End If End If En
23、d If '只有TextBox控件在“数量”单元格时,才使用以下过程 If flex1.Col >= 4 Then EditKeyCode flex1, txtEdit, KeyCode, Shift End If End Sub '当输入数据并按下 ENTER 键,或用鼠标单击MSHFlexGrid 控件中的另一个单元时, '焦点将返回此控件。这时 TextBox 中的文本被复制到活动单元中 Private Sub flex1_GotFocus() If txtEdit.Visible = False Then Exit
24、 Sub flex1 = txtEdit txtEdit.Visible = False view_DP End Sub Private Sub flex1_LeaveCell() If txtEdit.Visible = False Then Exit Sub flex1 = txtEdit txtEdit.Visible = False End Sub Private Sub cmdCancel_Click() For i = 1 To flex1.Rows - 1 For j
25、 1 To flex1.Cols - 1 flex1.TextMatrix(i, j) = "" Next j Next i SetButtons False txtEdit.Visible = False view_DP End Sub Private Sub cmdRegister_Click() Dim lsph As Integer '声明一个整型变量 '创建入库票号 rs1.Open "select * from 入库主表 order
26、 by 票号", Cnn, adOpenStatic If rs1.RecordCount > 0 Then If Not rs1.EOF Then rs1.MoveLast If rs1.Fields("票号") <> "" Then lsph = Val(Right(Trim(rs1.Fields("票号")), 4)) + 1 txtph.Text = Date & "rk" & Format(lsph, "0000") End If Else txtph.
27、Text = Date & "rk" & "0001" End If rs1.Close txtDate.Text = Date '设置控件有效或无效 SetButtons True For i = 1 To flex1.Rows - 1 For j = 1 To flex1.Cols - 1 flex1.TextMatrix(i, j) = "" Next j Next i txt1(0) = "" txt1(1) =
28、 "" txt1(0).SetFocus view_DP End Sub Private Sub cmdSave_Click() Dim js As Integer For i = 1 To flex1.Rows - 1 If flex1.TextMatrix(i, 1) <> "" And flex1.TextMatrix(i, 2) <> "" And flex1.TextMatrix(i, 4) = "" Then MsgBox "第" & i & "行录入错误!", , "提示窗口"
29、 Exit Sub End If If flex1.TextMatrix(i, 1) = "" Then js = js + 1 End If Next i If js = flex1.Rows - 1 Then MsgBox "没有要保存的数据!", , "提示窗口" Exit Sub End If rs1.Open "select * from 入库从表", Cnn, adOpenKeyset
30、 adLockOptimistic For i = 1 To flex1.Rows - 1 If flex1.TextMatrix(i, 1) <> "" And flex1.TextMatrix(i, 2) <> "" And flex1.TextMatrix(i, 4) <> "" Then '添加新记录到"入库从表"中 rs1.AddNew If flex1.TextMatrix(i, 1) <> "" Then rs1.Fields("商品名称") = flex1.TextMatr
31、ix(i, 1) If flex1.TextMatrix(i, 2) <> "" Then rs1.Fields("规格") = flex1.TextMatrix(i, 2) If flex1.TextMatrix(i, 3) <> "" Then rs1.Fields("单位") = flex1.TextMatrix(i, 3) rs1.Fields("入库数量") = Val(flex1.TextMatrix(i, 4)) rs1.Fields("单价") = Val(flex1.TextMat
32、rix(i, 5)) rs1.Fields("金额") = Val(flex1.TextMatrix(i, 6)) If flex1.TextMatrix(i, 7) <> "" Then rs1.Fields("备注") = flex1.TextMatrix(i, 7) If txtph.Text <> "" Then rs1.Fields("入库票号") = Trim(txtph.Text) rs1.Update Cnn.Execute ("update 商品信息表 se
33、t 库存数量=库存数量+" & Val(flex1.TextMatrix(i, 4)) & " where 商品名称 ='" + _ flex1.TextMatrix(i, 1) + "'and 规格='" + flex1.TextMatrix(i, 2) + "'") End If Next i rs1.Close rs2.Open "select * from 入库主表", Cnn, adOpenKeyset, adLockOptimistic '打开数据库 rs2.AddNe
34、w If txtph.Text <> "" Then rs2.Fields("票号") = Trim(txtph.Text) If txtDate.Text <> "" Then rs2.Fields("入库日期") = Trim(txtDate.Text) If txt1(0) <> "" Then rs2.Fields("供应商全称") = txt1(0) If txt1(1) <> "" Then rs2.Fields("经手人") = txt1(1) rs2.Fields("入库金额") = lblSum
35、 rs2.Update rs2.Close '设置控件有效或无效 SetButtons False End Sub Private Sub cmdQuit_Click() End End Sub VB msflexgrid中设置内容对齐方式 ∣学习 2010-03-26 10:43:29 阅读482 评论0 字号:大中小 订阅 使用 .FixedAlignment (设置指定列的对齐方式) .ColAlignment (设置指定固定列的对齐方式) 常数
36、 值 描述 flexAlignLeftTop 0 单元格的内容左、顶部对齐。 flexAlignLeftCenter 1 字符串的缺省对齐方式。单元格的内容左、居中对齐。 flexAlignLeftBottom 2 单元格的内容左、底部对齐。 flexAlignCenterTop 3 单元格的内容居中、顶部对齐。 flexAlignCenterCenter 4 单元格的内容居中、居中对齐。 flexAlignCenterB
37、ottom 5 单元格的内容居中、底部对齐。 flexAlignRightTop 6 单元格的内容右、顶部对齐。 flexAlignRightCenter 7 数值的缺省对齐方式。单元格的内容右、居中对齐。 flexAlignRightBottom 8 单元格的内容右、底部对齐。 flexAlignGeneral 9 单元格的内容按一般方式进行对齐。字符串按“左、居中”显示,数字按 “右、居中”显示。 FormatString 属性
38、设置 MSHFlexGrid的列宽、对齐方式、固定行文本和固定列文本。 语法 object.FormatString [= string] FormatString 属性的语法包含如下部分: 部分 描述 object 一个对象表达式,其值为“应用于”列表中的一个对象。 string 一个字符串表达式,为格式化在行和列中的文本。如在说明中所述。 说明 在设计时,MSHFlexGrid 语法分析和解释 F
39、ormatString 来获得如下信息:行和列的数目、行 和列标头的文本、列宽和列对齐方式。 FormatString 属性包含由管道字符 (|) 分隔的段。管道字符之间的文本定义一列并且也可能 包含特定的对齐字符。这些字符使整个列左对齐(<)、居中(^)或右对齐(>)。另外,根据缺省规定文本 被指定给行 0,且文本宽度定义每一列的宽度。 FormatString 属性可能包含一个分号 (;)。这使得字符串的余下部分被解释为行标头和行宽度 信息。另外,根据缺省规定文本被指定给列 0,且最长的字符串定义列 0
40、 的宽度。 MSHFlexGrid 创建附加的行和列来驻留由 FormatString 定义的所有字段。如果只有几个字段 被指定,附加的行和列不被删除。要删除附加的行和列,设置 Rows 和 Cols 属性。 FormatString 属性示例 下面的示例举例说明 FormatString 属性如何工作。 注意 如果正在使用 MSFlexGrid,用“MSFlexGrid1”代替“MSHFlexGrid1”。 ' 设置列标头。 s$
41、 = "
42、hone|Social Security#" s$ = s$ + ";|Robert|Jimmy|Bonzo|John Paul" MSHFlexGrid.FormatString = s$ MSHFlexGrid MSFlexGrid 都适用 Private Sub Form_Load() With MSFlexGrid1 .Rows = 10 .Cols = 5 For j = 0 To 4 .ColAlignment(j
43、) = 1 '--------->as this For i = 0 To 9 .TextMatrix(i, j) = i * j Next Next End With End Sub 首先,msflexgrid1.cellalignment=0 只是设置了当前单元格的显示方式 让每个单元格都居左显示,有两种方法 楼上是一种 另外: With MSHFlexGrid1 .Row
44、s = 5 .Cols = 4 For i = 0 To .Rows - 1 For j = 0 To .Cols - 1 .Row = i .Col = j
45、 '在这了可以对单元格进行各种操作 .Text = i & "|" & j .CellAlignment = 1 Next j Next i End With 这种方法对于fixed的行和列也有效 附录资料:不需要的可以自行删除 VB H
46、OOK(钩子)超级无敌详细用法(介绍) hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。 下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。 关于HOOKS 使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。 HOOK链 WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。 WINDOWS为这几种HOOKS
47、维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息) HOOK过程 为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。该函数语法如下: public
48、 function MyHook(nCode,wParam,iParam) as long ‘加入代码 end function 其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。 SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。 [注释]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中
49、的CallNextHookEx语句将被忽略。 全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。 [注释] 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其它使用该类HOOK的应用程序产生冲突。 HOOK类型 WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendM
50、essage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。 WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。 WH_CBT Hook 系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818