2009-05-15 3 views
3

Ich bin neu in VB6 (und Visual Basic in jeder Form) Entwicklung und ich bin auf ein Problem gestoßen. Es kann lexikalische Fehler unten geben, weil ich den Code formatierte, um ein wenig lesbarer innerhalb des Pfostens hier zu sein, aber der Kern der Frage bleibt. Hier ist der CodeWarum ändert sich meine VB6-Variante je nachdem, wann sie zugewiesen wurde?

Mein Problem ist, dass die von den MsgBox Aufrufen angezeigt (die zweite Gruppe von ihnen, diejenigen, die auf die Variablen ScrWord und ResWord verweisen) unterscheiden sich je nachdem, wenn ich den Variablen ScrWord und ResWord zuweisen. Wenn ich den Variablen scrWord und resWord an der ersten Stelle, die im oben gezeigten Code unkommentiert ist, zuweisen, werden die Nachrichtenboxen am unteren Rand des Codes entweder Zeichenfolgen ausgeben, an denen ich nicht interessiert bin (z. B. die erste Nachricht) eine Ausgabe, die aussieht wie "srcws: resColNum: #" oder was scheinbar Mülldaten sind. Beachten Sie, dass dies bedeutet, dass der Variable scrWord eine statische Zeichenfolge zugewiesen wurde, die ich im vorherigen Meldungsfeld verwendet habe. Das ist NIE das beabsichtigte Verhalten und ich habe keine Ahnung, wie es passiert.

Wenn die Zuweisung dagegen unmittelbar vor den Meldungsfeldern erfolgt, in denen die Variablenzuweisung im obigen Code kommentiert wird, geben die Variablen einen anderen Wert aus, der etwas mehr dem entspricht, was erwartet wird, aber nicht genau (normalerweise sind die beiden Variablen genau gleich oder eins ist numerisch, wenn beide unterschiedliche Alphastrings sein sollen).

Ich bin von diesem Problem verwirrt und ich glaube, es hat etwas mit den GetData-Aufrufe zu tun, die einen Variant-Datentyp zurückgeben.

Danke, Evan

Neuer Code unten geschrieben wird. Funktioniert immer noch nicht.

In diesem neuen Code wird sowohl "srcWord" als auch "resWord" "Hallo, Welt" angezeigt.

Ich kann immer noch keinen Sinn dieses Verhaltens machen.

+0

Haben Sie versucht, diesen Code mit dem Debugger auszuführen. Der VB6 Debugger ist ziemlich anständig. Dies sollte Ihnen die Quelle des unerwarteten Verhaltens viel besser zeigen, als wenn Sie MsgBox-Aufrufe besprenkeln. – Tomalak

+0

Ich schreibe eine DLL, um eine Host-Anwendung zu erweitern. Ich sehe den VB6 Debugger ist gut, aber ich bin mir unsicher, wie zu debuggen, wenn ich die Host-Anwendung ausführen muss (sonst haben meine Aufrufe von "GetData" kein Ziel) –

+0

Was sind die sourceWS und resultWS Objekte? Excel Arbeitsblätter? –

Antwort

1

Versuchen

 

    Dim srcWord As Variant 
    Dim resWord As Variant 

Do While (BinsCol.GetData(grouprownum, 1) = binfromnum And nogroupfound = True) 


    For columnnum = 1 To FormHyst.GroupList.ListCount 

     scrWord = (sourceWS.Columns(columnnum).GetData(rownum, 1)) 
     resWord = (resultWS.Columns(columnnum + 3).GetData(grouprownum, 1)) 

     MsgBox ("srcColNum:" & columnnum & vbNewLine & "srcRowNum:" & _ 
        rownum)  MsgBox ("resColNum:" & (columnnum + 3) & vbNewLine & "resRowNum:" & _ 
        grouprownum) 


     MsgBox ("srcws:" & srcWord) 
    Next            
Loop 

 

Die folgende keinen Sinn machen

MsgBox ("resws:" & resWord & vbNewLine & "test:" & (resWord <> srcWord)) 

