Problem mit Refresh



  • Hallo zusammen,
    ich habe eine Mehtode erstellt, die eine Wertetabelle und den Graphen zu einer Funktion ausgibt. Dazu muss über ein TEdit eine Variabel (RR) eingegeben werden. Gibt man nun mal beispielsweise 11 oder 15 ein, so ändert sich logischerweise der Graph und die Wertetabelle.

    Der Graph wird auf einem TImage dargestellt. Leider habe ich folgendes Problem: Nachdem ich einen Wert für meine Variabel eingegeben habe, wird der Graph erstellt. Möchte ich nun den Graphen zu einem anderem Wert erhalten, so wird dieser auch erstellt, aber der alte verschwindet nicht. Der Neue wird also über den Alten gezeichnet.

    Ich wollte das Problem mit Refresh () lösen, aber leider tut sich nichts. Hier der Quelltext:

    void __fastcall TCelirity::Graph1 (void)
    {
     Form1->Image2->Canvas->MoveTo(0,0);
     Form1->Image2->Canvas->Pen->Color = clNavy;
     for (int i = -100; i < 100; i++)
     {
      Vlight(i,RR);
      Form1->Image2->Canvas->LineTo (i+100, -V+200);
     }
    }
    //---------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
     Form1->Image2->Refresh(); //hiermit sollte der alte Graph gelöscht werden!!
     int RR = StrToInt (Edit1->Text);
     Celirity1->Table2(StringGrid1, RR);// Wertetabelle wird erstellt
     Celirity1->Graph1(RR); // RR wird über TEdit eingegen!
    }
    

    Vielen Dank für eure Hilfe
    lg, freakC++



  • Aus der FAQ:

    Image2->Picture = NULL;
    


  • Hallo

    Du must vor dem Zeichnen des neuen Graphen den alten überzeichnen. Am einfachsten indem du auf ganzen Bereich des TImages die Canvas-Methode zum Zeichnen eines Rechtecks mit der gewünschten Hintergrundfarbe anwendest.

    /Edit : Oder die Variante von Jansen.

    bis bald
    akari



  • Hi,
    danke für die schnelle Antwort. Sorry, da hab ich wohl etwas übersehen. Leider kannte ich den "Befehl" NULL noch nicht. Könntet ihr mir kurz sagen, was dieser bewirkt?

    Vielen Dank
    lg, freakC++



  • Hallo

    NULL ist kein Befehl (es gibt in C++ überhaupt keine Befehle...)

    NULL ist nur ein Schlüsselwort aus C, und bedeutet nichts weiter als "0". Es wird meistens gebraucht um Zeiger als "leer" zu markieren. Du könntest also genausogut schreiben :

    Image2->Picture = 0;
    

    In diesem speziellen Fall wird also der Eigenschaft Picture ein nicht vorhandenes Bitmap zugewiesen, was dazu führt das die Grafik im TImage gelöscht wird.

    bis bald
    akari



  • Hallo,
    vielen Dank für die Antwort. Mir ist schon klar, dass man das nicht Befehl nennen kann. Deshalb hab ich Befehl ja auch in Anführungszeichen geschrieben.

    Naja...ich habs jedenfalls kapiert und sage

    Vielen Dank
    lg, freakC++



  • Halt, noch eine Frage! Warum ist das denn mit Refresh nicht möglich?

    Vielen Dank
    lg, freakC++



  • Hallo

    Deine Zeichenaktion modifiziert nur das bestehende Bitmap im Zwischenspeicher des TImages. Das Refresh aktualisiert die Monitoranzeige mit dem Zwischenspeicher. Die alten Zeichnungen werden nur komplett gelöscht indem du den Zwischenspeicher leerst, mit den genannten Methoden.

    bis bald
    akari



  • Alles klar! Das ist einleuchtend!

    Vielen Dank
    lg, freakC++


Anmelden zum Antworten