2012-01-06 10 views
24

Robię trochę pracy nad starszą aplikacją, a moje umiejętności VB6 nie są tak wspaniałe. Muszę sprawdzić, czy pole String zostało zainicjowane i ustawione na coś innego niż null/nothing lub pusty ciąg znaków. W języku C# chcę tylko zrobić coś takiego:Odpowiednik ciągu VB6.IsNullOrEmpty

if (string.IsNullOrEmpty(myObj.Str)) 

Nie jestem pewien, co równoznaczne było w VB6 i jestem nerwowy temat korzystania If myObj.Str = "" i nazywając ją dobrze. Jaki jest właściwy sposób na zrobienie tego?

celu wyjaśnienia, chcę coś, co zwróci true, jeśli którykolwiek z następujących warunków:

  • Pole nie został zainicjowany
  • Pole jest pusty ciąg znaków (str = „”, length = 0)
  • To pole ma wartość NULL lub nic, lub vbnull, lub jakakolwiek forma wartości pustej dotyczy ciągów VB6.

Pole pierwotnie był długi, a kod mam zastępując sprawdzić, czy została ona ustawiona na 0.

Odpowiedz

37

VB6 został zaprojektowany, aby być łatwy

Zastosowanie

If str = "" Then 
    ' uninitialised, null or empty "" 
  • Łańcuchy są automatycznie inicjalizowane na [edit] łańcuch pusty.
  • Łańcuch pusty to vbNullString.
  • Ale nie martw się o ciągach zerowych. Łańcuch zerowy VB6 jest nieodróżnialny od pustego ciągu znaków "" dla (prawie) dowolnej manipulacji ciągami.
+1

Przesyłanie vbNullString do argumentu LPCSTR funkcji API może być problemem. – wqw

+1

@wqw Rzeczywista (ale dość rzadka sytuacja). Będę edytować, aby powiedzieć "prawie każdy" – MarkJ

+3

Niepoprawnie. Ciągi nie są automatycznie inicjalizowane, aby były puste. Użycie StrPtr (s) zwróci 0 dla łańcucha zerowego (vbNullString), a StrPtr ("") zwróci adres pustego łańcucha. Jednak VB6 naprawdę traktuje je tak samo, to tylko wywołania API, które mogą być ważne. –

3

użytku Is Null na użądlenia lub jest nic obiektów

używać len ("ciąg ") zamiast" ciąg "="", ponieważ jest szybsza

Dim s As String 

If Not (s Is Null) Then 
    MsgBox "SET" 

    if (len(s)>0) then 
    MsgBox "size > 0" 
    else 
    MsgBox "size = 0" 
    end if 
Else 
    MsgBox "not SET" 
End If 

pozdrowienia

+0

i do pustej użycia strun Jeśli DŁ.B (s) = 0 Then – ClickerMonkey

+0

edit *^co powiedział. - chce również sprawdzić zainicjowany łańcuch, który jest pusty lub długość 0, więc sprawdź także dla s == "" – Tank

+0

Czy Null dla łańcuchów jest niepoprawny w VB6 * lub * VB.Net. Po prostu użyj = "" dla VB6, a w VB.Net użyj Is Nothing – MarkJ

11

Najbardziej zoptymalizowany i bezpieczny sposób, aby spełniać wymagania 3 jest następujący:

If LenB(myObj.Str) = 0 
Then Debug.Print "String is empty/null/not initialized" 
Else Debug.Print "Not Empty" 
+0

+1 Testowanie długości ciągu jest rzeczywiście najbardziej wydajnym/wydajnym sposobem testowania łańcucha o zerowej długości. – tcarvin

+1

Testowanie długości jest najbardziej wydajnym sposobem testowania łańcucha o zerowej długości, ale jest mniej czytelne niż proste 'str =" "'. Jak często wydajność jest naprawdę ważna? – MarkJ

0

jako „null” i „puste ciągi” są rzeczywiście różne wartości, takie podejście może przechwytywać zarówno dla ciebie łatwe:

If strValue & "" = "" Then 
    'This is Null 
Else 
    'This is NOT Null 
End If 
+0

' Trim (strValue & vbNullString) = vbNullString' także zapełni wypełnione spacjami. – Fionnuala

+0

Niepoprawnie. Wartości null i puste ciągi są identyczne w VB6 (i VB.Net). – MarkJ

+0

Ups, błędne wczytanie VBA, przepraszam. – Fionnuala

2

Próbowałem, If str = "" Następnie

ale to nie działa .

Najlepszym sposobem, aby określić, czy dany ciąg jest zerowy jest:

If IsNull(str) Następnie

"To będzie działać doskonale

0

Wystarczy dodanie informacji do odpowiedzi MarkJ użytkownika. W przypadku pracy z zestawem rekordów ten błąd w czasie wykonywania zostanie zgłoszony w przypadku, gdy element ma wartość NULL. Powinieneś to zrobić:

if rs.fields.item("rsField").value & "" = "" then 

Powodzenia.

0

„Korzystanie VbNullstring może być bardzo skutecznym sposobem

Dim YourString as string 
dim HasValue as boolean 

If YourString = vbnullstring then 
    HasValue = False 
Else 
HasValue = True 
End if 
+2

Nie pisz tego kodu; zamiast tego napisz 'HasValue = YourString <> vbNullString': jest bardziej bezpośredni, tutaj' If' jest zupełnie niepotrzebny. Co więcej, nie ma powodu, aby ** kiedykolwiek ** napisać to w VB6. Możesz po prostu powiedzieć "HasValue = YourString <>" " –