VB6悄悄地从窗体中删除大量控件数据

3
我的项目有大约130个控件(包括所有标签、文本框等)在一个SSTab(4个标签)中。该项目加载正常,运行正常,在任何时候都没有看到任何错误或警告,但是当我保存带有SStab的表单时,SStab数据不会保存(完全消失)。通常情况下,.frm文件的相关部分如下:
Begin TabDlg.SSTab SSTab1 Height = 8895 [1550个控件的更多代码] Width = 540 End Begin VB.Menu FileMenu
但最近它被裁剪为:
Begin TabDlg.SSTab SSTab1 Begin VB.Menu FileMenu
这非常令人沮丧!在我的VB IDE中,框架、sstab和所有控件都存在,并且可以编辑,运行/编译正常,在任何时候都没有错误消息,但是当您保存文件时,1550行珍贵的sstab数据就消失了——同样,没有警告或错误消息。因此,如果您退出并重新启动IDE,则会出现表单加载错误,因为现在缺少60%的代码。日志文件指向它找到的第一个错误(在这种情况下是一个没有结尾的Begin TabDlg)-没有其他信息。(代码被删除并保存后生成的日志文件,因此它不太有用。)
当我首次发布这个问题时,我认为它与控件数量有关,因为它在我添加控件后出现,并且在我的前几个测试中,似乎当删除该控件(或其他控件)时消失。现在,即使在将控件删除多个(将控件数远低于上次稳定时的数量),我也无法让该表单保存。
我还尝试删除SStab并将所有控件移动到4个不同的框架中。我在IDE中成功完成了这项工作,但是当我保存时,一大块数据(从滑动控件开始)就会消失。所以我真不知道发生了什么。
这个问题在两台不同的PC上都可以复制,因此看起来不是硬件/损坏软件VB安装问题。
有其他人遇到过类似的问题吗?
6个回答

3

为每个选项卡创建一个用户控件。这会使编辑变得更加容易。它还允许您很好地模块化代码,因此每个选项卡都存在于自己的文件中,并且如果需要,它将允许您在其他地方重复使用选项卡。


哇,我从来不知道 UserControls 直到现在。我将每个选项卡放在一个用户控件中,然后就不知道如何从主模块中访问用户控件中的控件了。就在那时保存文件损坏了。我会在有时间的时候再去研究它 - 它似乎很酷。 - Fred Hamilton
我必须在这里同意Joel的看法。这是“填充”选项卡控件的方法。您不会将选项卡放入用户控件中,而是将用户控件放入每个选项卡中。您不会从表单中处理控件,而是将它们的逻辑移动到用户控件中。把它们看作类 - 只是一种特殊的类。 - Bob

2

听起来很可怕,从未听说过这样的事情。

假设在将表单加载到IDE之前,您并没有从VB6获得错误日志文件导致它损坏?日志文件与表单文件具有相同的文件名,但具有.log文件扩展名。例如,如果加载Myform.frm时发生错误,则Visual Basic会创建一个名为Myform.log的日志文件。您可能在其中看到的错误消息在手册中有记录

查看Windows事件日志,看看是否记录了任何与VB6 IDE相关的问题?

您是否使用任何奇怪的控件?也许其中一个控件以某种方式破坏了FRM或FRX。FRM文件只是文本,正如您所知道的那样,格式在VB6手册中有记录。您能在文本编辑器中看到FRM中的任何损坏吗?如果删除FRX中定义的任何属性,它是否仍然失败。

我认为我会尝试创建一个新项目和一个新表单,然后使用IDE将所有控件定义复制粘贴到其中-没有代码。玩弄新表单,看看它是否有同样的问题。也许您可以通过这种方式重新创建表单而没有问题。如果新表单确实有问题,请执行相同的操作,但只取一半的控件。也许您可以通过“二进制搜索”找到问题控件。


我采纳了你的建议,创建了一个全新的项目,并将所有控件粘贴到其中 - 目前它正在工作。文件的错误日志中没有有用的信息(除了指出第一次出现不连续的行号)。 “事件日志”文件在哪里? - Fred Hamilton
这是Windows事件日志,您可以从控制面板中使用事件查看器。http://support.microsoft.com/kb/308427 - MarkJ
解决方案是将所有控件和代码复制到一个新项目中,这样问题就得以解决。花费的时间不算太长,经过数天的大量使用和添加,表单一直运行良好。如果我找到了根本原因,我会更新这个问题。 - Fred Hamilton
很高兴它能够工作!您可以使用文件比较器查找新的工作表单和旧的损坏表单之间的差异。 - MarkJ

