OnClick Ereignis um Parameter erweitern
-
Hallo Community,
Ich möchte einem OnClick Ereignis noch ein paar Parameter mitgeben.
Form1->Button1->OnClick = StarteMessung(15,10)Habe nun meinen Code in der Headerdatei folgendermaßen erweitert:
void __fastcall StartMessung(int Anzahl, int Messschritt, TObject *tmpSender);Bekomme nun natürlich die Fehlermeldung, daß ich zu wenige Parameter Aufrufe:
[C++ Fehler] Grundbild.cpp(643): E2193 Zu wenige Parameter im Aufruf von '_fastcall TForm1::StartMessung(int,int,TObject *)'
Aber was muß ich für TObject eintragen?
Habe es mit this probiert oder mit tmpSender, aber beides ging nicht. Hat mir jemand einen Tip, was ich eintragen muß, oder wo ich das nachlesen kann.
-
Hallo
Das geht nicht, OnClick erwartet immer genau die selber Methode. Du kannst da nicht einfach ein paar zusützliche Parameter eintragen. Du must die zusätzlichen Werte anders übertragen, zum Beispiel mit Membervariablen des Forms.
bis bald
akari
-
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.cppvoid __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 Headerdateivoid __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.