| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1299 人关注过本帖
标题:点击MSHFlexGrid选择一行,单击显示图片,老是失灵,求高手解!
只看楼主 加入收藏
wxflw
Rank: 6Rank: 6
等 级:侠之大者
帖 子:324
专家分:435
注 册:2012-1-29
结帖率:88.24%
收藏
已结贴  问题点数:20 回复次数:5 
点击MSHFlexGrid选择一行,单击显示图片,老是失灵,求高手解!
功能描述:点击表格中一行通过表格数据编号,在数据库得到数据库中“图片”字段中保存的图片文件夹绝对路径,赋值给apptp1这个变量传递给commbox7的单击事件
          单击按钮7,通过apptp1获得的路径查找文件夹中所有文件,单击一次显示一张图片,循环显示。
问题:在表格的单击事件没有出错,但是奇怪的是,有时候能通过按钮7显示选中的那个信息对应的图片,有时候却显示不了,没有错误提示(出错处理屏蔽了),
      有点像来不及加载图片或文件的感觉,如果表格中存在几条数据,选择一个循环显示图片没有问题,但是,点击其他几条的时候却发现显示不了图片了,
      然后回到开始正常显示的那条也显示不了了,在选择刚才无法显示的又显示正常了,有时候干脆一个都不显示图片!!特别是点击频率快或多的时候
帮检查一下看看什么问题!如果有更好的优化方法请指点一下。
Dim spt() As String
Dim apptp1 As String
Dim mg
----------------------------------------------------------
Private Sub MSHFlexGrid3_Click()
  Dim j As Integer
  Command7.Enabled = False
  j = MSHFlexGrid3.MouseRow
  If MSHFlexGrid3.TextMatrix(j, 0) = mg Then Exit Sub  '如果点击原来的那条就退出
  mg = MSHFlexGrid3.TextMatrix(j, 0)
  If MSHFlexGrid3.Text = "" Then Exit Sub  '如果没有记录就退出
   apptp1 = ""  '清空变量
   Label25.Caption = ""
   Set Image1.Picture = Nothing
    Mle = ""  '清空变量
    Set cn = New adodb.Connection
    Set rs = New adodb.Recordset
    If cn.State = adStateOpen Then cn.Close
    If rs.State = adStateOpen Then rs.Close
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " & App.Path & "\fyxx.mdb;Jet OLEDB:Database Password=88 "
    sql = "select * from czfy where 编号 = " & (MSHFlexGrid3.TextMatrix(j, 0)) & ""
    rs.Open sql, cn, adOpenForwardOnly, adLockBatchOptimistic
    If rs.EOF And rs.BOF Then Exit Sub
    apptp1 = rs.Fields("图片") & ""   '获取图片文件夹路径
    If apptp1 <> "" Then
       Command7.Enabled = True
    End If
    If apptp1 = "" Then
         Label25.Caption = "注意:没有图片!"
        Exit Sub
    End If
    End If
