找回密码
 加入
搜索
查看: 8499|回复: 15

[AU3基础] [已解决]求教关于GUICtrlSetData,读文件数据时换行不正确的问题

  [复制链接]
发表于 2013-5-22 14:25:03 | 显示全部楼层 |阅读模式
本帖最后由 cynthia59 于 2013-5-22 15:59 编辑

最近学习用autoit做个小界面,用到GUICtrlSetData时,需要向一个edit控件里写文本,我采用的方式是从文件里一行一行读取,但是需要换行时,用@lf和@cr都不能换行,是直接连着写进控件的,用@crlf时却直接给我换了2行,不知道该如何解决?(代码第37行)
-------------------------------------------------------
其实这是个读配置文件的地方,本来想用读标准ini的方式取数据,但是edit控件里需要换行显示文本内容,写到ini里再用IniRead只能读到第一行数据,后面的读不到了。如果这里有方式可解决也谢谢了!
-------------------------------------------------------
代码如下(已删去了不相关的代码)
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <EditConstants.au3>

Opt ("GUIOnEventMode",1)
$parent = GuiCreate("test", 400, 420)
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents")


$Edit_1 = GuiCtrlCreateEdit("", 10, 93, 380, 150 )

$Button_7 = GuiCtrlCreateButton("读取配置文件", 120, 383 , 100)
    GUICtrlSetOnEvent(-1, "ReadPressed")
        
        
Func ChooseProjPressed()

        $var_proj = FileOpenDialog("", "" , "", 1 + 4 , "", $parent )

        GUICtrlSetData ( $Edit_1, $var_proj & @CRLF, 1 )        
        
EndFunc   ;==>ChooseProjPressed


        
Func ReadPressed()
        
        $var_read = FileOpenDialog("", "" , "所有文件 (*.*)", 1 + 4 , "", $parent )        
        $file = FileOpen($var_read, 0)

        For $i=1 To 100
                $line = FileReadLine($file, $i) 
                If @error = -1 Then ExitLoop                
                GUICtrlSetData($Edit_1 , $line & @LF, 1 )                ;这里有问题!
        Next
        

EndFunc   ;==>ReadPressed

Func SpecialEvents()
        Select
                Case @GUI_CtrlId = $GUI_EVENT_CLOSE
                        Exit

                Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE

                Case @GUI_CtrlId = $GUI_EVENT_RESTORE

        EndSelect
EndFunc   ;==>SpecialEvents

; GUI MESSAGE LOOP
GuiSetState()
While GuiGetMsg() <> $GUI_EVENT_CLOSE
WEnd
发表于 2013-5-22 14:37:40 | 显示全部楼层
为何要一行行写入呢?
 楼主| 发表于 2013-5-22 14:40:33 | 显示全部楼层
因为这个配置文件的上面还有其它内容,我需要从第10行开始读到最后,然后填到这个edit控件里显示出来。这里例子是从第一行开始读的而已。
 楼主| 发表于 2013-5-22 14:42:57 | 显示全部楼层
就是这里的换行,要么不换行,要么换2行,这里到底是什么地方出的问题呢?
在写数据的时候我把换行改为空格,它也是空2个字符,但是又觉得我的循环语句没有问题啊?
发表于 2013-5-22 14:47:11 | 显示全部楼层
配置文件的换行格式问题
 楼主| 发表于 2013-5-22 15:38:29 | 显示全部楼层
本帖最后由 cynthia59 于 2013-5-22 15:40 编辑
配置文件的换行格式问题
afan 发表于 2013-5-22 14:47


试了一下,确实是写配置文件的时候出的问题,如果直接手动修改ini文件换行输入,这里就对了。

我的流程是:
1)选择文件写入$Edit_1,或者复制粘贴文件路径写进$Edit_1(每个文件中间换行)
2)保存为ini文件
3)读取ini文件中的内容,写进$Edit_1

我保存配置文件的时候,这个字段是这样写进去的:(因为只有这个$Edit_1控件有换行,没有用IniWrite,后续读的时候用的读文件的方式)
IniWriteSection ($var_save, "工程列表",  GUICtrlRead($Edit_1) )
结果不管是选择写入的还是复制粘贴写入的或手动输入写入的,再读的时候都出现两个空行。
这里手动输入换行文本,保存,再读取,和直接修改ini文件再读取为什么不一样呢?求解!
发表于 2013-5-22 15:45:25 | 显示全部楼层
试了一下,确实是写配置文件的时候出的问题,如果直接手动修改ini文件换行输入,这里就对了。

我的流 ...
cynthia59 发表于 2013-5-22 15:38



    你这样写的ini文件会在该字段下的每行后面多出@CR回车,因为IniWriteSection仅以@LF分割。
发表于 2013-5-22 15:53:04 | 显示全部楼层
改成如下即可
IniWriteSection($var_save, "工程列表", StringRegExpReplace(GUICtrlRead($Edit_1), '\v+', @LF))
同时1#的37行改为
GUICtrlSetData($Edit_1, $line & @CRLF, 1)
 楼主| 发表于 2013-5-22 15:53:14 | 显示全部楼层
本帖最后由 cynthia59 于 2013-5-22 15:54 编辑

那我应该怎么处理这块呢?难道这里也要用写文件的方式写进去才行吗?
发表于 2013-5-22 15:56:24 | 显示全部楼层
那我应该怎么处理这块呢?难道这里也要用写文件的方式写进去才行吗?
cynthia59 发表于 2013-5-22 15:53



    抬头,已给出解决方案。
也可以不需要一行行载入Edit控件,用正则捕获整段数据一次载入
 楼主| 发表于 2013-5-22 15:58:55 | 显示全部楼层
改成如下即可同时1#的37行改为
afan 发表于 2013-5-22 15:53



    解决了,原来要先替换掉回车换行,我的脑筋还是太直了,谢谢afan的指导!
 楼主| 发表于 2013-5-22 16:04:48 | 显示全部楼层
抬头,已给出解决方案。
也可以不需要一行行载入Edit控件,用正则捕获整段数据一次载入
afan 发表于 2013-5-22 15:56



正则表达式这块觉得有点难,我就先放放了,用正则表达式是怎么个思路呢?
我的的配置文件大概如下:

[软件安装路径]
新版=C:\lubansoft\鲁班安装2013YS13
旧版=C:\lubansoft\鲁班安装2013YS12

[文件保存路径]
计算结果=C:\result\
计算日志=C:\result.log

[工程列表]
11
22
33
44
发表于 2013-5-22 16:12:36 | 显示全部楼层
32 - 38 行替换为以下:
Local $str = FileRead($var_read)
Local $aSR = StringRegExp($str, '(?s)\[工程列表\]\s+(.+?)(?=\s*\r\n\h*\[|\s*$)', 1)
If Not @Error Then GUICtrlSetData($Edit_1, $aSR[0])
 楼主| 发表于 2013-5-22 16:31:43 | 显示全部楼层
'(?s)\[工程列表\]\s+(.+?)(?=\s*\r\n\h*\[|\s*$)'
这一段看了半天还是没看明白怎么匹配的,先拿来用了,后面再努力研究研究。谢谢!
发表于 2013-5-27 02:24:46 | 显示全部楼层
看看学学,路过也得学学
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-17 19:03 , Processed in 0.080908 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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