停止Visual Basic 6更改我的外壳

时间:2009-06-30 17:08:54

标签: vb6

非常简单的问题,显然不可能找到一个合适的答案:如何使Visual Basic 6停止更改我的^ @#*变量套管!?!

我知道很多VB用户的一般意见是这个“功能”实际上非常有用,但我怀疑他们在任何源控制系统中都使用它很多。当您尝试与其他几个开发人员合作开展任何重要项目时,这绝对是一种感染。如果忽略,您会对文件(甚至没有实际代码更改的文件)产生数千个误报“更改”,这些更改会污染修订历史记录,并且在某些情况下几乎不可能找到发生的实际更改。

如果你不忽视它(就像我的办公室,我们被迫实施“不需要更换案例”政策),你花费的时间是你每次提交时的5倍,因为你必须小心地恢复VB对每个文件进行“校正”,有时会恢复数百行以进行一行更改。

肯定有一个设置,插件,黑客等可以删除这个不需要的“功能”?我愿意采取任何我能得到的方法,只要它不需要我挑选成堆的幻影差异。并预先解决了几个抱怨:不,我不能在我的差异工具中关闭案例检测,这不是重点。不,我们不能仅仅在全球范围内改变案例。我们正在与跨越多年开发的多个开发人员共同工作的数十万个LOC合作。从业务角度来看,同步是不可行的。最后:不,我们无法升级到VB.net或移植到另一种语言(尽我所能)。

(是的,我现在只是有点恼怒。你能说出来吗?我的道歉,但这花费了我的时间和我公司的钱,而且我觉得不可接受。)

10 个答案:

答案 0 :(得分:21)

这是一个真实世界的场景,以及我们如何为我们的350k LOC VB6项目解决它。

我们正在使用Janus Grid,并且在某些时候,引用JSColumn的DefaultValue属性的所有代码行都转向了defaultValue。这是一个调试整个IDE滋扰的机会。

我发现刚刚添加了对MSXML的引用,现在IDE在Janus Grid类型库之前获取了ISchemaAttributes的defaultValue属性。

经过一些实验后,我发现IDE按以下顺序收集“已注册”标识符:

  • 来自项目的参考图书馆/项目 - >参考文献按其列出的顺序

  • 来自Project->组件的控件(未知顺序)

  • 源代码

所以我们所做的简单修复就是创建一个虚拟类/接口,其方法可以保持正确的外壳。由于我们已经拥有了一个项目范围的类型库,我们在其他类型库之前从每个项目中引用,这是无痛的。

以下是IUcsVbIntellisenseFix界面的IDL的一部分:

[
  odl,
  uuid(<<guid_here>>),
  version(1.0),
  dual,
  nonextensible,
  oleautomation
]
interface IUcsVbIntellisenseFix : IDispatch {
    [id(1)] HRESULT DefaultValue();
    [id(2)] HRESULT Selector();
    [id(3)] HRESULT Standalone();
    ...
}

我们为IUcsVbIntellisenseFix添加了很多方法,其中一些方法以我们用来拼错的枚举项和我们想要解决的任何内容命名。使用从每个项目引用的公共库(ActiveX DLL)中的简单VB类也可以做到这一点。

这样我们的源代码在某些时候汇聚到正确的外壳,因为在签出时,IDE实际上固定外壳,如IUcsVbIntellisenseFix外壳。现在,即使我们尝试,也不能拼错枚举,方法或属性。

答案 1 :(得分:18)

根据您添加的情况

#If False Then
    Dim CorrectCase
#End If

可能有帮助。

答案 2 :(得分:4)

简单方法:Dim在您想要的情况下的每个变量。否则,VBA将以不可理解的方式更改它。

Dim x, X1, X2, y, Yy  as variant
子程序中的

会将所有情况更改为Dim语句

中的情况

答案 3 :(得分:1)

我可以同情。幸运的是,我们允许在我们的版本控制差异工具中关闭区分大小写!

似乎VB6 IDE自动大小写修正偶尔会改变变量声明和引用中的大小写,可能取决于VBP文件中列出模块的顺序?但IDE不会告诉您该文件需要保存。因此,只有在您因另一次编辑而保存文件时才会出现问题。我们暂时试图通过检查项目中的所有文件并仔细设置案例来防止这种情况,但它并没有消失。

