注册 登录
编程论坛 VFP论坛

乱世中的类,是用 vcx 与 prg ?

倦猫1973 发布于 2023-03-26 10:10, 3360 次点击
首先声明一点,我无意评价是用 vcx 好还是用 prg 好,我只是描述它们之间的差别,不考虑如何抉择。

vcx 由来以及,自我开始使用 vfp3 时它就存在了,当时用得不多因为 vfp3 没有容器。大范围使用 vcx 则是 vfp6,vfp6 有了容器并且有了更多的类。prg 则应该更加久远,直至 vfp9 有很多不可视类仍然需要用 prg 来完成,这里也不考虑不可视类这种无它的方式。

我以前曾经见过一些前辈,用大量大量的 prg 来定义类,甚至先用 vcx 设计类然后再转成 prg。我一直不明白为什么费尽心机维护两个版本,偶尔小更新图方便直接改 prg 忘了改 vcx,大更新又去调整 vcx 再转成 prg。我也曾经咨询过也跟同行讨论们这个问题,但从来没有人说得出一个令我信服的理由,这些理由比起维护两个版本来说以及 vcx 带来的便利来说根本不值一提,如果 prg 真的这么好,又何必设计时用 vcx 再特意转成 prg 呢。

后来我明白了,那是 Win2000 问世以后,vfp6 还是 vfp5 的程序在 Win2000 上频繁出现 C5 闪退,有大神分析了一通 vfp 原理,总结说是 Unicode 问题,解决方法12345其中有一个就是把 vcx 转成 prg。我信吗?我只是严格自律所有变量一律 Local 声明,我出现 C5 的情况通常都是在使用第三方的情况下出现(含 Win32api),这种情况下只能是认真看第三方说明了根本没有任何办法解决。

现在己经是 3202 年了,vfp6 也早就退出历史舞台了,可这种把 vcx 转成 prg 习惯却被很多人保留了下来,甚至把“为什么”视为绝密的存在。

prg 连个语法检查都没有,用它来写一个稍微复杂一点的类都痛苦得要死。vcx 可以多窗口可以打开多个方法,Ctrl+E 保存后下次打开 IDE 仍然停留在你上次编辑时的状态。prg 唯一的优点就是写个小型的示例 ,在各种论坛上直接发代码不用上传文件。

举个小例子,下图就是 vcx 与 prg 的差别,vcx 有属性、方法说明 prg 没有,prg 是由 vcx 直接生成的一字未动,我甚至尝试在 prg 中加 helpString "方法说明" 都毫无作用,但方法提示对我这位也己被岁月摧残成“前辈”的老人来说却是相当管用的。

就说到这吧,似乎没说什么,或者 vfp 并不完美,vcx 也不完美,prg 也不完美。

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-3-26 10:12编辑过]

35 回复
#2
schtg2023-03-26 10:16
好!
#3
sdta2023-03-26 11:16
向楼主学习
#4
cssnet2023-03-26 11:34
vcx方便【用】,prg方便【查】。
实际编写软件代码时,我习惯用“类管理器”打开vcx,来作编辑修改;而程序初稿完工后,进入debug阶段,我习惯导出prg,传到平板内,没事就拿在手上,一遍又一遍地通读,以便找出问题所在。
两者互不矛盾。
嗯……还有一点:
申请软件著作权时,若不放心源码过多地对外暴露,哪怕对方是正规管理机关也不太放心,不妨将一堆无关紧要的scx导出为prg,打印到A4纸上凑数。事关,软著对于源代码有打印页数的要求:前、后各连续30页,共60页。将表单转换为prg,又长又臭,五六个表单估计就能满足全部要求——反正版权中心那帮家伙,他们也看不懂VFP代码。
嘿嘿。

#5
吹水佬2023-03-26 12:00
如果只从个人爱好就没必要区分高低,自己喜欢就好。
vcx好、prg也好,最终结果好才是好。
vcx、scx... 也许是可视化编程的需要,其实VFP也不算得是真正意义的可视化编程。
prg过程模块式,可读性是第一特性。

#6
mywisdom882023-03-26 12:06
我做过对比,VCX,PRG运行的效果不同;
https://bbs.bccn.net/thread-510188-1-1.html
就是想自动根据字符长度改变控件大小,取所有最长的长度
为此,还特意问 吹版主

