Pytanie w sprawie vb6 – Zatrzymaj Visual Basic 6 przed zmianą mojej obudowy

59

Bardzo proste pytanie, które najwyraźniej jest niemożliwe do znalezienia przyzwoitej odpowiedzi na: Jak sprawić, by Visual Basic 6 przestał zmieniać zmienną obudowę ^ @ # * ing!?!

Wiem, że ogólna opinia wielu użytkowników VB jest taka, że ​​ta „funkcja” jest w rzeczywistości bardzo pomocna, ale wątpię, aby korzystali z niej w jakikolwiek sposób z jakimkolwiek systemem kontroli źródeł. Jest to absolutnie INFURIATING, gdy próbujesz współpracować przy projekcie o znaczącym rozmiarze z kilkoma innymi programistami. Jeśli zostaną zignorowane, generujesz tysiące fałszywych dodatnich „zmian” w plikach (nawet tych bez rzeczywistych zmian kodu!), Które zanieczyszczają historię wersji i sprawiają, że w niektórych przypadkach niemal niemożliwe jest zlokalizowanie rzeczywistej zmiany, która miała miejsce.

Jeśli tego nie zignorujesz (np. W moim biurze, gdzie musieliśmy wdrożyć zasadę „bez zbędnej zmiany przypadku”), spędzasz 5 razy więcej czasu niż przy każdym zatwierdzeniu, ponieważ musisz ostrożnie wycofać poprawki VB „w każdym pliku, czasami odwracając setki linii, aby wprowadzić jedną zmianę linii.

Z pewnością musi istnieć ustawienie, wtyczka, hack itp., Które mogą usunąć tę niechcianą „funkcję”? Jestem gotów przyjąć każdą metodę, jaką mogę uzyskać, o ile nie wymaga ode mnie przeszukiwania widmowych różnic. I zepsuć kilka skarg z góry: Nie, nie mogę wyłączyć wykrywania przypadków w moim narzędziu do porównywania, to nie o to chodzi. Nie, nie możemy po prostu zmienić sprawy na globalną. Pracujemy z setkami tysięcy LOC, które są opracowywane przez wielu programistów obejmujących wiele lat rozwoju. Synchronizacja, która nie jest możliwa z punktu widzenia biznesu. I wreszcie: Nie, nie możemy uaktualnić do VB.net lub portu na inny język (tak bardzo, jak bym chciał).

(I tak, jestem w tej chwili trochę zirytowany. Czy możesz powiedzieć? Moje przeprosiny, ale to kosztuje mnie czas i pieniądze mojej firmy, i nie uważam tego za dopuszczalne).

Posiadanie Prywatnej Przestrzeni Stałej zadeklarowanej w jednym pliku w projekcie uniemożliwia użycie wbudowanej funkcji Space () w dowolnym pliku w projekcie ... kbshimmyo
Rozumiem twój ból, to jest ogromny problem z VBA, jak pokazuje link do kurtyny. Lance Roberts
Stało się to jednym z czynników przy ważeniu, czy zaktualizować kod VB6 do C #. Nie jedyny, nie najważniejszy, ale może przesuwać rzeczy ponad linię. DaveInCaz

Twoja odpowiedź

8   odpowiedzi
-2

Nie sądzę, żeby ktoś to zrobił. IDE zmieni przypadek nazwy zmiennej na taki, jaki jest, gdy zostanie zadeklarowany. Ale, szczerze mówiąc, w tamtym czasie pracowałem nad kilkoma dużymi projektami VB6 i nigdy nie uważałem tego za problem. Dlaczego ludzie w zespole programistów stale zmieniają deklaracje zmiennych? Wygląda na to, że nie ustanowiłeś wyraźnej polityki nazewnictwa zmiennych, którą wymuszasz. Znam twój niepokój, więc bez obrazy, ale może to być twoja polityka, której brakuje w tym względzie.

Niestety zgodnie z tymSO wątek, alternatywne IDE VB6 są trudne do zdobycia. Więc najlepszym rozwiązaniem jest rozwiązanie tego problemu za pomocą zasad. Lub przejdź do VB.NET. :)

Nie ma „rozwiązania”. JP Alioto
Tak, polityka nazewnictwa zmiennych pomaga niektórym, nie rozwiązuje problemu. Biblioteki innych firm mogą zniszczyć politykę nazewnictwa, powodując zmianę projektu w szerokim zakresie, wysyłając cię z powrotem do tego samego cyklu (jak stwierdził Toji w odpowiedzi na odpowiedź U62). Miquella
@Miquella Cóż, jeśli biblioteka innej firmy nie postępuje zgodnie z konwencją nazewnictwa firmy Microsoft, to nie zasługuje na użycie ... Tak więc polityka może polegać na zakazaniu takich bibliotek. Phil1970
21

Oto scenariusz z prawdziwego świata i sposób rozwiązania tego problemu w naszym projekcie LOC VB6 350k.

Używamy siatki Janus iw pewnym momencie wszystkie linie kodu, które odwoływały się do właściwości DefaultValue JSColumn, zmieniły się na defaultValue. Była to okazja do debugowania całej uciążliwości IDE.

