除了速度,综合来讲可以完败其它语言,还好现实世界有不少的事件不是时间敏感的,而且 ruby 速度也没那么不堪
问题自己摸出来了,应该这样定义任务 task :default => ["main.exe"]
file "main.exe" => OBJFILES do |t| sh "gcc -o #{t.name} main.o a.o b.o" end
原教程 task :default => [:main] file "main" => OBJFILES do |t| sh "gcc -o #{t.name} main.o a.o b.o" end
然后在 windows 下,原教程产生不了 main 文件(实际产生的是 main.exe)
原教程应该是对 linux 有效,windows 则需要改改
我想创建各种轮子
我用 ruby 制作 window 桌面 gui 应用框架
我自己用 Ruby 在做 windows 下的桌面 app 框架,已初具效果,UI 已经做到运行时动态增删,达到 wysiwyg 了,而且手工配置的部分已经做到比 json,yaml,xml 直观太多了!
这是手工配置文件的样子
{ applications{
aio(CAppDemo){
title=mls "aio 测量系统" version="0.0.2" software_version="0.0.0"
font_name=mls "宋体" font_size=30
prop_int=127{ title=mls "亮度" default=0 llimit=0 ulimit=444 mouse_wheel=1.0
} def_prop_cmd_line
begin_def_measure_val{
prop_mesure_float=-0.0{ title=mls "半径" unit=UnitTypeMM
std=0.0 correct=0.05 llimit=-0.5 ulimit=0.5 }
end_def_measure_val}
light_adj=127{ title=mls "亮度" }
app_idle_time=0.0{ title=mls "程序空闲时间" unit=UnitTypeMS format="%6.3f" editable=false #read_only= true }
app_idle_proc_time=0.0{
title=mls "程序空闲处理时间" unit=UnitTypeMS format="%6.3f" }
worktable{ pos{ x=0.0{ title=mls "X" llimit=-100.0 ulimit=100.0 } y=0.0{ title=mls "Y" } ff=0.0{ title=mls "Z" } } }
time_for_show_caret=0.5{ title=mls "定时显示光标"
llimit=0.1 ulimit=1.0 mouse_wheel=0.01 unit=UnitTypeMS
}
ui_config=false{ title="配置 UI" }
test_mesure_val=0{
}
length_unit=UnitTypeMM{ title=mls "长度单位" vals=[UnitTypeMM,UnitTypeInch,UnitTypeMil] } angle_unit=UnitTypeDu{ title=mls "角度单位" vals=[UnitTypeDu,UnitTypeHuDu,UnitTypeDFM] } time_unit=UnitTypeS{ title=mls "时间单位" vals=[UnitTypeH,UnitTypeM,UnitTypeS,UnitTypeMS,UnitTypeUS] } vel_unit=UnitTypeMMPerS{ title=mls "速度单位" vals=[UnitTypeMMPerS,UnitTypeDuPerS,UnitTypePlusPerS] } show_dyn_prompt=true{ title=mls "显示动态提示" } user_type=PermissionUser{
}
} } }
完善控件后,用 RAIO(我给这个框架起的名字)在做项目时,程序员只需要用内置的功能就可以用 wysiwyg 的方式快速生成 UI,然后接下来就是直接进入 app 逻辑的编写
从 CObj 派生的类不需要写 attr_accessor,你只管按路径写法去读写你程序用到的属性,不存在就自动生成,而其默认值就是 nil 例: 写:$root.os.applications.app.main_frm.rect.val=[0,0,640,480] 读:$root.os.applications.app.main_frm.rect.val 这里除了$root 是需要主动生成之外,其它后面的路径节点都是不存在就动态产生,无需在类中先 attr_accessor
配置文件的写法,比其它什么 json,yaml,xml 直观得太多了!
当然也可以在自动产生的代码中加入手工写的代码来增加控件
上面的 UI 配置是程序自动产生的,只有 app 配置是手定的
已经可以运行中进行控件的增删及自由布局,并自动保存改变, UI 的设计不象现有的多数软件是在设计时进行,都在运行时通过鼠标拖拽完成,无需手写代码,真正达到 wysiwyg 的效果了
Kao,这格式都丢失了~!@#¥%……&*
这是 UI 配置的样子 PermissionUser.password="" PermissionEngine.password="1" PermissionAdmin.password="11" PermissionSuper.password="111"
{ (CWinDlg, NameFrmMain){ (CWinTitleBar, at: AlignTypeTop, as: AlignSizeToTextHeight, name: NameAppTitleBar){ new_btn(FunWinClose) new_btn(FunWinMaximize) new_btn(FunWinMinimize) new_btn(FunMoveWin) new_btn(FunELine) new_btn(FunERect) new_btn(FunMakeUI) title="aio 测量系统 0.0.0" } (CWinStatusBar, at: AlignTypeBottom, as: AlignSizeToTextHeight, name: NameStatusBar){ (CWin, at: AlignTypeRight, as: 100){ title="CWin_7880" } (CWin, at: AlignTypeRight, as: 150, name: NameCmdStatistics){ title="1/0/1" } new_prop_win($root.os.applications.aio.prop_int, at: AlignTypeRight, as: 200) title="退出" } (CWinPanel, at: AlignTypeRight, as: 1019, name: NameRightBar){ (CWinTab, at: AlignTypeClient, as: 0){ (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridAppProp){ (CWin, at: AlignTypeRight, as: 150){ title="CWin_9300" } new_prop($root.os.applications.aio.app_idle_time) new_prop($root.os.applications.aio.app_idle_proc_time) new_prop($root.os.applications.aio.time_for_show_caret) new_prop($root.os.applications.aio.show_dyn_prompt, class: CWinPropbool) new_prop($root.os.applications.aio.refresh_wins) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_mesure_float) prop_split=300 title="程序属性" } (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridDocProp){ prop_split=300 title="文档属性" } (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridCmdProp){ prop_split=300 title="命令属性" } (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridActiveEntityProp){ prop_split=300 title="活动图元属性" } (CWinGridReport, at: AlignTypeClient, as: 0, name: NameReport){ title="报表" } active_page=0,NoNotical fir_visible=0 } (CWinPanel, at: AlignTypeTop, as: 300){ (CWinCoorBar, at: AlignTypeClient, as: 0, name: NameCoorBar){ prop_split=274 title="NameCoorBar" } (CWinLightCtrlBar, at: AlignTypeRight, as: 200, name: NameLightCtrlBar){ rings=4 areas=8 title="NameLightCtrlBar" } title="CWinPanel_12760" } title="NameRightBar" } (CWinPanel, at: AlignTypeClient, as: 0){ (CWinCanvas, at: AlignTypeClient, as: 0, name: :canvas){ title="canvas" } (CWinCmdBar, at: AlignTypeBottom, as: 300, name: NameCmdBar){ title="NameCmdBar" } title="CWinPanel_19580" } frm_rect.val=CRect.new [0, 0, 2560, 1600] modal_frm.val= true title="NameFrmMain" } }
这是配置文件的样子 { applications{
aio(CAppDemo){
title=mls "aio 测量系统" version="0.0.2" software_version="0.0.0"
font_name=mls "宋体" font_size=30
prop_int=127{ title=mls "亮度" default=0 llimit=0 ulimit=444 mouse_wheel=1.0
} def_prop_cmd_line
begin_def_measure_val{
prop_mesure_float=-0.0{ title=mls "半径" unit=UnitTypeMM
std=0.0 correct=0.05 llimit=-0.5 ulimit=0.5 }
end_def_measure_val}
light_adj=127{ title=mls "亮度" }
app_idle_time=0.0{ title=mls "程序空闲时间" unit=UnitTypeMS format="%6.3f" editable=false #read_only= true }
app_idle_proc_time=0.0{
title=mls "程序空闲处理时间" unit=UnitTypeMS format="%6.3f" }
worktable{ pos{ x=0.0{ title=mls "X" llimit=-100.0 ulimit=100.0 } y=0.0{ title=mls "Y" } ff=0.0{ title=mls "Z" } } }
time_for_show_caret=0.5{ title=mls "定时显示光标"
llimit=0.1 ulimit=1.0 mouse_wheel=0.01 unit=UnitTypeMS
}
ui_config=false{ title="配置 UI" }
test_mesure_val=0{
}
length_unit=UnitTypeMM{ title=mls "长度单位" vals=[UnitTypeMM,UnitTypeInch,UnitTypeMil] } angle_unit=UnitTypeDu{ title=mls "角度单位" vals=[UnitTypeDu,UnitTypeHuDu,UnitTypeDFM] } time_unit=UnitTypeS{ title=mls "时间单位" vals=[UnitTypeH,UnitTypeM,UnitTypeS,UnitTypeMS,UnitTypeUS] } vel_unit=UnitTypeMMPerS{ title=mls "速度单位" vals=[UnitTypeMMPerS,UnitTypeDuPerS,UnitTypePlusPerS] } show_dyn_prompt=true{ title=mls "显示动态提示" } user_type=PermissionUser{
}
} } }
还好,坚持做了,有点收获了