[此贴子已经被作者于2023-3-26 12:09编辑过]

#7
倦猫19732023-03-26 12:18
以下是引用cssnet在2023-3-26 11:34:56的发言:

vcx方便【用】,prg方便【查】。
实际编写软件代码时,我习惯用“类管理器”打开vcx,来作编辑修改;而程序初稿完工后,进入debug阶段,我习惯导出prg,传到平板内,没事就拿在手上,一遍又一遍地通读,以便找出问题所在。
两者互不矛盾。
嗯……还有一点:
申请软件著作权时,若不放心源码过多地对外暴露,哪怕对方是正规管理机关也不太放心,不妨将一堆无关紧要的scx导出为prg,打印到A4纸上凑数。事关,软著对于源代码有打印页数的要求:前、后各连续30页,共60页。将表单转换为prg,又长又臭,五六个表单估计就能满足全部要求——反正版权中心那帮家伙,他们也看不懂VFP代码。
嘿嘿。


vfp 可以将整个项目导出成 prg/txt。
#8
cssnet2023-03-26 12:36
以下是引用倦猫1973在2023-3-26 12:18:37的发言:
vfp 可以将整个项目导出成 prg/txt。


对了,我一直没找到全自动地、无错误地将带有ActiveX控件的表单/类库,转换为可正确的、可直接运行的prg的好方法。
举个例子:
假设表单中添加了Treeview、RichTextBox之类ActiveX控件,那么,从类管理器ViewSource转出来的prg,因为缺少了必要的ActiveX控件OLE设计时信息,其实是无法直接运行,必须手动修补添加的。
不知倦猫有无良策?
#9
倦猫19732023-03-26 12:40
没有,反正导出来就是看着玩的,又不运行。
#10
吹水佬2023-03-26 13:30
以下是引用mywisdom88在2023-3-26 12:06:38的发言:

我做过对比,VCX,PRG运行的效果不同;
https://bbs.bccn.net/thread-510188-1-1.html
就是想自动根据字符长度改变控件大小,取所有最长的长度
为此,还特意问 吹版主

不好意思,还真没留意到。
问题应该是 add object 与 addobject() 的动机不同。
在VFP帮助里经常会看到“设计时”和“运行时”说法。
add object  是设计时,静态的,代码载入时对象就已经成型。有点像拖个控件到表单里一样,在表单看到什么样就什么样。
addobject() 是运行时,动态的,代码载入时对象不存在的,等到代码运行时,程序在运行过程中用指令逐步创建成型。

Cnt类的init在执行addobject()时触发,Cnt的width此时已经定局,到执行下面语句时,Label的AutoSize变动不会改变Cnt的width。
.Cnt2.label1.caption = "哈哈哈哈哈哈哈哈"

或者可以在addobject()时传入label1的caption。
或者:
.Cnt2.label1.caption = "哈哈哈哈哈哈哈哈"
INKEY(0.001)
.Cnt2.init


#11
wp2319572023-03-26 13:42
回复 楼主 倦猫1973
vfp本身就不行
#12
吹水佬2023-03-26 14:31
以下是引用wp231957在2023-3-26 13:42:00的发言:

vfp本身就不行

文字越少,问题越大。
#13
倦猫19732023-03-26 15:29
以下是引用wp231957在2023-3-26 13:42:00的发言:

vfp本身就不行


我感谢还有一些大佬,如木瓜,ZhZ,Xiejie等,不断为 vfp 添砖加瓦,把不可能变为可能。
#14
mywisdom882023-03-26 15:33
回复 10楼 吹水佬
是的,这样是可以,但中间会有停顿现象。


[此贴子已经被作者于2023-3-26 15:39编辑过]

#15
倦猫19732023-03-26 15:41
由于 vfp 解释型的,我的推测是:

Add Object 时,在 prg 中 cnt 类己经实例化了。而 AddObject 则在代码没有结束之前,是并没有完成实例化操作的。

[此贴子已经被作者于2023-3-26 15:42编辑过]

#16
倦猫19732023-03-26 15:53
但往上一层如你例子中的 form 它在代码未完成之前就不能被实例化,我就不试了你好奇可以试一下,就是试一下 form 的宽度是否能适应 label 宽度。
#17
mywisdom882023-03-26 15:54
以下是引用倦猫1973在2023-3-26 15:41:12的发言:

