TTimerereignis steuern
-
ich hab einen Timer der nach einer vorgegebenen Anzahl von Ereignisauslösungen disabled werden soll. Ich habe das so gelöst:
Ich habe eine Variable int anzahlMessungen in private der Form deklariert, habe diese im Formkonstruktor mit 0 initialisiert und zähle im Timerereignis die Variable immer um 1 hoch. Dann prüfe ich mit if ob die vorgegebene Anzahl an Messungen schon erreicht wurde. Wenn ja wird der Timer disabled.void __fastcall TfrmHO::timMessreihenTimer(TObject *Sender) { anzahlMessungen++; if (counterMessreihen == StrToInt(txtAnzahlMessreihen->Text)) timMessreihen->Enabled = false; ErfasseMesswerte(StrToInt(txtAnzahlMessreihen->Text)); }
Kann man das so machen oder gibts eine elegantere Möglichkeit dafür?
-
Hallo
Das ist schon in Ordnung so, einen Zähler brauchst du. Alternativ zu der Membervariable geht noch eine lokale statische.
void __fastcall TfrmHO::timMessreihenTimer(TObject *Sender) { static int anzahlMessungen = 0; // Hier Deklaration statt im Form-Header anzahlMessungen++; if (counterMessreihen == StrToInt(txtAnzahlMessreihen->Text)) timMessreihen->Enabled = false; ErfasseMesswerte(StrToInt(txtAnzahlMessreihen->Text)); }
bis bald
akari
-
Hallo
andere Moeglichkeit waere es
"Tag" des Timers zu verwenden
Dann braucht man keine eigene Variable dafuer
Denn der ist schon vorhandenMfg
Klaus
-
mit Tag hab ich noch gar nicht gearbeitet.
Bei dem static gibts ein Problem. Den Timer starte ich über einen StartButton in dem ich ihn enabled setze. Ist der Timer durchgelaufen und ich starte den Timer nochmals funktioniert das nicht, da ja die Variable anzahlMessungen noch auf den alten Wert steht. Also müsste man diese wieder auf 0 setzen. Geht das bei static?
-
Nicht von außen und innerhalb der Routine weißt Du nicht, wann Du die zurücksetzen musst. Erstell die Zählvariable als Member des Forms, dann kanst Du die im Button-Ereignis zurücksetzen. Oder nimm tatsächlich die Tag-Eigenschaft. Die kannst Du frei verwenden. Schau mal in die Hilfe.
-
hab einfach die Tageigenschaft genutzt. Die kannt ich noch gar nicht, ist aber echt gut da ich ja keine Variable erstellen muss. Hier mal mein Code. Hab auch mal die if-Abfrage geändert:
void __fastcall TfrmHO::btnStartClick(TObject *Sender) //StartButton, startet den Timer { timDatenerfassung->Tag = 0; timDatenerfassung->Enabled = true; }
void __fastcall TfrmHO::timDatenerfassung(TObject *Sender)//Timer{ timMessreihen->Tag++; if (timDatenerfassung->Tag <= StrToInt(txtAnzahlMessungen->Text)) ErfasseMesswerte(); //eigene Funktion die Daten in Vektor schreibt else timDatenerfassung->Enabled = false; }
Was haltet ihr davon?