Go Down

Topic: Bouncer-Problem (Read 3 times) previous topic - next topic

olikraus

#25
Apr 02, 2012, 12:38 pm Last Edit: Apr 02, 2012, 06:42 pm by olikraus Reason: 1
Quote
Hab noch nie mit characters gearbeitet.


Also, im Prinzip setze ich ein paar C/C++ Gundlagen voraus. Auf der anderen Seite, könnte man sich das auch aus den Beispielen erschießen, die ich in der M2tklib Referenz angeben haben. Speziell für die STRLIST:
http://code.google.com/p/m2tklib/wiki/elref#STRLIST. Anders ausgedrückt: Entweder gar nicht darüber nachdenken und das Beispiel aus der Referenz übernehmen oder aber ein gutes C (Betonung liegt auf C und  nicht auf C++) Lernbuch zur Hand nehmen und dort nachlesen.

Ich hab' mal nach "c tutorial" gegoogled und u.a.folgendes gefunden
http://www.c-howto.de/tutorial-strings-zeichenketten.html

Quote
Was passiert da genau?

Die Frage bezog sich ja auf das STRLIST element. Um es etwas allgemeiner zu formulieren. Das STRLIST Element sorgt für die Darstellung einer Liste von Strings. Damit man das wiederverwenden kann, muss die STRLIST einige Informationen kennen:
1. Wie viele Elemente gibt es denn insgesamt?
2. Wie viele Elemente sollen denn sichtbar sein?
3. Welches ist das erste sichtbare element? (wird teilweise automatisch berechnet)
4. Wie lauten denn die einzelnen Zeilen?

Punkt 4 ist wie folgt gelöst. STRLIST benutzt eine sogenannte Callback-Procedure (Rückruf oder Hilfs-Funktion). Die muss vom Benutzer der Lib (sprich von Dir) bereitgestellt werden und ermöglicht es der Lib zu einer gegebenen Zeilennummer den String zu ermitteln.

Diese Callback-Procedure wird aber für einen zweiten Zweck benutzt, deshalb schickt STRLIST eine Nachricht (erster Parameter der Callback-Procedure) über die STRLIST der CB-Procedure mitteilt, was es denn genau haben will.
Ist msg ==  M2_STRLIST_MSG_GET_STR, dann hält der zweite Parameter die Nummer der Zeile, zu der STRLIST gerne den String hätte. Siehe auch das Referenz-Handbuch:
http://code.google.com/p/m2tklib/wiki/elref#STRLIST

Code: [Select]

uint8_t el_bw_first = 0;
uint8_t el_bw_cnt = BW_TOTAL;


Darüber werden die Informationen
1. Wie viele Elemente gibt es denn insgesamt?
3. Welches ist das erste sichtbare element?
angegeben. Beides sind Variablen im Hauptspeicher, die sich jederzeit manuell ändern lassen bzw von STRLIST auch selbst aktualisiert werden. Man kann so beispielsweise in el_bw_first immer nachlesen welches das erste sichtbare Element ist (Achtung: Das ist nicht das Element, auf dem gerade der Cursor steht!). Man kann durch Änderung von el_bw_cnt auch die Liste dynamisch vergrößern (das ist aber nur selten sinnvoll...)

