代码之家  ›  专栏  ›  技术社区  ›  Toji

阻止Visual Basic 6更改我的外壳

vb6
  •  58
  • Toji  · 技术社区  · 15 年前

    非常简单的问题,显然不可能找到一个像样的答案:如何使Visual Basic 6停止更改变量大小写!?!

    我知道很多VB用户的普遍看法是这个“特性”实际上是非常有用的,但是我怀疑他们是否在任何源代码控制系统中使用过它。当您试图与其他几个开发人员在任何规模的项目上进行协作时,这绝对是令人恼火的。如果忽略,会对文件产生数千个假阳性的“更改”(即使没有实际的代码更改!)在某些情况下,不可能找到真正的改变。

    如果你不忽略它(比如我的办公室,我们被迫实施了一个“不必要的案例更改”策略),你在每个提交上花费的时间是平时的5倍,因为你必须小心地还原VB对每个文件的“更正”,有时会还原数百行以放入一行更改。

    当然,一定有一个设置,插件,黑客等在那里,可以删除这个不需要的“功能”?我愿意采取任何我能得到的方法,只要它不需要我去挑选成堆的幻影差异。我要先解决几个问题:不,我不能在diff工具中关闭病例检测,这不是重点。不,我们不能在全球范围内改变情况。我们正在与数十万个LOC合作,这些LOC是由多个开发人员跨多年开发的。从业务的角度来看,这是不可行的。最后:不,我们不能升级到VB.net版或者移植到另一种语言(我很乐意)。

    (是的,我现在只是有点生气。你能看出来吗?我很抱歉,但这要花费我的时间和公司的钱,我觉得这是不可接受的。)

    8 回复  |  直到 15 年前
        1
  •  21
  •   Tim Cooper    13 年前

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

    我们使用的是Janus网格,在某个时刻,引用JSColumn的DefaultValue属性的所有代码行都变成了DefaultValue。这是一个调试整个IDE的机会。

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

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

    • 从项目中引用的库/项目->按列出顺序引用

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

    所以我们所做的简单修复就是创建一个虚拟类/接口,其中的方法保存了正确的大小写。因为我们已经有了一个项目范围的typelib,我们在引用其他任何typelib之前就从每个项目中引用了它,所以这样做很轻松。

    以下是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添加了很多方法,其中一些方法是以我们过去拼写错误的枚举项和我们想要修复的任何东西命名的。在公共库(activexdll)中的一个简单VB类也可以做到这一点,该库从每个项目中引用。

    这样,我们的源代码在某个点上收敛到合适的大小写,因为在签出IDE时实际上 固定的 外壳符合IUcsVbIntellisenseFix外壳。现在,即使我们尝试拼写错误,也不能拼写错误的枚举、方法或属性。

        2
  •  19
  •   Simon D    15 年前

    取决于你的情况

    #If False Then
        Dim CorrectCase
    #End If
    

    可能会有帮助。

        3
  •  4
  •   Rathakrishnan Ramasamy micky    12 年前

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

    Dim x, X1, X2, y, Yy  as variant
    

    在子例程中,将所有情况更改为 暗淡 陈述

        4
  •  1
  •   Community Egal    7 年前

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

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

    编辑:我刚想到的东西:适应 Fred's answer . 从现在起,每次签入文件时,都要在顶部添加一个块,以便为常见的嫌疑人建立规范的案例。如果没有别的,那就比手工还原几百行容易多了。最终,您将在每个文件中都有这个块,然后问题就不会再发生了。

    #If False Then
      Dim I, X, Y ' etc '
    #End If
    
        5
  •  1
  •   Deanna superuser    8 年前

    我通过使用上面的例子,在整个代码库中标准化了这个案例( Dim CorrectCase ),然后再次移除。 然后,我触发VB保存每个文件,方法是对“End”进行区分大小写的搜索/替换为“End”(没有功能更改,但足以让VB重新保存)。 一旦这样做了,我就可以做一个单一的承诺,以标准化的情况下,使它更容易保持在顶部,在以后的日期。

        6
  •  0
  •   StayOnTarget    7 年前

    专门用于控制枚举值的大小写 ,有一个VB6 IDE外接程序,可能会有所帮助。枚举对于这个问题似乎有一个稍微独特的版本。

    如以下链接所述:

    成员。与其他标识符不同,IDE不强制 枚举块中声明的枚举成员的大小写。那个 有时会导致手动写入的枚举成员丢失 它的原始情况下,除非一个编码输入足够仔细。 ...

    但是,如果项目包含大量枚举和/或特定枚举 有很多成员,重新定义每个成员都可以得到 相当乏味的快。。。

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

    对话框。用法很简单,只需选择整个枚举块, 右键单击,然后选择“Lock Enum Case”上下文菜单 项目。

        7
  •  0
  •   Muhammad Dyas Yaskur Babasaheb Bankar    4 年前

    我也有类似的问题:

    在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
    

        8
  •  -2
  •   Community Egal    7 年前

    我觉得没什么好做的。IDE将变量名的大小写更改为声明时的大小写。但是,老实说,在那一天,我做了几个大型VB6项目,从来没有发现这是一个问题。为什么您的开发团队中的人员不断更改变量声明?似乎您还没有建立一个明确的变量命名策略。我知道你的不安,所以无意冒犯,但可能是你的政策在这方面有所欠缺。

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

        9
  •  -6
  •   U62    15 年前

    真 的。我花了很多时间用VB6编程,我不知道你在说什么。我认为您所指的唯一一件事是intellisense将更改变量名的大小写以匹配它们的声明。如果你抱怨的话,我会很奇怪为什么他们会以其他方式进入。如果这是你的问题,不,我知道没有办法禁用它。我建议您一次性签出每个文件,确保声明和变量使用的上限都匹配并签回。