找回密码
 加入
搜索
查看: 12171|回复: 13

[GUI管理] 文件拖曳问题(已解决)

 火.. [复制链接]
发表于 2010-5-2 21:57:46 | 显示全部楼层 |阅读模式
本帖最后由 wujianfu 于 2010-5-3 13:04 编辑

我编了个计算MD5值的工具,但在使用过程出现了一些问题,如下:
将文件拖曳到input1控件后,会在input1控件中显示被拖曳文件的路径。但是第二次拖曳时的返回值是接在第一次拖曳的返回值后面,即第一次拖曳的返回值并没有被清除,而是两次的结果混在一起了。
我的问题是:如何在在拖曳后清除原来input1中的路径,即只显示刚刚被拖曳文件的路径。这个问题困扰我很久了,问高手指点一下。

以下是截图:

第一次拖曳


第二次拖曳

附上源码:
  1. #Region ;**** 参数创建于 ACNWrapper_GUI ****
  2. #AutoIt3Wrapper_icon=G:\素材大全\图标资源\系统图标\51(1).ico
  3. #AutoIt3Wrapper_Res_Comment=计算文件的MD5值
  4. #AutoIt3Wrapper_Res_Description=计算文件的MD5值
  5. #AutoIt3Wrapper_Res_Fileversion=1.0
  6. #AutoIt3Wrapper_Res_LegalCopyright=阿福所有 侵权不究
  7. #EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
  8. #include <ButtonConstants.au3>
  9. #include <EditConstants.au3>
  10. #include <GUIConstantsEx.au3>
  11. #include <WindowsConstants.au3>
  12. #include <ACN_HASH.au3>
  13. Global $Hash,$FileHandle,$Filename,$Buffersize=0x20000
  14. #Region ### START Koda GUI section ### Form=
  15. $Form1 = GUICreate("计算文件的MD5值", 364, 71, -1, -1,-1,$WS_EX_ACCEPTFILES)
  16. GUISetIcon("G:\素材大全\图标资源\系统图标\51(1).ico", -1)
  17. $Input1 = GUICtrlCreateInput("浏览或拖曳一个文件到这里", 8, 8, 297, 21)
  18. GUICtrlSetState($Input1,$GUI_DROPACCEPTED)
  19. $Button1 = GUICtrlCreateButton("浏览", 312, 4, 43, 25)
  20. $Input2 = GUICtrlCreateInput("", 8, 40, 297, 21)
  21. $Button2 = GUICtrlCreateButton("复制", 312, 36, 43, 25)
  22. GUISetState(@SW_SHOW)
  23. #EndRegion ### END Koda GUI section ###

  24. While 1
  25.         $nMsg = GUIGetMsg()
  26.         Switch $nMsg
  27.                 Case $GUI_EVENT_CLOSE
  28.                         Exit
  29.                 Case $Button2
  30.                         ClipPut(GUICtrlRead($Input2))
  31.                         MsgBox(0,"结果","已将MD5值复制到剪贴板!",2)
  32.                 Case $Button1
  33.                         $Filename=FileOpenDialog("选择文件","","所有文件(*.*)")
  34.                         If @error<>1 Then
  35.                                 GUICtrlSetData($Input1,$Filename)
  36.                 MD5()
  37.                         EndIf        
  38.         Case $GUI_EVENT_DROPPED
  39.                         $Filename=GUICtrlRead($Input1)
  40.                         If StringInStr($Filename,"|")<>0 Then
  41.                                 GUICtrlSetData($Input1,"浏览或拖曳一个文件到这里")
  42.                                 MsgBox(16,"错误","一次只能拖曳一个文件!",5)
  43.                         Else
  44.                 MD5()
  45.             EndIf                                
  46.         EndSwitch
  47. WEnd
  48. Func MD5()
  49.         GUICtrlSetData($Input2,"计算中,请稍等...")
  50.     $FileHandle=FileOpen($Filename,16)
  51.     $MD5CTX=_MD5Init()
  52.     For $i=1 To Ceiling(FileGetSize($Filename)/$Buffersize)
  53.                 _MD5Input($MD5CTX,FileRead($FileHandle,$Buffersize))
  54.     Next
  55.         $Hash=_MD5Result($MD5CTX)
  56.         FileClose($FileHandle)
  57.     $Hash=StringTrimLeft($Hash,2)
  58.     $Hash=StringUpper($Hash)
  59.         GUICtrlSetData($Input2,$Hash)
  60. EndFunc        
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-5-2 22:18:42 | 显示全部楼层
我这里测试正常= =
 楼主| 发表于 2010-5-2 22:38:07 | 显示全部楼层
