高手请进,问几个菜鸟级的问题

lgxysl 2003-08-22 11:28:16
高手请进,问几个菜鸟级的问题。
问题1:对于一个记录集recordset,如何得知它是多少列和多少行?
问题2:怎样设置textbox控件和combo控件,使得它们中的文本处于全选状态(即蓝底白字)?
问题3:对于一个combo控件,如何使它在获得焦点时自动展开选项?如何使它能够自动识别文本,如选项列表中有一项是“我是中国人”,在combo中只要键入“我”字,就自动展开跳到“我是中国人”处?这些功能在ACCESS2000中是很容易办到,但VB6却好似不支持。
...全文
33 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingll 2003-08-26
  • 打赏
  • 举报
回复
问题3如果不要求展开cobom的下拉列表,其实是可以仅用vb的功能实现的,
大概想法如下
可以先将cobom list中的内容排序
在输入改变时,查找列表,找出前面部分与输入内容相同的字窜,
让cobom.text=该字窜
但让后面的部分处于被选择状态,

例如,输入的是 abcd
找到的是 abcdefg
那么让cobom.text="abcdefg", 并且,cobom.selstart=4,cobom.sellength=3
lingll 2003-08-26
  • 打赏
  • 举报
回复
3.
下面是不知哪里抄来的一段代码,好像比前面的精短,绝对运行通过

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
As Long
Public Const CB_FINDSTRING = &H14C
Private Sub Combo1_Change()
Dim iStart As Integer
Dim sString As String
Static iLeftOff As Integer
iStart = 1
iStart = Combo1.SelStart
If iLeftOff <> 0 Then
Combo1.SelStart = iLeftOff
iStart = iLeftOff
End If
sString = CStr(Left(Combo1.Text, iStart))
Combo1.ListIndex = SendMessage(Combo1.hwnd,B_FINDSTRING, -1, ByVal CStr(
Left( ombo1.Text, iStart)))
 
If Combo1.ListIndex = -1 Then
iLeftOff = Len(sString)
combo1.Text = sString
End If
Combo1.SelStart = iStart
iLeftOff = 0
End Sub
静态变量 iLeftOff 指定了字符长度。


ACCESS2000可以做到而vb做不到,是因为两个工具面向的对象不同,
两个的级别似乎本来就不一样,一个是开发工具,一个是应用程序,
vb相对于access2000处于底层的位置,
不要老想着什么功能都由开发工具来实现,然后自己将这些功能组合起来就完事了,
许多东西是需要自己制作的,并且也确实可以自己完成,

可能曲解了楼主的意思,若是,在此抱歉,
以上的话,只是发发牢骚,因为经常看见一些帖子问,
什么什么功能该如何实现啊,有没有控件可以实现这些功能啊,
而,往往问题都不难解决,利用vb本来的功能即可,只要动脑

再次抱歉
lgxysl 2003-08-26
  • 打赏
  • 举报
回复
多谢!
原来是这么难的呀。
道素 2003-08-26
  • 打赏
  • 举报
回复
附加
Private Declare Function SendMessageLong Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const CB_GETEXTENDEDUI = &H156
Private Const CB_SETEXTENDEDUI = &H155
Public Property Let ComboExtendedUI( _
ByRef cboThis As ComboBox, ByVal bState As Boolean _
)
SendMessageLong cboThis.hwnd, CB_SETEXTENDEDUI, Abs(bState), 0
End Property
Public Property Get ComboExtendedUI( _
ByRef cboThis As ComboBox _
) As Boolean
ComboExtendedUI = (SendMessageLong(cboThis.hwnd, CB_GETEXTENDEDUI, 0, 0) <> 0)
End Property

Private Sub Check1_Click()
ComboExtendedUI(Combo1) = (Check1.Value = Checked)
End Sub

以上实现的功能是当combobox获得焦点后,按键盘的下箭头建自动下拉列表(VB默认不下拉)
道素 2003-08-26
  • 打赏
  • 举报
回复
气死我了,写了一堆没发成功,重写一遍
1。对于打开的记录的连接是默认的adUseServer (mconn.CursorLocation =adUseServer )
类型打开记录集时要用adOpenStatic或者adOpenKeyset
或者将mconn.CursorLocation =adUseServer 改成mconn.CursorLocation =adUseClient
那么用adOpenDynamic也可以,这时调用rs.RecordCount 就可以获得行数
2。可以象 cuizm(射天狼)的做法也可以发消息
3。用消息实现
Private Const CB_SHOWDROPDOWN = &H14F
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Long) As Long

Private Sub Combo1_KeyPress(KeyAscii As Integer)
SendMessage Combo1.hwnd, CB_SHOWDROPDOWN, 1, ByVal 0&
End Sub
自动下来

下面是自动完成功能

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) _
As Long

Private Const CB_FINDSTRING As Long = &H14C
Public Sub ComboAutoComplete(ByRef SourceCtl As VB.ComboBox, _
ByRef KeyAscii As Integer, ByRef LeftOffPos As Long)
Dim iStart As Long
Dim sSearchKey As String

With SourceCtl
'If text entered so far matches item(s) in the list, use autocomplete
Select Case Chr$(KeyAscii)
Case vbBack
'Let backspace characters process as usual; otherwise try to match text
Case Else
If Chr$(KeyAscii) <> vbBack Then
.SelText = Chr$(KeyAscii)

iStart = .SelStart

If LeftOffPos <> 0 Then
.SelStart = LeftOffPos
iStart = LeftOffPos
End If

sSearchKey = CStr(Left$(.Text, iStart))
.ListIndex = SendMessage(.hWnd, CB_FINDSTRING, -1, _
ByVal CStr(Left$(.Text, iStart)))

If .ListIndex = -1 Then
LeftOffPos = Len(sSearchKey)
End If

.SelStart = iStart
.SelLength = Len(.Text)
LeftOffPos = 0

KeyAscii = 0
End If
End Select
End With
End Sub
Private Sub Combo1_KeyPress(KeyAscii As Integer)
Static iLeftOff As Long

ComboAutoComplete Combo1, KeyAscii, iLeftOff
End Sub
lgxysl 2003-08-23
  • 打赏
  • 举报
回复
“Combo控件本身没有这个功能,你自己编吧”,怎么编呢?
对于问题2,对于textbox控件怎么办?如果combox的style=0怎么办?
射天狼 2003-08-23
  • 打赏
  • 举报
回复
1. rs.RecordCount '行数,不过要想取这个行数,打开的时候记录集必须为adOpenStatic,静态的才可以
rs.Fields.Count '列数
2. Combo1.SelStart = 0
Combo1.SelLength = Len(Combo1.Text)
Combo1.SetFocus
'如果这么用,Combo控件的Style属性必须为1才行.
3. Combo控件本身没有这个功能,你自己编吧

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