文件拖曳问题(已解决)
本帖最后由 wujianfu 于 2010-5-3 13:04 编辑我编了个计算MD5值的工具,但在使用过程出现了一些问题,如下:
将文件拖曳到input1控件后,会在input1控件中显示被拖曳文件的路径。但是第二次拖曳时的返回值是接在第一次拖曳的返回值后面,即第一次拖曳的返回值并没有被清除,而是两次的结果混在一起了。
我的问题是:如何在在拖曳后清除原来input1中的路径,即只显示刚刚被拖曳文件的路径。这个问题困扰我很久了,问高手指点一下。
以下是截图:
第一次拖曳
第二次拖曳
附上源码:#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=G:\素材大全\图标资源\系统图标\51(1).ico
#AutoIt3Wrapper_Res_Comment=计算文件的MD5值
#AutoIt3Wrapper_Res_Description=计算文件的MD5值
#AutoIt3Wrapper_Res_Fileversion=1.0
#AutoIt3Wrapper_Res_LegalCopyright=阿福所有 侵权不究
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ACN_HASH.au3>
Global $Hash,$FileHandle,$Filename,$Buffersize=0x20000
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("计算文件的MD5值", 364, 71, -1, -1,-1,$WS_EX_ACCEPTFILES)
GUISetIcon("G:\素材大全\图标资源\系统图标\51(1).ico", -1)
$Input1 = GUICtrlCreateInput("浏览或拖曳一个文件到这里", 8, 8, 297, 21)
GUICtrlSetState($Input1,$GUI_DROPACCEPTED)
$Button1 = GUICtrlCreateButton("浏览", 312, 4, 43, 25)
$Input2 = GUICtrlCreateInput("", 8, 40, 297, 21)
$Button2 = GUICtrlCreateButton("复制", 312, 36, 43, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button2
ClipPut(GUICtrlRead($Input2))
MsgBox(0,"结果","已将MD5值复制到剪贴板!",2)
Case $Button1
$Filename=FileOpenDialog("选择文件","","所有文件(*.*)")
If @error<>1 Then
GUICtrlSetData($Input1,$Filename)
MD5()
EndIf
Case $GUI_EVENT_DROPPED
$Filename=GUICtrlRead($Input1)
If StringInStr($Filename,"|")<>0 Then
GUICtrlSetData($Input1,"浏览或拖曳一个文件到这里")
MsgBox(16,"错误","一次只能拖曳一个文件!",5)
Else
MD5()
EndIf
EndSwitch
WEnd
Func MD5()
GUICtrlSetData($Input2,"计算中,请稍等...")
$FileHandle=FileOpen($Filename,16)
$MD5CTX=_MD5Init()
For $i=1 To Ceiling(FileGetSize($Filename)/$Buffersize)
_MD5Input($MD5CTX,FileRead($FileHandle,$Buffersize))
Next
$Hash=_MD5Result($MD5CTX)
FileClose($FileHandle)
$Hash=StringTrimLeft($Hash,2)
$Hash=StringUpper($Hash)
GUICtrlSetData($Input2,$Hash)
EndFunc 我这里测试正常= = 回复 2# 大绯狼
你先拖曳一次,然后将光标定位到上次结果的某个位置中,再拖曳一次试试。还有如果上次结果是处于选中状态的话,再拖曳是没有问题的。 简单改几行#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_Icon=G:\素材大全\图标资源\系统图标\51(1).ico
#AutoIt3Wrapper_Res_Comment=计算文件的MD5值
#AutoIt3Wrapper_Res_Description=计算文件的MD5值
#AutoIt3Wrapper_Res_Fileversion=1.0
#AutoIt3Wrapper_Res_LegalCopyright=阿福所有 侵权不究
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ACN_HASH.au3>
Global $Hash, $FileHandle, $Filename, $Buffersize = 0x20000
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("计算文件的MD5值", 364, 71, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUISetIcon("G:\素材大全\图标资源\系统图标\51(1).ico", -1)
$Button1 = GUICtrlCreateButton("浏览", 312, 4, 43, 25)
$Input2 = GUICtrlCreateInput("", 8, 40, 297, 21)
$Button2 = GUICtrlCreateButton("复制", 312, 36, 43, 25)
$Input1 = GUICtrlCreateInput("浏览或拖曳一个文件到这里", 8, 8, 297, 21)
GUICtrlSetState(-1, 8)
;GUICtrlSetState(-1, 128) ;禁用
$Filename = GUICtrlRead($Input1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button2
ClipPut(GUICtrlRead($Input2))
MsgBox(0, "结果", "已将MD5值复制到剪贴板!", 2)
Case $Button1
$Filename = FileOpenDialog("选择文件", "", "所有文件(*.*)")
If @error <> 1 Then
GUICtrlSetData($Input1, $Filename)
MD5()
EndIf
Case $GUI_EVENT_DROPPED
$_Filename = ControlCommand($Form1, '', $Input1, 'GetSelected', '')
If StringInStr($_Filename, "|") <> 0 Then
GUICtrlSetData($Input1, "浏览或拖曳一个文件到这里")
MsgBox(16, "错误", "一次只能拖曳一个文件!", 5)
GUICtrlSetData($Input1, $Filename)
Else
GUICtrlSetData($Input1, $_Filename)
MD5()
$Filename = $_Filename
EndIf
EndSwitch
WEnd
Func MD5()
GUICtrlSetData($Input2, "计算中,请稍等...")
$FileHandle = FileOpen($_Filename, 16)
$MD5CTX = _MD5Init()
For $i = 1 To Ceiling(FileGetSize($_Filename) / $Buffersize)
_MD5Input($MD5CTX, FileRead($FileHandle, $Buffersize))
Next
$Hash = _MD5Result($MD5CTX)
FileClose($FileHandle)
$Hash = StringTrimLeft($Hash, 2)
$Hash = StringUpper($Hash)
GUICtrlSetData($Input2, $Hash)
EndFunc ;==>MD5 回复 4# afan
之前有想过通过获取被选中字符串来达到重写inpu的目的,但苦于不知到获取选中字符串的函数,现在终于知道了,非常感谢楼主的帮助! 强烈学习~~~ 恩学习中。。。。。 备以后查阅 谢谢4楼的方法挺好用。
当有多个Input时,我用该方法总是起不到效果。
请教当有多个拖曳的Input都要判断时,如何实现?谢谢! 解决了我一个难题, 虽说和问题不太相关{:face (197):} 把每次拖曳过来的文件用个数组记录下来,拖曳新的文件时挨个判断一下全路径即可,因为在拖曳过程中文件名和文件路径不会改变,且同一个路径下不会用同名文件。 MARK学习一下,这个备用 谢谢4楼的代码
收藏一下备用 谢谢楼主提供
页:
[1]