标题:VFP6.0 生成的程序,电脑重启后打印串行,崩溃中
取消只看楼主
freejyl
Rank: 1
等 级:新手上路
帖 子:59
专家分:3
注 册:2006-1-6
 问题点数:0 回复次数:10 
VFP6.0 生成的程序,电脑重启后打印串行,崩溃中


我用VFP6写了一个种子销售的程序,这套程序在其他公司运行了已经十年,从未出现过任何问题,并不是说自己有多自信,也是因为自己及时和优质的售后服务,经介绍卖给了外地的一家种子公司。
原以为会很顺利的弄完,以前生成的程序换台电脑只要在那台电脑上添加自定义票据纸张规格(20CM * 9.3CM),进项目管理器把报表重新进行页面设置,根据对方出示的票据套打位置稍作调整,重新连编一下生成可执行文件就OK了。可这次莫名其妙的问题出现了。

去那家公司后,发现对方的系统为WIN7,且汉字系统损坏,于是改装了XP,安装XP后按以往的经验重新连编后打印什么一切正常,于是打道回府乘火车回家。
几天之后,对方要求加一个单据退换货和作废的功能,于是按他们要求弄了另外一个程序,因为数据库没什么修改,直接把生成的可执行文件单独发了过去。
前三天开始问题出现了,告诉我打印出来的单据打印位置串行,于是远程桌面到对方电脑上调整报表中数据打印位置后重新连编生成可执行文件,对方告知打印正常了,虽然心里有些疑惑(之前已经弄完了,怎么会串行呢?)但既然问题解决,没多想什么就下线了。
没过多久,对方又打电话来,说重启了一下电脑,依然串行,心里觉得很诧异,再次远程桌面到对方电脑,这次没调整报表,直接重新连编可执行文件后打印就正常了。这次特意看了一下电脑,里面安装了很多其他的软件,如QQ电脑管家、WPSOFFICE等等,我在想是不是其他软件会影响打印机的默认纸张设置?因为前些天重装后做了GHOST备份,让对方恢复了一下系统,但重启打印串行的问题依旧存在。让对方查毒,用的金山毒霸未发现病毒存在。虽然对金山毒霸的查杀能力不完全相信,也只好暂时相信系统是无毒的了。但问题摆在面前总要解决,开始回想前几次连编的过程,都没有选择“重新编译全部文件”、“显示错误”和“重新生成组件ID”这三个选项,于是把这三项都打勾选项进行连编,生成程序之后,重启电脑了问题不再出现,心想终于可以无忧了。谁知今天早上打来电话,说程序不能打印,后来对方不知弄了什么,又说可以打印了,但还是有一些小小的串行,OMG,要崩溃的节奏!
静下心来仔细回想整个过程,我觉得有以下几个问题让我困惑


1、连编的那几个选项是否选择确实有必要么?之前连编时就选择“连编可执行文件”,下面选项区的那几项都没选过,以前给其他公司使用时也没出现过打印位置串行的问题,怎么这次会这样呢?对方前台有两个电脑,一台是我连编时选择“重新编译全部文件”、“显示错误”和“重新生成组件ID”这三个选项生成的,另一台因为对方的网速实在太慢,就让对方公司里面一个接触过VFP的员工替我重新连编的,而今天早上打电话来的恰恰是对方员工重新连编的那台电脑,现在不知道他在连编时是否真的选了那三项。
2、因为对方公司的网速实在是太慢,第二次添加功能时我没法在线在对方电脑上更改,于是单独发了一个生成后的可执行文件过去,现在对方电脑里实际上是有两个程序的,新修改的程序中,我加了一些功能也涉及到报表打印,里面的纸张规格有A4的,但他们用没用过新功能我就不清楚了。我和他们说尽量不要两个程序同时运行,以免造成数据冲突,但他们是否能真的照做不晓得,那么我想知道,如果他们真的两个程序同时运行了,并且打印了A4规格纸张的报表,会影响票据输出么?
3、每一次VFP6的项目文件挪到别的电脑打开时,都提示找 _FRAMEWK.VCX、_REPORTS、APPHOOK等一些文件,这次给这家公司修改程序时,为了省事,我把VFP6中这些文件都放到了项目文件夹,会不会我这次的自以为省事的举措造成了现在的问题?
4、怀疑对方电脑安装的其他软件改变了打印机的默认纸张规格,但已经恢复了原来的系统,是否可以排除其他软件干扰因素?
5、病毒!之前对方电脑我给安装了免费的金山毒霸,但说真的,对免费产品是否真能查杀出病毒,还是感觉未知。

以上这几个问题百思不得解,虽然从学VFP到现在已经有十三年的时间,按理说应该对VFP了解颇深了,但实在是惭愧得紧,我不是专职搞开发,期间工作调动频繁,根据工作和养家的需要先后做过网络维护、无盘安装、网站设计等,VFP期间间断过很久,很多知识确实没有更新和储备,很多方面确实是不太深入。
附上打印机的型号是:映美 FP 630k +
搜索更多相关主题的帖子: 电脑重启 项目管理 执行文件 台电脑 汉字 
2016-01-16 11:30
freejyl
Rank: 1
等 级:新手上路
帖 子:59
专家分:3
注 册:2006-1-6
得分:0 
以下是引用mywisdom88在2016-1-16 12:59:12的发言:

