标题:表单需要运行多个实例,编程时需要注意哪些问题?
只看楼主
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
结帖率:99.55%
已结贴  问题点数:100 回复次数:21 
表单需要运行多个实例,编程时需要注意哪些问题?
最近涉及到的问题:一个表单需要运行多个实例,如销售订单,一个订单开到中途会因为某些原因需要待会再开,此时又要开另一个订单,甚至于会同时打开更多的订单窗口。这在表单设计时如何避免因变量名重复而产生的干扰?存放数据的自由表如何避免同名?每个新开的窗口名称是否需要不同?还有没有其他需要事先考虑的问题?希望有过实践经验的朋友多多指点,让我少走弯路。先谢谢各位!
搜索更多相关主题的帖子: 因变量 朋友 如何 
2014-07-12 15:24
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:17 
需要注意以下问题:
1. 表单的数据环境必须设为“私有数据工作期”
2. 在表单中不要定义和使用全局变量,而改用表单自定义属性、私有变量、局部变量
3. 表单中的游标可以同名
4. 表单中输出的自由表不可同名,可通过 SYS(2015) 来获取唯一的文件名。如:
    cTmp = sys(2015)
    select * from 表1 into table (cTmp)
    create table (cTmp) free (字段1 i)
    use in (cTmp)
5. 新开窗口的名称可以相同

泉城飞狐
2014-07-12 17:15
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:17 
楼上高 很详细
2014-07-12 23:20
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
以下是引用tlliqi在2014-7-12 23:20:20的发言:

楼上高 很详细
是的,非常感谢,同时也希望得到更多的建议或指导。

活到老,学到老! http://www. E-mail:hu-jj@
2014-07-13 07:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:17 
共享编程需要注意什么问题,这个就需要注意什么问题。

授人以渔,不授人以鱼。
2014-07-13 18:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
举个简单的例子:假设你的表单要填写一个数据表,比如在订单库中追加或编辑一条订单记录,那么,开多个订单表格使用的时候,就要注意订单库中的数据共享问题,你不能让多个表单同时操作同一记录,也要注意由于表单的编辑、保存时间差异而造成的数据覆盖问题,这甚至与你使用表的方式有关,有些需要锁定整个表的指令会长期霸占数据库让共享困难。数据库,包括其中的数据表和索引,都是外部的共享数据,不是靠表单的私有数据工作区可以隔离的,只要你刷写文件数据,就一定涉及共享问题!

授人以渔,不授人以鱼。
2014-07-13 19:33
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
共享的确是个重要的问题,但因比较常见,也有有效的处理办法。我最担心的是表单中定义的局部变量,多个表单会不会相互干扰。可能用自定义属性能够解决。另外就是表单的name相同会不会有影响。此外还有没有其他的问题。我想在动手之前先了解这方面的情况。

活到老,学到老! http://www. E-mail:hu-jj@
2014-07-13 19:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
局部变量不会互相干扰。执行的表单实例name不能相同。至于其他的问题,视你写程序时是否要考虑多个表单在同时运行这个事实而定,亦即有太多的潜在问题——写所有代码的时候,都应考虑假如这个表单有多个实例将会如何,才能避免那些问题。这跟写程序的习惯有关。

授人以渔,不授人以鱼。
2014-07-13 19:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
比如局部变量,我不知道你们怎么理解局部变量,因为vfp有两种局部变量形式,private和local,在我的观念中,后者才是真正的局部变量(与C相同),而前者其实是全局变量,它是可以向下传递的。也就是说,如果你习惯于不声明local而直接写出自动声明为private的“局部变量”,而在别的下层代码中没有用private屏蔽掉那些实际上被看见的变量,就等于用了全局变量。这就是所谓的编程习惯。

授人以渔,不授人以鱼。
2014-07-13 20:01
qingfameng
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:35
帖 子:964
专家分:3019
注 册:2010-2-6
得分:17 

   回复楼主:谈一点个人看法。
1、主表单中执行子表单时,同实例过程中,各个并行子表单名称不能重名!否则界面会混乱,楼主可试试就知道了。
2、用 do 子表单时,要用‘参数控制’打开。否则,当多次点击打开时,关闭子表单需点击多次才关闭。
   这必须要求有条件打开。 比如:
          if na1=0
              na1=1
              do form 子表单1 with na1 to nb1
           endif
     用 nb1返回 0 值替换na1的值等。当然,也可以不用 to nb1,关闭表单时设 na1=0
3、各表单必须设置其 datasession=2 为私有。这样,即便一个表单中,使用了 close all,也无妨任何表单的
   grid 数据环境而正常显示。例如,打开子表单的数据环境,在dataenvironment 的 beforeopentable 中,
   可以写下列简单测试的语句:(与打开实例前,先写 prg 预处理程序段,其形式或效果是一样的)
   
      close all
      set safety off
      set talk off,
       .....
      open data 数据库
      nhd=sqlconnect('连接名',.T.)
      nd1=sqlexec(nhd,'select * from dbo.表1','b1')
      nd2=sqlexec(nhd,'select * from dbo.表2','b2')
      nqq=sqldisconnect(nhd)
      close database && 数据库已经关了,但生成的临时表并没有关。

      sele b1
      sele b2
 
     * 打开  dbc 数据库及其表时情况相同。及时关闭数据库,避免共享冲突。

4、如果每个子表单是一些较大的程序块,启动实例可能较慢。此时可考虑多实例模式的弱点。最好用公共类
   的模式,启动一个一个的独立表单或表单集。这就是多进程模式。一个表单的多个实例,仍然只是‘一个’进程。
   表面上我们可以同时打开若干窗口,实现了多界面,但是,由于他们都在一个公共参数环境内,需要对各个
   环节的参数都需严格控制,才能避免众多的干扰因素。而公共类则宽松得多。不但实现多界面同时操作,而且‘安全稳定’是最大的优点。有人说多进程占用内存大,但对于目前的电脑来说,是戳戳有余的。

5、实现多界面或多进程的同时操作,还有一种方法,就是使用多项目产生的多个dll,或 exe。可以用打开类的方式,或
   用API调用他们。由于多进程之间的数据是互不联系的,过强的独立性,多界面操作之间互不干扰,固然是个优点,
   但是,却对相互之间的数据传递造成了困难,这就是一大缺点。但是,在此,我们要感谢VFP 了!因为他有一个
   非常好的数据传递工具--- dbf 文件。利用我们再熟悉不过的 dbf,可以将各个独立进程中产生的参数,数据,
   需要传递的,都放进 dbf 中,让其他的进程随时调用。又简单可靠,又容易实现。

6、如何在多界面操作中避免自由表重名?个人体会,可以用规范路径的方法。即:每一个子程序或实例中,所使用的路径都是编了号的,并且都以参数形式使用。这样不可能存在各实例间的表的冲突或混肴。多界面操作,要注意共享数据库
   的及时刷新。因为是商业订单的开写,以及查询等,所要求即时无误的新数据情况不是太高。但是,也尽量考虑,
   在必要的步骤中先获取最新数据,用共享库首先生成临时表,立刻关闭共享库。开完一张订单,用临时表刷新数据库。(仅供参考)
2014-07-13 20:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-433963-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.099344 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved