OnClick Ereignis um Parameter erweitern



  • void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    StartMessung(15,10,this);
    }
    

    geht doch einwandfrei, was willst Du genau machen?



  • Schade, das wäre eine einfache Lösung gewesen um meine Parameter gleich in die Funktion zu übergeben.

    Werde die Werte in einem Übergeordnetem Datencontainer zwischenspeichern.

    Danke für die schnelle Antwort.

    Grüße
    egcactus



  • Ich wollte die Werte zweier Edit Felder aus einem Frame in die Routine übergeben.

    Zum einem den Messschritt und die Anzahl der Messungen. Die Werte sind nicht immer gleich, deshalb sollten sie übergeben werden.



  • void __fastcall TForm1::StartMessung(int Anzahl, int Messschritt, TObject *tmpSender)
    {
    Edit1->Text=Anzahl;
    Edit2->Text=Messschritt;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    StartMessung(15,10,this);
    }
    

    meinst Du das so?



  • Mein Problem, ist genau umgekehrt als du es beschrieben hast.

    Ich habe ein Frame mit einer Startfrequenz (Edit1), einer Anzahl an Messungen(Edit2), einem Messschritt(Edit3). In diesem Frame habe ich einen Start Button.

    Wenn dieser StartButton betätigt wird (onclick ereignis), rufe ich StartMessung auf.

    Ich kann aber in der Funktion StartMessung nicht einfach folgendes ausführen.

    int Anz = StrToInt(Frame1->EditAnzahl->Text);
    

    Da er mir eine Fehlermeldung bringt. Zugriffsverletzung bei Adresse ...

    Werde mal versuchen die Werte in einem externem Container zwischenzuspeichern und sie dann bei Bedarf abrufen.



  • dann mach es doch so:

    void __fastcall TForm1::StartMessung(int Anzahl, int Messschritt, TObject *tmpSender)
    {
    //Tu was
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    StartMessung(StrToInt(Edit1->Text),StrToInt(Edit2->Text),this);
    }
    


  • Also die Zugriffsverletzung bleibt gleich.

    Ich poste mal den Code:
    Grundbild.cpp

    void __fastcall TFormGrundbild::FZweiUOFreqDAB(TObject *Sender)
    {
     // Frame FDAB erstellen
     TFZweiUOFreq* FDAB = new TFZweiUOFreq(new TGroupBox(FormGrundbild));
    
     // Überschrift einblenden
     FDAB->LZweiUOFreqEinstellung->Caption = "DAB";
    
     // Masseinheit festlegen
     FDAB->LMasseinheitStartfreq1->Caption = "MHz";
     FDAB->LMasseinheitEndfreq1->Caption = "MHz";
     FDAB->LMasseinheitStartfreq2->Caption = "MHz";
     FDAB->LMasseinheitEndfreq1->Caption = "MHz";
     FDAB->LMasseinheitMessschritt1->Caption = "MHz";
     FDAB->LMasseinheitMessschritt2->Caption = "MHz";
    
     // Frequenzen und Messschritte holen
     FDAB->EStartfreq1->Text = FloatToStrF(
                    Frequenzeinstellung.DAB.Freq[0].getMinimum(),ffGeneral,6,2);
     FDAB->EEndfreq1->Text = FloatToStrF(
                    Frequenzeinstellung.DAB.Freq[0].getMaximum(),ffGeneral,6,2);
     FDAB->EMessschritt1->Text = FloatToStrF(
                    Frequenzeinstellung.DAB.Freq[0].getMessschritt(),ffGeneral,6,2);
     FDAB->EStartfreq2->Text = FloatToStrF(
                    Frequenzeinstellung.DAB.Freq[1].getMinimum(),ffGeneral,6,2);
     FDAB->EEndfreq2->Text = FloatToStrF(
                    Frequenzeinstellung.DAB.Freq[1].getMaximum(),ffGeneral,6,2);
     FDAB->EMessschritt2->Text = FloatToStrF(
                    Frequenzeinstellung.DAB.Freq[1].getMessschritt(),ffGeneral,6,2);
    
     // Anzahl Messungen holen
     FDAB->EAnzahl1->Text = IntToStr(Frequenzeinstellung.DAB.Freq[0].getAnzahl());
     FDAB->EAnzahl2->Text = IntToStr(Frequenzeinstellung.DAB.Freq[1].getAnzahl());
    
     // Position bestimmen
     FDAB->SetBounds(0,ControlBar1->Height,FormGrundbild->ClientWidth,220);
    
     // Rahmen im Frame anpassen
     FDAB->Bevel1->Width = ClientWidth -16;
    
     // Rahmen positionieren
     FDAB->Bevel1->Left = 8;
    
     // Frame anzeigen
     FDAB->Show();
    
     // Zugehörigkeit zum Grundbild festlegen
     FDAB->Parent = FormGrundbild;
    
     // Messung Starten
     FDAB->BStart->OnClick = StartMessungDAB1;
    
     // Frames ausblenden
     FDAB->BAbbrechen->OnClick = FInVisible;
    }
    

    In diesem Abschnitt tritt schon die Zugriffsverletzung auf

    void __fastcall TFormGrundbild::StartMessungDAB1(TObject *Sender)
    {
    StartMessungDAB(StrToInt(FDAB->EAnzahl1->Text),StrToFloat(FDAB->EMessschritt1->Text),this);
    }
    

    Hier werden Standardabweichung, Mittelwert ... berechnet. Formeln stimmen, aber da ich noch die Anzahl der Messungen und die Messschritte berücksichtigen muß, passt das noch nicht mit den Messungen überein. mache das gerade nur mit ein paar Beispielwerten.

    void __fastcall TFormGrundbild::StartMessungDAB(int Anzahl, float Messchritt, TObject *Sender)
    {
     // Überschrift einfügen
     RichEdit1->Lines->Add("Messung DAB");
    
     // Messwerte löschen
     Messung->DAB[0].Wert.clear();
     Messung->DAB[1].Wert.clear();
    
     // Beispiel zum Füllen mit Messwerten------------------------
     for(int i=1; i<4; i++)
            {
             Messung->DAB[0].Wert.push_back((i));
             Messung->DAB[1].Wert.push_back((i));
            }
      //----------------------------------------------------------
    
     Messung->DAB[0].berechneWerte();       // Aufruf Berechnungsfunktion
     Messung->DAB[1].berechneWerte();       // Aufruf Berechnungsfunktion
    
     // Ausgabe in RichEdit Feld
     RichEdit1->Lines->Add("Anzahl Messungen: " + FloatToStr(Messung->DAB[0].getAnzahl()));
     RichEdit1->Lines->Add("Summe Messwerte: " + FloatToStr(Messung->DAB[0].getSumme()));
     RichEdit1->Lines->Add("Quadratsumme: " + FloatToStr(Messung->DAB[0].getQuadratsumme()));
     RichEdit1->Lines->Add("Mittelwert: " + FloatToStr(Messung->DAB[0].getMittelwert()));
     RichEdit1->Lines->Add("Quadratmittelwert: " + FloatToStr(Messung->DAB[0].getQuadratmittelwert()));
     RichEdit1->Lines->Add("Standardabweichung: " + FloatToStr(Messung->DAB[0].getStandardabweichung()));
     RichEdit1->Lines->Add("Standardabweichung(n-1): " + FloatToStr(Messung->DAB[0].getStandardabweichung1()));
     RichEdit1->Lines->Add("Varianz: " + FloatToStr(Messung->DAB[0].getVarianz()));
     RichEdit1->Lines->Add("1Sigma: " + FloatToStr(Messung->DAB[0].get_1sig()));
     RichEdit1->Lines->Add("2Sigma: " + FloatToStr(Messung->DAB[0].get_2sig()));
     RichEdit1->Lines->Add("3Sigma: " + FloatToStr(Messung->DAB[0].get_3sig()));
     RichEdit1->Lines->Add("RMS: " + FloatToStr(Messung->DAB[0].getRMS()));
     RichEdit1->Lines->Add("Minimalwert: " + FloatToStr(Messung->DAB[0].getMIN()));
     RichEdit1->Lines->Add("Maximalwert: " + FloatToStr(Messung->DAB[0].getMAX()));
     RichEdit1->Lines->Add("Maximaler Betrag: " + FloatToStr(Messung->DAB[0].getAMAX()));
    
     RichEdit1->Lines->Add("Anzahl Messungen: " + FloatToStr(Messung->DAB[1].getAnzahl()));
     RichEdit1->Lines->Add("Summe Messwerte: " + FloatToStr(Messung->DAB[1].getSumme()));
     RichEdit1->Lines->Add("Quadratsumme: " + FloatToStr(Messung->DAB[1].getQuadratsumme()));
     RichEdit1->Lines->Add("Mittelwert: " + FloatToStr(Messung->DAB[1].getMittelwert()));
     RichEdit1->Lines->Add("Quadratmittelwert: " + FloatToStr(Messung->DAB[1].getQuadratmittelwert()));
     RichEdit1->Lines->Add("Standardabweichung: " + FloatToStr(Messung->DAB[1].getStandardabweichung()));
     RichEdit1->Lines->Add("Standardabweichung(n-1): " + FloatToStr(Messung->DAB[1].getStandardabweichung1()));
     RichEdit1->Lines->Add("Varianz: " + FloatToStr(Messung->DAB[1].getVarianz()));
     RichEdit1->Lines->Add("1Sigma: " + FloatToStr(Messung->DAB[1].get_1sig()));
     RichEdit1->Lines->Add("2Sigma: " + FloatToStr(Messung->DAB[1].get_2sig()));
     RichEdit1->Lines->Add("3Sigma: " + FloatToStr(Messung->DAB[1].get_3sig()));
     RichEdit1->Lines->Add("RMS: " + FloatToStr(Messung->DAB[1].getRMS()));
     RichEdit1->Lines->Add("Minimalwert: " + FloatToStr(Messung->DAB[1].getMIN()));
     RichEdit1->Lines->Add("Maximalwert: " + FloatToStr(Messung->DAB[1].getMAX()));
     RichEdit1->Lines->Add("Maximaler Betrag: " + FloatToStr(Messung->DAB[1].getAMAX()));
    
    }
    //---------------------------------------------------------------------------
    

    Grundbild.h
    Diese Zwei zeilen Stehen in der Headerdatei

    void __fastcall StartMessungDAB1(TObject *tmpSender);
            void __fastcall StartMessungDAB(int Anzahl, float Messchritt, TObject *tmpSender);
    


  • warum hast du im header *tmpSender und in der Methode *Sender?



  • Das war nur ausversehen. Hatte das zuerst so gemacht, um mir eine Denkhilfe zu setzen, das das ein temporärer Aufruf ist.

    Hat aber keinen Einfluss auf die Zugriffsverletzung. Habe ich abgeändert. Fehler bleibt gleich.



  • Hallo,

    Geh erstmal mit dem Debugger durch und versuche herauszubekommen wo die Zugriffsverletzung auftritt. Weiterhin würde ich Show erst nach dem Setzen des Parents aufrufen. Woher soll dein Frame denn da schon wissen wo es gezeichnet werden soll.


Anmelden zum Antworten