[已解决]请教:《文件拖曳问题》的延伸
本帖最后由 ferelove 于 2010-6-14 01:46 编辑http://www.autoitx.com/thread-15160-1-3.html
单个Input的文件拖曳时参考该帖子4楼解决,确实挺好用。
当有多个Input都需要类似的判断时,我始终处理不了,请教各位。谢谢! 新手,跟着学习学习 研究无果,继续请教高手。谢谢! 楼主什么意思,给段代码看看,这问题应该不麻烦,只是到底是哪个控件的问题
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ACN_HASH.au3>
Global $Hash, $FileHandle, $Filename, $Filename2, $Buffersize = 0x20000
$Form1 = GUICreate("多个Input文件拖曳判断", 364, 211, -1, -1, -1, $WS_EX_ACCEPTFILES)
$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, $GUI_DROPACCEPTED)
$Button3 = GUICtrlCreateButton("浏览2", 312, 67, 43, 25)
$Input3 = GUICtrlCreateInput("浏览或拖曳一个文件到这里", 8, 70, 297, 21)
GUICtrlSetState(-1, 8)
$Button4 = GUICtrlCreateButton("复制2", 312, 97, 43, 25)
$Input4 = GUICtrlCreateInput("", 8, 100, 297, 21)
$Filename = GUICtrlRead($Input1)
$Filename2 = GUICtrlRead($Input3)
GUISetState(@SW_SHOW)
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)
MD5A()
EndIf
Case $GUI_EVENT_DROPPED
$_Filename = ControlCommand($Form1, '', $Input1, 'GetSelected', '')
$_Filename2 = ControlCommand($Form1, '', $Input3, 'GetSelected', '')
If $_Filename<>$Filename Then
If StringInStr($_Filename, "|") <> 0 Then
GUICtrlSetData($Input1, "浏览或拖曳一个文件到这里")
MsgBox(16, "错误", "一次只能拖曳一个文件!", 5)
GUICtrlSetData($Input1, $Filename)
Else
GUICtrlSetData($Input1, $_Filename)
MD5A()
$Filename = $_Filename
EndIf
ElseIf $_Filename2<>$Filename2 Then
If StringInStr($_Filename2, "|") <> 0 Then
GUICtrlSetData($Input3, "浏览或拖曳一个文件到这里")
MsgBox(16, "错误", "一次只能拖曳一个文件!", 5)
GUICtrlSetData($Input3, $Filename2)
Else
GUICtrlSetData($Input3, $_Filename2)
MD5B()
$Filename = $_Filename2
EndIf
EndIf
EndSwitch
WEnd
Func MD5A()
MsgBox(0, 0, 'MD5A')
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 ;==>MD5A
Func MD5B()
MsgBox(0, 0, 'MD5B')
GUICtrlSetData($Input4, "计算中,请稍等...")
$FileHandle = FileOpen($_Filename2, 16)
$MD5CTX = _MD5Init()
For $i = 1 To Ceiling(FileGetSize($_Filename2) / $Buffersize)
_MD5Input($MD5CTX, FileRead($FileHandle, $Buffersize))
Next
$Hash = _MD5Result($MD5CTX)
FileClose($FileHandle)
$Hash = StringTrimLeft($Hash, 2)
$Hash = StringUpper($Hash)
GUICtrlSetData($Input4, $Hash)
EndFunc ;==>MD5B 本帖最后由 ferelove 于 2010-6-13 23:35 编辑
谢谢lynfr8元老 ,及各位朋友!
问题仍未解决。
当已经往Input里拖放了第1次,而且在未全选内容时,再往该Input拖放第2次(先拖曳一次,然后将光标定位到上次结果的某个位置中,再拖曳一次试试。),那么就会如图所示结果。
当整个界面中只有1个Input时,倒是处理很理想的,但,当有2个以上的Input时,处理效果没能达到预期效果。
能对Input1进行处理时,Input2却受影响,能对Input2进行处理时,Input1却受影响,彼此有干扰。
拿到代码首先要分析代码的思路
从中学习到解决关键问题的方法
而不是这个代码是否解决了自己目前的问题
如果你真的读懂了代码
那么你肯定会明白为何会出现这种情况 写了个简单例子$Form1 = GUICreate('多输入框接受拖放例子', 400, 120, -1, -1, -1, 0x00000010)
GUICtrlCreateInput('', 5, 5, 390, 20)
GUICtrlSetState(-1, 8)
GUICtrlCreateInput('', 5, 30, 390, 20)
GUICtrlSetState(-1, 8)
GUICtrlCreateInput('', 5, 55, 390, 20)
GUICtrlSetState(-1, 8)
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case -13
$mouse = GUIGetCursorInfo($Form1)
$_str = ControlCommand($Form1, '', $mouse, 'GetSelected', '')
GUICtrlSetData($mouse, $_str)
EndSwitch
WEnd 一时心急,未领悟代码急于求成。非常感谢lynfr8元老的教导!问题得于解决。
感谢afan超版!一段代码让我见识和学习了更多的知识。 回复 8# afan
您的-13 是怎么得来的啊?很好奇哦! 回复 10# xuanfeng1234567
几个常用消息常量之一,就是 $GUI_EVENT_DROPPED 回复 11# afan
-3是从前辈这里学到的,今天又学到了-13 {:face (411):} 回复 11# afan
嘿嘿...又学到了点东西,但是不知道为什么他被定义为-13? 本帖最后由 水木子 于 2010-6-15 16:32 编辑
回复 13# xuanfeng1234567
$GUI_EVENT_CLOSE-3对话框(窗口)正被关闭(相关按钮被点击或系统菜单项被选中).
$GUI_EVENT_MINIMIZE-4对话框(窗口)被最小化(窗口标题栏上的最小化按钮被点击)
$GUI_EVENT_RESTORE-5对话框(窗口)被还原(任务栏图标被点击)
$GUI_EVENT_MAXIMIZE-6对话框(窗口)被最大化(窗口标题栏上的最大化按钮被点击)
$GUI_EVENT_MOUSEMOVE-7鼠标光标被移动.
$GUI_EVENT_PRIMARYDOWN-8鼠标的主要按钮被按下.(多指左键)
$GUI_EVENT_PRIMARYUP -9鼠标的主要按钮被松开.(多指左键)
$GUI_EVENT_SECONDARYDOWN-10鼠标的第二个按钮被按下.(多指右键)
$GUI_EVENT_SECONDARYUP -11鼠标的第二个按钮被松开.(多指右键)
$GUI_EVENT_RESIZED-12对话框大小改变.
$GUI_EVENT_DROPPED-13拖放(Drag&Drop)操作结束,@GUI_DRAGID, @GUI_DRAGFILE 和 @GUI_DROPID 将用于返回 ID/文件 相应的控件.
没测试,只是瞎猜的,不知道是不是这样。 应该是吧,嘿嘿!!
页:
[1]
2