感谢 bing614 帮我解决了 请高手帮忙修改脚本, 谢谢!
本帖最后由 131738 于 2009-10-15 00:16 编辑下面是一段打开"保存文件对话框", 保存文件的部分代码,摘自官网的一个脚本.
要求附图中红框内修改为中文,因代码中涉及到 API ; 位"与" ; 位"移" ; 位"或"运算,本人对此一窍不通!
试着修改了代码第四行 _FileSaveDialog 中第三个参数为中文, 结果"保存对话框" 相应部分显示乱码, 文件也不能正确保存!
谢谢!!!!func _get_save_file($newname = "New File")
Local $save_file_dir = ""
$rectype = False
$save_file_dir = _FileSaveDialog("Save INI file", "", "Ini File [*.ini](*.ini)|Txt File [*.txt](*.txt)|Data File [*.dat](*.dat)|Config File [*.cfg](*.cfg)|Other [*.*](*.*)", 2+16, $newname, "", $Form1)
Return $save_file_dir
EndFunc
Func _FileSaveDialog ($sTitle, $sInitDir, $sFilter = 'All (*.*)', $iOpt = 0, $sDefaultFile = "", $sDefaultExt = "", $mainGUI = 0)
Local $iFileLen = 65536 ; 在返回的字符串中的最大字符数
; 准备 API 标志
Local $iFlag01 = BitAND ($iOpt, 2) ;位"与"运算
Local $iFlag02 = BitShift($iFlag01,-10) ;位"移"运算
Local $iFlag03 = BitAND($iOpt,16) ;位"与"运算
Local $iFlag04 = BitShift($iFlag03, 3) ;位"移"运算
Local $iFlag = BitOR($iFlag02, $iFlag04) ;位"或"运算
; 过滤字符串转换到数组
Local $asFLines = StringSplit( $sFilter, '|');分隔符拆分字串
Local $asFilter [$asFLines *2+1]
Local $i, $iStart, $iFinal, $suFilter = ''
$asFilter = $asFLines *2
For $i=1 To $asFLines
$iStart = StringInStr($asFLines [$i], '(', 0, 1) ;检查是否含有给定的子串
$iFinal = StringInStr($asFLines [$i], ')', 0,-1);检查是否含有给定的子串
$asFilter01 = StringLeft($asFLines [$i], $iStart-1) ;返回从左开始指定数量的字符
$asFilter [$i*2-1] = StringStripWS ($asFilter01, 3) ;删去所有"空白符".
$asFilter02 = StringTrimLeft($asFLines [$i], $iStart);删除从左开始指定数量的字符
$asFilter03 = StringLen($asFLines [$i]) ;返回字符总数
$asFilter04 = StringTrimRight($asFilter02, $asFilter03 -$iFinal+1);删除从右开始指定数量的字符
$asFilter [$i*2] = StringStripWS($asFilter04, 3) ;删去所有"空白符".
$suFilter01 = StringLen($asFilter [$i*2-1]);返回字符总数
$suFilter02 = StringLen($asFilter [$i*2]) ;返回字符总数
$suFilter = $suFilter & 'char[' & $suFilter01 + 1 & '];char[' & $suFilter02 + 1 & '];'
Next
; 创建 API 结构
Local $uOFN = DllStructCreate ('dword;int;int;ptr;ptr;dword;dword;ptr;dword' & _
';ptr;int;ptr;ptr;dword;short;short;ptr;ptr;ptr;ptr;ptr;dword;dword' )
Local $usTitle= DllStructCreate ('char[' & StringLen ($sTitle) +1 & ']')
Local $usInitDir= DllStructCreate ('char[' & StringLen ($sInitDir) +1 & ']')
Local $usFilter = DllStructCreate ($suFilter & 'char')
Local $usFile = DllStructCreate ('char[' & $iFileLen & ']')
Local $usExtn = DllStructCreate ('char[' & StringLen ($sDefaultExt) +1 & ']')
For $i=1 To $asFilter
DllStructSetData ($usFilter, $i, $asFilter [$i])
Next
; 为 API 结构设置数据
DllStructSetData ($usTitle, 1, $sTitle)
DllStructSetData ($usInitDir, 1, $sInitDir)
DllStructSetData ($usFile, 1, $sDefaultFile)
DllStructSetData ($usExtn, 1, $sDefaultExt)
DllStructSetData ($uOFN,1, DllStructGetSize($uOFN))
DllStructSetData ($uOFN,2, $mainGUI)
DllStructSetData ($uOFN,4, DllStructGetPtr ($usFilter))
DllStructSetData ($uOFN,7, 1)
DllStructSetData ($uOFN,8, DllStructGetPtr ($usFile))
DllStructSetData ($uOFN,9, $iFileLen)
DllStructSetData ($uOFN, 12, DllStructGetPtr ($usInitDir))
DllStructSetData ($uOFN, 13, DllStructGetPtr ($usTitle))
DllStructSetData ($uOFN, 14, $iFlag)
DllStructSetData ($uOFN, 17, DllStructGetPtr ($usExtn))
DllStructSetData ($uOFN, 23, BitShift (BitAND ($iOpt, 32), 5))
; 调用 API 功能
$ret = DllCall ('comdlg32.dll', 'int', 'GetSaveFileName', 'ptr', DllStructGetPtr ($uOFN) )
If $ret Then
Return DllStructGetData ($usFile, 1)
Else
SetError (1)
Return ""
EndIf
EndFunc附截图 AU3自带的不行么????????$MyDocsFolder = "::{450D8FBA-AD25-11D0-98A8-0800361B1103}"
$var = FileSaveDialog( "输入一个名称.", $MyDocsFolder, "脚本 (*.aut;*.au3)", 2)
; 选项 2 = 除非选择一个有效的路径/文件,或者按下取消按钮,对话框不能关闭.
If @error Then
MsgBox(4096,"","取消保存.")
Else
MsgBox(4096,"","你保存为了:" & $var)
EndIf
; 多筛选项
$var = FileSaveDialog( "输入一个名称.", $MyDocsFolder, "脚本 (*.aut;*.au3)|文本文件 (*.ini;*.txt)", 2)
; 选项 2 = 除非选择一个有效的路径/文件,或者按下取消按钮,对话框不能关闭.
If @error Then
MsgBox(4096,"","取消保存.")
Else
MsgBox(4096,"","你保存为了:" & $var)
EndIf 2# bing614
谢谢!!!!
这个被保存文件名是脚本自动设置或自动捕捉的,还涉及到脚本的其它部分,你提供的方法我试过的,不行!
再次谢谢!!!!!!!!!!! 顶出求解!!!!!!!!!!!!!!!! 不知道具体有什么用,或者有简单点的办法 5# afan
谢谢回帖!! 准备写个 INI 文件编辑工具...
使用 FileSaveDialog 语句也可以,只是每次保存时都需手动填写文件名和后缀
上面的代码能自动填写, 新建的可预设文件名, 打开的能自动捕捉原文件名, 后缀只是选类型后自动添加!
总之只要你可以使用默认值,保存对话框打开后,只需一键"确定"就行了!
实在不能改动,也只有使用 FileSaveDialog 语句 了.... FileSaveDialog ( "标题", "起始目录", "文件类型" [, 选项 [, "默认文件名" [, 窗口句柄]]] )
我看不出来还有哪里不能改的?
文件类型 和 默认文件名你控制这2个参数不行么? FileSaveDialog ( "标题", "起始目录", "文件类型" [, 选项 [, "默认文件名" [, 窗口句柄]]] )
我看不出来还有哪里不能改的?
文件类型 和 默认文件名你控制这2个参数不行么?
sxd 发表于 2009-10-11 01:43 http://autoitx.com/images/common/back.gif
谢谢回帖!!
单纯使用 FileSaveDialog 的话,我没问题, 关键是上面原代码将 FileSaveDialog该为_FileSaveDialog UDF 函数了,好处我在 6 楼说了! FileSaveDialog 也可以自动填写文件名和后缀吧 http://www.autoitscript.com/forum/index.php?showtopic=64057&st=0&p=477865&hl=GetSaveFileName&fromsearch=1&#entry477865用这个 FileSaveDialog 也可以自动填写文件名和后缀吧
afan 发表于 2009-10-11 02:33 http://autoitx.com/images/common/back.gif
只能在参数中设定, 在修改就需手动了!
谢谢!!!!!!!!!! http://www.autoitscript.com/forum/index.php?showtopic=64057&st=0&p=477865&hl=GetSaveFileName&fromsearch=1&#entry477865用这个
bing614 发表于 2009-10-11 03:45 http://autoitx.com/images/common/back.gif
这个有点高深了, 我看看..............
谢谢!!!!!!!!!!!!!!!!!!!
只能在参数中设定, 在修改就需手动了!
谢谢!!!!!!!!!!
131738 发表于 2009-10-11 18:29 http://www.autoitx.com/images/common/back.gif
等你做好了 一定要在这里看看我看看是什么功能 因为我估计我的理解能力有问题 本帖最后由 131738 于 2009-10-12 00:17 编辑
等你做好了 一定要在这里看看我看看是什么功能 因为我估计我的理解能力有问题
sxd 发表于 2009-10-11 22:27 http://autoitx.com/images/common/back.gif
找不到解决方案,可能会放弃这段代码的............
其实也不是什么理解问题!简单说,就是打开保存文件对话框后,文件名输入框已经自动有了完整的文件名称和后缀名!比喻 ABC.au3 ,
此时若想存为 txt 文件, 只需在 保存类型中点选文本文件项, txt 后缀就自动跳到文件名输入框, 并且覆盖原 au3 后缀.
FileSaveDialog 则没有这么高的自动程度了!
本想 autoit 在英文环境中能做到的, 偿试想在中文环境能否实现?.................. 再顶出,望高手!!!!!!!!!!!!!!
页:
[1]
2