VisualBasic Programm trotz zu wenig Speicher fortsetzen

Krik

Fleet Admiral Pro
Registriert
Juni 2005
Beiträge
17.978
Moin


Ich verwende VB 6.

Ich habe ein ADODB Recordset, dass von einer SQL-DB gefüttert wird. Was in dem Recordset steht soll in einer Tabelle (MSFlexGrid) dargstellt werden.
Das Problem ist allerdings, dass in der Tabelle auch Grafiken dargestellt werden, weswegen nach ca. 9500 eingelesenen Zeilen VB was von "zu wenig Speicher" meckert. Das Programm nimmt sich zu dem Zeitpunkt laut Taskmanager etwa 60 MB RAM.

Ich möchte, dass die Ausführung trotz des Fehler fortgesetzt wird. Aber mir ist nicht klar, wie das hier funktioniert. Mit ON ERROR habe ich nie gearbeitet. Mir ist daher unklar, wie ich das Programm ändern muss, dass er mit dem weiteren Füttern der Tabelle aufhört und die Sub, in der das steht normal beenden kann.

gekürzter Code:
Code:
Dim fehlerAufgetreten As Boolean

Cn.Open strcnn ' Verbindung zum SQL-Server öffnen
Set rs.ActiveConnection = Cn

 ' SQL-Abfrage definieren
rs.Source = "SELECT ..."
rs.Open ' SQL-Statement senden

On Error GoTo Fehler

While Not rs.EOF()
[INDENT]Filtertabelle.AddItem(...)
'...
Set Filtertabelle.CellPicture = LoadPicture("Datei") ' <-- Hier kommt die Fehlermeldung nach etwa 9500 Schleifendurchläufen.
'...
rs.MoveNext[/INDENT]
Wend

If fehlerAufgetreten = True Then MsgBox "Es wurden " & Str(rs.Fields) & " Ergebnisse gefunden. \n" & _
                                         "Leider können nur " & Str(Filtertabelle.Rows) & " angezeigt werden. \n" & _
                                         "Die Programmausführung wird fortgesetzt."

Exit Sub

Fehler:
If Err.Number = 7 Then fehlerAufgetreten = True ' "Zu wenig Speicher!"
Err.Clear
Resume
Ich bedanke mich im Voraus.
Gruß, Laurin
 
Wenn ich mich nicht irre, sollte es auch in VB 6.0 möglich sein, dass du dir die Fehlermeldung ausgeben lässt anstatt sone Hard-codierte Nachricht.

Einfach unter "Fehler:"

"MsgBox err.Message" setzen und schauen, was dir geschmissen wird.

Funktioniert bei VB 6.0 eigentlich schon Try/Catch ?
Würde ich als Methode dem Label-jumpen bevorzugen, zumal du dir im klaren sein musst, dass er auch ohne Fehler über das Label geht, auch wenn da momentan nicht viel passiert, wegen des Exits.
 
Zuletzt bearbeitet:
Ok, dank eurer Hilfe habe ich es hinbekommen.

@Krafty
Try/Catch kennt VB6 leider nicht.


Edit:
Ich habe diesen Code direkt nach dem Wend eingefügt:
Code:
Fehler:     ' Falls ein Speicherüberlauf auftrat
            If Err.Number = 7 Then
                MsgBox "Es wurden mehr Ergebnisse gefunden, als dargestellt werden können. \n" & _
                       "Es werden nur die ersten " & Filtertabelle.Rows & " Ergebnisse dargestellt."
                
                Err.Clear
            End If
Das Programm hängt sich leider auf und muss mit dem Taskmanager abgeschoßen werden. Er scheint sich an der MsgBox zu stören, warum auch immer. Ohne sie geht es.

Mist, wie mache ich das jetzt bloß?
 
Zuletzt bearbeitet:
Ich vermute, dass es weniger an der MessageBox als an dem Zugriff auf dsa Filtertabelle Objekt liegt.

Und nach einem Fehler weiterzuarbeiten ist nicht immer sinnvoll, noch einmal meinen Tipp von oben aufgreifen und die Fehlermeldung anzeigen lassen, damit du dann entscheiden kannst, ob ein weiterführen überhaupt sinnvoll ist oder ob man doch eher den Fehler beseitigen sollte.
 
Die Messagebox wird modal aufgerufen, deswegen kann das Programm so lange nicht weiterlaufen bis du sie schliesst.
Mach dir ne neue Form und nenn sie frmError und mach da ein Label mit der Fehlernachricht drauf.Die Form kannst du mit Load frmError laden und frmError.Show sichtbar machen!
Ich hoffe das hilft dir weiter.
 
@Krafty
Es kommt immer der Fehler 7 - Zu wenig Speicher.

Das einzige, was ich mir im Moment vorstellen kann, ist, die letzten 100 Elemente der Liste kurzerhand zu löschen, damit speichermäßig wieder etwas Puffer nach oben ist.

Die Fehlermeldung nach deiner Idee ausgeben zu lassen, scheitert leider genau an demselben Problem wie meine Fehlermeldung. Das Programm hängt sich schlicht auf.


Ach Mann, VB 6 ist Mist. Völlig veraltet. Ich hätte das lieber in Java programmiert, aber die Firma ist dagegen. :(


@Julexander
Ich werde das probieren, danke für den Tipp.


Edit:
Das extra Fehlerfenster hat leider keinen Ausweg gebracht. Das Programm hängt sich wieder auf, bevor es erscheinen kann. *nerv*

Ok, ich gehe mal logisch ran. ON ERROR sollte bei einem Fehler auf alle Fälle zu der Sprungmarke springen. Müsste ich nicht jetzt zumindest eine Zeile aus der Tabelle löschen, damit er nicht weiter an der Speichergrenze klebt?


Edit 2:
Auf diese Art gehts:
Code:
Fehler:     ' Falls ein Speicherüberlauf auftrat
If Err.Number = 7 Then
Filtertabelle.RemoveItem (Filtertabelle.Cols - 1)
Err.Clear
MsgBox "Es wurden mehr Ergebnisse gefunden, als dargestellt werden können. " & vbNewLine & _
"Es werden nur die ersten " & Filtertabelle.Rows & " Ergebnisse dargestellt."
End If

Ich bedanke mich bei allen. :)
 
Zuletzt bearbeitet:
Zurück
Oben