Code: [Select]
if ( msg == M2_STRLIST_MSG_SELECT ) {
    brennweite = idx; (...)

Quote

Sowas muss man also immer bei Eingaben und die dazugehörige Speicherung der Eingabe machen, oder? Sonst kommt diese ewige Schleife..richtig?


Zunächst mal: Das ist die zweite Aufgabe der Callback-Funktion: Die bekommt mitgeteilt, dass der Benutzer eine bestimmte Zeile angeklickt hat. In diesem Falle enthält der zweite Parameter die Nummer der angeklickten Zeile (beginnend mit 0, die erste Zeile hat also die Nummer 0).

Wenn Du die Nachricht von STRLIST ignorierst, passiert gar nichts. Aber in diesem Falle speichern wir einfach die vom  Benutzer ausgewählte Brennweite ab.

Code: [Select]

M2_STRLIST(el_bw, "l4w12", &el_bw_first, &el_bw_cnt, el_bw_getstr);
M2_SPACE(el_space, "w1h1");
M2_VSB(el_bw_vsb, "l4w1r1", &el_bw_first, &el_bw_cnt);
M2_LIST(list_bw) = { &el_bw, &el_space, &el_bw_vsb };
M2_HLIST(el_bw_hlist, NULL, list_bw);


Diese Variablen sind die sogenannten Elemente von M2tk. Die sind (wie auch die Funktionen) in M2tk.h (bzw m2.h) definiert. Alle Elemente sind hier:
http://code.google.com/p/m2tklib/wiki/elref
definiert. Meist auch mit einem Beispiel

Es wird hier das gesamte Layout und das Verhalten des Menüs definiert.

Hier ist das entsprechende Tutorial:
http://code.google.com/p/m2tklib/wiki/t02lc


Grüße,
Oliver

olikraus

Ich glaube eine Frage bezüglich dieses Codes war noch offen.
Code: [Select]
M2_STRLIST(el_bw, "l4w12", &el_bw_first, &el_bw_cnt, el_bw_getstr);
M2_SPACE(el_space, "w1h1");
M2_VSB(el_bw_vsb, "l4w1r1", &el_bw_first, &el_bw_cnt);
M2_LIST(list_bw) = { &el_bw, &el_space, &el_bw_vsb };
M2_HLIST(el_bw_hlist, NULL, list_bw);


Zunächste einmal: Es gibt Listen und Elemente.
Alles was "M2_LIST" heisst, sind Listen, alles andere sind Elemente.

Die ersten beiden Argumente der Elemente sind immer gleich:
1. Name des Elementes
2. Ein Format String

Über den Namen kann das Element später referenziert werden. Achtung: Elemente werden immer über &Name referenziert. (Bei Listen ist es nur der Name!)

Der Format String enthält zusätzliche Angaben in der Form "Buchstabe" + "Zahl"
Beispielsweise bedeutet
"w1": Breite (Width) von einem Zeichen
"l4": Anzahl der Zeilen (Lines) von 4
"r1": Read-Only
Die genaue Bedeutung steht jeweils bei der Elementbeschreibung

Hier nochmals die Beschreibung des STRLIST Elements:
http://code.google.com/p/m2tklib/wiki/elref#STRLIST
Dort steht beispielsweise, dass der "l" Parameter notwendig (required) ist. Man muss das also angeben. Klar, sonst weiss nämlich m2tklib nicht, wie viele Zeilen dargestellt werden sollen.

Der Format-String selbst, ist hier beschrieben:
http://code.google.com/p/m2tklib/wiki/elref#Element_Format_String

Betrachten wir nochmal kurz das Ergebnis:


Ganz rechts ist eine Spalte mit dem Scrollbalken. Das Ding heisst VSB (vertical scroll bar) und ist hier dokumentiert:
http://code.google.com/p/m2tklib/wiki/elref#VSB

Die ersten beiden Parameter sind die üblichen:
Code: [Select]

M2_VSB(el_bw_vsb, "l4w1r1", &el_bw_first, &el_bw_cnt);

Er ist 4 Zeichen hoch ("l4") ein Zeichen breit ("w1") und soll nicht veränderbar durch den User sein ("r1").
Über die beiden folgenden Parameter drei und vier kommuniziert die VSB mit der STRLIST. Sozusagen ist die Scrollbar über diese beiden Variablen mit der Liste verknüpft und die VSB zeigt den passenden Ausschnitt am Display an.

Links neben der VSB befindet sich eine leere Spalte. Diese wurde mit M2_SPACE erzeugt. SPACE bekommt nur die bekannten zwei parameter. Wiederum definiert der Format-String "w1h1" die Größe des Leerraums.
Über "w1" ist also festgelegt, dass eine Spalte belegt ist.

Ganz links ist die STRLIST, die hier den größten Raum beansprucht. Auf meinem 16x4 Display sind das 14 Spalten.
Code: [Select]

M2_STRLIST(el_bw, "l4w12", &el_bw_first, &el_bw_cnt, el_bw_getstr);

Die Breitenangabe "w12" gibt übrigens die Netto-Breite an, also ohne den Platz für den Cursor (die eckigen Klammern). Die Breite der STRLIST ist also tatsächlich 12+2= 14 Spalten. An dritter und vierter Parameterstelle folgen wieder die beiden Variablen, über die die STRLIST mit der VSB kommuniziert (wenn denn eine VSB da ist. Wenn keine VSB da ist, braucht die STRLIST aber die Parameter trotzdem) Auch hier wird über & die Adresse der Variablen übergeben und nicht der Inhalt der Variablen. Als fünfter und letzter Parameter wird dann die Callback-Prozedur übergeben (siehe oben).

Jetzt müssen noch diese drei Elemente gelayoutet werden. Dazu bietet M2tk diverse Kontainer-Elemente an. Dies sind derzeit:
- XYLIST --> Manuelles Plazieren der Elemente per (x,y) Koordinate
- VLIST --> Automatisches Plazieren vertikal
- HLIST --> Automatisches Plazieren horizontal
- GRIDLIST --> Automatisches Plazieren als Matrix

Damit die Kontainer arbeiten können, muss ihnen eine Liste der Elemente übergeben werden. Das ist die angesprochene M2_LIST.
- M2_LIST klammert mehrere Elemente
- Die Reihenfolge der Elemente in der M2_LIST kann wichtig sein (für VLIST, HLIST und GRIDLIST)
- M2_LIST selbst ist KEIN Element.

Nochmal der Code:
Code: [Select]

M2_LIST(list_bw) = { &el_bw, &el_space, &el_bw_vsb };
M2_HLIST(el_bw_hlist, NULL, list_bw);


Die Liste bekommt einen Namen "list_bw". Die Elemente stehen (wie in C üblich) zwischen { und }. Die Elemente werden über den & Operator referenziert. Da später die HLIST verwendet wird, ist die Reihenfolge wichtig: Zuerst (ganz links) die STRLIST (el_bw), dann das SPACE und am Schluß die VSB.

Schließlich wird am Schluss das Kontainer-Element selbst definiert: Eine HLIST ordnet das ganze horizontal (von links nach rechts) an. Einen Format-String bekommt die HLIST nicht, deshalb wird NULL übergeben, was soviel heisst wie: "Es gibt keinen Format String". Als dritter Parameter muss die Liste angegeben werden: Achtung: KEIN & für die Listen.

So, das war mein Versuch Deine Fragen zu beantworten. Wer auch immer es bisher mit dem Lesen geschafft hat: Vielen Dank und viel Spass mit M2tklib

Oliver



Sim0n

Vielen Dank Oliver!

Ich finds sehr kompliziert..ich habs versucht nachzuvollziehen, aber es fällt mir sehr schwer.
Andere Möglichkeiten gibt es nicht - oder?

Mh... Tut mir Leid das ich so "schwer vom Begriff" bin - aber glaub mir, ich habs versucht es zu verstehen und habe auch lange zum verstehen gebraucht - aber es hat nichts genützt.
Ich versteh einigermaßen was du programmiert hast, könnte es aber nicht nachprogrammieren.  :~

Go Up