Was übergeben bei Aufruf von OnChange-Ereignis?



  • Ja ich hatte es probiert, mit "this" zu übergeben, aber dann kam der Fehler:

    Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000."

    Wenn ich nun "0" bzw. das Control selber übergebe, passiert das Gleiche!



  • Hallo

    Dann verlang deine Eventmethode wirklich einen gültigen passenden Sender. Sowohl 0 als auch this sind da falsch. Du must die Variante mit OnChange(DBEdit55) verwenden. Warum das aber einen Fehler liefert, kann ich nicht nachvollziehen.

    bis bald
    akari



  • war ja ein kurzes bis bald (als wenn du es geahnt hättest) ^^

    ja also die funktion, in der der Aufruf steht, sieht so aus:

    void __fastcall TReguliererStammForm::MonthCalendar1Click(TObject *Sender)
    {
    	DBEdit55->OnChange(DBEdit55);
    	DBEdit55->Text = MonthCalendar1->Date.DateString();
    }
    

    ich habe das auch ausprobiert, abre ich bekomme den gleichen Fehler! 😕



  • schau mal was bei

    void __fastcall TReguliererStammForm::MonthCalendar1Click(TObject *Sender)
    {
        DBEdit55->OnChange(Sender);
        DBEdit55->Text = MonthCalendar1->Date.DateString();
    }
    

    passiert

    greetz KN4CK3R



  • Normalerweise muß das funktionieren. Kannst auch dieses mal versuchen.

    DBEdit55Change(DBEdit55);
    

    aber da wird wohl wo anders etwas nicht in Ordnung sein.



  • Wahrscheinlich ist gar kein Ereignis bei OnChange registriert und daher die Nullpointer-Exception!!!

    Üblicherweise werden Ereignis daher so aufgerufen:

    if(DBEdit55->OnChange != 0) // apropos: toller Name !????
      DBEdit55->OnChange(DBEdit55);
    

    Ich denke aber, der OT will etwas anderes erreichen, denn OnChange würde ja explizit bei Änderung von DBEdit55->Text automatisch aufgerufen (sofern zugewiesen).

    Daher kann die Zeile m.E. völlig entfallen!!!



  • So gut, damit bekomme ich keinen Fehler mehr, was aber daran liegt, dass die if-Bedingung falsch ist ^^

    Ich werde jetzt mal meinen Grund für die Zeile erklären:

    Ich habe so einige DBEdits, welche mit meiner Datenbank über ADOQuery und DataSource verbunden sind. Immer, wenn ich eines von ihnen verändere, also per Hand anklicke und darin schreibe, dann wird das OnStateChange-Ereignis ausgelöst.

    Die Kalendar-Komponenten können nicht einfach so mit der Datenbank verbunden werden, so dacht ich mir, packe ich unsichtbare DBEdits unter die Kalendar und wenn man ein Datum auswählt, schreibe ich dieses Datum in das DBEdit. Leicht gesagt, leicht getan: Aber dies löst leider nicht das OnChange-Ereignis des DBEdits aus, nur wenn ich selber nochmal drin rumschreibe.

    Klicke und schreibe ich nun in einem anderen DBEdit rum, so werden die KalendarEdits wieder auf den alten Stand zurückgesetzt, wie sie vor in der Datenbank vorm Ändern waren ...



  • So ich hatte noch ein wenig rumgegrübelt und mir gedacht, ich rufe einfach das OnClick-Ereignis einer DBCheckBox auf, welche auch mit derselben Datenbank verbunden ist. Aber wieder der Fehler beim Auslesen der Adresse 00000000!

    Der Code sah nun so aus:

    void __fastcall TReguliererStammForm::MonthCalendar1Click(TObject *Sender)
    {
    	DBCheckBox12->OnClick(DBCheckBox12);
    	DBEdit55->Text = MonthCalendar1->Date.DateString();
    }
    

    Ich denke mal, dass das irgendwie mit der Datenbank zusammenhängen könnte?



  • hast du denn der DBCheckBox überhaupt ein OnClick Ereignis zugewiesen?!

    greetz KN4CK3R



  • Hallo MichelM,

    du hast das Prinzip der Ereignisbehandlungsfunktionen nicht (richtig) verstanden. Egal, ob du OnChange, OnClick oder sonst eine Ereignisfunktion aufrufst, damit rufst du nur die eigene Behandlungsmethode auf (sofern, du sie überhaupt zugewiesen hast - aber das hatte ich ja schon geschrieben -)

    So wirst du dein Problem nicht lösen können.

    Für den MonthCalendar kenne ich zwar jetzt keine datensensitive Komponente, aber für den DateTimePicker habe ich selber eine entwickelt, die ich dir zur Verfügung stellen könnte.
    Ansonsten kannst du ja auch mal bei "Delphi Super Pages" (http://delphi.icm.edu.pl/) nach einer entspechenden Komponente schauen.


Anmelden zum Antworten