火车采集器软件交流官方论坛

 找回密码
 加入会员
搜索
火车采集器V9版免费下载火车浏览器 - 可视采集,万能群发,全自动脚本工具
查看: 4496|回复: 2

基于XUL的OA系统 - eMIS

[复制链接]
发表于 2008-12-31 22:31:25 | 显示全部楼层 |阅读模式
准备花3个月的时间,编写一个基于XUL的OA系统,刚刚开始,所以也没打算包含很多功能,基本功能搞定之后就再慢慢完善了。客户端是采用XUL+SQLite, 服务器端采用Apache+PHP+MySQL,当然客户端是运行在XULRunner上的了。
姑且起个好听的名字 eMIS,这个名字以后响亮不响亮,就不知道了
别人写了个基于Notes的什么系统,我用的很不爽,就想自己写个系统了。Notes的确很不错,外界使用的都赞不绝口,都听说怎么这么的牛,如何如何的不错,但是没让我感觉到。然而,我的电脑如老牛拉航空母舰般的运行速度,实在让我不能忍受。Notes8.5运行起来消耗虚实内存合计300M还多。嗨,都是Java惹得祸啊,全世界都知道Java是个“内存大户”,而这个Notes8.5还偏偏基于Eclipse。不知道为什么选用IBM LotusNotes,而不用 MicrosoftSharePoint,就功能来说,后者强很多啊,N多已经摒弃Notes转到Outlook,而我们却“倒退”回去了呢?
为了用一个功能而占用我300M内存和N多CPU的系统我不喜欢,人云亦云没什么理由的我更不喜欢。
呵呵,也不是为了争什么,就是很久没有看一件东西这么不爽了。我是个直率的人,看着不爽我就说了,呵。
至于为什么采用XUL和PHP,也显而易见
1. 好奇,这个XUL对于我来说是个很新鲜的玩意,看着功能不错,我忍不住想试试
2. 界面组件丰富,比HTML强很多,所以后来微软也搞了个什么XAML,功能貌似很强,用的时候还要.NET 3.0
3. 内部通过JavaScript调用XPCOM组件,这使得XUL不再处于“脚本”级别,而被提升到了应用级
4. Mozilla的文档不错,虽然网上Mozilla的资料不多,但是Mozilla的网站的文档还是蛮多的
5. 有应用程序先例,firefox, thundbird, Komodo …
6. 参考的程序一堆,Firefox里一堆插件是很好的例子,当然也包括firefox本身
……
理由还有一堆
PHP部分就不说了
这个系统还是基于Web的,富客户端Web程序,不是B/S也不像C/S,一半对一半吧
XUL说实话我不熟悉,不过通过不少天的学习,也基本掌握不少了,高级功能和技巧正在摸索中,其实这里面的最最重要的操作时通过JavaScript来做的,所以在这个里面写JS应该是很爽的一件事
接下来,我会记录这个“项目”的进展,也会和大家分享一下如何建立基于XULRunner的XUL应用程序过程,还有里面一大堆的JS操作。呵呵,kickoff时间未定,一切都在准备之中,拭目以待吧
 楼主| 发表于 2008-12-31 22:52:51 | 显示全部楼层
eMIS 准备 - XUL中的通用对话框
一个完善的OA系统,肯定离不开一些文件的操作,那文件操作的前提是要打开、保存文件,那么如何打开文件,保存文件呢,打开文件、保存文件的对话框又如何实现?
先说说如何实现打开文件、保存文件、选择文件夹对话框,这些对话框在应用程序中称为通用对话框
XUL中没有类似功能的标签,只能使用JS调用XPCOM中的组件来完成这种功能
在XPCOM中具有打开文件、保存文件、选择文件夹对话框功能的组件名称为 nsIFilePicker
下面介绍 nsFilePicker 的使用方法
1.创建 nsIFilePicker :
view plaincopy to clipboardprint?

  • var fp = Components.classes["@mozilla.org/filepicker;1"]  
  •     .createInstance(Components.interfaces.nsIFilePicker);  

