Timer Komponente



  • Hallo,
    ich verwende die Timer Komponente wie in der Hilfe angegeben(hoffe ich).
    Sie funktioniert aber nicht wie ich das gern hätte.
    Eigentlich sollte in einer for-Schleife immer wieder das Ereignis OnTimer ausgelöst werden und der entsprechende Quelltext jeweils zeitverzögert ablaufen(man soll einer Bewegung zusehn können).
    Die Zeitverzögerung tritt aber nur beim ersten mal auf wenn der Timer aktiviert wird.
    Könnt ihr mir da helfen????

    Bitte auf Anfänger Level antworten!

    Danke



  • Poste bitte mal den Schleifencode und die Timerfunktion...



  • Danke für Dein Hilfs-Angebot
    Ich hab das Problem jetzt anders gelöst, mit Sleep();
    und Application->ProcessMessages();
    Das bringt mir denselben Effekt.....

    Danke nochmals!



  • Hallo!

    Ich möchte diesen sehr alten Beitrag wieder öffnen weil ich genau das gleiche Problem habe. Die Schleife funktioniert nicht wie sie sollte und ich seh wahrscheinlich vor lauter Bäumen mal wieder keinen Wald.

    Hier mein Code vor und während der FOR-Schleife:

    // Intervall fuer TimerPrint setzen
    			TimerPrint->Interval = (iIntervall * 1000);
    
    			// Flag fuer Timerintervall zum Druck setzen
    			iTimerPrint = 1;
    
    			for (int i = 0; i < ListBox1->Count; i++) {
    
    			// Wenn Flag auf '1' steht wird gedruckt
    			if(iTimerPrint == 1)
    			{
    				// Dateiname in Variable sFilename uebergeben
    				sPDFArbeitspfad = sPDFQuellpfad + "\\" +
    					ListBox1->Items->Strings[i];
    
    				// Debugmodus
    
    				// Logfile schreiben
    				if (iDebug == 1) {
    					sLogfileString = "[DEBUG] Parameteraufruf: " + sGSPrint +
    						" " + sPDFArbeitspfad;
    
    					// Funktion zum Schreiben der Logfile aufrufen
    					LogfileSchreiben();
    				}
    
    				// Strings umwandeln
    				sPDFArbeitspfad = AnsiQuotedStr(sPDFArbeitspfad, 34);
    
    				// Dateien drucken
    				ShellExecute(Handle, L"open", sGSPrint.c_str(),
    					sPDFArbeitspfad.c_str(), NULL, SW_HIDE);
    
    				// Logfile schreiben
    				if (iLogging == 1) {
    					sLogfileString =
    						"[INFO ] Datei '" + ListBox1->Items->Strings[i] +
    						"' wurde von '" + sComputername + "' mit dem Benutzer '" + sBenutzername + "' gedruckt... ";
    
    					// Funktion zum Schreiben der Logfile aufrufen
    					LogfileSchreiben();
    				}
    
    				// Anzahl gedruckter Dateien in Label uebergeben
    				Label4->Caption = IntToStr(ListBox2->Count) + " von " + IntToStr(ListBox1->Count);
    
    				// Zum letzten Eintrag springen
    				ListBox2->TopIndex = ListBox2->Items->Count - 1;
    
    				// Messages verarbeiten
    				Application->ProcessMessages();
    
    				// Setze Flag fuer Druck auf '0'
    				iTimerPrint = 0;
    
    				// Aktiviere TimerPrint um Flag fuer Intervall zum Warten setzen
    				TimerPrint->Enabled = true;
    				}
    
    			}
    

    Hier der Code innerhalb des Timers:

    // Setze Flag zum Drucken auf '1'
    	iTimerPrint = 1;
    
    	// TimerPrint deaktivieren
    	TimerPrint->Enabled = false;
    

    Bin ich wirklich so blind? Oder einfach nur blöd?

    Danke und viele Grüße



  • Hallo,

    dein Code mit dem Timer ist komplett unsinnig. Was willst du denn erreichen?
    Möchtest du eine Wartezeit zwischen den einzelnen Druckaufträgen haben?

    Einen Timer verwendet man idR. um eine Aktion periodisch auszuführen.
    Wenn du das Drucken per Timer ausführen lassen willst, dann solltest du den Code, der innerhalb deiner for-Schleife steht in den Timer packen (und als Index mußt du dann eine Membervariable benutzen, welche du dann im Timer erhöhst).
    Zusätzlich mußt du dann die Schleifen-Bedingung als Abfrage in den Timer einbauen:

    ++Index;
    if (Index >= ListBox1->Count)
    {
      TimerPrint->Enabled = false;
      return;
    }
    
    // Drucken den Eintrag mit aktueller Index-Variable
    

    Beim Druck-Start dann selbstverständlich die Index-Variable mit 0 initialisieren.

    PS: Noch ein paar Hinweise:
    - benenne deine GUI-Variablen besser anstatt ListBox1, ListBox2, ListBox3, ...
    - trenne am besten GUI und Logikcode
    - Application->ProcessMessages() ist üblicherweise ein Zeichen für schlechten Code (wie man an deinem Versuch hier sieht)



  • Hallo!

    Vielen Dank für deine schnelle und ausführliche Antwort. Ich habe den Code jetzt mal umgebaut, leider funktioniert das immer noch nicht.

    Mit folgendem Code wird der Druck gestartet:

    if (question == mrYes) {
    
    			// Intervall fuer Druck in TimerPrint uebergeben
    			TimerPrint->Interval = (iIntervall * 1000);
    
    			// Index initialisieren
    			iIndex = 0;
    
    			// TimerPrint fuer Druck aktivieren
    			TimerPrint->Enabled = true;
    }
    

    Nachfolgender Code wird nun innerhalb des Timers aufgerufen:

    void __fastcall Tf_start::TimerPrintTimer(TObject *Sender)
    {
    	if (iIndex >= ListBox1->Count) {
    		TimerPrint->Enabled = false;
    		return;
    	}
    
    	for (int i = 0; i < ListBox1->Count; i++) {
    
    		// Dateiname in Variable sFilename uebergeben
    		sPDFArbeitspfad = sPDFQuellpfad + "\\" + ListBox1->Items->Strings[i];
    
    		// Debugmodus
    
    		// Logfile schreiben
    		if (iDebug == 1) {
    			sLogfileString = "[DEBUG] Parameteraufruf: " + sGSPrint + " " +
    				sPDFArbeitspfad;
    
    			// Funktion zum Schreiben der Logfile aufrufen
    			LogfileSchreiben();
    		}
    
    		// Strings umwandeln
    		sPDFArbeitspfad = AnsiQuotedStr(sPDFArbeitspfad, 34);
    
    		// Dateien drucken
    		ShellExecute(Handle, L"open", sGSPrint.c_str(), sPDFArbeitspfad.c_str(),
    			NULL, SW_HIDE);
    
    		// Logfile schreiben
    		if (iLogging == 1) {
    			sLogfileString = "[INFO ] Datei '" + ListBox1->Items->Strings[i] +
    				"' wurde von '" + sComputername + "' mit dem Benutzer '" +
    				sBenutzername + "' gedruckt... ";
    
    			// Funktion zum Schreiben der Logfile aufrufen
    			LogfileSchreiben();
    		}
    
    		// Anzahl gedruckter Dateien in Label uebergeben
    		Label4->Caption = IntToStr(ListBox2->Count) + " von " +
    			IntToStr(ListBox1->Count);
    
    		// Zum letzten Eintrag springen
    		ListBox2->TopIndex = ListBox2->Items->Count - 1;
    
    		// Index erhoehen
    		++iIndex;
    
    	}
    }
    

    Hab ich hier noch was übersehen bzw. muss ich in der FOR-Schleife auch die Variable iIndex verwenden?

    Für einen weiteren Tipp wäre ich wirklich dankbar, ich komm hier echt nicht weiter...

    Danke und liebe Grüße



  • Hallo!

    Ich hatte noch vergessen hinzuzufügen, dass ich in der Tat eine Wartezeit zwischen den einzelnen Druckaufträgen haben möchte.

    Danke und viele Grüße



  • Hallo nochmals,

    du solltest den Code, der innerhalb der for-Schleife ist in den Timer packen, nicht den for-Schleifenkopf...

    Und statt der lokalen Variablen 'i' dann eben 'iIndex' benutzen.

    Es soll ja pro Timer-Callback nur jeweils ein Druckauftrag gestartet werden!

    PS: Hast recht, den Index erst am Ende zu erhöhen (ansonsten müßtest du ja den Index mit -1 initialisieren - und das ist ohne Kommentierung schwieriger zu verstehen).



  • Hallo!

    Danke für die Antwort. Ich habe es nun auch begriffen und es funktioniert auch.

    Liebe Grüße



  • 👍


Log in to reply