每一次VFP6的项目文件挪到别的电脑打开时,都提示找 _FRAMEWK.VCX、_REPORTS、APPHOOK等一些文件,因为你程序用到这些东西,移动项目后,由于你电脑安装VFP环境发生变化
打印位置串行的问题,好像报表和打印机型号有关系,以前听他们说过,比如你用LQ1600K打印机来设置报表的,最好,客户端的打印机也是这个型号的,
生成程序前,最好把报表的打印环境清理,如:把报表交费单.frx的打印纸张的设置清除掉。
Use form\交费单.frx
Replace All expr with "",Tag With "",tag2 With "" For ObjType=1 And ObjCode=53
Use
用户打印的时候,叫他自己根据报表选择纸张规格,如2等份纸140*241




感谢回复
如果清除了报表的打印纸张设置,以后连编出来的程序,是不是每次都要运行SYS(1037)来设置打印?
2016-01-16 17:51
freejyl
Rank: 1
等 级:新手上路
帖 子:59
专家分:3
注 册:2006-1-6
得分:0 
以下是引用吹水佬在2016-1-16 15:57:48的发言:

VFP6的报表文件是保存设计时的打印机环境(VFP9可以选择是否保存),导致出现有楼上的清除打印机环境的解决方法:
Replace All expr with "",Tag With "",tag2 With "" For ObjType=1 And ObjCode=53

以前用VFP6时也曾经遇到过一些打印问题,有些电脑更换打印机时,系统的旧打印设备没删除,或安装了一些虚拟打印设备,当这些打印设备变成默认打印输出设备时, VFP6的打印输出有可能出现异常,用 SET PRINTER TO NAME WindowsPrinterName 指定打印机也无效。



感谢回复
如果是这样,我想把这个程序在VFP9中打开,VFP6的项目可以不用改动的移植到VFP9中进行重新编译么?
另外,我有一个设想,如果我在编译时把报表文件排除,然后在其他电脑中运行时根据实际情况来调整,比如更改报表文件的页面设置中对应的自定义纸张,以及调整报表里面一些控件的位置,以便适应新的票据格式,保存一次以后在软件运行环境更改前(更换电脑或打印机)都不需要每次重新运行时都要再次设置打印机和选择默认的自定义纸张,能否实现?
2016-01-16 18:05
freejyl
Rank: 1
等 级:新手上路
帖 子:59
专家分:3
注 册:2006-1-6
得分:0 
以下是引用hu9jj在2016-1-16 20:06:06的发言:

你应该自己连编,然后发EXE程序给用户,为什么让用户连编呢,难不成你的源码全部在用户电脑中!



源码确实是在用户电脑中,就是为了方便在用户电脑上随时修改,这些种子公司的要求不一样,所以我卖出去的软件有N多的版本功能,这次的用户是外地的,而且他们那儿的网速实在是过慢,远程连接常常就断了,也不想随便把源码放在外面,以前的做法是源码用RAR加密打包,需要修改时自己远程解压,修改完成再重新打包。主要是以前都是在本地用,也没出现过这次的问题,不逼迫也确实没有今天的这次的提高,感谢各位朋友的指点与回复。
2016-01-17 19:06
freejyl
Rank: 1
等 级:新手上路
帖 子:59
专家分:3
注 册:2006-1-6
得分:0 
以下是引用吹水佬在2016-1-16 20:46:11的发言:

VFP6写的代码在VFP9编译应该没问题,编译后实测一下,有问题也是些细节问题。
如果不是动态报表,报表文件设计时就可以制定好。
喜好做法:
1、设计报表文件时,在报表属性设置不选择保存打印机环境。
2、用GETPRINTER()、APRINTERS()等获取打印设备信息供用户选择,并作为软件系统设置保存。
3、软件运行时取出保存的打印设备信息,用“SET PRINTER TO NAME 打印设备名”指定打印输出设备。
4、报表设计时,页面纸张选择一般选标准纸,如A3、A4、A5等,要看具体打印机纸盒进纸情况,有时可能要设计不同纸张模板的多种报表文件来适应不同的打印设备,这些纸张选择项也要作为软件系统设置由用户选择并保存,以便打印输出时确定用那种报表文件。也许有点繁杂,但报表设计时只要设置好实际打印区域或各边距,其实设计时页面设置选择什么纸张不重要,打印机纸盒和进纸能适应就能正常打印出来。设计时选择的纸张只是一个模板,如设计时页面选择A4纸,将打印内容设计输出在A4纸的上半部或中间, 实际打印时可用A5纸或非标准纸张(自定义纸张)放到打印机打印。