2

当.FRM可写但.FRX只读时,我在尝试保存表单时遇到了相同的问题。


有趣,但是当我尝试使用只读FRX保存时,我会收到各种错误消息。你能够在没有这些错误消息的情况下保存吗? - Fred Hamilton

1

不确定是否是这个问题,但在VB6表格上,有255(或256)个命名控件的限制。也许你遇到了这个问题?

绕过这个限制的一种方法是使用控件数组。例如,如果您有10个标签,而不是label1、label2、label3等,您可以使用label(0)到label(9),仅使用一个命名控件。

SSTAB值得一提的另一件事是它显示/隐藏控件的方式。虽然看起来控件在不同的选项卡中,但实际上正在发生的是将控件移动到非常左边(因此看不到)。也许对于这么多组件,SSTAB在IDE中尝试在设计视图中呈现控件时会出现问题?

再次强调,不确定是否是这个问题,但我知道这两个提示相对较少人知道。


有趣...我没想到会达到255,而且很多控件已经是数组了,所以我不认为是这个问题。然而,我对触发代码删除的原始假设产生了一些疑问。今天需要进行更多测试并更新我的描述。感谢您的回复! - Fred Hamilton

1

所以保存功能不起作用。

我怀疑您放置在选项卡上的某个组件是罪魁祸首。

所以...

1)清点您在表单上放置的每种组件

2)消除一种组件,保存

3)它是否已保存?

-> 是=那就是有问题的控件

-> 否=返回步骤2,但选择另一种类型

当然,在第2步中删除某种类型的所有控件非常重要(例如,所有标签或所有文本框等)。

然而,我从未听说过发生这种情况。


1

你并不孤单!我也遇到了这个问题……事实上,我现在正在处理它,这也是我来到这个网站的原因。

我从'94年(VB3)开始使用VB,大约5或6年前,当我使用VB6时,我第一次看到了这个问题。那时我的解决方案与上面回答过你的好心人们的建议类似:丢弃现有文件,在新文件中重新构建表单。我当时就这么做了,受影响的表单自那以后就一直工作正常。

我的当前问题出现在另一个更新的表单中,替换/重建选项(一个月前执行)只能持续三周左右。现在问题又回来了,每个新版本的文件都很快就会损坏。根据上面关于允许控件总数的回复,我正在研究我有多少控件……而且,恰好我正在将主要按钮和菜单合并为控件数组,仅仅是因为这样可以简化它们的管理。

我也可以确认您关于将项目移动到第二台计算机的观察结果......我也这样做了,问题仍然存在。此外,我可以补充说,我已经将项目从一个共享存储系统移动到另一个共享存储系统,但问题依旧。(原始存储位置在Win-tel系统上挂载的驱动器上,新位置位于基于UNIX的NAS上!)

刚刚重新构建了文件并检查:Controls.Count = 62,因此我远未达到先前提到的255个控件限制。这确实很奇怪!(更不用说令人沮丧了!)


我感同身受!我仍在处理它。经过一定量的编辑后,它再次发生,我不得不将所有内容粘贴到一个新项目中,然后它又能运行一段时间。你是否正在使用sstab控件?我想知道这是否与此有关。 - Fred Hamilton
当您使用文件比较器比较工作文件和损坏文件时,是否显示任何内容?这似乎是要检查的第一件事。 - MarkJ
我再也没有一个损坏文件的副本了(下次我会保存一份副本),但是当它开始出现问题时,我确实查看过它。看起来发生的情况是,一个巨大的数据块刚好从 .frm 文件的表单(而不是代码)部分被删除掉了。我相信删除是从行边界开始/结束的(而不是在行的中间),但它绝对不尊重嵌套结构:A B C D /D /C /B /A变成了类似这样的形式:A B /A测量一下消失的大小(行数和字节)会很有趣...下次我会这样做。 - Fred Hamilton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接