Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

VB6: Programm stürzt ständig ab!

Engfer / 1 Antworten / Baumansicht Nickles

Hallo,
ich bin nicht der VB-Freak, nutze eigentlich VB6 nur für Sachen, die ich nicht mit Clickexe3 hinbekomme.


Zu meinem Problem:
Ich habe ein Programm geschrieben, mit welchem ich eine Textdatei (Dat_Sender.txt) auslese.


Inhalt:
----------------------------------------------------------


4


2400
ATZXL3
26
1/1:Kommunikationsausfall
----------------------------------------------------------


Aufgrund dieser Daten wird die Rufnummer angerufen.


Danach soll sich das Programm beenden.


Das VB-Script sieht folgendermaßen aus:
----------------------------------------------------------
Dim schnittstelle As Integer
Dim amt As String
Dim baudrate As String
Dim inizialisierung As String
Dim rufnummer As String
Dim empfaengerrufnummer As String
Dim meldung As String
Dim setting As String
Dim modemantwort As String
Dim t As Integer
Dim stufe As Integer



Private Sub abbrechen_Click()
abbrechen.Enabled = False
abbrechen.Visible = False
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
Print #1, "Abbruch" + Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Close #1
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'MSComm1.PortOpen = False
End Sub



Private Sub Form_Load()
Let stufe = 0
'Daten von FRM übernehmen
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Input As #1
Input #1, schnittstelle
Input #1, amt
Input #1, baudrate
Input #1, inizialisierung
Input #1, empfaengerrufnummer
Input #1, meldung
Close #1
'Textfelder füllen
'Let meldetext.Text = meldung
Let empfaenger.Text = empfaengerrufnummer
'Setting String (Schnittstelleneinstellung) zusammenstellen
Let setting = baudrate + ",N,8,1"
'Schnittstelle vorbereiten
MSComm1.CommPort = schnittstelle
'MsgBox schnittstelle
MSComm1.Settings = setting
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InputLen = 0
'Initialisierungsstring senden
ini(0).Visible = True
MSComm1.Output = inizialisierung + Chr(13)
For t = 0 To 10000: Next
melde1(0).Visible = True
waehle(1).Visible = True
MSComm1.Output = "ATX3DT" + amt + empfaengerrufnummer + Chr(13)
stufe = 3
melde2(1).Visible = True
'verbindung(0).Visible = True
MSComm1.Handshaking = comRTS


End Sub


Private Sub Form_Unload(Cancel As Integer)
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'MSComm1.PortOpen = False
End Sub


Private Sub MSComm1_OnComm()
modemantwort = MSComm1.Input
'modemantwort = Replace$(modemantwort, Chr(13), "")
'modemantwort = Replace$(modemantwort, Chr(10), "")
Text1.Text = Text1.Text + modemantwort ' + Chr(13)
If stufe = 3 Then
If InStr(1, modemantwort, "NO CARRIER") <> 0 Then
    'MsgBox "NO CARRIER!"
    'melde2(1).Caption = "ERROR!"
    'melde2(1).ForeColor = &HFF&
    'melde2(1).Visible = True
    Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
    Print #1, "Ruf_ok" + Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Close #1
    Unload Telefon_Fenster
    Set Telefon_Fenster = Nothing
    'End
    'Unload Me
 End If
 If InStr(1, modemantwort, "BUSY") <> 0 Then
    'MsgBox "NO CARRIER!"
    'melde2(1).Caption = "ERROR!"
    'melde2(1).ForeColor = &HFF&
    'melde2(1).Visible = True
    Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
    Print #1, "Ruf_ok" + Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Close #1
    Unload Telefon_Fenster
    Set Telefon_Fenster = Nothing
    'End
    'Unload Me
 End If
