找回密码
 加入
搜索
查看: 3172|回复: 19

感谢 bing614 帮我解决了 请高手帮忙修改脚本, 谢谢!

[复制链接]
发表于 2009-10-10 16:21:19 | 显示全部楼层 |阅读模式
本帖最后由 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 [0] *2+1]
    Local $i, $iStart, $iFinal, $suFilter = ''
    $asFilter [0] = $asFLines [0] *2
    For $i=1 To $asFLines [0]
        $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 [0]
        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 [0] Then
        Return DllStructGetData ($usFile, 1)
    Else
        SetError (1)
        Return ""
    EndIf
EndFunc
附截图  

本帖子中包含更多资源

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

×
发表于 2009-10-10 18:13:26 | 显示全部楼层
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

评分

参与人数 1金钱 +25 贡献 +20 收起 理由
131738 + 25 + 20 再次谢谢!!! 就是这个效果!!!!!

查看全部评分

 楼主| 发表于 2009-10-10 18:28:59 | 显示全部楼层
2# bing614

谢谢!!!!

这个被保存文件名是脚本自动设置或自动捕捉的,还涉及到脚本的其它部分,你提供的方法我试过的,不行!

再次谢谢!!!!!!!!!!!
 楼主| 发表于 2009-10-10 22:59:40 | 显示全部楼层
顶出求解!!!!!!!!!!!!!!!!
发表于 2009-10-11 00:06:29 | 显示全部楼层
不知道具体有什么用,或者有简单点的办法
 楼主| 发表于 2009-10-11 01:10:03 | 显示全部楼层
5# afan
谢谢回帖!! 准备写个 INI 文件编辑工具...
使用 FileSaveDialog 语句也可以,只是每次保存时都需手动填写文件名和后缀
上面的代码能自动填写, 新建的可预设文件名, 打开的能自动捕捉原文件名, 后缀只是选类型后自动添加!
总之只要你可以使用默认值,保存对话框打开后,只需一键"确定"就行了!

实在不能改动,也只有使用 FileSaveDialog 语句 了....
发表于 2009-10-11 01:43:11 | 显示全部楼层
FileSaveDialog ( "标题", "起始目录", "文件类型" [, 选项 [, "默认文件名" [, 窗口句柄]]] )
我看不出来还有哪里不能改的?

文件类型 和 默认文件名  你控制这2个参数不行么?
 楼主| 发表于 2009-10-11 02:13:14 | 显示全部楼层
FileSaveDialog ( "标题", "起始目录", "文件类型" [, 选项 [, "默认文件名" [, 窗口句柄]]] )
我看不出来还有哪里不能改的?

文件类型 和 默认文件名  你控制这2个参数不行么?
sxd 发表于 2009-10-11 01:43

谢谢回帖!!
单纯使用 FileSaveDialog 的话,我没问题, 关键是上面原代码将 FileSaveDialog  该为_FileSaveDialog UDF 函数了,好处我在 6 楼说了!
发表于 2009-10-11 02:33:10 | 显示全部楼层
FileSaveDialog 也可以自动填写文件名和后缀吧
发表于 2009-10-11 03:45:58 | 显示全部楼层
http://www.autoitscript.com/forum/index.php?showtopic=64057&st=0&p=477865&hl=GetSaveFileName&fromsearch=1&#entry477865
用这个
 楼主| 发表于 2009-10-11 18:29:04 | 显示全部楼层
FileSaveDialog 也可以自动填写文件名和后缀吧
afan 发表于 2009-10-11 02:33

只能在参数中设定, 在修改就需手动了!

谢谢!!!!!!!!!!
 楼主| 发表于 2009-10-11 18:30:09 | 显示全部楼层
http://www.autoitscript.com/forum/index.php?showtopic=64057&st=0&p=477865&hl=GetSaveFileName&fromsearch=1&#entry477865用这个
bing614 发表于 2009-10-11 03:45

这个有点高深了, 我看看..............

谢谢!!!!!!!!!!!!!!!!!!!
发表于 2009-10-11 22:27:42 | 显示全部楼层
只能在参数中设定, 在修改就需手动了!

谢谢!!!!!!!!!!
131738 发表于 2009-10-11 18:29


等你做好了 一定要在这里看看  我看看是什么功能 因为我估计我的理解能力有问题
 楼主| 发表于 2009-10-12 00:15:55 | 显示全部楼层
本帖最后由 131738 于 2009-10-12 00:17 编辑
等你做好了 一定要在这里看看  我看看是什么功能 因为我估计我的理解能力有问题
sxd 发表于 2009-10-11 22:27

找不到解决方案,可能会放弃这段代码的............

其实也不是什么理解问题!简单说,就是打开保存文件对话框后,文件名输入框已经自动有了完整的文件名称和后缀名!比喻 ABC.au3 ,

此时若想存为 txt 文件, 只需在 保存类型中点选文本文件项, txt 后缀就自动跳到文件名输入框, 并且覆盖原 au3 后缀.  

FileSaveDialog 则没有这么高的自动程度了!

本想 autoit 在英文环境中能做到的, 偿试想在中文环境能否实现?..................
 楼主| 发表于 2009-10-14 21:53:29 | 显示全部楼层
再顶出,望高手!!!!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-4 15:01 , Processed in 0.080452 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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