资源描述
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)
'标准编辑控件处理。
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
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.SetFocus
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.TextMatrix(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 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.TextMatrix(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
Frame1.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("规格") <> "" 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 '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 - 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
Private Sub Form_Load()
Dim i As Integer
'使第一列较窄。
flex1.ColWidth(0) = flex1.ColWidth(0) / 2
'初始化编辑框
txtEdit = ""
flex1.Rows = 101
flex1.Cols = 8
'设置列标头。
s$ = "^|^商品名称 |^规格 |^单位 |^数量 |^进货价 |^金额 |^备注 "
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 控件:
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)
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 flex1_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 = vbKeyReturn 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
DataGrid1.SetFocus
Else
Adodc1.RecordSource = "供应商信息表"
Adodc1.Refresh
If Adodc1.Recordset.RecordCount > 0 Then
DataGrid1.Visible = True
DataGrid1.SetFocus
Else
MsgBox "无可选的供应商信息,请首先录入供应商数据!", , "提示窗口"
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) = 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, Shift 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
Else
Adodc2.RecordSource = "商品信息表"
Adodc2.Refresh
If Adodc2.Recordset.RecordCount > 0 Then
DataGrid2.Visible = True
DataGrid2.SetFocus
Else
MsgBox "无可选的商品信息,请首先录入商品数据!", , "提示窗口"
End If
End If
End 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 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 = 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 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.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) = ""
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 & "行录入错误!", , "提示窗口"
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, 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.TextMatrix(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.TextMatrix(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 商品信息表 set 库存数量=库存数量+" & 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.AddNew
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
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 (设置指定固定列的对齐方式)
常数 值 描述
flexAlignLeftTop 0 单元格的内容左、顶部对齐。
flexAlignLeftCenter 1 字符串的缺省对齐方式。单元格的内容左、居中对齐。
flexAlignLeftBottom 2 单元格的内容左、底部对齐。
flexAlignCenterTop 3 单元格的内容居中、顶部对齐。
flexAlignCenterCenter 4 单元格的内容居中、居中对齐。
flexAlignCenterBottom 5 单元格的内容居中、底部对齐。
flexAlignRightTop 6 单元格的内容右、顶部对齐。
flexAlignRightCenter 7 数值的缺省对齐方式。单元格的内容右、居中对齐。
flexAlignRightBottom 8 单元格的内容右、底部对齐。
flexAlignGeneral 9 单元格的内容按一般方式进行对齐。字符串按“左、居中”显示,数字按
“右、居中”显示。
FormatString 属性
设置 MSHFlexGrid的列宽、对齐方式、固定行文本和固定列文本。
语法
object.FormatString [= string]
FormatString 属性的语法包含如下部分:
部分 描述
object 一个对象表达式,其值为“应用于”列表中的一个对象。
string 一个字符串表达式,为格式化在行和列中的文本。如在说明中所述。
说明
在设计时,MSHFlexGrid 语法分析和解释 FormatString 来获得如下信息:行和列的数目、行
和列标头的文本、列宽和列对齐方式。
FormatString 属性包含由管道字符 (|) 分隔的段。管道字符之间的文本定义一列并且也可能
包含特定的对齐字符。这些字符使整个列左对齐(<)、居中(^)或右对齐(>)。另外,根据缺省规定文本
被指定给行 0,且文本宽度定义每一列的宽度。
FormatString 属性可能包含一个分号 (;)。这使得字符串的余下部分被解释为行标头和行宽度
信息。另外,根据缺省规定文本被指定给列 0,且最长的字符串定义列 0 的宽度。
MSHFlexGrid 创建附加的行和列来驻留由 FormatString 定义的所有字段。如果只有几个字段
被指定,附加的行和列不被删除。要删除附加的行和列,设置 Rows 和 Cols 属性。
FormatString 属性示例
下面的示例举例说明 FormatString 属性如何工作。
注意 如果正在使用 MSFlexGrid,用“MSFlexGrid1”代替“MSHFlexGrid1”。
' 设置列标头。
s$ = "<Region |<Product |<Employee |>Sales "
MSHFlexGrid1.FormatString = s$
' 设置行标头(注意开始的分号)。
s$ = ";Name|Address|Telephone|Social Security#"
MSHFlexGrid1.FormatString = s$
' 设置列和行标头。
s$ = "|Name|Address|Telephone|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) = 1 '--------->as this
For i = 0 To 9
.TextMatrix(i, j) = i * j
Next
Next
End With
End Sub
首先,msflexgrid1.cellalignment=0 只是设置了当前单元格的显示方式
让每个单元格都居左显示,有两种方法
楼上是一种
另外:
With MSHFlexGrid1
.Rows = 5
.Cols = 4
For i = 0 To .Rows - 1
For j = 0 To .Cols - 1
.Row = i
.Col = j
'在这了可以对单元格进行各种操作
.Text = i & "|" & j
.CellAlignment = 1
Next j
Next i
End With
这种方法对于fixed的行和列也有效
附录资料:不需要的可以自行删除
VB HOOK(钩子)超级无敌详细用法(介绍)
hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。
下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。
关于HOOKS
使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。
HOOK链
WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。
WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)
HOOK过程
为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。该函数语法如下:
public function MyHook(nCode,wParam,iParam) as long
‘加入代码
end function
其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。
SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。
[注释]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。
全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。
[注释] 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其它使用该类HOOK的应用程序产生冲突。
HOOK类型
WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK
WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。
WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。
WH_CBT Hook
系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉
展开阅读全文