[已解决]求教关于GUICtrlSetData,读文件数据时换行不正确的问题
本帖最后由 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 为何要一行行写入呢? 因为这个配置文件的上面还有其它内容,我需要从第10行开始读到最后,然后填到这个edit控件里显示出来。这里例子是从第一行开始读的而已。 就是这里的换行,要么不换行,要么换2行,这里到底是什么地方出的问题呢?
在写数据的时候我把换行改为空格,它也是空2个字符,但是又觉得我的循环语句没有问题啊? 配置文件的换行格式问题 本帖最后由 cynthia59 于 2013-5-22 15:40 编辑
配置文件的换行格式问题
afan 发表于 2013-5-22 14:47 http://www.autoitx.com/images/common/back.gif
试了一下,确实是写配置文件的时候出的问题,如果直接手动修改ini文件换行输入,这里就对了。
我的流程是:
1)选择文件写入$Edit_1,或者复制粘贴文件路径写进$Edit_1(每个文件中间换行)
2)保存为ini文件
3)读取ini文件中的内容,写进$Edit_1
我保存配置文件的时候,这个字段是这样写进去的:(因为只有这个$Edit_1控件有换行,没有用IniWrite,后续读的时候用的读文件的方式)IniWriteSection ($var_save, "工程列表",GUICtrlRead($Edit_1) )结果不管是选择写入的还是复制粘贴写入的或手动输入写入的,再读的时候都出现两个空行。
这里手动输入换行文本,保存,再读取,和直接修改ini文件再读取为什么不一样呢?求解! 试了一下,确实是写配置文件的时候出的问题,如果直接手动修改ini文件换行输入,这里就对了。
我的流 ...
cynthia59 发表于 2013-5-22 15:38 http://www.autoitx.com/images/common/back.gif
你这样写的ini文件会在该字段下的每行后面多出@CR回车,因为IniWriteSection仅以@LF分割。 改成如下即可IniWriteSection($var_save, "工程列表", StringRegExpReplace(GUICtrlRead($Edit_1), '\v+', @LF))同时1#的37行改为GUICtrlSetData($Edit_1, $line & @CRLF, 1) 本帖最后由 cynthia59 于 2013-5-22 15:54 编辑
那我应该怎么处理这块呢?难道这里也要用写文件的方式写进去才行吗? 那我应该怎么处理这块呢?难道这里也要用写文件的方式写进去才行吗?
cynthia59 发表于 2013-5-22 15:53 http://www.autoitx.com/images/common/back.gif
抬头,已给出解决方案。
也可以不需要一行行载入Edit控件,用正则捕获整段数据一次载入 改成如下即可同时1#的37行改为
afan 发表于 2013-5-22 15:53 http://www.autoitx.com/images/common/back.gif
解决了,原来要先替换掉回车换行,我的脑筋还是太直了,谢谢afan的指导! 抬头,已给出解决方案。
也可以不需要一行行载入Edit控件,用正则捕获整段数据一次载入
afan 发表于 2013-5-22 15:56 http://www.autoitx.com/images/common/back.gif
正则表达式这块觉得有点难,我就先放放了,用正则表达式是怎么个思路呢?
我的的配置文件大概如下:
[软件安装路径]
新版=C:\lubansoft\鲁班安装2013YS13
旧版=C:\lubansoft\鲁班安装2013YS12
[文件保存路径]
计算结果=C:\result\
计算日志=C:\result.log
[工程列表]
11
22
33
44 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) '(?s)\[工程列表\]\s+(.+?)(?=\s*\r\n\h*\[|\s*$)'
这一段看了半天还是没看明白怎么匹配的,先拿来用了,后面再努力研究研究。谢谢! 看看学学,路过也得学学
页:
[1]
2