End If
If stufe < 3 Then
 If InStr(1, modemantwort, "NO CARRIER") <> 0 Then
    'MsgBox "NO CARRIER!"
    melde2(1).Caption = "ERROR!"
    melde2(1).ForeColor = &HFF&
    melde2(1).Visible = True
    Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
    Print #1, "Fehler" + Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Close #1
    Unload Telefon_Fenster
    Set Telefon_Fenster = Nothing
    'End
    'Unload Me
 End If
 If InStr(1, modemantwort, "ERROR") <> 0 Then
    'MsgBox "ERROR!"
    Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
    Print #1, "Fehler" + Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Close #1
    Unload Telefon_Fenster
    Set Telefon_Fenster = Nothing
    'End
    'Unload Me
 End If
 If InStr(1, modemantwort, "NO DIALTONE") <> 0 Then
    'MsgBox "NO DIALTONE!"
    Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
    Print #1, "Fehler" + Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Close #1
    Unload Telefon_Fenster
    Set Telefon_Fenster = Nothing
    'End
    'Unload Me
 End If
 If InStr(1, modemantwort, "BUSY") <> 0 Then
    MsgBox "BUSY!"
    Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
    Print #1, "Fehler" + Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Close #1
    Unload Telefon_Fenster
    Set Telefon_Fenster = Nothing
    'End
    'Unload Me
 End If
 If InStr(1, modemantwort, "NO ANSWER") <> 0 Then
    'MsgBox "NO ANSWER!"
    Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
    Print #1, "Fehler" + Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Print #1, Chr(13)
    Close #1
    Unload Telefon_Fenster
    Set Telefon_Fenster = Nothing
    'End
    'Unload Me
 End If
End If
If InStr(1, modemantwort, "OK") <> 0 Then
 'MsgBox "Test bestanden - OK"
    If melde1(0).Visible = True Then
        melde2(1).Visible = True
        'verbindung(0).Visible = True
    End If
    melde1(0).Visible = True
End If


End Sub
---------------------------------------------------------


Leider ist es so, dass das Programm beim 1. Mal super funktioniert, allerdings ab dem 2. oder 3. Programmstart wird das Fenster nicht mehr geöffnet und das Programm steht im Task-Manager, kann aber nicht geschlossen werden, in den meisten Fällen wird kann man den PC sogar nicht mehr herunterfahren!


Ich habe die Befürchtung, dass das Programm nicht richtig beendet wird.


Wer kann helfen?


Andreas

bei Antwort benachrichtigen
Sovereign Sylvia Engfer „VB6: Programm stürzt ständig ab!“
Optionen

Hi Engfer,
in deinem Code kommen häufig diese 2 Zeilen vor:
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing

Sofern "Telefon_Fenster" dein Formular ist (als deklarierte Variable taucht es nämlich nirgendwo auf), so ist es erstens überflüssig, Telefon_Fenster Nothing zu setzen, denn das ist es nach dem Unload sowieso, und zweitens musst du den Form_Unload event entfernen, weil es unsinnig und problematisch ist, das Formular während des Unloads nochmal zum Unload aufzurufen. Deshalb kann es sein, dass nach dem ersten Beenden Reste des Programms im Speicher verbleiben, der sich dann mit weiteren Resten nach jedem neuen Programmende auffüllt.
Im übrigen, wenn du das Programm mit VB6 startest und es beendest, müsste man sehen können, ob das Programm richtig beendet wird oder ob lediglich Telefon_Fenster unsichtbar wird, der Programm-Start Button von VB6 aber immer noch deaktiviert ist; dann wird es nämlich nicht richtig entladen.

Ich sehe auch in deinem Code, dass du die beiden erwähnten Zeilen manchmal mittendrin in einer Prozedur hast. Dann läuft folgendes ab: Wenn die erste Zeile den Unload-Process anfängt und dieser dann zu Ende ist, wird der Rest des Codes in der Prozedur ausgeführt. Wird auch nur ein Control (Button, TextBox oder Label oder so) angesprochen, dann lädt das Programm wieder durch. Ich empfehle dir folgendes: Setze vor der letzten Zeile einer Prozedur folgende zwei Zeilen:
Lastline:
Unload me

Ersetze die von mir eingangs erwähnten 2 Zeilen durch "Goto Lastline". Dann bist auf der sichereren Seite.

Good Luck !

Gruss Sovereign Sylvia

Mein sz streikt heute wieder ------ Nobody is perfect, and we prove it every day.
bei Antwort benachrichtigen