由于 vfp 解释型的,我的推测是:

Add Object 时,在 prg 中 cnt 类己经实例化了。而 AddObject 则在代码没有结束之前,是并没有完成实例化操作的。


然后,回到楼主问题
VCX 是不是,不能用 Add Object,如果是,那我的问题,就在这里体现出来了
#18
倦猫19732023-03-26 16:04
以下是引用mywisdom88在2023-3-26 15:54:38的发言:
然后,回到楼主问题




我没有问题,爱用 vcx 爱用 prg 我都尊重各位的决定。
#19
吹水佬2023-03-26 16:55
Add Object 基于可视类的VCX,相当于容器中的对象。
Add Object 在PRG的类定义中也不是都能实现的,要看BaseClass是什么。

#20
cssnet2023-03-26 17:53
若考虑到源代码加密的话——我爱采用源代码层面的加密,而非EXE层面的加壳、加密——那么,我当然更喜欢vcx多一些!
毕竟,prg结构简单,解密前后,皆可直接随意调试、运行;
而VCX的解密,相对可能复杂一些,调试、运行起来,也没那么方便、直观。
站在“破解者”的角度,当然乐意面对的是纯prg程序,而非vcx类库。

#21
sam_jiang2023-03-26 19:29
感觉初学者只把代码写在form里面,高手写在vcx里面供使用者,重复调用,大侠喜欢写prg。。。

[此贴子已经被作者于2023-3-27 19:55编辑过]

#22
csyx2023-03-26 19:42
以下是引用cssnet在2023-3-26 17:53:06的发言:
站在“破解者”的角度,当然乐意面对的是纯prg程序,而非vcx类库。

两者没区别,一个是独立的 prg/fxp,vcx就是一个dbf,类方法的 prg/fxp 就在 Methods/Objcode 字段中
作为破解者,不可能连这点基础知识都不知
#23
csyx2023-03-26 20:28
我的习惯是能用 vcx 的尽量用 vcx,除了楼主所说的好处外,有时候必须用 vcx 才能达到目的,甚至有些偏好者把不能用 vcx 设计的类也转成 vcx,楼主是老鸟,应该听说过 prg2vcx 之类的吧
前面所说的 COM/ActiveX 就是典型情况,而且一些 COM/ActiveX 还需要设计时授权才行,很多菜鸟都不明白为什么在自己的电脑上用 NewObject('') 实例化一个共用对话框没问题,在某些客户的电脑上就报错?通常为了简单起见老鸟都会告诉他搜一个叫 vb6controls.reg 的文件,下载双击导入注册表。把正版开发工具(假设哈)才有的设计时授权直接转移给用户,严格来说是违法的
正确做法是先在 vcx 中子类化一个共用对话框的 OLE 控件,假设取名 comdlg,代码中使用时用 NewObject('comdlg')即可,无论用户是否有设计时授权都可以正常创建这个对象。原因吗,我猜测是 vfp 把这些注册和授权信息保存在 vcx'ole 字段中了
楼主所说的智能提示确实是个问题,例如在自定义的 grid 成员类 header、column 中我们就添加了很多属性,由于它们都只能在 prg 中定义,智能提示没有相应的 descript 使用时确实很容易犯迷糊,目前也只能去翻看 prg 中的注释。vcx 中的 descript 是放在 Reserved3 字段中的,智能提示照道理也应该是从这取的,vfp 的这些工具源码都在 xsource.zip 中,希望有好事者能把这个 foxcode.prg 改改!

[此贴子已经被作者于2023-3-26 20:30编辑过]

#24
cssnet2023-03-26 21:31
以下是引用csyx在2023-3-26 19:42:39的发言:
两者没区别,一个是独立的 prg/fxp,vcx就是一个dbf,类方法的 prg/fxp 就在 Methods/Objcode 字段中
作为破解者,不可能连这点基础知识都不知


有区别的,甚至有狠大区别。
试想,倘若Unfox出来只是一堆prg,那么代码调试起来,是相当方便的。
甚至可以考虑:
copy  *.prg  ..\allprg.prg
然后,只需将主程序移到allprg.prg的最前边,即可一览众山小,优雅地、不慌不忙地、毫无障碍地仔细调试那一只可怜的待宰羔羊了。
而vcx则未必有这种便利。想要好好地总览一下待破解的代码,至少需费上一点点周折吧。

