unkontrolierter Programmabsturz

Ein Forum zum Erfahrungsaustausch und Hilfestellung in deutscher Sprache.

unkontrolierter Programmabsturz

Postby PMan » Fri Feb 18, 2011 3:34 pm

Hallo

ich habe unkontrollierte Programmabstürze bei nachfolgendem Formular. Der Absturz ereignet sich beim ersten, 5. oder 12. Öffnen des Fensters und an unterschiedlichen Stellen im Code - manchmal ganz am Anfang, manchmal mittendrin, manchmal aber auch erst am Ende. Die Fenster werden unterschiedlich weit aufgebaut. Es kommt die MS-Fehlermeldung

kbrun.exe hat ein Problem festgestellt und muss beendet werten. - dieses Problem auch an MS senden?

mit folgender Projektsignatur
AppName: kbrun.exe
AppVers: 0.0.0.0
ModName: kbrun.exe
ModVers: 0.0.0.0
Offset: 0034cbd8

Das Offset ist bei allen Abstürzen gleich. Der Cache wurde regelmäßig geleert.

Was kann ich tun, um den Fehler zu finden und zu beheben?

Code: Select all
Dim sRecID as String

Private Sub Form_OnOpen()

'Allgemein
Dim iDS as Integer, iSP as Short, iPrime as Short = 0

'Window-Handling
Dim iLabLen as Short = 0, iFldLen as Integer = 0, iHight as Integer
Dim iFldH as Short = 20, iFldMaxLen as Short = 120
Dim iOffsetX as Short = 10, iOffsetY as Short = 5
Dim iFormX as Integer, iFormY as Integer = iOffsetX, iPosH as Integer
Dim sFont as String = "Arial", iFontSize as Short = 11
Dim nFontFakt as Single = 0.51 * 0.353 * 4    'Schriftbreite, pt-Breite, Screen
Dim nScreenPart as Single = 0.8
Dim iScreenW as Integer = ScreenW
Dim iScreenH as Integer = ScreenH

'DB-Handling
Dim iNCols as Short, iNRows as Integer
Dim sSQL as String
Dim sFldNames as Strings = New Strings, sFK as Strings = New Strings
Dim sCmbVal as Strings = New Strings
Dim vField[1,1] as Variant

'Control-Handling
Dim lb as Label, tb as TextBox, cmb as ComboBox, cb as CommandButton
Dim iPosX as Integer, iPosY as Integer, iCtlW as Integer, iCtlH as Integer
Dim sCtlName as String, sCtlType as String, sCtlGroup as String = "MyGroup"

'Arbeitsumgebung einrichten
  Me.Caption = ho_FormCap
 
'Datenbank handeln, Feldnamen ermitteln
  If Database.SetCurrentDatabase(ho_DB) Then
    sSQL      = "SELECT * FROM " & ho_TBL & ";"
    sRecID    = Records.Open(ho_DB, sSQL)
    sFldNames = Records.FieldNames(sRecID)
    iNCols    = sFldNames.Length
    iNRows    = Records.Length(sRecID)
    Records.First(sRecID)
  EndIf

'Dimensionen der Felder ermitteln
'1: Name, 2: Länge des Namens, 3: Feldtyp, 4: Feldlänge, 5: Feldhöhe, 6:Wert
  ReDim vField[1 To iNCols, 1 To 6] 
  For iSP = 1 To iNCols
    vField[iSP, 1] = sFldNames.String(iSP)
    vField[iSP, 2] = Len(vField[iSP, 1])
    vField[iSP, 3] = FldType(ho_DB, ho_TBL, vField[iSP, 1])
    vField[iSP, 4] = FldDim(ho_DB, ho_TBL, vField[iSP, 1])
    If vField[iSP, 4] > iFldMaxLen Then
      vField[iSP, 5] = Int(vField[iSP, 4] / iFldMaxLen + 1) * iFldH
      vField[iSP, 4] = iFldMaxLen
    Else
      vField[iSP, 5] = iFldH
    EndIf
    If iNRows = 0 Then
      vField[iSP, 6] = ""
    Else
      vField[iSP, 6] = Records.Value(sRecID, vField[iSP, 1])
    EndIf
