搜索
查看: 4909|回复: 8

[文件] 使用 fsys.table,fsys.config 创建配置文件

  [复制链接]

186

主题

2537

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13938
发表于 2016-1-23 19:33:59 | 显示全部楼层 |阅读模式
回复

使用道具 举报

186

主题

2537

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13938
 楼主| 发表于 2016-1-23 19:34:49 | 显示全部楼层

一、使用fsys.table创建可持久化的table对象

fsys.config 实际上是对 fsys.table的封装,
fsys.table的功能是是将table对象映射为硬盘文件 - 以创建一个可持久化的table对象,在aardio中数组、哈希表、结构体等等都是table(请参考语法文档)。

fsys.table使用 table.tostring() 函数将一个table转换为aardio代码并写入一个字符串对象(忽略表的所有函数成员)。然后将此字符串写入硬盘,在加载文件时,使用 eval()函数解析aardio 代码重新生成table对象。

fsys.table的用法非常简单,最简单的例子:
import fsys.table;
var ftbl = fsys.table("/test/test.table"); //注意目录或文件不存在时会自动创建
ftbl.name = 123;

上面的ftbl对象就象一个普通的table对象那样使用,
区别是在线程结束时,他会自动更新对应的硬盘文件的值( 控制台程序直接点关闭按钮 - 这种异常终止程序时不会更新硬盘文件)。

ftbl对象 还提供以下成员函数:
ftbl.load() 函数用于再次从硬盘文件重新载入值。
ftbl.save() 函数用于手动保存表到硬盘文件。
ftbl.mixin() 函数用于将参数指定的表混入到当前对象,类似table.mixin ()函数。
ftbl.mix() 函数同样是混入表到当前对象,但是不会覆盖已经存在的值,类似 table.mix() 函数。
ftbl.beforeSave 用于自定义一个回调函数,可在保存配置文件以前自动调用。




回复

使用道具 举报

186

主题

2537

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13938
 楼主| 发表于 2016-1-23 19:47:36 | 显示全部楼层

二、fsys.config 创建配置文件

fsys.config与fsys.table类似,区别是创建参数是一个文件目录,而不是指定一个文件路径。
在获取fsys.config配置对象的成员时,自动将其生成一个fsys.table对象,

示例代码:
import fsys.config;
config = fsys.config(
"/config/")
config.uiSetting.height = 123;
config的成员配置文件名不能以下划线开始,例如 config._uiSetting 这样写是错的。
上面的 config.uiSetting 将会自动生成一个fsys.talbe对象 - 对应的硬盘文件存储于创建 fsys.config对象时指定的 "/config/"目录下(即 config.uiSetting 对应的硬盘文件为 "/config/uiSetting.table").

config仅提供一个函数,即 config.saveAll() 用于保存所有的配置文件。
当然即使你不调用这个函数,在退出程序时,也会自动保存(除非程序意外终止)。

如果你不希望将配置文件保存在当前目录,而是系统的AppData目录(这也是推荐的做法),那么可以象下面这样写
config = ..fsys.config(
    ..fsys.getSpecial( 0x1c /*_CSIDL_LOCAL_APPDATA*/ ,"/应用程序名/" )
);


回复

使用道具 举报

186

主题

2537

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13938
 楼主| 发表于 2016-1-23 20:23:13 | 显示全部楼层

三、让窗口控件自动绑定配置文件

win.form创建的窗口对象,可以使用 bindConfig() 函数将控件绑定到配置文件,示例:
import fsys.config;
config = fsys.config(
"/config/");

//将窗口控件绑定到配置文件 config.mainForm
winform.bindConfig( config.winform,{
    edit = "text";
    radiobutton =
"checked";
    checkbox =
"checked";
    combobox =
"selIndex";
} );

这个函数的第一个参数指定一个fsys.table对象,
第二个参数可选指定一个表(可省略此参数),键为控件类名,值为需要同步到配置文件的属性。

窗口在绑定配置文件以后,在窗口销毁后,控件指定的值将会自动同步到配置文件。


下面是一个更完整的例子,演示了如何重置控件的值、如何手动保存配置:
import win.ui;
/*DSG{{*/
winform = ..win.form(text=
"aardio form";right=599;bottom=399)
winform.add(
btnReset={cls=
"button";text="重置";left=389;top=351;right=521;bottom=379;z=3};
btnSave={cls=
"button";text="保存";left=231;top=351;right=363;bottom=379;z=1};
edit3={cls=
"edit";text="edit3";left=44;top=42;right=407;bottom=68;edge=1;multiline=1;z=2}
)
/*}}*/

import fsys.config;
config = fsys.config(
"/config/");

//将窗口控件绑定到配置文件 config.mainForm
winform.bindConfig( config.winform,{
    edit =
"text";
} );

//取消或重置为初始值
winform.btnReset.oncommand = function(id,event){
   
    config.winform.load();
}

//也可以手动保存配置文件
winform.btnSave.oncommand = function(id,event){
    config.winform.save();
}

winform.show()
;
win.loopMessage();

绑定配置文件的窗口不但能自动同步控件的指定值到配置文件,还会自动记录上次打开该窗口所在的屏幕位置,并在再次打开该窗口时自动恢复原来的位置。


回复

使用道具 举报

47

主题

178

帖子

1176

积分

荣誉会员

Rank: 8Rank: 8

积分
1176
发表于 2016-1-23 21:26:39 | 显示全部楼层

谢谢

谢谢
回复

使用道具 举报

0

主题

8

帖子

82

积分

培训班

积分
82
发表于 2016-1-23 22:17:12 | 显示全部楼层

好,太好了,正是我想学习的,嘿嘿,好幸福——想什么就来什么,感谢版主!{:)}

好,太好了,正是我想学习的,嘿嘿,好幸福——想什么就来什么,感谢版主!
回复

使用道具 举报

1

主题

5

帖子

54

积分

一级会员

Rank: 2

积分
54
发表于 2016-4-3 20:54:22 | 显示全部楼层

{:)}好东西,学习了

好东西,学习了
回复

使用道具 举报

0

主题

2

帖子

13

积分

新手入门

Rank: 1

积分
13
发表于 2016-4-24 23:41:21 | 显示全部楼层

一切变的简单

一切变的简单
回复

使用道具 举报

0

主题

4

帖子

35

积分

新手入门

Rank: 1

积分
35
发表于 2018-6-28 16:39:09 | 显示全部楼层
非常方便,发现这个语言真是神器
学习了,不错。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-8-22 07:07 , Processed in 0.078125 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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