Verständnisproblem bei Verwendung von Fl_Preferences (FLTK)



  • Ich nutze seit einiger Zeit das FLTK Toolkit, weil einige Grafik Ausgaben damit recht einfach umzusetzen sind. Um programminterne Konfigurationen abzuspeichern nutze ich Fl_Preferences, allerdings bisher nur minimal, was ich jetzt erweitern möchte.
    http://www.fltk.org/doc-1.3/classFl__Preferences.html
    Ich habe mir den gesamten Quelltext gezogen, auch um mehr Beispiele zu haben, da es ja nur wenig brauchbare Anleitungen gibt. In einem der Programme namens FLUID (Fast Light User Interface Designer) taucht jetzt eine Kombination auf, die ich nicht so recht verstehe:

    Fl_Preferences	fluid_prefs(Fl_Preferences::USER, "fltk.org", "fluid");
    

    Das sollte dann eine globale Instanz dieser Klasse sein, oder?
    Aber ein Stückchen weiter kommt dann das:

    char position_window(Fl_Window *w, const char *prefsName, int Visible, int X, int Y, int W=0, int H=0 ) {
      Fl_Preferences pos(fluid_prefs, prefsName);
      if (prevpos_button->value()) {
        pos.get("x", X, X);
        pos.get("y", Y, Y);
        if ( W!=0 ) {
          pos.get("w", W, W);
          pos.get("h", H, H);
          w->resize( X, Y, W, H );
        }
        else
          w->position( X, Y );
      }
      pos.get("visible", Visible, Visible);
      return Visible;
    }
    

    Wenn ich das richtig sehe, wird da mit pos ein neues Objekt erzeugt. Aber wie funktioniert das? Es muss doch immer auf dieselbe Datei zugegriffen werden, in diesem Fall: .fltk/fltk.org/fluid.prefs

    Kann mir da jemand einen Tipp geben?



  • In der Funktion wird ein anderer Konstruktor aufgerufen: Fl_Preferences(Fl_Preferences & parent, const char * group), welcher Zugriff auf eine Untergruppe innerhalb der Preferences-Datei ermöglicht.



  • Das heißt, ich erzeuge zwar ein neues Objekt, habe aber durch die Angabe von parent trotzdem Zugriff auf die Daten der ursprünglichen Instanz? Ich finde das irgendwie verwirrend.

    Ich habe Fl_Preferences bisher nur einmal benutzt, und dabei die einzige Instanz direkt angesprochen.

    ...
        static Fl_Preferences prefs;
        ...
    
        ...
        if( prefs.get( "startdir", buf, "", 255 ) ) {
            chdir( buf );
        }
    

    Das dauert wohl noch etwas, bis ich das verinnerlicht habe.



  • einwegflasche schrieb:

    Das dauert wohl noch etwas, bis ich das verinnerlicht habe.

    Man muss nicht alles verinnerlichen, man muss aber wissen, wo es steht 😉



  • Also ich habe das jetzt so, wie es im erwähnten Beispielprogramm gemacht wurde, in mein eigenes Programm eingebaut. Das hat etwas gedauert, weil ich dazu einige gravierende Änderungen in einer Klasse vornehmen musste.

    Aber irgendwie hat das für mich immer noch etwas magisches. Denn ich rufe nie die Methode

    void Fl_Preferences::flush ()
    

    auf. Auch der Destructor wird nie explizit aufgerufen.

    Trotzdem werden alle Änderungen gespeichert. Wie das genau funktioniert, habe ich noch nicht wirklich verstanden. Diesen Mechanismus zu verstehen, meinte ich u.a. mit "verinnerlichen".


Log in to reply