Kann mir jemand helfen so eine Chat-Queue zu erstellen?
ich bekomme meine daten ( als string ) und möchte die nun in einer schlange anzeigen, bei der die neuste nachrichten ganz unten steht und die älteren bei jeder neuen weiter nach oben wandern.
für eine schnell hilfe bin ich euch sehr dankbar
könntest deine Nachrichten in einem Stringfeld speichern
DIM Message$[1]
// wenn eine Nachricht reinkommt als String, dann diese einfügen
DIMPUSH Message$[], newMessage$
// in einem bestimmten Bildschirmbereich könntest du dann z.B. immer die letzen 10
// Nachrichten darstellen
last_message = BOUNDS(Message$[], 0)
FOR i = last_message - 10 TO lastmessage
PRINT Message$[i], 0, i * 30
NEXT
meintest du so etwas in der Art? Nicht hauen, wenn Fehler drin sind, hab zur Zeit kein GLBasic zur Hand zum probieren.
Exact. Und wenn die Schlange nur 10 Dinge haben soll:
IF BOUNDS(Message$[], 0) > 10
DIMDEL Message$[], 0
ENDIF
...wow, sind die neuen DIMPUSH/DIMDEL Befehle klasse :D
Übrigens, ihr kennt schon:
FOREACH msg$ IN Messages$[]
PRINT msg$, 0, y
y=y+font_size_y
NEXT
FOREACH ist (ok, hier bisserl ein Schmarrn) viel schneller als FOR i= .., weil ich intern nur den Zeiger inkrementiere statt eine Feldabfrage, die ja eine Multiplikation braucht.
Sorry, das hat hier gar nix mit dem Thema zu tun...
ein kleines Beispiel für einen Chat:
LOCAL Message$[] // die gesammelen Nachrichten
LOCAL newmsg$ // die aktuelle Eingabe
LOCAL aktuell, fontx, fonty
GETFONTSIZE fontx, fonty // die Höhe des Zeichensatzes wird noch gebraucht
WHILE TRUE
FILLRECT 0, 0, 640, 460, RGB(0, 0, 255) // Bereich für die Ausgabe
FILLRECT 0, 465, 640, 480, RGB(255, 255, 0) // Bereich für die Eingabe
IF KEY(14) // Backspace gedrückt, dann das letzte Zeichen löschen
IF LEN(newmsg$)
newmsg$ = MID$(newmsg$, 0, LEN(newmsg$) - 1)
WHILE KEY(14); WEND // Tastaturpuffer leeren
ENDIF
ELSEIF KEY(28) // Enter gedrückt, dann Eingabe in Ausgabe schieben
DIMPUSH Message$[], newmsg$
newmsg$ = "" // und Eingabefeld löschen
WHILE KEY(28); WEND // Tastaturpuffer leeren
ELSE
a$ = INKEY$() // eigentliche Zeicheneingabe
IF a$ <> "" THEN newmsg$ = newmsg$ + a$
ENDIF
aktuell = BOUNDS(Message$[], 0) // Anzahl der bereits getätigten Eingaben
starty = 460 - fonty // Startpunkt für die Ausgabe
WHILE aktuell AND starty > 0 // jetzt solange die eingegebenen Texte ausgeben
PRINT Message$[aktuell-1], 0, starty // bis entweder keine weiteren Zeilen vorhanden sind
DEC starty, fonty + 2 // oder über den oberen Bildschirmrand geschrieben würde
DEC aktuell, 1
WEND
PRINT newmsg$, 0, 467 // jetzt noch Eingabefeld aktualisieren
SHOWSCREEN // und anzeigen
WEND
END // fäddisch
@Gernot
FOREACH ist ja schön ;), aber ich denke in dem Fall nur dann hilfreich, wenn man wirklich nur eine bestimmte Anzahl an Zeilen speichert, es sei denn, du bringst noch einen Zusatz rein, daß man das Feld von hinten nach vorne durchlaufen kann :)
Wow Quentin, bin überrascht!
Nice Work !
ich glaub ich hab ne blockade :(
ich geb euch mal meinen code in der main schleife:
WHILE TRUE
DRAWLINE 0, 570, 800, 570, RGB(255,255,255)
DRAWLINE 620, 0, 620, 570, RGB(255,255,255)
PRINT ty, 0,0
num = SPLITSTR(ausgabe$, text$[], "\r\n")
FOR i = 0 TO num-1
nick_position = INSTR(text$[i], "!")
nick_text$ = MID$(text$[i], 1, nick_position-1)
position = INSTR(text$[i], "PRIVMSG #Hiro :")
length = LEN(text$[i])
test$ = MID$(text$[i], position+15, (length-position))
IF position > -1
los$ = "|11:49:59| "+nick_text$+": "+test$
DIMPUSH Message$[], los$
los$ = ""
aktuell = BOUNDS(Message$[], 0) // Anzahl der bereits getätigten Eingaben
starty = 540 - fonty // Startpunkt für die Ausgabe
WHILE aktuell AND starty > 0 // jetzt solange die eingegebenen Texte ausgeben
PRINT Message$[aktuell-1], 0, starty // bis entweder keine weiteren Zeilen vorhanden sind
DEC starty, ty + 2 // oder über den oberen Bildschirmrand geschrieben würde
DEC aktuell, 1
WEND
ENDIF
NEXT
IF Active() = 1 THEN InputX(0,580)
SHOWSCREEN
WEND
SDL_Quit_GL()
wenn ich jetzt einen txt bekomme in dem die oben genannten kretierien drin sind füllt der damit die ganze queue :(
irgendwelche vorschläge?
hmmm, was steht denn in Ausgabe$ drin? Ist das die komplette Queue als ein langer String oder nur die akutell eingegebene Zeile eines Benutzers?
ausgabe hat den kompletten satz der vom server kommt.
der wird getrennt nach zeilen enden. dann wird die position des nicknames gesucht und gespeichert und dann den text dazu.
heraus kommt nick_text$ und test$. die pack ich mit los$ = "|11:49:59| "+nick_text$+": "+test$ in die perfekte zeile.
und die will ich ausgeben in einer queue
Du musst, wenn Du fertig bist Ausgabe$ wieder löschen, falls keine neue NAchricht vorliegt, oder?
wenn ich ausgabe leere dann verschwindet auch der text sofort... irgendwo muss da noch einbug drin sein. :(
mit Trockenübungen tue ich mich immer ein wenig schwer, aber versuch doch mal die WHILE - WEND - Schleife für die Ausgabe des Textes außerhalb der FOR - NEXT - Schleife, in der dein Text aufbereitet wird, zu setzen.
Bringt leider auch nichts quentin... trotzdem danke euch allen.
ich muss mir wohl ne neue zerflück methode einfallen lassen
Dein code ist:
Ausgabe$="ein Text"
WHILE TRUE
SPLITSTR(Ausgabe$, feld$[], "\r\n")
FROEACH a$ IN feld$[]
...
NEXT
WEND
Aber!: Bei dem WEND hat Ausgabe$ immer noch den gleichen Wert wie vorher. Den musst Du also vorher löschen, oder wieder neu vom Server laden. Aber zus Sicherheit würde ich vor dem WEND ein: Ausgabe$="" machen.
dein code versteh ich nicht Gernot. hab noch nie mit foreeach gearbeitet. magst du mir vielleicht damit helfen?
Ja, OK. Aber Du hast FOR i = 0 TO num-1. Das Problem ist, dass nach dieser Schleife die Variable "Ausgabe$" immer noch den gleichen Wert hat. Und dann bei WHILE/WEND eben immer wieder das gleiche passiert.
ok Update:
SPLITSTR(ausgabe$, feld$[], "\r\n")
FOREACH a$ IN feld$[]
nick_position = INSTR(a$, "!")
nick_text$ = MID$(a$, 1, nick_position-1)
text_position = INSTR(a$, "PRIVMSG #Hiro :")
text_Length = LEN(a$)
text_text$ = MID$(a$,text_position+15, (text_length-text_position))
SPLITSTR(zeit$, time$[], " ")
IF text_position > -1
los$[0+c] = "|"+time$[1]+"| "+nick_text$+": "+text_text$
c = c+1
ENDIF
NEXT
ausgabe$ = ""
PRINT c,0,0
FOR g = 0 TO 40-1
PRINT los$[g],0,540-(g*ty)
NEXT
FOR h = 40 TO 1
los$[h] = los$[h-1]
NEXT
damit kann ich zwar eine queue aufbauen jedoch fehlt jetzt der text der geschrieben wurde :(
nickname und zeit sind da und werden angezeigt
und nach 42 zeilen kackt das ganze ab... ich hab heute irgendwie mal wieder ne blockade *heul*
Quote from: trucidareund nach 42 zeilen kackt das ganze ab...
Schalt' den Debugger ein und lass' laufen. Dann siehst Du wo's abstürzt.
problem das der text nicht angezeigt wird gefixt!
das programm schmiert ab weil ich keine felder mehr nach oben hin habe. dim los$[41]
ich arbeite gerade an einer lösung das nach 40 zeilen der kram gelöscht wird
dimdel los$[], 0