Sie werden mit "True" oder "False" an (resWord <> srcWord) am Ende

+0

Ich beabsichtigte, die Zeichenfolge "True" oder "False" anzuzeigen Verschieben der Dims außerhalb der While-Schleife scheint nichts zu tun –

+0

Das Entfernen der anderen Meldungsfeld hat anscheinend keine Auswirkungen. Ich werde den Text meiner Frage bearbeiten, um meinen neuen Code wiederzugeben. Es ist dramatisch vereinfacht und funktioniert immer noch nicht. resWord und scrWord verhalten sich beide wie flüchtige Strings, die durch zufällige String-Komponenten in meinem Programm geladen und entladen werden. –

2

Haben Sie Option Explicit an der Spitze Ihres Moduls ???

Sie haben einen Tippfehler: srcWord vs scrWord

+0

Notiert, das war ein Tippfehler in meinem Code.Anzeigen von ResWord verhalten sich jedoch immer noch auf die gleiche Weise und zeigen scheinbar zufällige Zeichenfolgen an (z. B. "resColNum:"). –

+0

Stellen Sie sicher, dass Sie Option Explicit verwenden, um weitere nicht deklarierte Variablen abzufangen –

3

Wie Sie sagten, Sie zu VB6 neu sind, hier einige allgemeine Gedanken und Ratschläge.

Als einen ersten Tipp: Verwenden Sie niemals Varianten, solange Sie nicht wirklich brauchen sie. Verwenden Sie den konkreten Datentyp, den Sie erwarten würden. Bei MSDN gibt es eine Erklärung, wie Varianten intern arbeiten. Es gibt implizite Conversions, die beim Vergleich von Varianten auftreten, also ist es eine Art Glücksspiel, wenn Sie Ihre Daten nicht wirklich kennen.

Auch wenn Ihre GetData-Funktion Variant zurückgibt, können Sie den Retrun-Wert auf den bestimmten Datentyp in dieser Blattspalte umwandeln. Wenn Ihre Spalte also nur Zeichenfolgen enthält, müssen Sie sie mit CStr() in eine Zeichenfolge umwandeln und in eine Zeichenfolgenvariable einfügen. Gleich mit Zahlen, in doppelte oder lange Variablen.

Sie können auch die VarType-Funktion verwenden, um den realen Typ der in Ihren Varianten gespeicherten Werte zu ermitteln.

Die folgende, von einem Debug-Workflow ist, aber vielleicht hilft es Ihnen, Ihr Problem aufzuspüren:

  1. aktiviert Option Explicit nicht angemeldete/falsch geschriebene Variable Probleme zu vermeiden. (wie bereits von DJ erwähnt)

  2. Produzieren Debugausgaben nach jeder Zeile, um sicherzustellen, dass Sie die Werte haben, die Sie erwarten, und nicht etwas anderes. Wenn dies nicht möglich ist, mit Debugging oder "Debug.Print", könnten Sie sich vielleicht in eine externe Protokolldatei einloggen oder MsgBox verwenden.

  3. Entkoppeln Sie Ihre Quelle von externen Komponentenabhängigkeiten zum Testen. Versuchen Sie in Ihrem Fall, das Problem zu reproduzieren, während Sie die Daten nicht aus dem externen Gitter lesen (setzen Sie die Variablen beispielsweise auf einige konkrete Zeichenfolgen). Dann wissen Sie, ob das Problem in Ihrer Programmierlogik oder in den Daten liegt, die Sie verarbeiten müssen.

  4. Überprüfen Sie immer, dass Ihre externe Datenquelle wirklich die ist, die Sie erwarten, und nicht eine andere. (Passiert mir oft genug ...) Also überprüfe, welche Daten dein Grid enthält (i, j) und ob es mit den Daten übereinstimmt, die du erhältst.

Ein weiterer Punkt: String-Vergleiche sind Groß- und Kleinschreibung in VB6, solange man nicht setzen „Option Text vergleichen“ an der Spitze des Moduls/Klasse/Form. Also "Hallo Welt" <> "Hallo Welt".

Verwandte Themen