GLBasic forum

Other languages => GLBasic - de => Topic started by: trucidare on 2007-Jul-04

Title: Chat-Queue
Post by: trucidare on 2007-Jul-04
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
Title: Chat-Queue
Post by: Quentin on 2007-Jul-04
könntest deine Nachrichten in einem Stringfeld speichern

Code (glbasic) Select
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.
Title: Chat-Queue
Post by: Kitty Hello on 2007-Jul-04
Exact. Und wenn die Schlange nur 10 Dinge haben soll:
Code (glbasic) Select
IF BOUNDS(Message$[], 0)  > 10
   DIMDEL Message$[], 0
ENDIF
...wow, sind die neuen DIMPUSH/DIMDEL Befehle klasse :D

Übrigens, ihr kennt schon:
Code (glbasic) Select
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...
Title: Chat-Queue
Post by: Quentin on 2007-Jul-04
ein kleines Beispiel für einen Chat:

Code (glbasic) Select
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 :)
Title: Chat-Queue
Post by: Schranz0r on 2007-Jul-04
Wow Quentin, bin überrascht!

Nice Work !
Title: Chat-Queue
Post by: trucidare on 2007-Jul-05
ich glaub ich hab ne blockade :(

ich geb euch mal meinen code in der main schleife:

Code (glbasic) Select
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?
Title: Chat-Queue
Post by: Quentin on 2007-Jul-05
hmmm, was steht denn in Ausgabe$ drin? Ist das die komplette Queue als ein langer String oder nur die akutell eingegebene Zeile eines Benutzers?
Title: Chat-Queue
Post by: trucidare on 2007-Jul-05
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
Title: Chat-Queue
Post by: Kitty Hello on 2007-Jul-05
Du musst, wenn Du fertig bist Ausgabe$ wieder löschen, falls keine neue NAchricht vorliegt, oder?
Title: Chat-Queue
Post by: trucidare on 2007-Jul-05
wenn ich ausgabe leere dann verschwindet auch der text sofort... irgendwo muss da noch einbug drin sein. :(
Title: Chat-Queue
Post by: Quentin on 2007-Jul-05
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.
Title: Chat-Queue
Post by: trucidare on 2007-Jul-05
Bringt leider auch nichts quentin... trotzdem danke euch allen.
ich muss mir wohl ne neue zerflück methode einfallen lassen
Title: Chat-Queue
Post by: Kitty Hello on 2007-Jul-05
Dein code ist:
Code (glbasic) Select
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.
Title: Chat-Queue
Post by: trucidare on 2007-Jul-06
dein code versteh ich nicht Gernot. hab noch nie mit foreeach gearbeitet. magst du mir vielleicht damit helfen?
Title: Chat-Queue
Post by: Kitty Hello on 2007-Jul-06
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.
Title: Chat-Queue
Post by: trucidare on 2007-Jul-06
ok Update:

Code (glbasic) Select
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*
Title: Chat-Queue
Post by: Kitty Hello on 2007-Jul-06
Quote from: trucidareund nach 42 zeilen kackt das ganze ab...
Schalt' den Debugger ein und lass' laufen. Dann siehst Du wo's abstürzt.
Title: Chat-Queue
Post by: trucidare on 2007-Jul-06
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
Title: Chat-Queue
Post by: Kitty Hello on 2007-Jul-06
dimdel los$[], 0