var fp = Components.classes["@mozilla.org/filepicker;1"]    .createInstance(Components.interfaces.nsIFilePicker);2.nsIFilePicker方法:
  1). init()
    原型: void init(in nsIDOMWindow parent, in AString title, in short mode);
    功能: 初始化 nsIFilePicker 组件
    参数: parent: 该对话框的父窗口对象,一般写window即可; title: 提示的信息; mode:打开对话框的模式,有4种打开方式, modeOpen(0, 选择单个文件), modeSave(1, 保存单个文件),modeGetFolder(2, 选择单个文件夹), modeOpenMultiple(3, 选择多个文件)
  2). appendFilters()
    原型: void appendFilters(in long filterMask);
    功能: 设置文件过滤器
    参数: filerMask: 文件过滤器的类别,目前有如下几种类别: filterAll(0×01,所有的文件,*.*),filterHTML(0×02, HTML文件, *.html;*.htm), filterText(0×04, 文本文件, *.txt),filterImages(0×08, 图像文件, *.jpg; *.jpeg; *.gif; *.png), filterXML(0×10,XML文件, *.xml), filterXUL(0×20, XUL文件, *.xul), filterApps(0×40,可执行文件,不同的操作系统平台文件后缀不同)
  3). appendFilter()
    原型: void appendFilter(in AString title, in AString filter);
    功能: 设置自定义文件过滤器
    参数: title: 过滤器的提示信息, filter: 实际过滤器, 比如过滤压缩文件可以这样写: fp.appendFilter(”压缩文档(*.zip,*.rar)”,”*.rar;*.zip”);
  4). show()
    原型: short show();
    功能: 显示对话框
    返回: 对话框返回值, 有 returnOK(0,单击确定), returnCancel(1, 单击取消), returnReplace(2, 选择替换某个文件时)
3. nsIFilePicker属性:
  1). defaultString: (AString, R/W), 读写, 默认的文件名
  2). filterIndex: (long, R/W), 读写, 以0开始的过滤器的顺序
  3). displayDirectory: (nsILocalFile, R/W), 读写, 默认的目录
  4). file: (nsILocalFile, R), 只读, 选择后的文件的“句柄”, 当init的mode选择为modeOpen时有效
  5). fileURL: (nsIFileURL, R), 只读, 选择后的URL文件的“句柄”
  6). files: (nsISimpleEnumerator, R), 只读, 选择后的所有的文件, 当init的mode选择为modeOpenMultiple时有效
4. 示例:
view plaincopy to clipboardprint?

  • /**********************************
  • * 选择单个文件
  • ***********************************/
  • const nsIFilePicker = Components.interfaces.nsIFilePicker;  
  • //创建组件
  • var fp = Components.classes["@mozilla.org/filepicker;1"]  
  •     .createInstance(nsIFilePicker);  
  • //初始化组件, 选择打开单个文件
  • fp.init(window, "选择单个文件", nsIFilePicker.modeOpen);  
  • //添加文件过滤器
  • fp.appendFilters(nsIFilePicker.filterAll | nsIFilePicker.filterText);  
  • //显示对话框
  • var rv = fp.show();   
  • if(rv==nsIFilePicker.returnOK || rv==nsIFilePicker.returnReplace)  
  • {  
  •   //alert("选择了文件");
  •   //获得选择的文件对象
  •   var file = fp.file;  
  •   alert("您选择的文件全路径为:" + file.path);  
  • }  
  • else
  • {  
  •   alert("没有选择文件");  
  • }  
  • /********************************
  • * 选择多个文件
  • *********************************/
  • ......  
  • fp.init(window, "选择多个文件", nsIFilePicker.modeOpenMultiple);  
  • ......  
  • {  
  •   var files = fp.files;  
  •   while (files.hasMoreElements())  
  •   {  
  •     //从files里获取单个文件的句柄
  •     var file = files.getNext().QueryInterface(Components.interfaces.nsILocalFile);  
  •     alert("文件全路径为:"+file.path);  
  •   }  
  • }  
  • ......  

/*********************************** 选择单个文件***********************************/const nsIFilePicker = Components.interfaces.nsIFilePicker;//创建组件var fp = Components.classes["@mozilla.org/filepicker;1"]    .createInstance(nsIFilePicker);//初始化组件, 选择打开单个文件fp.init(window, "选择单个文件", nsIFilePicker.modeOpen);//添加文件过滤器fp.appendFilters(nsIFilePicker.filterAll | nsIFilePicker.filterText);//显示对话框var rv = fp.show();  if(rv==nsIFilePicker.returnOK || rv==nsIFilePicker.returnReplace){  //alert("选择了文件");  //获得选择的文件对象  var file = fp.file;  alert("您选择的文件全路径为:" + file.path);}else{  alert("没有选择文件");}/********************************* 选择多个文件*********************************/......fp.init(window, "选择多个文件", nsIFilePicker.modeOpenMultiple);......{  var files = fp.files;  while (files.hasMoreElements())  {    //从files里获取单个文件的句柄    var file = files.getNext().QueryInterface(Components.interfaces.nsILocalFile);    alert("文件全路径为:"+file.path);  }}......上面的这些操作,建议封装成函数,以方便调用
对于上面的 nsILocalFile,nsIFileURL 组件,就涉及到了文件的有关操作了
相关链接:
    https://developer.mozilla.org/En/NsIFilePicker
发表于 2016-2-9 12:46:07 | 显示全部楼层
爪,以后学习下。。
您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

QQ|手机版|Archiver|火车采集器官方站 ( 皖ICP备06000549 )

GMT+8, 2024-11-24 18:27

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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