感谢经验奉献
如果在设计报表时页面设置成A4,在打印的时候走纸也是按A4纸的长度去走吧?对于票据打印来说,通过后面卷纸器一次输出的是连续多张票据,在打印完成后,票据走纸后停止后要恰好停在撕纸位。
2016-01-17 19:20
freejyl
Rank: 1
等 级:新手上路
帖 子:59
专家分:3
注 册:2006-1-6
得分:0 
回复 9楼 吹水佬
我想我可能知道串行的原因了。
当然是多方面的。
原因一:确实是之前的打印环境没有清除,之后和所使用电脑的系统环境、打印设置不相同,而造成莫名的错误。
解决:用Replace All expr with "",Tag With "",tag2 With "" For ObjType=1 And ObjCode=53清除报表打印环境数据,到所运行的电脑上重新设计报表,重新进行页面设置得到解决。但出现了一点状况,是我之前没有想到的,于是又有了原因之二,现在也仅仅是猜测
猜测的原因二:打印报表之前,数据表里一些字段值为空,在报表设计时对应域控件的“打印条件”中设为默认的“若是空白行则删除”,于是在报表打印时由于该行为空值被删除,下面几行的域控件被提上去,造成了打印串行,无法正确的套打到票据上。如下图,分别为报表设计截图、没有空值的记录正常打印、有空值产生串行图片



未实际证明的解决思路:为什么会有空值存在呢?因为此种子公司在打印赠品时是不输入用户姓名、地址和电话的,这样造成了报表设计第1行都为空值,所以此行被删除了,下面第2、3、4、5行被提了上去,产生了串行发生。
第一个想法:不让第一行的对应字段为空值,输入时的表单文本框设置默认值为“.”,这样就避免了空行的存在。
第二个想法:在域控件属性的“域控件位置”中有三个选项,浮动、相对于带区顶端固定、相对于带区底端固定,(那么问题来了,浮动选项是啥意思?实际打印时会怎样?)将第1行控件属性设为“相对于带区顶端固定”,将第2、3、4、5行控件属性设为“相对于带区底端固定”,因为在产品为赠品时是不输入的,只有第一行会出现空值,所以将第1行设为相对于带区顶端固定,其余的行不会为空,设为相对于底端固定,避免因第1行空值时删除往上提产生串行。

第三个想法:把所有域控件的属性中的打印条件里的“若是空白行则删除”项上的对勾取消。
以上的想法已付诸实际,发给对方,只待结果。


[此贴子已经被作者于2016-1-19 14:43编辑过]

2016-01-19 14:32
freejyl
Rank: 1
等 级:新手上路
帖 子:59
专家分:3
注 册:2006-1-6
得分:0 
以下是引用吹水佬在2016-1-20 16:29:23的发言:

套打格式固定,打印行数也不能变。
PS:
中国特色表格就是多姿彩,制表如制图,图表不分。
鬼佬比较实际,好多时不用表格,有一行就打印一行,不拘一格,省时省料。



套打确实让人感觉挺闹心,但格式已定,也只好一再调整
2016-01-28 08:52
freejyl
Rank: 1
等 级:新手上路
帖 子:59
专家分:3
注 册:2006-1-6
得分:0 
以下是引用厨师王德榜在2016-1-18 11:40:37的发言:

我说一个方法,看对你有没有用,就是到报表这个环节,如果用户的打印环境不确定,我比较倾向于生成一个EXCEL文件,
然后,用户打印这个EXCEL文件时,让他自己根据自己的打印环境来调整吧,反正那个EXCEL界面大多数用户都熟悉,他爱怎么调整就怎么调整。 




这个我还真没有尝试过,是用VFP来控制EXCEL表格的生成么?
是不是在生成之后,直接用VFP就打印了的?
进一步想知道的是,关于纸张设置、连续出纸在VFP也一并能实现,还是需要用户手动去设置EXCEL?
2016-01-28 08:55
freejyl
Rank: 1
等 级:新手上路
帖 子:59
专家分:3
注 册:2006-1-6
得分:0 
以下是引用hu9jj在2016-1-21 07:44:36的发言:

建议楼主不要直接用源表作报表的数据源,另外建一个结构相同的自由表,需要打印时将筛选出的数据复制到这个自由表中再打印,打印完之后清空自由表。





我沿用的做法,是票据打印时在自由表中进行,打印结束开新单据后,向销售记录表中添加打印的记录,自由表清除,主要是不想加上筛选这一过程,如果以后补打,把销售表中当前记录发送至自由表中单条打印。

你的建议有别的含义在里面吗?
2016-01-28 09:02
freejyl
Rank: 1
等 级:新手上路
帖 子:59
专家分:3
注 册:2006-1-6
得分:0 
以下是引用liuxingang28在2016-1-21 13:21:55的发言:

既然是套打,很多信息的位置都是固定的,此时不应再设置“若是空白行则删除”选项。我觉得这是问题的根源。




我也感觉是这个原因造成了串行,也想在实际环境中测试,无奈相隔较远,加之对方网络速度太慢,容不得细细深究,为了稳妥,我那几个解决方法都用上了
1、空值字段字符型的自动替换成“.”、2、取消“若是空白行则删除”选项的对勾、3、不同位置相对于带区顶端或底端固定
2016-01-28 09:06



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




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

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