Odkryłem, że właśnie dodano odniesienie do MSXML, a teraz IDE pobiera właściwość defaultValue 'ISchemaAttributes' przed typelibem Janus Grid.

Po kilku eksperymentach dowiedziałem się, że IDE zbiera „zarejestrowane” identyfikatory w następującej kolejności:

Biblioteki / projekty referencyjne z projektu-> Odniesienia w kolejności, w jakiej są wymienione

Elementy sterujące z projektu-> Komponenty (w nieznanym porządku)

Kod źródłowy

Tak więc prostą poprawką, jaką zrobiliśmy, było stworzenie sztucznej klasy / interfejsu metodami, które utrzymują naszą właściwą obudowę. Ponieważ mieliśmy już typelib dla całego projektu, do którego odwoływaliśmy się z każdego projektu przed czymkolwiek innym typelibem, było to bezbolesne.

Oto część IDL dla naszego interfejsu 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();
    ...
}

Dodaliśmy wiele metod do IUcsVbIntellisenseFix, niektóre z nich nazwano po elementach enum, których używaliśmy do błędnego pisania i czymkolwiek, co chcieliśmy naprawić. To samo można zrobić z prostą klasą VB we wspólnej bibliotece (DLL ActiveX), do której odwołuje się każdy projekt.

W ten sposób nasz kod źródłowy w pewnym momencie zbiegł się z właściwą obudową, ponieważ po sprawdzeniu IDE faktycznienaprawiony obudowa jak w obudowie IUcsVbIntellisenseFix. Teraz nie możemy błędnie napisać wyliczeń, metod ani właściwości, nawet jeśli próbujemy.

<quote> Ponieważ mieliśmy już typelib dla całego projektu, do którego odwoływaliśmy się z każdego projektu przed wszystkim innym typelibem </ quote>. Zwróć uwagę na część „przed każdym innym typelibem”. Przesuń fixel typelib tak wysoko, jak to możliwe, w oknie dialogowym References, „przed dowolnym innym typelibem”. wqw
Kiedy próbowałem tego dokonać, działał on dla enums (ale potem także nieco prostsze rozwiązanie powyżej), ale nie dla metod lub właściwości - zachowują wszystkie przypadki, które mają w kodzie źródłowym, i zastępują przypadek wszelkich pobliskich wyliczeń. Jakiś pomysł, co mogę robić źle? Simon D
Byłoby to dobrą odpowiedzią na pytanie „VB6 IDE tip and tricks”stackoverflow.com/questions/664370/… MarkJ
Dziękujemy za bardzo szczegółową odpowiedź! Będę musiał przedyskutować to z innymi programistami w moim biurze i sprawdzić, czy jest to praktyczne rozwiązanie dla naszej sytuacji. Toji
1

Standaryzowałem przypadek w całym kodzie kodu, zwykle za pomocą powyższych przykładów (Dim CorrectCase) i usunięcie go ponownie. Następnie uruchomiłem VB, aby zapisać KAŻDY plik, wykonując wyszukiwanie / zamienianie wielkości liter na „Koniec” na „Koniec” (bez zmiany funkcjonalnej, ale wystarczającej, aby VB mogła zostać ponownie zapisana). Kiedy to zrobię, będę mógł wykonać jedno zobowiązanie do standaryzacji sprawy, dzięki czemu znacznie łatwiej będzie ją przechowywać w późniejszym terminie.

0

Specjalnie do kontrolowania przypadku wartości wyliczeniowych, istnieje dodatek VB6 IDE, który może być pomocny. Enum wydaje się mieć nieco unikalną wersję tego problemu.

Jak opisano w poniższym linku:

VB6 IDE ma denerwujące dziwactwo, jeśli chodzi o członków Enum. W przeciwieństwie do innych identyfikatorów, IDE nie wymusza przypadku członka Enum, ponieważ został on zadeklarowany w bloku Enum. Czasami powoduje to, że członek Enum, który został ręcznie napisany, traci swoją oryginalną obudowę, chyba że koder wpisał ją wystarczająco starannie. ...

Jeśli jednak projekt zawiera wiele Enums i / lub konkretny Enum ma wielu członków, ponowne określenie członków w każdym z nich może być dość żmudne. ...

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

... załaduj i usuń dodatek w razie potrzeby za pomocą okna dialogowego Menedżer dodatków. Użycie jest tak proste, jak wybranie całego bloku Enum, kliknięcie prawym przyciskiem myszy, a następnie wybranie pozycji menu kontekstowego „Zablokuj przypadek Enum”.

-6

Łał. Spędziłem dużo czasu na programowaniu w VB6 i nie mam pojęcia, o co ci chodzi. Jedyną rzeczą, o której mogę myśleć, jest to, że intellisense zmieni wielkie litery nazw zmiennych, aby dopasować je do deklaracji. Jeśli narzekasz na to, musiałbym się zastanawiać, dlaczego, do diabła, zostały wprowadzone w inny sposób. A jeśli to jest twój problem, nie, nie ma sposobu, aby go wyłączyć, o czym wiem. Sugerowałbym, za jednym zamachem, sprawdź każdy plik, upewnij się, że czapki na deklaracjach i zastosowaniach zmiennych są zgodne.

