Pergunta sobre vb6 – Pare o Visual Basic 6 de alterar minha caixa

59

Pergunta muito simples que aparentemente é impossível encontrar uma resposta decente para: Como posso fazer com que o Visual Basic 6 pare de alterar minha caixa variável ^ @ # * ing!?!

Eu sei que a opinião geral de muitos usuários de VB é que esse "recurso" é realmente muito útil, mas duvido que eles o usem muito com qualquer sistema de controle de código-fonte. Isso é absolutamente INFORMÁTICO quando você está tentando colaborar em um projeto de qualquer tamanho significativo com vários outros desenvolvedores. Se ignorado, você produz milhares de "mudanças" falso-positivas em seus arquivos (mesmo aquelas sem alterações reais de código!) Que poluem o histórico de revisões e tornam quase impossível, em alguns casos, localizar a alteração real ocorrida.

Se você não o ignorar (como no meu escritório, onde fomos forçados a implementar uma política de "mudança desnecessária de caso desnecessário"), você gasta 5x o tempo que normalmente faria em cada commit porque precisa reverter cuidadosamente as "correções" do VB. "em todos os arquivos, às vezes revertendo centenas de linhas para colocar em uma mudança de linha.

Certamente deve haver uma configuração, plugin, hack, etc. por aí que possa remover esse "recurso" indesejado? Estou disposto a adotar qualquer método que eu possa obter, desde que isso não exija que eu escolha pilhas de diffs fantasmas. E para eliminar algumas reclamações na frente: Não, não consigo desativar a detecção de maiúsculas e minúsculas na minha ferramenta de comparação, esse não é o ponto. Não, não podemos apenas fazer o caso mudar globalmente. Estamos trabalhando com centenas de milhares de LOCs sendo trabalhados por vários desenvolvedores, abrangendo muitos anos de desenvolvimento. Sincronizar isso não é viável do ponto de vista de negócios. E, finalmente: Não, não podemos atualizar para o VB.net ou portar para outro idioma (tanto quanto eu adoraria).

(E sim, estou apenas um pouquinho irritada no momento. Consegue dizer? Minhas desculpas, mas isso está me custando tempo e dinheiro da minha empresa, e não acho isso aceitável.)

Ter um espaço privado constante declarado em um arquivo no projeto torna impossível usar a função interna Space () em qualquer arquivo no projeto ... kbshimmyo
possível duplicata deEditor VB6 mudando o caso dos nomes das variáveis! raven
Eu entendo sua dor, isso é um grande problema com o VBA, como mostra o link do curtisk. Lance Roberts
Isso se tornou um fator quando se avalia se deve atualizar o código VB6 para C #. Não é o único, não o mais importante, mas pode empurrar as coisas para o outro lado. DaveInCaz

Sua resposta

8   a resposta
1

Eu posso simpatizar. Felizmente, estamos autorizados a desativar a diferenciação de maiúsculas e minúsculas em nossa ferramenta de comparação de controle de versão!

Parece que a correção automática de caso do IDE do VB6 ocasionalmente muda o caso em declarações e referências de variáveis, talvez dependendo da ordem em que os módulos são listados no arquivo VBP? Mas o IDE não diz que o arquivo precisa ser salvo. Portanto, o problema só aparece quando você salva o arquivo por causa de outra edição. Nós tentamos evitar isso checando todos os arquivos em um projeto e definindo o caso com cuidado, mas ele não desapareceu.

Eu suponho que você poderia listar os nomes de variáveis ​​que são afetados - os suspeitos usuais são nomes de uma letra como "I", "X" e "Y", talvez porque eles são usados ​​em manipuladores de eventos padrão como MouseDown. Em seguida, escreva um suplemento que pesquisará todas as declarações "As" e force o caso para superior. Execute o add-in em seus módulos antes de fazer o check-in. Você poderá acionar o complemento para ser executado automaticamente ao salvar no VB6.

EDIT: algo que eu acabei de pensar: adaptarA resposta de Fred. De agora em diante, toda vez que você fizer o check-in de um arquivo, adicione um bloco no topo para estabelecer um caso canônico para os suspeitos usuais. Se nada mais, é mais fácil do que reverter centenas de linhas à mão. Eventualmente, você terá esse bloco em todos os arquivos e, talvez, o problema pare de acontecer.

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

