Timer enablen/disablen



  • Hallo,

    wahrscheinlich einfaches Problem:
    Ich habe eine Formular (Form1), mit einem Timer (timer1) als Objekt.
    In der Datei Form1.h kann ich den Timer ganz einfach mit

    timer1->enabled=true/false;
    

    ein- und ausschalten.
    Nun habe ich zusätzlich noch eine ganz normale C++-Klasse (class1). Wie kann ich aus eine Methode der Klasse den Timer in Form1 enabeln/disablen?

    Danke.

    Gruß, Christian



  • mmh, da gibts ziemlich viele moeglichkeiten,

    meinst du mit normaler klasse "unmanaged" oder nur eine eigene klasse unter ,net aber managed.

    Wenn's unmanaged ist, wirds ein biserl unangenehmer, da man managed und unmaganed nicht einfach mischen kann. (besonders managed zeugs in unmanaged classes mag der compiler ueberhaupt nicht)

    Im Falle von einer unmanaged c++ class, nutzte ich oft folgendes zur kommuniation, ist aber sicher nicht die einzige loesung, aber eine die mir in den kram passt:

    Ich ubergebe meiner C++ klasse das handle von der Form und schicke dann mit der winpi function send/post message nachrichten an die Form. Dort kann ich dann in der ueberschriebenen wndproc entsprechend reagieren.

    Wenn ich mich recht erinner kann man einer unmanaged class keine reference auf ein maganed object uebergeben, wie dass mit functionspointern auf managed code functionen ausschaut weiss ich nicht, vielleicht kann man irgendwie eine callbackfunction uebergeben, die den timer aendert.
    Ob das dann einfacher ist als ueber das Msg system, mmh k.a.

    cheers
    Flo



  • Du musst entweder einen Verweis zur Timer-Instance Deiner Klasse übergeben, oder im Form eine Methode für das En-/Disabled zur Verfügung stellen, die dann von der Klasse aufgerufen wird.



  • ok, erstmal danke für eure Antowrten, aber bin in C++ absoluter Anfänger :), also:

    zur 1. Antwort:
    woher wesi ich ob meine Klasse manages oder unmanaged ist?
    Das Message-System kenne ich (noch) nicht. Beispiele?

    zur 2. Antwort:
    wie rufe ich die Methode dann aus meiner Klasse auf?
    Wie würde ich einen Verweis zur Timer-Instance an die Klasse übergeben? (das war auch meine Idee, ich habe nur keine Ahnung wie und suche schon seit 2 Tagen nach einem Beispiel....)

    Gruß, Christian



  • zu 2:

    in deiner klasse brauchst du eine timer ref:

    Timer^ t1;
    

    in die musst du dann zur Laufzeit die timer ref von deiner Form hineinkopieren;

    z.B gib der class eine function, die bei programm start aufgerufen werden muss:

    public: System::Void SetTimer(Timer ^t1)
    {this->t1 = t1;}
    

    und dann kannst du einfach in deiner klasse mit this->t1->enabled = true/false arbeiten.

    zu 1:
    was manganed code angeht, in .NET ist eigentlich alles managed, wenn man selber klassen erstellt musss man davor ein ref schreiben (.NEt 2, bei 1 wars irgendwas mit gc_ )
    z.B. class abc{}; //unmanaged
    z.B. public ref class abc{}; //managed.

    wobei man durch managed einschraenkungen in ableitungsfaehig hinnehmen muss.
    Aber - wie gesagt - ich habs mit .NET 2 nicht versucht, aber in einer unmanaged class duerfte es dir nicht moeglich sein eine Timer^ t1 reference zu erstellen. Das darf man nur in managed classes.

    (Wenn du was uebers msg system wissen willst, lies mal ein paar tutorials ueber winapi, schadet nicht wenn man ein biserl uebers msg system weiss, da dass das herz jeder win anwendung ist, auch wenn .NET drueber sitzt. Hilft oft bei problemen zu verstehen was drunter so ungefaehr passiert.)

    Cheers
    Flow



  • danke für die Tips, mein Code schaut jetzt wie folgt aus:

    Form1:

    void funktion1() 
    {
      System::Windows::Forms::Timer^  Timer1;
    
      Klasse k1;
      k1->funktion(this->Timer1)
    }
    

    Klasse:

    Class Klasse
    {
    private:
      ...
    public:
      void funktion (System::Windows::Forms::Timer ^t1) 
      {
        t1->enabled=true;
        t1->enabled=false;
      }
    }
    

    ...und alles funktionert wies soll 🙂

    Gruß, Christian


Anmelden zum Antworten