SolidWorks机械工程师网——最大的SolidWorks学习平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

好品数字
好品数字
查看: 1393|回复: 6
打印 上一主题 下一主题

VB调用eDrawings 窗体显示防抖解决问题

  [复制链接]

5

主题

50

帖子

608

金币

传奇

Rank: 8Rank: 8

积分
3580

最佳新人活跃会员宣传达人

跳转到指定楼层
楼主
 楼主| 发表于 2024-4-20 09:54:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
问题描述:
      在 excel 中用 eDrawings 窗体显示solidworks零部件。 具体实现是 通过 Workbook_SheetSelectionChange 触发(也可以使用user32 API的MouseMove事件)。使用中发现一个问题,快速操作表格或者移动鼠标的时候,这些事件都是频繁触发的,而 eDrawings 打开 零部件还是耗时的,频繁触发会造成极大的延迟。 这中间频繁调用起始都是无效的,我们真正希望的是保留最后一次的调用。
解决思路: 就是利用延时制造一个 防抖多次触发 只执行最后一次。避免频繁调用,无效渲染
1. 触发事件,先执行一次,延时Ts, 才能再次调用。
2.  延时期间若是再次触发则更新 延时,重新延时Ts,记录需要最后一次的任务信息。‘
3. Ts延时后若是有任务则执行任务,若是没有则结束。
核心点: 2此 调用的时间间隔 大于等于 Ts,  频繁调用也是更新定时器,没有渲染调用,避免的了无效渲染,性能浪费。
下面是实现代码:




eDrawings

eDrawings

窗体防抖调用.txt

(2.66 KB, 下载次数: 5 售价: 1 金币

窗体防抖调用

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 转播转播 分享教程|习题|模型|技巧 点赞点赞 拍砖拍砖
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复

使用道具 举报

5

主题

50

帖子

608

金币

传奇

Rank: 8Rank: 8

积分
3580

最佳新人活跃会员宣传达人

沙发
 楼主| 发表于 2024-4-20 09:56:11 | 只看该作者
  1. 无效渲染'防抖使用 : 避免频繁调用,无效渲染
  2. '触发事件后函数会立即执行,n 秒内触发事件不会执行功能函数下一次调用,n秒后再次触发才会再次执行功能函数。
  3. '第一次: flag=false, 执行一次,flag=true,延时,flag=false
  4. '延时期间(flag=true),更新延迟,并记录最后一次的信息,延迟结束,执行
  5. Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  6.     Const waitTime As Single = 1#
  7.     Static Start As Single      '标记开始状态的时间
  8.     Static isSleep As Boolean ' 记录状态 初始值默认是false 防抖使用
  9.     Static hasTask As Boolean ' 是否有任务
  10.     Static last As Range
  11.     '防抖使用 : 避免频繁调用,无效渲染
  12.     '触发事件后函数会立即执行,n 秒内触发事件不会执行功能函数下一次调用,n秒后再次触发才会再次执行功能函数。
  13.     ' 更新 timer 并且退出
  14.     If isSleep Then
  15.         ' 单位是 秒
  16.         hasTask = True
  17.         Set last = Target
  18.         Start = Timer
  19.         Exit Sub
  20.     End If
  21.    ' 设置开始暂停的时刻。

  22.     Dim FileName As String
  23.     Dim FileType As String
  24.     Dim task As Range
  25.     isSleep = True
  26.     Set task = Target
  27. TashHandler:
  28.     hasTask = False
  29.     'Debug.Print task.row & "," & task.Column & ":  " & task
  30.     If task.Column = Header_e.fFileName Then
  31.         FileType = task.Offset(0, 1)
  32.         FileName = IIf(task <> "" And GetFileType(FileType) <> 0, task & "." & FileType, "")
  33.     ElseIf ActiveCell.Column = Header_e.fHasDraw Then
  34.         FileName = IIf(task = "★", task.Offset(0, 2) & ".SLDDRW", "")
  35.     Else
  36.         If ModelDisplay.visible = True Then
  37.             ModelDisplay.Hide
  38.         End If
  39.         isSleep = False
  40.         Exit Sub
  41.     End If
  42.     If FileName = "" Then
  43.         isSleep = False
  44.         ModelDisplay.Hide
  45.         Exit Sub
  46.     End If

  47.     ModelDisplay.Caption = FileName
  48.     FileName = Cells(task.row, Header_e.fFilePath) + FileName
  49.     If FileName <> ModelDisplay.doc Then
  50.         ModelDisplay.doc = FileName
  51.         'ModelDisplay.EModelViewControl1.CloseActiveDoc ModelDisplay.doc
  52.         'ModelDisplay.EModelViewControl1.Refresh
  53.         'ModelDisplay.Top = 50
  54.     End If
  55.     ModelDisplay.EModelViewControl1.OpenDoc FileName, False, False, True, ""
  56.     'Debug.Print task.Left, task.Width

  57.     If Not ModelDisplay.visible Then
  58.         ModelDisplay.Show vbModeless
  59.     End If
  60.     ModelDisplay.Left = Int(task.Left + task.Width) + 20


  61.     Start = Timer
  62.     While Timer < Start + waitTime
  63.         DoEvents    ' 将控制让给其他程序。
  64.     Wend
  65.     If hasTask Then Set task = last: GoTo TashHandler
  66.     isSleep = False
  67.      
  68.    ' ModelDisplay.Show
  69. End Sub
复制代码
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复 支持 反对

使用道具 举报

1

主题

299

帖子

200

金币

长老

Rank: 6Rank: 6Rank: 6

积分
1973

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

板凳
发表于 2024-4-20 10:16:55 | 只看该作者
感谢楼主分享,很不错!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

9

主题

265

帖子

395

金币

VIP特别用户组

Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30

积分
2317

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

地板
发表于 2024-4-20 13:45:45 | 只看该作者
感谢楼主分享,很不错!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

3

主题

1163

帖子

182

金币

传奇

Rank: 8Rank: 8

积分
3885

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

5#
发表于 2024-4-20 18:36:07 | 只看该作者

   经典案例图书
感谢楼主分享,很不错!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

9

主题

436

帖子

789

金币

传奇

Rank: 8Rank: 8

积分
4609

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

6#
发表于 2024-4-21 07:53:23 | 只看该作者
楼主辛苦了!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

9

帖子

11

金币

混混

Rank: 1

积分
38
7#
发表于 3 天前 | 只看该作者

   经典案例图书
感谢楼主分享,很不错!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭 卷起
关闭 卷起

SOLIDWORKS 2023 机械设计从入门到精通

手机版|小黑屋| GMT+8, 2024-5-29 04:27 , Processed in 0.155299 second(s), 37 queries .

SolidWorks机械工程师网 ( 鲁ICP备14025122号-2 ) 鲁公网安备 37028502190335号

声明:本网言论纯属发表者个人意见,与本网立场无关。
如涉版权,可发邮件: admin@swbbsc.com

快速回复 返回顶部 返回列表