Dependendo da sua situação, adicionar

#If False Then
    Dim CorrectCase
#End If

pode ajudar.

Dá caso canônico sem criar uma variável. Útil se enums estão mudando caso. Simon D
Boa solução para alguns casos. Lance Roberts
o que isso faz exatamente? curtisk
Obrigado pela resposta, e tenho certeza de que isso funcionaria muito bem para alguns projetos, mas infelizmente acho que a escala de nossos projetos exclui essa solução. Toji
Surpreendente! Se você acabou de estragar um invólucro acidentalmente isso irá corrigi-lo para o bem, pelo menos, no Office 2010 VBA Editor - Obrigado !!! Marcus Mangelsdorf
4

MANEIRA SIMPLES:Dim cada variável no caso que você deseja. De outra forma,VBA irá mudá-lo de uma forma que não é compreensível.

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

em uma sub-rotina vai mudar todos os casos para aqueles noDim declaração

Perfeito! Eu tenho lutado com isso por dias até você mostrar como resolvê-lo! Obrigado! sirboderafael
O exemplo dado é uma armadilha de programação comum, onde apenas o último item da lista é realmente digitado como declarado. Todos os outros tipos seriam padronizados para Variantes. Não importaria se você realmente quisesse variantes, mas se você fizesse isso com qualquer outro tipo, você obteria todas as variantes e somente o item final receberia o tipo declarado. Pillgram
1

Eu padronizei o caso através da base de código, normalmente usando os exemplos acima (Dim CorrectCase) e removê-lo novamente. Em seguida, acionei o VB para salvar TODOS os arquivos, fazendo uma pesquisa / substituição de "Fim" com "End" (sem alteração funcional, mas o suficiente para fazer com que o VB fosse salvo novamente). Uma vez feito isso, eu poderia fazer um único commit para padronizar o caso, tornando MUITO mais fácil mantê-lo em uma data posterior.

-6

Uau. Passei muito tempo programando no VB6 e não tenho ideia do que você está falando. A única coisa que posso pensar que você está se referindo é que o intellisense mudará a capitalização dos nomes das variáveis ​​para corresponder às suas declarações. Se você está reclamando disso, eu teria que me perguntar por que diabos eles foram inscritos de outra maneira para começar. E se esse é o seu problema, não, não há como desativá-lo do que eu saiba. Eu sugiro que você, de uma só vez, verifique todos os arquivos, certifique-se de que os limites nas declarações e usos das variáveis ​​coincidam e retorne.

Eu pensei que originalmente também, mas nós vimos evidências em nosso sistema de mudanças de caso entre módulos ocorrendo, e ouvimos outros desenvolvedores citarem problemas semelhantes. Se realmente foi escopo para o arquivo atual, não seria um problema, mas infelizmente isso não é o caso. Toji
@Toji: Eu pensei que os nomes das variáveis ​​estão vinculados ao escopo em que a variável é usada? Como a convenção de nomenclatura de terceiros em um módulo diferente pode afetar sua própria? Eu acho que estou apenas com falta de experiência aqui, mas eu realmente não entendo. Tomalak
@Toji: Eu vejo. Obrigado por explicar! Tomalak
@Lance Roberts: Obviamente eu sou da fração "Não tenho idéia do que você está falando". O que pode ser porque eu (reconhecidamente) nunca trabalhei em um projeto VB6 desse tamanho. Assim,quando exatamente o VB6 altera arbitrariamente o nome da variável? Tomalak
21

Aqui está um cenário do mundo real e como nós o resolvemos para o nosso projeto de 350k LOC VB6.

Estamos usando o Janus Grid e, em algum momento, todas as linhas de código que referenciaram a propriedade DefaultValue do JSColumn foram convertidas para defaultValue. Esta foi uma oportunidade para depurar todo o incômodo da IDE.

O que eu descobri foi que uma referência ao MSXML acaba de ser adicionada e agora o IDE pega a propriedade defaultValue do ISchemaAttributes antes do typelib Janus Grid.

Depois de algumas experiências, descobri que o IDE coleta identificadores "registrados" na seguinte ordem:

Bibliotecas / projetos referenciados de Project-> References na ordem em que estão listados

Controles de Projeto-> Componentes (em ordem desconhecida)

