2012-01-19 11 views
7

Mam duże projekty VB6, w których wiele zmiennych nie ma jawnie zdefiniowanego typu, więc automatycznie ustawiają się one na Variant. Znalezienie tych wszystkich ręcznie jest ogromnym zadaniem, więc czy istnieje sposób na zautomatyzowanie tego? W VB.Net można wyłączyć wszystkie automatyczne użycie wariantów przy użyciu opcji "Opcja Strict", ale VB6 nie ma tej opcji.VB6: Wyłącz warianty

W tej chwili dodałem DefByte A-Z do każdej klasy, która tworzy domyślny typ "Bajt" zamiast "Wariant". Pozwoliło mi to złapać wiele nieokreślonych zmiennych w czasie wykonywania, gdy tylko przydzielono im wartość większą niż 255. Ale nadal nie jest to w pełni głupie.

Czy istnieje bardziej niezawodny sposób wykrywania wszystkich niezdefiniowanych zmiennych?

+0

Nie możesz po prostu wyszukać słowa "Wariant" w całym rozwiązaniu? – pikzen

+1

@pikzen: w VB6, jeśli nie określisz typu, otrzymasz wariant Variant. – MartW

+1

Ponadto, jeśli masz linię typu "Dim x, y, z AS Integer", tylko z będzie liczbą całkowitą. x i y będą wariantami. To zachowanie zmieniło się w przypadku VB.NET, na szczęście. – MartW

Odpowiedz

2

Nie sądzę, że istnieje "niezawodny" sposób wykrywania wszystkich niezdefiniowanych zmiennych. Jednak instrukcja Option Explicit wymaga, aby wszystkie zmienne były zadeklarowane w module, w którym pojawia się instrukcja, więc kompilator będzie oznaczał każdą instancję, w której nie ma to miejsca. Istnieje również opcja IDE, która automatycznie dodaje tę instrukcję na początku każdego nowego modułu.

+0

Kod już wykorzystany Option Explicit, thanks anyway! – Muis

+0

Jeśli w swoim kodzie użyto opcji Explicit, to dlaczego zadajesz to pytanie? –

+0

@MarkBertenshaw - opcja "Opcja jawna" sprawdza niezadeklarowane zmienne. Nie sprawdza, czy zmienne zadeklarowane są wariantami, co jest zgodne z wymaganiami PO –

5

Użyłem użyć Aivosto's Project Analyzer, aby odebrać takie rzeczy. Jest wersja demo, która da ci dobry pomysł, co może zrobić.

+0

. Oprogramowanie nie jest drogie i bardzo szybko się zapłaci, oszczędzając czas i zapobiegając problemom. –

4

Udekoruj swoje moduły za pomocą Option Explicit.

To zdanie powinno znajdować się u góry każdego tworzonego modułu. Gdy to zrobi, spowoduje błąd kompilatora, gdy napotkane zostaną niezadeklarowane zmienne.

Option Explicit nie stoi jednak na przeszkodzie typu mniej deklaracje zmiennych, takich jak

Dim i 

Zmienna i zostaną zadeklarowane jako wariant, a nie błąd kompilatora zostanie wyrzucony nawet z Option Explicit zdefiniowane.

+0

Kod już wykorzystany Option Explicit, thanks anyway! – Muis

2

Użyj edytora tekstu programisty (ja używam UltraEdit) i wykonuję masowe przeszukiwanie katalogów źródłowych projektu.

Zacznij od wyszukania Variant (oczywiście), chociaż prawdopodobnie już to zrobiłeś.

Następny użyć zwykłego wyszukiwania wpisz wyrażenie czegoś wzdłuż linii:

*Dim [a-zA-Z][a-zA-Z0-9_]*\p 

To powinno dostać scenariusz Dim x bez spływu As DataType.

Skorzystaj z *Dim [a-zA-Z][a-zA-Z0-9_]*,.*, aby znaleźć scenariusze typu Dim a, b, c As Integer.

Zastosowanie *Dim .*, [a-zA-Z][a-zA-Z0-9_]*,.* dla nieparzystych scenariuszy piłkę jak Dim a As Integer, b, c As Long

powtórzyć powyższe seaches z Private i Global zamiast Dim i że powinien dostać prawie wszystko.

+1

Należy również uwzględnić "ReDim", ponieważ VB nie wymaga najpierw "Dim". I nie działa dla tablic, parametrów funkcji, wartości zwracanych, itp. Więc chociaż jest to przyjemny wysiłek, ma pewne luki;) – Muis

+0

Użyłem tylko Redima z tablicami. Pomyślałem o problemie z parametrami, ale szczerze mówiąc, nie jestem wystarczająco biegły w wyrażeniach regularnych, aby znaleźć jeden dla każdego. Zostawię to komuś bardziej ambitnemu niż ja :) – tcarvin

+0

Czy publiczne i prywatne nie można również użyć do zadeklarowania pola? Potrzebuję również wyrażeń regularnych. – MarkJ