Announcement

Collapse
No announcement yet.

DBLookupComboBoxChange ==> EAccessViolation

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DBLookupComboBoxChange ==> EAccessViolation

    Hallo,

    ich habe folgendes Problem in dem "OnChange"-Ereignis der TDBLookupComboBox-Komponente.

    Bei Anwendung des folgenden Codes wirft das Programm bei Beenden eine "EAccessViolation"-Exception aus:
    <PRE>
    IF DM.DataSetBuchung.DataSet.FieldByName('Name').AsSt ring <> '' THEN BEGIN
    Form1.labelName.Caption:= 'TEST';
    END;
    </PRE>

    Kann es sein, daß ich noch expliziz das Schließen der Firebird-Datenmenge vor dem Close aufrufen muß bei Beendigung des Programms ? Aber wo und wie setze ich das genau rein ?

    Grüsse,
    Carsten

  • #2
    Hi Carsten,

    in meinem BCB gibt's dafür das Ereignis OnDestroy() des Datenmoduls, sollte in Delphi eigentlich auch vorhanden sein. Dort fügst Du folgendes ein:
    <PRE>
    if (DataSetBuchung.Active == true)
    DataSetBuchung.Close();
    if (DataSetBuchung.Prepared == true)
    DataSetBuchung.Prepared = false;
    oder
    DataSetBuchung.UnPrepare();
    </PRE>
    So mach' ich das in meinem BCB. Ich denke mal, daß Du keine Probleme hast, das nach Pascal zu übersetzen.

    Und ja, man sollte immmer sicher stellen, daß geöffnete DataSets, Queries und was auch immer, beim Programmende geschlossen werden.

    Grüße Joche

    Comment


    • #3
      Hallo Jochen,

      danke für Deine Hilfe. Habe jetzt im "OnCloseQuery"-Ereignis des Formulars die Zeile
      <PRE>
      DM.DataSetBuchung.Active:= False;
      </PRE>
      dazugesetzt und der Fehler tritt nicht mehr auf.

      Im "OnDestroy"-Ereignis trat der Fehler weiterhin auf, wenn ich das Programm mit dem "X"-Button, der von Windows standardmäßig zur Verfügung gestellt wird, geschlossen habe. Mit dem "OnCloseQuery"-Ereignis funktioniert es jetzt aber.

      Warum müssen Queries und DataSets bei Programmende geschlossen noch explizit geschlossen werden. Habe damit bis jetzt noch nie Probleme gehabt. Woran liegt das ?

      Vielen Dank,
      Carsten

      P.S.: Was ist BCB

      Comment


      • #4
        Borland C++Builder.<br>Uli

        Comment


        • #5
          Hallo Carsten,

          sorry, ich dachte BCB wäre ein allgemein bekanntes Kürzel...

          In welcher OnDestroy() hast Du das eingefügt, der des DataModules, oder der eines Forms? Befindet sich das DataSet in der Unit, in der Du versuchst das zu schließen? Die Referenzierung von DM. ist überflüssig, wenn Du das in der richtigen OnDestroy() unterbringst. Je nachdem in welcher OnDetroy() Du das DM... aufrufst, gibt es dieses DM schon gar nicht mehr...

          OnCloseQuery() ist aber eigentlich der falsche Platz. Hier sollten normalerweise Überprüfungen stattfinden, ob das Form geschlossen werden kann. OnClose() wäre da schon passender. Aber es ist mir ein Rätsel warum das in OnDestroy() nicht funktioniert. Ich denke, Du solltest mal posten wie und wann Du die DataSets öffnest, respektive aktivierst. Am Besten inkl. Code.

          Nun ja, ob eine Datenmenge explizit geschlossen werden muß hängt von einer Reihe von Faktoren ab. Aber da unsere informix DB die Prozesse, die nicht geschlossen werden, nicht automatisch beendet, habe ich mir angewöhnt das in der OnDestroy() oder im Destruktor sicherzustellen.

          Grüße Joche

          Comment

          Working...
          X