Código fonte

Então, a solução simples que fizemos foi criar uma classe / interface fictícia com métodos que contivessem nossa caixa adequada. Como já tínhamos um typelib para todo o projeto que referenciamos em todos os projetos antes de qualquer outro typelib, isso era indolor.

Aqui faz parte do IDL para nossa interface IUcsVbIntellisenseFix:

[
  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();
    ...
}

Adicionamos vários métodos ao IUcsVbIntellisenseFix, alguns deles nomeados após os itens do enum que usamos para escrever incorretamente e o que queríamos corrigir. O mesmo pode ser feito com uma classe VB simples em uma biblioteca comum (ActiveX DLL) que é referenciada em todos os projetos.

Desta forma, o nosso código-fonte em algum momento convergiu para o invólucro adequado, porque no momento do check-out o IDE realmentefixo o invólucro de acordo com IUcsVbIntellisenseFix invólucro. Agora não podemos errar enums, métodos ou propriedades, mesmo se tentarmos.

<quote> Como já tínhamos um typelib para todo o projeto, referenciamos todos os projetos antes de qualquer outra typelib </ quote>. Observe a parte "antes de qualquer outro typelib". Mova o typelib de correção o mais alto possível na caixa de diálogo Referências, "antes de qualquer outro typelib". wqw
Isso seria uma boa resposta para a pergunta "Dica e truques do VB6 IDE"stackoverflow.com/questions/664370/… MarkJ
Quando eu tentei isso, funcionou para enums (mas novamente para uma solução mais simples acima), mas não para métodos ou propriedades - eles mantêm qualquer caso no código-fonte, e sobrescrevem o caso de qualquer enums próximos. Alguma ideia do que eu possa estar fazendo errado? Simon D
Obrigado pela sua resposta muito detalhada! Vou ter que discutir isso com os outros desenvolvedores no meu escritório e ver se é uma solução viável para a nossa situação. Toji
-2

Eu não acho que haja alguma para fazer isso. O IDE mudará o caso do nome da variável para o que for quando for declarado. Mas, sinceramente, no passado trabalhei em vários grandes projetos VB6 e nunca achei que isso fosse um problema. Por que as pessoas em sua equipe de desenvolvimento estão constantemente mudando as declarações de variáveis? Parece que você não estabeleceu uma política de nomenclatura de variável clara que você impõe. Eu sei que você está chateado, então não ofenda, mas podem ser suas políticas que estão faltando a esse respeito.

Infelizmente, de acordo com issoDiscussão SO, IDs VB6 alternativos são difíceis de obter. Então, sua melhor aposta é resolver esse problema via política. Ou vá para o VB.NET. :)

Não há "solução". JP Alioto
Sim, uma política de nomenclatura de variáveis ​​ajuda alguns, não resolve o problema. Bibliotecas de terceiros podem arruinar o caos em uma política de nomenclatura, fazendo com que o caso mude o projeto, enviando você de volta ao mesmo ciclo (como Toji afirmou na resposta à resposta do U62). Miquella
@Miquella Bem, se uma biblioteca de terceiros não seguir a convenção de nomenclatura da Microsoft, então ela não merece ser usada ... Portanto, uma política poderia ser banir essas bibliotecas. Phil1970
0

Especificamente para controlar o caso de valores enum, há um add-in VB6 IDE que pode ser útil. Os enums parecem ter uma versão ligeiramente única desse problema.

Conforme descrito no link abaixo:

O VB6 IDE tem uma peculiaridade irritante quando se trata do caso de membros Enum. Ao contrário de outros identificadores, o IDE não impõe o caso de um membro Enum como foi declarado no bloco Enum. Isso ocasionalmente faz com que um membro Enum que foi escrito manualmente perca seu caso original, a menos que um codificador tenha digitado com cuidado suficiente. ...

No entanto, se um projeto contiver muitos Enums e / ou um Enum em particular tiver muitos membros, redeclarar os membros em cada um deles pode ser bastante fastidioso. ...

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

... carregue e descarregue o complemento conforme necessário por meio da caixa de diálogo Gerenciador de complementos. O uso é tão simples quanto selecionar todo o bloco Enum, clicar com o botão direito do mouse e escolher o item de menu de contexto "Lock Enum Case".

Perguntas relacionadas