shutdown timer programmiert



  • Hallo,

    ich habe nun einen shuttime timer programmiert. bestimmt nicht sauber, aber er funktioniert...

    nur habe ich ein Problem beim stellen der Zeit zum herunterfahren.
    Habe dies mit dem button updown versucht zu lösen, aber es klappt leider nicht so wie ich es mir vorstelle... eigentlich sollte er wenn ich down drücke um 10min runterzählen, aber das geht erst wenn ich hochgezählt habe und dann zählt er auch nur runter bis zum voreingestellten Wert... hier der code:

    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {       fortschritt=0;                         //Fortschritt vom countdown (anzeige)
            h = ShutT.getTimeNow()/60;             //ergibt lokale Zeit Stunden
            m = ShutT.getTimeNow()%60;             //ergibt lokale Zeit Minuten
            hstell = h;                            //default Stellzeit
            mstell = 0;
            sprintf(buffer,"%02d:%02d",h,m);
            LokalZeit->Caption=buffer;
            sprintf(buffer,"%02d:%02d",hstell,mstell);
            StellZeit->Caption=buffer;
    }
    
    void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
    {    switch (Button) {
    
         case btNext:                                 //Stellzeit um 10min vor
                      if(mstell==50)
                      {     hstell++;
                            mstell=0;
                            if(hstell>23)hstell=0;
                      }else mstell+=10;
    
                      break;
    
         case btPrev:                                //Stellzeit um 10min zurück
                      if(mstell==0) {
                      mstell=50;
                      hstell-=1;
                      if(hstell<0){hstell=23;}
                      }else mstell-=10;
    
                      break;
         }
         sprintf(bufferstell,"%02d:%02d",hstell,mstell);  //Stellzeit wird in bufferstell gelesen
         StellZeit->Caption=bufferstell;                  //Stellzeit wird zur anzeige geschickt
    }
    

    Ich weiß nicht woran es liegt, weil er ja eigentlich mit dem code hier

    if(mstell==0) {
                      mstell=50;
                      hstell-=1;
                      if(hstell<0){hstell=23;}
                      }else mstell-=10;
    

    immer runterzählen sollte...

    vielleicht kann mir einer helfen, wäre nice

    MfG Gustl



  • wenn anstatt updown zwei normale buttons verwende funktionierts...

    woran könnte das liegen?



  • Mal so probiert?

    void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
    {
      if(Button == 0)
       Panel1->Caption = "Oben geklickt";
      else
       Panel1->Caption = "Unten geklickt";
    }
    


  • Das gleiche Problem... komm einfach nicht drauf woran es liegen könnte..

    ich mache ja mit den buttons auch nichts anderes, kopiere eben nur den code von den 2 case in die buttons, die machen alles richtig.... komich



  • Ist zwar (wenn auch nur knapp) am Thema vorbei, aber warum machst du das so kompliziert? Wenn du anstatt von hstell und mstell nur eine Variable benutzt (zB CountDown), die den Countdown bis zum Neustart in Minuten angibt sparst du dir einiges an Verwaltung/Überprüfung. Ich poste mal Pseudo-Code, um das zu veranschaulichen:

    class MyClass /* soll die Formularklasse sein*/
       unsigned int CountDown_; // Countdown bis zum Reboot in Sekunden
    
    public:
       MyClass() : CountDown_( 5 * 60 ) // Default Countdown 5 Minuten
    
       void on_click_updown_hours( UDType nType )
       {
          if( btPrevious == nType )
          {
             decrease_timer( 3600 );
          }
          else
          {
             increase_timer( 3600 );
          }
       }
    
       void on_click_updown_minutes( UDType nType )
       {
          if( btPrevious == nType )
          {
             decrease_timer( 60 );
          }
          else
          {
             increase_timer( 60 );
          }
       }
    
       void on_click_updown_seconds( UDType nType )
       {
          if( btPrevious == nType )
          {
             decrease_timer( 1 );
          }
          else
          {
             increase_timer( 1 );
          }
       }
    
       void increase_timer( unsigned int Duration )
       {
          // Timer verlängern
          CountDown_ += Duration;
          update_timer_display();  
       }
    
       void decrease_timer( unsigned int Duration )
       {
          if( CountDown_ >= Duration )
          {
             // Timer verkürzen
             CountDown_ -= Duration; 
          }
          else
          {
             // Timer darf nicht unter 0 fallen (oder sonstigem Minimum)
             CountDown_ = 0;
          }
          update_timer_display();
       }
    
    private:
       void update_timer_display()
       {
          unsigned int Hours   = CountDown_ / 3600;
          unsigned int Minutes = (CountDown_ / 60) % 60;
          unsigned int Seconds = CountDown_ % 60;
    
          // UpDown Control für Stunden aktualisieren
          if( UpDownHours->Value != Hours )
          {          
            UpDownHours->Value     = Hours;
          } 
          // UpDown Control für Minuten aktualisieren
          if( UpDownMinutes->Value != Minutes )
          {
             UpDownMinutes->Value   = Minutes;
          }
          // UpDown Control für Sekunden aktualisieren
          if( UpDownSeconds->Value != Seconds )
          {
             UpDownSeconds->Value   = Seconds;      
          }
       }
    };
    

    Naja, sowas in der Art halt.



  • Es gibt viele Wege dies zu realisieren. Danke.

    Aber was ich nicht verstehe ist, warum es mit buttons geht und mit dem updown button eben nicht.

    hier nochmal der code mit buttons und updown:

    //unit1.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {        mstell = 0;
             hstell = 0;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
    {
            switch (Button) {
    
         case btNext:                                 //Stellzeit um 10min vor
                      if(mstell==50) {
                      hstell++;
                      mstell=0;
                      if(hstell>23)hstell=0;
                      }else mstell+=10;
    
                      break;
    
         case btPrev:                                //Stellzeit um 10min zurück
                      if(mstell==0) {
                      mstell=50;
                      hstell-=1;
                      if(hstell<0){hstell=23;}
                      }else mstell-=10;
    
                      break;
         }
         sprintf(buffer,"%02d:%02d",hstell,mstell);  //Stellzeit wird in bufferstell gelesen
         StaticText1->Caption=buffer;                  //Stellzeit wird zur anzeige geschick
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::BupClick(TObject *Sender)
    {           if(mstell==50)
                {
                hstell++;
                mstell=0;
                if(hstell>23)hstell=0;
                }else mstell+=10;
    
            sprintf(buffer,"%02d:%02d",hstell,mstell);  //Stellzeit wird in bufferstell gelesen
            StaticText1->Caption=buffer;                //Stellzeit wird zur anzeige geschick
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::BdownClick(TObject *Sender)
    {           if(mstell==0) {
                mstell=50;
                hstell-=1;
                if(hstell<0){hstell=23;}
                }else mstell-=10;
    
            sprintf(buffer,"%02d:%02d",hstell,mstell);  //Stellzeit wird in bufferstell gelesen
            StaticText1->Caption=buffer;                //Stellzeit wird zur anzeige geschick
    }
    //---------------------------------------------------------------------------
    
    //unit1.h
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    #include <stdio.h>
    #include <Buttons.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
            TStaticText *StaticText1;
            TUpDown *UpDown1;
            TBitBtn *Bup;
            TBitBtn *Bdown;
            void __fastcall UpDown1Click(TObject *Sender, TUDBtnType Button);
            void __fastcall BupClick(TObject *Sender);
            void __fastcall BdownClick(TObject *Sender);
    private:  int hstell, mstell;
              char buffer[9];	// User declarations
    public:		// User declarations
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    sollte das nicht das gleich sein und beides funktionieren... ?



  • Bei UpDown wird das OnClick nur aufgerufen, wenn der Wert geändert wurde.
    Wenn das Ding schon am Anschlag steht - nach dem Start - passiert nix.

    (Setz min/ max auf grosse Werte - plus bzw. minus) und Start- Wert auf 0.

    Gruss
    Frank



  • Hallo Frank, leider verstehe ich nicht ganz was du meinst.

    Wo soll ich hier min und max festlegen?



  • UpDown1->Min=-200;
    UpDown1->Max=200;

    Danke, jetzt gehts 🙂


Anmelden zum Antworten