verständnisfragen



  • ok danke soweit, dann würde ich gerne noch wissen was es bedeutet, wenn eine fkt als returnparameter IComparable^ besitzt. was kann ich damit anfangen?



  • IComparable ist ein Interface... sie sind dazu gedacht, dass du nicht jeden Typ kennen musst mit dem du arbeiten willst (d.h. es könnten 10000 Objecte existieren die IComparable implementiert haben aber du kannst jedes Objekt über diese Interface ansprechen). Wie IComparable schon sagt, werden dir dort ein paar Methoden angeboten womit du irgendwas mit was anderem vergleichen kannst.



  • und wie hängt das ganze mit WinUnit zusammen?



  • Gar nicht. Musste erstmal nachschaun was das sein soll. Meinst du das hier? Falls ja schließt sich das sogar in gewisser Weise aus, da WinUnit für native C++ verwendet wird und nicht für .Net welches ja bei Windows Forms verwendet wird.



  • doch genau mit diesem WinUnit arbeiten wir unter CLI/C++!
    aber ok wollte ja auch nur wissen ob IComparable damit direkt zusammenhängt!



  • Wie funktioniert das? Ich meine ein Testframework das für native C++ ausgelegt ist, erwartet ja auch native Datentypen bei Funktionsaufrufen etc. Die kann C++/CLI doch aber gar net liefern. Das selbe Problem existiert natürlich auch anders herum. Das beim VS enthaltene TestFramework z.B. ist auf .Net zugeschnitten und C++/CLI Anwendungen lassen sich prima testen, native C++ Anwendungen dagegen fast gar net.



  • ok es ist dieser code den ich nicht verstehe:

    // Liste_IteratorTest.cpp
    #include "WinUnit.h"
    using namespace System;
    #include "VerketteteListe.h"
    #include "Liste.h"
    
    Liste^ new_Liste();
    
    BEGIN_TEST(Liste_Iterator_Konstruktion)
    { Liste^ liste=new_Liste();
      Liste::Iterator^ i=liste->erzeuge_Iterator();
      WIN_ASSERT_TRUE(i!=nullptr,_T("Iterator-Objekt sollte erzeugt worden sein"));
    }
    END_TEST
    
    BEGIN_TEST(Liste_Iterator_element)
    { Liste^ liste=new_Liste();
      Liste::Iterator^ i=liste->erzeuge_Iterator();
      i->ende();    
      try
      { WIN_ASSERT_THROWS(i->element(),
                        Liste::anfang_Ausnahme^,
                        _T("Iterator steht auf Anfang und darf Element nicht zurueckgeben."));
      }
      catch(Exception^ e) 
      { WIN_ASSERT_FAIL(_T("Ausnahme darf nicht kommen."));
      }
    }
    END_TEST
    

    Dann würde ich gerne noch wisse, wann die Methode OnPaint(PaintEventArgs^ e) eines Panels aufgerufen wird! ich sehe die deklaration, die definition, aber nicht den expliziten aufruf, dennoch wird die methode irgendwo, irgendwie aufgerufen!
    Was sind PaintEventArgs^ ? kann ich damit nur pointer vom typ Graphics^ übergeben?



  • nochmal zu dem onpaint:
    laut msdn:

    Hinweise zur Vererbung:

    Wenn Sie OnPaint in einer abgeleiteten Klasse überschreiben, müssen Sie die OnPaint-Methode der Basisklasse aufrufen, sodass registrierte Delegaten das Ereignis empfangen.

    eben dieser aufruf fehlt oder wird die onpaint methode automatisch aufgerufen wenn ich einen panel erstelle?



  • Dann würde ich gerne noch wisse, wann die Methode OnPaint(PaintEventArgs^ e) eines Panels aufgerufen wird! ich sehe die deklaration, die definition, aber nicht den expliziten aufruf, dennoch wird die methode irgendwo, irgendwie aufgerufen!
    Was sind PaintEventArgs^ ? kann ich damit nur pointer vom typ Graphics^ übergeben?

    edit:
    laut msdn:

    Wenn Sie OnPaint in einer abgeleiteten Klasse überschreiben, müssen Sie die OnPaint-Methode der Basisklasse aufrufen, sodass registrierte Delegaten das Ereignis empfangen.

    eben dieser aufruf fehlt oder wird die onpaint methode automatisch aufgerufen wenn ich einen panel erstelle?



  • OnPaint(..) wird von der Base-Class aufgerufen.
    PaintEventArgs enthält das Graphics-Objekt... das ist zum zeichnen mit GDI+ gedacht



  • also automatisch aufgerufen?
    edit:
    ich drücke es mal anders aus:

    habe in einer klasse folgende funktion:

    void Welt::OnPaint(PaintEventArgs^ e) 
    { 
      Graphics^ g = e->Graphics;
      brumm->zeichne(g);
    
    }
    

    sie ist so deklariert in der klasse:

    public ref class Welt:Panel
    { /** Konstruiert eine Welt */
      public: 
        Welt();
      protected: 
        virtual void OnPaint(PaintEventArgs^ e) override; // Behandlung des Paint-Ereignisses
      private:
         Void behandle_timer_ereignis(Object^ sender,EventArgs^ e); // Behandlung des Zeitgeber-Ereignisses
    
    }
    

    Ich möchte jetzt wissen, wann und wie die onPaint Methode aufgerufen wird, denn ich sehe keinen expliziten aufruf!dennoch wird der code ausgeführt!



  • Hallo,

    Ich möchte jetzt wissen, wann und wie die onPaint Methode aufgerufen wird, denn ich sehe keinen expliziten aufruf!dennoch wird der code ausgeführt!

    Einfach ausgedrückt, immer wenn das (Betriebs-)System meint, dass ein Fenster (oder Teile davon) sich neu zeichnen soll(en) (z.B. wenn es von anderen verdeckt war), wird ein Paint-Ereignis ausgelöst, in dem OnPaint aufgerufen wird.

    MfG,

    Probe-Nutzer


Anmelden zum Antworten