回复 2# 大绯狼
你先拖曳一次,然后将光标定位到上次结果的某个位置中,再拖曳一次试试。还有如果上次结果是处于选中状态的话,再拖曳是没有问题的。
发表于 2010-5-3 10:52:24 | 显示全部楼层
简单改几行
  1. #Region ;**** 参数创建于 ACNWrapper_GUI ****
  2. #AutoIt3Wrapper_Icon=G:\素材大全\图标资源\系统图标\51(1).ico
  3. #AutoIt3Wrapper_Res_Comment=计算文件的MD5值
  4. #AutoIt3Wrapper_Res_Description=计算文件的MD5值
  5. #AutoIt3Wrapper_Res_Fileversion=1.0
  6. #AutoIt3Wrapper_Res_LegalCopyright=阿福所有 侵权不究
  7. #EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
  8. #include <ButtonConstants.au3>
  9. #include <EditConstants.au3>
  10. #include <GUIConstantsEx.au3>
  11. #include <WindowsConstants.au3>
  12. #include <ACN_HASH.au3>
  13. Global $Hash, $FileHandle, $Filename, $Buffersize = 0x20000
  14. #Region ### START Koda GUI section ### Form=
  15. $Form1 = GUICreate("计算文件的MD5值", 364, 71, -1, -1, -1, $WS_EX_ACCEPTFILES)
  16. GUISetIcon("G:\素材大全\图标资源\系统图标\51(1).ico", -1)

  17. $Button1 = GUICtrlCreateButton("浏览", 312, 4, 43, 25)
  18. $Input2 = GUICtrlCreateInput("", 8, 40, 297, 21)
  19. $Button2 = GUICtrlCreateButton("复制", 312, 36, 43, 25)
  20. $Input1 = GUICtrlCreateInput("浏览或拖曳一个文件到这里", 8, 8, 297, 21)
  21. GUICtrlSetState(-1, 8)
  22. ;GUICtrlSetState(-1, 128) ;禁用
  23. $Filename = GUICtrlRead($Input1)
  24. GUISetState(@SW_SHOW)
  25. #EndRegion ### END Koda GUI section ###

  26. While 1
  27.         $nMsg = GUIGetMsg()
  28.         Switch $nMsg
  29.                 Case $GUI_EVENT_CLOSE
  30.                         Exit
  31.                 Case $Button2
  32.                         ClipPut(GUICtrlRead($Input2))
  33.                         MsgBox(0, "结果", "已将MD5值复制到剪贴板!", 2)
  34.                 Case $Button1
  35.                         $Filename = FileOpenDialog("选择文件", "", "所有文件(*.*)")
  36.                         If @error <> 1 Then
  37.                                 GUICtrlSetData($Input1, $Filename)
  38.                                 MD5()
  39.                         EndIf
  40.                 Case $GUI_EVENT_DROPPED
  41.                         $_Filename = ControlCommand($Form1, '', $Input1, 'GetSelected', '')
  42.                         If StringInStr($_Filename, "|") <> 0 Then
  43.                                 GUICtrlSetData($Input1, "浏览或拖曳一个文件到这里")
  44.                                 MsgBox(16, "错误", "一次只能拖曳一个文件!", 5)
  45.                                 GUICtrlSetData($Input1, $Filename)
  46.                         Else
  47.                                 GUICtrlSetData($Input1, $_Filename)
  48.                                 MD5()
  49.                                 $Filename = $_Filename
  50.                         EndIf
  51.         EndSwitch
  52. WEnd
  53. Func MD5()
  54.         GUICtrlSetData($Input2, "计算中,请稍等...")
  55.         $FileHandle = FileOpen($_Filename, 16)
  56.         $MD5CTX = _MD5Init()
  57.         For $i = 1 To Ceiling(FileGetSize($_Filename) / $Buffersize)
  58.                 _MD5Input($MD5CTX, FileRead($FileHandle, $Buffersize))
  59.         Next
  60.         $Hash = _MD5Result($MD5CTX)
  61.         FileClose($FileHandle)
  62.         $Hash = StringTrimLeft($Hash, 2)
  63.         $Hash = StringUpper($Hash)
  64.         GUICtrlSetData($Input2, $Hash)
  65. EndFunc   ;==>MD5
复制代码
 楼主| 发表于 2010-5-3 13:03:17 | 显示全部楼层
回复 4# afan
之前有想过通过获取被选中字符串来达到重写inpu的目的,但苦于不知到获取选中字符串的函数,现在终于知道了,非常感谢楼主的帮助!
发表于 2010-5-14 11:48:49 | 显示全部楼层
强烈学习~~~
发表于 2010-5-24 15:29:49 | 显示全部楼层
恩  学习中。。。。。
发表于 2010-5-25 06:06:51 | 显示全部楼层
备以后查阅
发表于 2010-6-8 08:46:28 | 显示全部楼层
谢谢4楼的方法挺好用。
当有多个Input时,我用该方法总是起不到效果。
请教当有多个拖曳的Input都要判断时,如何实现?谢谢!
发表于 2011-7-19 14:55:22 | 显示全部楼层
解决了我一个难题, 虽说和问题不太相关
发表于 2011-8-24 20:42:14 | 显示全部楼层
把每次拖曳过来的文件用个数组记录下来,拖曳新的文件时挨个判断一下全路径即可,因为在拖曳过程中文件名和文件路径不会改变,且同一个路径下不会用同名文件。
发表于 2012-4-21 00:48:54 | 显示全部楼层
MARK  学习一下,这个备用
发表于 2014-6-4 15:41:30 | 显示全部楼层
谢谢4楼的代码
收藏一下备用
发表于 2018-5-27 20:27:11 | 显示全部楼层
谢谢楼主提供
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2026-9-20 23:15 , Processed in 0.061355 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

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