'    Print iSP, vField[iSP, 1], vField[iSP, 2], vField[iSP, 3], _
'               vField[iSP, 4], vField[iSP, 6]  ', vField[iSP, 5]
    iLabLen = Max(iLabLEn, vField[iSP, 2] * iFontSize * nFontFakt)
    iFldLen = Max(iFldLen, vField[iSP, 4] * iFontSize * nFontFakt)
    iFormY  = iFormY + vField[iSP, 5] + iOffsetY
  Next iSP

'Platzbedarf vertikal (X) und horizontal (Y) ermitteln und Fenstergröße setzen
  iFormX = iOffsetX + iLabLen + iOffsetX + iFldLen + iOffsetX
  iFormY = iFormY + iOffsetX
  If iFormX > iScreenW * nScreenPart Then iFormX = iScreenW * nScreenPart
  If iFormY > iScreenH * nScreenPart Then iFormY = iScreenH * nScreenPart
  Me.Width  = iFormX
  Me.Height = iFormY
  Me.X      = Int(iScreenW - iFormX) / 2
  Me.Y      = Int(iScreenH - iFormY) / 2
  Me.Visible = True
 
'Controlls erstellen
  iPosH = iOffsetX
'  Print
  For iSP = 1 To iNCols
'Label anlegen
    sCtlName = "lb" & iSP
    sCtlType = "Label"
    ControlAppend(sCtlName, sCtlType, sCtlGroup, _
                 iOffsetX, iPosH, iLabLen, iFldH, True)
    lb          = Control(sCtlName)
    lb.FontName = sFont
    lb.FontSize = iFontSize
    lb.Caption  = vField[iSP, 1]
'Primary und Foreign Key ermitten
    If iPrime = 0 Then
      If FldIsPrimary(ho_DB, ho_TBL, vField[iSP, 1]) Then iPrime = iSP
    EndIf
    sFK = ShowForeignKey(ho_DB, ho_TBL, vField[iSP, 1])
'    Print iSP, vField[iSP, 1], vField[iSP, 2], vField[iSP, 3], _
'               vField[iSP, 4], vField[iSP, 6]  ', vField[iSP, 5]
'Feld anlegen,
    If sFK.Length > 0 Then            'Foreign Key liegt vor
      sCmbVal = CreateCMB(ho_DB, sFK)
      sCtlName = "cmb" & iSP
      sCtlType = "ComboBox"
      ControlAppend(sCtlName, sCtlType, sCtlGroup, _
         iOffsetX + iLabLen + iOffsetX, iPosH, iFldLen, vField[iSP,5], True)
      cmb          = Control(sCtlName)
      cmb.FontName = sFont
      cmb.FontSize = iFontSize
      cmb.RemoveAll
      For iDS = 1 To sCmbVal.Length
        cmb.Append(sCmbVal.String(iDS))
      Next iDS
      cmb.Value = sCmbVal.String(vField[iSP, 6])
    Else
      If vField[iSP, 3] = "boolean" then
        sCtlName = "cmb" & iSP
        sCtlType = "ComboBox"
        ControlAppend(sCtlName, sCtlType, sCtlGroup, _
           iOffsetX + iLabLen + iOffsetX, iPosH, iFldLen, vField[iSP,5], True)
        cmb          = Control(sCtlName)
        cmb.FontName = sFont
        cmb.FontSize = iFontSize
        cmb.RemoveAll
        cmb.Append("Ja")
        cmb.Append("Nein")
        If iNRows > 0 Then
          If vField[iSP, 6] = 0 Then
            cmb.Value = "Nein"
          ElseIf vField[iSP, 6] = 1 Then
            cmb.Value = "Ja"
          EndIf
        Else
            cmb.Value = " "
        EndIf
      Else
        sCtlName = "tb" & iSP
        sCtlType = "TextBox"       
        ControlAppend(sCtlName, sCtlType, sCtlGroup, _
           iOffsetX + iLabLen + iOffsetX, iPosH, iFldLen, vField[iSP,5], True)
        tb           = Control(sCtlName)
        tb.FontName  = sFont
        tb.FontSize  = iFontSize
        tb.Alignment = "AlignLeft" + "AlignTop"
        tb.Value = vField[iSP, 6]
        If iPrime = iSP Then tb.ReadOnly = True
      EndIf
    EndIf
'Höhe für die nächste Zeile berechnen
    iPosH = iPosH + vField[iSP, 5] + iOffsetY
  Next iSP
 
