event handling



  • hallo,

    ich habe 2 klassen .. eine GUI klasse und eine controllerklasse die die GUI "steuert" .. also eine referenz auf sie hat. jetzt können jedoch auch änderungen aus der gui herauskommen (ala trackbar change).

    bei einer änderung in der GUI soll die controllerklasse informiert werden. jedoch soll die gui unabhaengig von der controllerklasse sein .. also keine referenz auf sie haben.

    wie kann man das machen? das einizge was mir einfällt wär einen eigenen event schreiben? weiss jedoch nicht wie das geht...das was ich ausprobiert habe ging nicht zu compilieren.

    ich kenn von java her das observer prinzip.. dies hier anzuwenden find ich aber leicht übertrieben. ich hab weder messages die ich uebergeben muss .. noch hab ich mehrere observer.

    vielleicht gibts auch andere möglichkeiten als events?!

    danke für die hilfe!



  • Events sind schon die richtige Vorgehensweise, da du dadurch die Entkopplung Aufrecht erhälst.

    Beispiel für einen Event:

    typedef void __fastcall (__closure *TMyEvent)(TObject *Sender /*, ... */); // evtl. weitere Parameter hinzufügen
    
    // in der GUI-Klasse (im public-Teil des Headers)
    TMyEvent MyEvent;
    
    // Aufruf innerhalb der GUI
    void GUI::CallEvent()
    {
      if(MyEvent != 0)
          MyEvent(this /*, ...*/);
    }
    
    // im Controller
    gui.MyEvent = &OnMyEvent;
    
    void __fastcall Controller::OnMyEvent(TObject *Sender /*, ... */) // <- Edit!!!
    {
      // ...
    }
    

    Du könntest evtl. auch einfach das Original-Event weitergeben, d.h. statt TMyEvent einfach TNotifyEvent (für TTrackBar::OnChange) verwenden.
    Wenn du jedoch eigene Parameter noch mitgeben willst (z.B. den aktuellen Wert), dann mußt du entsprechend das 'typedef' anpassen.



  • Hallo

    Alternativ auch das Observer-Pattern.

    bis bald
    akari



  • danke fuer die hilfe!

    ich bekomm jedoch noch einen fehler beim compilieren:

    [BCC32 Fehler] TimeLine.cpp(14): E2034 Konvertierung von 'void (* (_closure )(TObject *))(TObject *)' nach 'void (_fastcall * (_closure )(TObject *))(TObject *)' nicht möglich



  • der fehler bezieht sich auf die zeile:

    guiTimeLine->MyEvent = &OnMyEvent;
    


  • habs rausgefunden

    vor dem Handler fehlte noch das __fastcall

    void __fastcall Controller::OnMyEvent(TObject *Sender)
    

    danke nochmal!



  • Sorry für den Fehler, hab den Code nur aus dem Gedächnis heruntergetippt gehabt...

    Freut mich aber, daß es jetzt bei dir läuft.



  • Wenn du CG2009 oder die boost Bibliotheken benutzt könntest du dir mal boost::signal anschauen.


Log in to reply