Hintergrundfarbe eines Panels in einem Frame per Event ändern



  • Hallo!

    Ich frage in einem Thread den Status einer boolschen Variable einer SPS ab.
    Auf einer Übersichtsseite habe ich mehrere Frames, welche verschiedene Panels und Buttons enthalten.
    Die Farbe der Panels möchte ich abhängig vom Status der boolschen Variablen ändern.
    Das soll nicht per Timer funktionieren, sondern möglichst per Event "VariableChange".
    Hat jemand sowas schonmal gemacht?



  • Ja, aber anhand der wenigen Informationen, die du lieferst, kann man dir bei deinem Problem wohl nicht konkret helfen.
    Wie stellst du denn z.B. fest, wann sich deine Variable ändert? Wenn du das nicht per Timer machen willst kannst du z.B. das Observer Pattern benutzen, hier mal im Pseudocode:

    class Variable;
    
    class Listener
    {
    public:
       Listener() 
       {
       }
    
       virtual ~Listener()
       {
       }
    
       virtual void notify( const Variable& var ) = 0;
    };
    
    class Variable
    {
       double Wert_;
       container<Listeners> Listeners_;
    
    public:
       Variable() : Wert_( 0.0 )
       {
       }
    
       double Wert() const
       {
          return Wert_;
       }
    
       void set_wert( double op )
       {
          if( Wert_ != op )
          {
             Wert = op;
             for_each( Listener in Listeners_ )
             {
                Listener.notify( *this );
             }
          }
       }
    
       void subscribe( Listener L )
       {
          if( !Listeners.contains( L ) ) Listeners_.add( L );
       }
    
       void unsubscribe( Listener L ) 
       {
          Listeners_.remove( L );
       }
    };
    

    Wenn du dich nicht für alle Variablen einzeln anmelden/abmelden willst kannst du alle Variablen natürlich auch zu einem Verbund zusammenfassen und das Observer Pattern für den Verbund umsetzen.

    Edit:
    Musst natürlich aufpassen, dass die GUI Elemente im VCL Hauptthread verändert werden, wenn das Event im Lesethread ausgelöst wird und der Eventhandler im Kontext des Lesethreads aufgerufen wird darfst du die GUI nicht anfassen (die VCL ist nicht threadsafe).


Log in to reply