#25
zhken2023-03-26 21:32
回复 23楼 csyx
理解的不错
#26
csyx2023-03-26 22:16
以下是引用cssnet在2023-3-26 21:31:46的发言:
有区别的,甚至有狠大区别。
试想,倘若Unfox出来只是一堆prg,那么代码调试起来,是相当方便的。
甚至可以考虑:
copy  *.prg  ..\allprg.prg
然后,只需将主程序移到allprg.prg的最前边,即可一览众山小,优雅地、不慌不忙地、毫无障碍地仔细调试那一只可怜的待宰羔羊了。
而vcx则未必有这种便利。想要好好地总览一下待破解的代码,至少需费上一点点周折吧。

难道没用 class browser 导出过 vcx 吗?
#27
cssnet2023-03-26 22:25
以下是引用csyx在2023-3-26 22:16:51的发言:
难道没用 class browser 导出过 vcx 吗?


我说的是:调试!运行!
class browser 导出的prg,其实未必能够正儿八经运行的。
#28
csyx2023-03-26 22:38
以下是引用cssnet在2023-3-26 22:25:14的发言:
我说的是:调试!运行!
class browser 导出的prg,其实未必能够正儿八经运行的。

正因为 vcx 拥有 prg 无法实现的功能,class browser 才无法做到用 prg 准确还原 vcx 的所有功能,因此,只有在像 main、不可视化类设计等不得已的情况下才使用 prg
我用 class browser 最主要的目的,就是导出一堆无用的 prg 给著作权申请使用

[此贴子已经被作者于2023-3-26 22:40编辑过]

#29
吹水佬2023-03-27 08:39
不知有无发觉,写程序的到了一定境界时都有点固执,容易产生将一些统一体的各方面对立起来论长短。

#30
倦猫19732023-03-27 09:08
以下是引用吹水佬在2023-3-27 08:39:02的发言:

不知有无发觉,写程序的到了一定境界时都有点固执,容易产生将一些统一体的各方面对立起来论长短。



这便是本文也是本人的目的,不破不立。
#31
吹水佬2023-03-27 09:19
以下是引用倦猫1973在2023-3-27 09:08:27的发言:

这便是本文也是本人的目的,不破不立。

其实可以换一个方式来讨论,避免出偏。
如,在类的应用方面:
vcx能做到的也许prg难以做得好的问题,有什么方法可以用prg能更好地处理该问题?
prg能做到的也许vcx难以做得好的问题,有什么方法可以用vcx能更好地处理该问题?



#32
倦猫19732023-03-27 09:26
以下是引用吹水佬在2023-3-27 09:19:25的发言:
其实可以换一个方式来讨论,避免出偏。
如,在类的应用方面:
vcx能做到的也许prg难以做得好的问题,有什么方法可以用prg能更好地处理该问题?
prg能做到的也许vcx难以做得好的问题,有什么方法可以用vcx能更好地处理该问题?


我相信我说得很清楚了,比如为什么设计时用 vcx 用时再转成 prg 。。。。
#33
sam_jiang2023-03-28 16:26
没有删除自己参与互动内容的功能

[此贴子已经被作者于2023-3-28 16:35编辑过]

#34
hdx602023-04-02 23:02
你们说的那些我不懂或不在意。我只是共用的东西设计成类,可视化编程时,叼上来,或加上去就行。我把它叫“控件”了。
觉得它就像个“集成电路”,按规矩给个输入,就可以得到按规矩的输出效果。内部运行可以不管了。也便于大家共享这个“模块”。
#35
gs25367856782023-04-05 14:24
看过了,楼主写的是一篇很有深度的论文。应该说能够创作自定义类的,都是大虾,不是小菜鸟。
我现在只是创作可视的类,不可视的统一为PRG了。另外我是尽量减少外部控件,尽量用自定义
类来代替外部控件,例如进度条,tree控件。全部自主化了。
#36
sam_jiang2023-04-05 15:56
回复 35楼 gs2536785678
初学者主要将代码写在form里,或者command控件上;
高手会写自定义类,以便可以在其他form或command控件上调用;
大侠都写在prg里面。。。

其他的就只能算是入门者。
1