Zeitverzögerung bei Funktionsaufruf (oder so)



  • Moin,

    ich möchte, dass durch einen Funktionsaufruf der Wert des Labels XY geändert wird. Nach einer vorgegebenen Zeit soll der Wert nun zurück gesetzt werden. Die Funktion bekommt nun XY übergeben. Kann also alle Labels auf der Form ansprechen.

    void doXY(String XY){
      dynamic_cast<TImage*>(Form1->FindComponent(XY))->Transparent = false;
      Delay(1000);
      dynamic_cast<TImage*>(Form1->FindComponent(XY))->Transparent = true;
      dynamic_cast<TLabel*>(Form1->FindComponent(XY))->Caption = "bla";
    }
    
    void __fastcall TForm1::Delay(int ilMSecs)
    {
      int ilStartTime = GetTickCount();
      while (int(GetTickCount() - ilStartTime) < ilMSecs)
        Application->ProcessMessages();
    }
    

    ruf ich nun doXY("img1) auf, wird es gefunden, untranzparent(?) gemacht und nach einer Sekunde wieder transparent. Soweit so wunderbar!
    Rufe ich nun innerhalb dieser Sekunde die Funktion mit doXY("img2") auf, so verlängert sich das Rücksetzten von img1 um eine weitere Sekunde, denn erst, wenn der 2. Funktionsaufruf seine Sekunde gewartet hat, wird sowohl gleichzeitig img1 und img2 zurück gesetzt. Ich will aber, dass unabhängig von weiteren Aufrufen, jedes img nach der eingestellten Zeit zurück gesetzt wird. Einzige Ausnahme, wenn doXY("img1") zweimal aufgerufen wird, soll erst nach Ablauf der Zeit des 2. Aufrufes das img zurück gesetzt werden... wobei ich mir net sicher bin, wie ich dann das Label handhabe, weil da ein Counter dranhängt und der schon nach Ablauf der ersten Zeit hoch muss....
    Problem verstanden? Gut, weil ich hab grad keine Idee... ich wüsst noch net mal, wonach ich suchen sollt... 😕



  • Benutze dazu einen Timer und realisiere das Zurücksetzen im OnTimer-Ereignis



  • aber dann bräuchte ich für jeden Aufruf der Funktion einen eigenen Timer, oder?

    Außerdem, kann es sein, dass viele Timer (so 22 Stück) die Anwendung langsamer machen?



  • Hallo

    Nein es reicht ein Timer, eingestellt auf den Grundzeitraum (100ms reichen bei dir).
    Erstelle dir einfach ein Array mit den fraglichen Labels mitsamt Restwert, den es, wenn überhaupt, noch transparent bleiben soll. Bei jedem Timerdurchgang ziehst du bei jedem Label einen entsprechenden Betrag ab, bis es keinen Restbetrag mehr hat und dann weißt du, das du deises Label wieder normal darstellen kannst.

    Dann entfällt auch das äußerst unschöne, ungeprüfte und performance-fressende mehrfache Suchen und Casten von Controls.

    bis bald
    akari


Anmelden zum Antworten