End Sub    'Form_OnOpen________________________________________________________



Private Function CreateCMB(sDB as String, sFK as Strings) as Strings

Dim iDS as Integer, iNRows as Integer, iSP as Short, iNCols as Short
Dim iFldPos as Short
Dim sFKDB as String, sFKTbl as String, sFKCol as String, sFKPos as String
Dim sSQL as String, sRID as String, sLfFld as String
Dim sFldNames as Strings = New Strings, sCmbVal as Strings = New Strings

'  For iDS = 1 To sFK.Length
'    Print iDS, sFK.String(iDS)
'  Next iDS
  sFKDB  = sFK.String(1)
  sFKTbl = sFK.String(2)
  sFKCol = sFK.String(3)
  sFKPos = sFK.String(4)
  sLfFld = Right(sFKTbl, Len(sFKTbl) - 4)
 
  If Database.CurrentDatabase <> sFKDB Then Database.SetCurrentDatabase(sFKDB)
  sSQL      = "SELECT * FROM " & sFKTbl & ";"
  sRID      = Records.Open(sFKDB, sSQL)
  sFldNames = Records.FieldNames(sRID)
  iNCols    = sFldNames.Length
  iNRows    = Records.Length(sRID)
  Records.First(sRID)

  For iSP = 1 To iNCols
'    Print iSP, sFldNames.String(iSP)
    If Lower(sFldNames.String(iSP)) = Lower(sLfFld) Then
      For iDS = 1 To iNRows
        sCmbVal.Append(Records.Value(sRID, sLfFld))
      Next iDS
      Exit For
    EndIf
  Next iSP
 
  Records.Close(sRID)
 
  If Database.CurrentDatabase <> sDB Then Database.SetCurrentDatabase(sDB)

  Return sCmbVal
 
End Function    'CreateCMB_____________________________________________________
PMan
 
Posts: 145
Joined: Sat Jul 03, 2010 12:31 pm
Location: Switzerland

Re: unkontrolierter Programmabsturz

Postby berndnoetscher » Sun Feb 20, 2011 3:22 pm

Spontaner Einfall: vielleicht könnte es daran liegen, dass du das Fenster beim Öffnen veränderst. Ruf doch in onopen eine andere funktion auf mit einem timer, die alles erledigt.
berndnoetscher
Site Admin
 
Posts: 1059
Joined: Tue Sep 25, 2007 9:37 am

Re: unkontrolierter Programmabsturz

Postby PMan » Sun Feb 20, 2011 4:54 pm

Hi,

dies könnte zutreffen, da ich nach einigen Änderungen noch einen anderen Fehler hebe. Das Fenster wird vom Programm inzwischen zwar in die richtige Breite aber nicht mehr in die richtigen Höhe gebracht.

Was ich noch nicht verstanden habe, ist das mit dem Timer. Hast Du dazu ein Beispiel?

/PMan
PMan
 
Posts: 145
Joined: Sat Jul 03, 2010 12:31 pm
Location: Switzerland

Re: unkontrolierter Programmabsturz

Postby berndnoetscher » Mon Feb 21, 2011 11:28 am

PMan wrote:Hi,

dies könnte zutreffen, da ich nach einigen Änderungen noch einen anderen Fehler hebe. Das Fenster wird vom Programm inzwischen zwar in die richtige Breite aber nicht mehr in die richtigen Höhe gebracht.

Was ich noch nicht verstanden habe, ist das mit dem Timer. Hast Du dazu ein Beispiel?

/PMan


In etwa so: Timer im code oder formular. Die timer-event funktion in onopen aufrufen, indem der timer gestartet wird. Am ende der timer-event-funktion timer stoppen.
berndnoetscher
Site Admin
 
Posts: 1059
Joined: Tue Sep 25, 2007 9:37 am

Re: unkontrolierter Programmabsturz

Postby PMan » Mon Feb 21, 2011 6:13 pm

Ich bin mir nicht sicher, ob ich das schon verstanden habe und habe einmal folgenden Code in das Formular eingebaut.

Code: Select all
Private Sub Form_OnOpen()
  Timer_CreateForm.Interval = 2000
  Timer_CreateForm.Start
End Sub    'Form_OnOpen________________________________________________________


Private Sub Form_OnTimer()
   Me.Caption = ho_FormCap
  Timer_CreateForm.Stop
