TPerformanceGraph funktioniert nicht im minimierten Zustand



  • Hallo,

    ich habe festgestellt, dass TPerformanceGraph im minimierten Zustand nicht funktioniert.

    Die Methode DataPoint() fügt den Wert nicht hinzu, oder zumindest wird der Graph nicht weiter gezeichnet.

    Gibt es Alternativen, die ähnlich bequem funktionieren und aber diesen Fehler nicht aufweisen? Oder gar eine Lösung für TPerformanceGraph?

    Edit: Ich verwende den Borland C++ Builder 6.

    Vielen Dank und Grüße
    heini



  • HI,

    ich habe diese Komponente lange nicht verwendet, aber wenn ich mich richtig erinnere, muss man nach der Methode DataPoint() immer ein Update() durchführen, wenn man den Punkt/Wert sehen will:

    PerformanceGraph1->DataPoint(clBlue, 10);
    PerformanceGraph1->Update(); 
    
    PerformanceGraph1->DataPoint(clRed, 20);
    PerformanceGraph1->Update();
    

    LG

    Hawk



  • Ja, ok, sorry, das hätte ich vllt. erwähnen sollen: Das tue ich natürlich. Sonst würde es auch im nicht-minimierten Zustand nicht funktionieren. 😉

    Allerdings ahbe ich eben ein neues Projekt angelegt, um das einmal zu reproduzieren, auf einfacherer Weise. Dabei habe ich feststellen müssen, dass es trotz minimiertem Zustand fuktioniert. Es liegt also irgendwo im Code ein Fehler, den ich aber nicht finde.

    Ich suche weiter. Danke soweit.



  • Ich versuche das mal zu erläutern, was ich festgestellt habe. Das Phänomen ist sehr interessant, weil ich keine theoretische Erklärung dafür habe. Es ist, als würden Geister ihre Finger im Spiel haben.

    Also gut. Folgendes:

    Wenn ich ein blankes Projekt aufsetze mit einem simplen Timer und einem TPerformanceGraph, im Timer setze ich jedes Mal ein und demselben DataPoint, funktioniert alles erste Sahne. Auch im minimierten Zustand.

    Wenn ich in meinem eigentlichen Projekt echte Daten verwende, und im Prinzip genau das Gleiche mache, stellt sich das so dar, dass - solange das Programm nicht minimiert ist - alles normal läuft. Wenn ich aber nun minimiere und nach ein paar Sekunden das Fenster wieder zum Vorschein bringe, fehlen die Daten von dieser Zeit auf dem ersten Blick.

    Auf dem zweiten Blick jedoch - wenn z. B. während das Fenster minimiert war andere Werte vorhanden waren, sieht man das auch - erkennt man, dass die Datapoints, die entstanden sind während das Fenster minimiert war, schneller nach links wandern als die anderen. Sie rücken also vor, überholen vorherige Datapoints.

    Da man nicht direkt auf die Datapoints zugreifen kann, kann ich das auch nicht genauer verfolgen. Aber ich frage mich, ob ich der einzige bin, der dieses Phänomen beobachtet.

    Ich sollte an dieser Stelle auch folgendes erwähnen: Da TPerformanceGraph kein Scrollen durch die Daten ermöglicht, und bei Größenänderungen die Datapoints ans Ende setzt, die alten aber an alter Position bleiben, sodass Lücken entstehen, behelfe ich mir damit, dass ich bei jedem Datapoint auch den PerformanceGraph verlängere (Width) und die Position eins nach Links verschiebe.

    Das klappt auch alles wunderbar, und auch das habe ich vereinfacht mit einem Testprojekt nachgestellt. Doch - oh Wunder - da funktioniert es auch im minimierten Zustand.

    Ich habe schon die Reihenfolge (DataPoint() und Größen- / Positionsänderung) vertauscht um das zu troubleshooten. Keine Ahnung, was das noch sein kann. Das ist sehr wirr.

    Edit: DataPoint() und Update() rufe ich stets direkt hintereinander auf.



  • Zeige mal etwas Code bitte!



  • Ich habe den Fehler bei weiterer Eingrenzung gefunden. Der Fehler tritt nicht auf, wenn man ein Fenster mit Windows-eigenen Schaltflächen minimiert. Wenn man eigene Schaltflächen verwendet und dabei Application->Minimize(); aufruft, kommt es zu diesem Verhalten.

    Gibt es eine Möglichkeit die Windows-eigene Minimierungsmethode aufzurufen, mit eigenem Button?

    Edit: Ein SendMessage(fMain->Handle,WM_SYSCOMMAND,SC_MINIMIZE,0); hat leider auch nicht geholfen. 😞

    Edit 2: Nun wird's interessant: Eben hat das mit dem Windows-eigenen Button noch funktioniert, jetzt tut's das auch nicht mehr.

    Hier einmal ein Beispiel-Projekt (Programm muss als Admin laufen, da ICMP via RAW...):
    http://s000.tinyupload.com/index.php?file_id=84300827784089753917

    Hier der Source:

    void __fastcall TfMain::Button1Click(TObject *Sender)
    {
            Application->Minimize();        
    }
    //---------------------------------------------------------------------------
    void __fastcall TfMain::tmPingTimer(TObject *Sender)
    {
            if(!PingInProgress) ICMP->Ping();
    }
    //---------------------------------------------------------------------------
    void __fastcall TfMain::ICMPReply(TComponent *ASender,
          const TReplyStatus &AReplyStatus)
    {
            switch(AReplyStatus.ReplyStatusType)
            {
                    case rsEcho:
                            if(AReplyStatus.MsRoundTripTime<(unsigned)ICMP->ReceiveTimeout)
                            {
                                    UpdateGraph(clBlack,(long)AReplyStatus.MsRoundTripTime);
                                    break;
                            }
                    case rsTimeOut:
                            UpdateGraph((TColor)0x008080c0,pgPing->Scale);
                            break;
                    case rsErrorUnreachable:
                            UpdateGraph((TColor)0x00c0c0c0,pgPing->Scale);
                            break;
                    case rsErrorTTLExceeded:
                            UpdateGraph((TColor)0x00ff8080,pgPing->Scale);
                            break;
                    default:
                            tmPing->Enabled=false;
            }
            PingInProgress=false;
    }
    //---------------------------------------------------------------------------
    void __fastcall TfMain::UpdateGraph(TColor _col,long _val)
    {
            pgPing->DataPoint(_col,_val);
            pgPing->Update();
            pgPing->Width++;
            pgPing->Left--;
    }
    void __fastcall TfMain::FormCreate(TObject *Sender)
    {
            pgPing->DataPoint(pgPing->BackColor,1);
            pgPing->Update();
            pgPing->Width=1;
    }
    //---------------------------------------------------------------------------
    

Anmelden zum Antworten