我想您可以列出受影响的变量名称 - 通常的嫌疑人是一个字母名称,如“I”,“X”和“Y”,可能是因为它们用于标准事件处理程序,如MouseDown。然后编写一个加载项,它将搜索所有声明“As”并强制将该情况强加给上层。在检入模块之前运行模块上的加载项。当您在VB6中保存时,可能会触发加载项自动运行。

编辑:我刚才想到的:改编Fred's answer。从现在开始,每次签入文件时,在顶部添加一个块,以便为通常的嫌疑人建立规范案例。如果不出意外,它比手动恢复数百行更容易。最终你会在每个文件中都有这个块。也许那时问题就会停止发生。

#If False Then
  Dim I, X, Y ' etc '
#End If

答案 4 :(得分:1)

我在整个代码库中对案例进行了标准化,通常是使用上面的示例(Dim CorrectCase),并再次删除它。 然后我通过执行区分大小写的搜索/替换&#34; End&#34;来触发VB以保存每个文件。用&#34;结束&#34; (没有功能改变,但足以让VB重新保存)。 一旦完成,我就可以做一次提交来标准化案例,使以后更容易保持在它之上。

答案 5 :(得分:1)

在这个例子中,VB6 在我引用一个库时犯了一个错字,改变了以下行的大小写:-

Dim MyRecordset As ADODB.REcordset

丑陋,现在 ADODB.REcordset 的每个其他实例都因此获得了新的拼写错误。我修复了以下问题:-

  1. 按如下方式输入新的声明

    Dim VB6CasingSucks AS ADODB, Recordset

    注意 ADODB 后面的逗号和空格。按 [ENTER] 为 VB6 检查行。

  2. 此时所有 REcordset 实例都变回 Recordset。

  3. 删除您的新声明。

我不知道这个修复是否对枚举/其他变量名有帮助。

答案 6 :(得分:0)

专门用于控制枚举值的情况,有一个VB6 IDE加载项可能会有所帮助。枚举似乎有一个稍微独特的问题版本。

如以下链接所述:

  

对于Enum的情况,VB6 IDE有一个恼人的怪癖   成员。与其他标识符不同,IDE不强制执行   在枚举块中声明的枚举成员的情况。那   偶尔会导致手动编写的Enum成员丢失   它的原始情况,除非编码人员仔细打字。   ...

     

但是,如果项目包含大量枚举和/或特定枚举   有很多成员,重新宣布他们每个成员都可以获得   相当乏味快速。 ...

参考:http://www.vbforums.com/showthread.php?778109-VB6-modLockEnumCase-bas-Enforce-Case-of-Enums

  

...通过加载项管理器根据需要加载和卸载加载项   对话框。用法就像选择整个Enum块一样简单,   右键单击,然后选择“锁定枚举案例”上下文菜单   项目

答案 7 :(得分:0)

我有一个类似的问题:

在我写的bas模块中:

Private sub bla_bla()
  Dim K as integer
End Sub

因此在类模块中,Dim k as integer将自动被IDE替换为'Dim K as integer'<-这不合逻辑,但随后: 我将bas模块更正为:

Private sub bla_bla()
  Dim k as integer
End Sub

然后神奇地解决了类模块中的问题(仍然是k,并且没有被IDE自动替换为K)。抱歉,我英文不好

答案 8 :(得分:-2)

我认为没有任何可行的事情。 IDE会将变量名称的大小写更改为声明时的大小写。但是,老实说,在我参与几个大型VB6项目的那一天,从未发现这是一个问题。为什么开发团队中的人员会不断更改变量声明?您似乎还没有建立明确的变量命名策略。我知道你的不满,所以没有冒犯,但这可能是你在这方面缺乏的政策。

不幸的是,根据这个SO thread,很难找到备用的VB6 IDE。所以,你最好的办法是通过政策来解决这个问题。或者转到VB.NET。 :)

答案 9 :(得分:-6)

哇。我花了很多时间在VB6编程,我不知道你在做什么。我能想到你唯一能指的是intellisense会改变变量名的大写以匹配它们的声明。如果你抱怨这个,我不得不想知道为什么他们以任何其他方式开始进入他们。如果这是你的问题,不,没有办法禁用它,我知道。我建议你一次性检查每个文件,确保声明和变量使用的上限都匹配并重新检入。