@Toji: Myślałem, że nazwy zmiennych są powiązane z zakresem, w którym zmienna jest używana? Jak konwencja nazewnictwa stron trzecich w innym module może wpływać na twoją własną? Myślę, że brakuje mi tutaj doświadczenia, ale naprawdę tego nie rozumiem. Tomalak
Dokładnie. Jeśli tak, to inni deweloperzy zmieniają zmienną obudowę ^ @ # * ing. IDE VBA sprawia, że ​​jest spójny. Tomalak
Jedną z głównych wad jest to, że kilka używanych przez nas bibliotek innych firm ma inną konwencję nazewnictwa niż nasz własny kod, co powoduje, że sprawa zmienia się, dopasowując ją do biblioteki strony trzeciej lub z powrotem do naszej, w zależności od kolejności ładowania plików przez Aby uczynić to jeszcze gorszym, niektóre biblioteki innych firm używają różnych konwencji nazewnictwa. To, oprócz problemów, takich jak reguły obudowy wyliczeń (opisane w linku udostępnionym przez kurtynę), sprawia, że ​​kontrola spraw w złożonych projektach jest bardzo trudna. Toji
@Lance Roberts: Oczywiście jestem z frakcji „Nie mam pojęcia, o czym mówisz”. Być może dlatego, że (co prawda) nigdy nie pracowałem nad projektem VB6 o takim rozmiarze. Więc,kiedy dokładnie czy VB6 dowolnie zmienia obudowę nazwy zmiennej? Tomalak
18

W zależności od twojej sytuacji dodawanie

#If False Then
    Dim CorrectCase
#End If

może pomóc.

Niesamowity! Jeśli przypadkowo pomieszałeś jedną obudowę, to naprawi to na dobre przynajmniej w Office 2010 VBA Editor - Dziękuję !!! Marcus Mangelsdorf
co to dokładnie robi? curtisk
Daje kanoniczny przypadek bez tworzenia zmiennej. Przydatne, jeśli wyliczenia zmieniają wielkość liter. Simon D
Dziękuję za odpowiedź i jestem pewien, że byłoby to dobre dla niektórych projektów, ale niestety myślę, że skala naszych projektów wyklucza to rozwiązanie. Toji
Dobre rozwiązanie w niektórych przypadkach. Lance Roberts
4

PROSTA DROGA:Dim każda zmienna w żądanym przypadku. Inaczej,VBA zmieni to w sposób niezrozumiały.

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

w podprogramie zmieni WSZYSTKIE przypadki na te wDim komunikat

Podany przykład jest typową pułapką programistyczną, w której tylko ostatni element na liście jest wpisywany tak, jak zadeklarowano, że wszystkie inne typy będą domyślnie ustawione na Warianty. Nie miałoby znaczenia, czy rzeczywiście chciałeś wariantów, ale jeśli zrobiłbyś to innym typem, dostaniesz wszystkie warianty i tylko ostateczny element otrzyma zadeklarowany typ. Pillgram
Idealny! Walczę z tym od wielu dni, aż pokażesz, jak go rozwiązać! Dzięki! sirboderafael
1

Mogę współczuć. Na szczęście możemy wyłączyć wrażliwość na wielkość liter w naszym narzędziu do kontroli wersji!

Wydaje się, że automatyczna korekcja przypadku VB6 IDE czasami zmienia wielkość liter w zmiennych deklaracjach i referencjach, być może w zależności od kolejności, w jakiej moduły są wymienione w pliku VBP? Ale IDE nie mówi ci, że plik musi zostać zapisany. Problem pojawia się tylko wtedy, gdy zapisałeś plik z powodu innej edycji. Przez krótki czas próbowaliśmy temu zapobiec, sprawdzając wszystkie pliki w projekcie i ostrożnie ustawiając obudowę, ale nie zniknęło.

Przypuszczam, że możesz wymienić nazwy zmiennych, których to dotyczy - zwykłymi podejrzanymi są nazwy jedn literowe, takie jak „I”, „X” i „Y”, być może dlatego, że są używane w standardowych programach obsługi zdarzeń, takich jak MouseDown. Następnie napisz dodatek, który wyszuka wszystkie deklaracje „As” i wymusi nałożenie sprawy. Uruchom dodatek na swoich modułach przed ich sprawdzeniem. Być może będziesz w stanie uruchomić dodatek, aby uruchamiał się automatycznie po zapisaniu w VB6.

EDYCJA: Coś, o czym właśnie pomyślałem: dostosujOdpowiedź Freda. Od tej chwili za każdym razem, gdy będziesz sprawdzać plik, dodaj blok na górze, aby ustalić kanoniczną sprawę dla zwykłych podejrzanych. Jeśli nic innego, jest to łatwiejsze niż ręczne przywracanie setek linii. W końcu będziesz miał ten blok w każdym pliku i może wtedy problem przestanie się dziać.

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

Powiązane pytania