End Sub    'Form_OnTimer_______________________________________________________


Mit Run öffnet das Formular. Allerdings kann ich jetzt nicht mehr debuggen. Nach der Übersetzung mit Debug stürzt das Programm bereits beim Login ab.
PMan
 
Posts: 145
Joined: Sat Jul 03, 2010 12:31 pm
Location: Switzerland

Re: unkontrolierter Programmabsturz

Postby berndnoetscher » Tue Feb 22, 2011 8:43 am

PMan wrote:Ich bin mir nicht sicher, ob ich das schon verstanden habe und habe einmal folgenden Code in das Formular eingebaut.

Code: Select all
Private Sub Form_OnOpen()
  Timer_CreateForm.Interval = 2000
  Timer_CreateForm.Start
End Sub    'Form_OnOpen________________________________________________________


Private Sub Form_OnTimer()
   Me.Caption = ho_FormCap
  Timer_CreateForm.Stop
End Sub    'Form_OnTimer_______________________________________________________


Mit Run öffnet das Formular. Allerdings kann ich jetzt nicht mehr debuggen. Nach der Übersetzung mit Debug stürzt das Programm bereits beim Login ab.


Was passiert wenn Form_OnOpen() leer ist?
berndnoetscher
Site Admin
 
Posts: 1059
Joined: Tue Sep 25, 2007 9:37 am

Re: unkontrolierter Programmabsturz

Postby PMan » Tue Feb 22, 2011 12:37 pm

Auch ein leeres Form_OnOpen führt zu keiner Besserung, erst nach dem Auskommentieren bzw. Löschen der Routine Form_OnOpen startet das Programm auch wieder unter Debugger. Bei einer Übersetzung mit Run läuft das Programm, wenn Form_OnOpen leer ist.

Wenn ich den Timer aus dem Formular entferne, geht das Debugging wieder
PMan
 
Posts: 145
Joined: Sat Jul 03, 2010 12:31 pm
Location: Switzerland

Re: unkontrolierter Programmabsturz

Postby berndnoetscher » Wed Feb 23, 2011 12:48 pm

PMan wrote:Auch ein leeres Form_OnOpen führt zu keiner Besserung, erst nach dem Auskommentieren bzw. Löschen der Routine Form_OnOpen startet das Programm auch wieder unter Debugger. Bei einer Übersetzung mit Run läuft das Programm, wenn Form_OnOpen leer ist.

Wenn ich den Timer aus dem Formular entferne, geht das Debugging wieder


Wie viele Formulare hast du denn?
berndnoetscher
Site Admin
 
Posts: 1059
Joined: Tue Sep 25, 2007 9:37 am

Re: unkontrolierter Programmabsturz

Postby PMan » Wed Feb 23, 2011 2:12 pm

Wie viele Formulare hast du denn?

Insgesamt sind 8 Fenster im Projekt. Für den Timer Test habe ich ein neues leeres Formular genommen, um das bestehende nicht mehrmals umbauen zu müssen.

In etwa so: Timer im code oder formular. Die timer-event funktion in onopen aufrufen, indem der timer gestartet wird. Am ende der timer-event-funktion timer stoppen.

Ich wollte zuerst verstehen, was Du damit meinst und das ist bis jetzt schief gegangen.
PMan
 
Posts: 145
Joined: Sat Jul 03, 2010 12:31 pm
Location: Switzerland

Re: unkontrolierter Programmabsturz

Postby berndnoetscher » Fri Feb 25, 2011 12:59 pm

PMan wrote:
Wie viele Formulare hast du denn?

Insgesamt sind 8 Fenster im Projekt. Für den Timer Test habe ich ein neues leeres Formular genommen, um das bestehende nicht mehrmals umbauen zu müssen.

In etwa so: Timer im code oder formular. Die timer-event funktion in onopen aufrufen, indem der timer gestartet wird. Am ende der timer-event-funktion timer stoppen.

Ich wollte zuerst verstehen, was Du damit meinst und das ist bis jetzt schief gegangen.


Liegt vielleicht an einer einstellung des formulars? Hast du irgendwas besonderers geändert?
berndnoetscher
Site Admin
 
Posts: 1059
Joined: Tue Sep 25, 2007 9:37 am

Next

Return to Deutsches Forum (in German only)

cron