end  sub
------------------------------------------------------------------------------------------------
Private Sub Command7_Click() '循环显示图片
On Error GoTo ErrLabel:
          Dim sth As String
          Dim sle As String
          Dim tst As ListItem
          Dim Mle As String
           Static ia%
      Command7.Enabled = False
    If apptp1 = "" Then
         Label25.Caption = "注意:没有图片!"
        Exit Sub
    End If
      '======================
          Label25.Caption = ""
          Set Image1.Picture = Nothing
          sth = apptp1 + "\"
          sle = sth & "*.*"
          Mle = Dir(sle, vbNormal) '获得符合条件的文件名
          Do While Mle <> ""         '循环查找
             f = f & Mle & vbCrLf     '添加到f数组
             Mle = Dir
          Loop
              spt = Split(f, vbCrLf)
              If ia = UBound(spt) - 1 Then ia = 0  '循环
              Image1.Picture = LoadPicture(apptp1 & "\" & spt(ia))
              Label25.Caption = CreateObject("Scripting.FileSystemObject").GetBaseName(apptp1 & "\" & spt(ia)) '显示文件名不带后缀
              ia = ia + 1
     '=======================================
ErrLabel:
Command7.Enabled = True
End Sub

[ 本帖最后由 wxflw 于 2012-11-14 17:58 编辑 ]
搜索更多相关主题的帖子: 数据库 文件夹 图片 信息 
2012-11-14 17:32
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30047
注 册:2008-10-15
收藏
得分:10 
没测试环境,无法测试。
只看到一个优化的问题。
    Set cn = New adodb.Connection
    Set rs = New adodb.Recordset

connection ,在一个工程里,针对一个数据库,只需要建立一个连接,不需要,也不建议建立多个。
recordset ,在一个过程中,需要的时就建立一个新的,用完就 销毁,而不是在整个工程中复用。

Private Sub Command7_Click() '循环显示图片
这个过程中,建议分成二部分。
一个全局变量表示 是否做了第一部分。
你的文件名是放在 全局数组中的。
那么,当第一次调用 command7 时,调用第一部分,也就是
    If apptp1 = "" Then
         Label25.Caption = "注意:没有图片!"
        Exit Sub
    End If
      '======================
          Label25.Caption = ""
          Set Image1.Picture = Nothing
          sth = apptp1 + "\"
          sle = sth & "*.*"
          Mle = Dir(sle, vbNormal) '获得符合条件的文件名
          Do While Mle <> ""         '循环查找
             f = f & Mle & vbCrLf     '添加到f数组
             Mle = Dir
          Loop
              spt = Split(f, vbCrLf)
这一部分,
调用完成后,设置一个标记,
然后再调用显示部分。

每次按钮7时,都先检查一个这个标记,然后再决定是否需要重复查找硬盘上的文件名。
如果是一个循环的图片,那么就继续使用上一次的数据。直接跳去显示。



或者你就干脆把检索图片名的程序段就放在  MSHFlexGrid3_Click 也可以。
另外 SPlit 这个函数,运行起来还是有点慢的。
如果能不使用这个函数,那就不要使用这个函数。
--------------------------
没有测试环境,无法测试,静态看,目前没看到问题出在那个地方。

授人于鱼,不如授人于渔
早已停用QQ了
2012-11-14 18:47
wxflw
Rank: 6Rank: 6
等 级:侠之大者
帖 子:324
专家分:435
注 册:2012-1-29
收藏
得分:0 
谢谢版主啊!长知识了!你说尽量不用SPlit函数,那我这个功能有其他方法实现吗?关键是我把图片存在文件夹中的!有时候我希望直接打开图片不要通过程序打开。

学习--------------学习-------------------学习--------------------!!
2012-11-15 08:35
wxflw
Rank: 6Rank: 6
等 级:侠之大者
帖 子:324
专家分:435
注 册:2012-1-29
收藏
得分:0 
::::
Set cn = New adodb.Connection
Set rs = New adodb.Recordset
connection ,在一个工程里,针对一个数据库,只需要建立一个连接,不需要,也不建议建立多个。
 recordset ,在一个过程中,需要的时就建立一个新的,用完就 销毁,而不是在整个工程中复用。
::::::
以前没注意过!都是一板一眼在凿出来的,请教一下,希望不要嫌我烦啊!
 connection只建立一个连接是什么意思?是不是只要工程第一次调用Set cn = New adodb.Connection以后就不要再在其他窗体再次使用Set cn = New adodb.Connection了?还是其他意思?
  
recordset建立一个新的用完就销毁是什么意思?为什么要销毁?怎么销毁?rs.Close是销毁吗?不销毁是不是占内存?

还有个MSHFlexGrid3_Click问题:   
    如果在MSHFlexGrid3_Click过程执行到一半又触发MSHFlexGrid3_Click事件会不会出错?就上面说的图片不显示的问题好像就错在这上面,有什么避免的方法吗?
     点击一条记录后立刻点击另一条记录就会出现上面说的不加载图片的问题,就是没有图片显示


[ 本帖最后由 wxflw 于 2012-11-15 09:45 编辑 ]

学习--------------学习-------------------学习--------------------!!
2012-11-15 09:13
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30047
注 册:2008-10-15
收藏
得分:10 
Connection
在 程序初始化时,就建立 ,然后程序中,不再对这个 Connection 进行操作,直接使用就可以了。

怎么销毁?rs.Close是销毁吗?不销毁是不是占内存?
rs.close 是关闭,如果你是在过程或函数中定义的 局部变量,关闭就可以了,退出过程或函数时会自动销毁。
手动销毁是: 关闭后,再执行 set rs=nothing

点击这块,我没办法仔细看,对这个控件不熟悉。
我的理解应该是 在 网格中有一个序列,单击时,通过这个序列去查表,得路径,然后枚举文件名。
再把文件名通过按钮显示出来。
优化策略:中间访问控件的属性的操作尽量减少,多用使用局部变量代替。
少进行字符串连接操作,如果一个字符串需要中间使用二次或以上,都尽量生成一个临时变量来调用。

授人于鱼,不如授人于渔
早已停用QQ了
2012-11-15 14:45
wxflw
Rank: 6Rank: 6
等 级:侠之大者
帖 子:324
专家分:435
注 册:2012-1-29
收藏
得分:0 
明白了!谢谢!我在试试!

学习--------------学习-------------------学习--------------------!!
2012-11-15 15:26
快速回复:点击MSHFlexGrid选择一行,单击显示图片,老是失灵,求高手解!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016396 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved