Kleiner Fehler den ich nicht finde... (Fields&Types)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Firstdeathmaker

Betreff: Kleiner Fehler den ich nicht finde... (Fields&Types)

BeitragFr, Jul 23, 2004 1:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Folgendes Problem: Das Programm soll die Basis eines Chatprogramms werden (Übungszweck). Später sollen auch mehrzeilige Beiträge möglich sein, und diese speichere ich in einem Subfeld. Ein Beitrag ist dann ungefähr so aufgebaut:

Textmessage
Informationen enthalten: Farbe
Textfeld
Text(Subfeld)
Text
Text

Ein Text der Nachher angezeigt werden soll, wird zunächst in ein Temporäres Feld geschrieben (Befehl AddToTmpTextbox(denText)) und nachher werden alle Daten in das richtige übertragen (Befehl SendToTextbox(Farbwert))

Das Problem: Wenn ich das Programm starte und als Test 2 Zeilen hineinschreib, zeigt er nachher nur die letzte der beiden Zeilen doppelt an. Woran liegt das?

Hier der Code:

Code: [AUSKLAPPEN]
; Netzwerkkommunikationsprogramm (Chat)


;Globale Variablen erstellen
Global Textposition
Global Font_Size=11
Global Font_Space#=1.1
Global SCREEN_X=300
Global SCREEN_Y=600

Global current_input$



;Textfelder erstellen
Type Textmessage
   Field message.message
   Field text_Color$
End Type
Global Textmessage.Textmessage

Type message
   Field msg$
End Type

;TMP_Textfeld erstellen
Type TMP_text
   Field TMP_msg$
End Type
Global TMP_text.TMP_text

;system_options:
Sys_msg_color$=$66CC00

Graphics SCREEN_X,SCREEN_Y,16,2
SetBuffer BackBuffer()
ClsColor 255,255,255


AddToTmpText("Test")
AddToTmpText("2te Zeile")
SendToTextbox($FF0000)




Repeat
Cls
Textbox()
Inputtext()
Flip
;Stop
Until KeyHit(1)



End





Function Textbox()
Textpos_tmp#=Font_Size-Textposition
Textcounter=0

For Textmessage.Textmessage=Each Textmessage
   Color 0,0,Textmessage\Text_color
   For message.message=Each message
      Text 10,Textpos_tmp,Textmessage\message\msg
      Textpos_tmp=Textpos_tmp+(Font_Size*Font_Space)
      Textcounter=Textcounter+(Font_Size*Font_Space)
   Next
Next

If Textcounter>SCREEN_Y Textposition=(Textcounter+3*Font_Size)-SCREEN_Y
End Function

Function AddToTmpText(Stringtext$)
TMP_text.TMP_text=New TMP_text
TMP_text\TMP_msg=Stringtext
End Function

Function SendToTextbox(Color_ID$)
Textmessage.Textmessage=New Textmessage
   For TMP_text.TMP_text=Each TMP_text
      Textmessage\message.message=New message
      Textmessage\message\msg=TMP_text\TMP_msg
      Delete TMP_text.TMP_text
   Next   
   Textmessage\Text_color=Color_ID
End Function

Function Inputtext()
Local zs
zs=GetKey()
If zs>31 And zs<128 current_input=current_input+Chr(zs)

;Text 10,SCREEN_Y-(FONT_SIZE*Font_Space),current_input
Text 50,SCREEN_Y-(FONT_SIZE*Font_Space),zs

End Function
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Dreamora

BeitragFr, Jul 23, 2004 1:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist die Funktion Textbox wo die innere Loop nicht sein dürfte.
Du speicherst ja die TextMsg als SubType, loopst allerdings durch alle Elemente von diesem Subtype, der NICHT auf "per Parenttype" Basis gespeichert ist.

Code: [AUSKLAPPEN]

Function Textbox()
Textpos_tmp#=Font_Size-Textposition
Textcounter=0

For Textmessage.Textmessage=Each Textmessage
   Color 0,0,Textmessage\Text_color
   For message.message=Each message
      Text 10,Textpos_tmp,Textmessage\message\msg
      Textpos_tmp=Textpos_tmp+(Font_Size*Font_Space)
      Textcounter=Textcounter+(Font_Size*Font_Space)
   Next
Next

If Textcounter>SCREEN_Y Textposition=(Textcounter+3*Font_Size)-SCREEN_Y
End Function


durch folgendes ersetzen


Code: [AUSKLAPPEN]

Function Textbox()
Textpos_tmp#=Font_Size-Textposition
Textcounter=0

For Textmessage.Textmessage=Each Textmessage
   Color 0,0,Textmessage\Text_color
   message.message=Textmessage\message
   Text 10,Textpos_tmp,message\msg
   Textpos_tmp=Textpos_tmp+(Font_Size*Font_Space)
   Textcounter=Textcounter+(Font_Size*Font_Space)
Next

If Textcounter>SCREEN_Y Textposition=(Textcounter+3*Font_Size)-SCREEN_Y
End Function
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Firstdeathmaker

BeitragFr, Jul 23, 2004 2:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, bei deinem Vorschlag verschwindet aber der erste Eintrag, den Loop muss ich schon durchlaufen lassen. Wie kann man es schreiben, dass der den Typ Textmessage nimmt, und alle zu diesem Typ gehörenden message.message ausgibt?
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Dreamora

BeitragFr, Jul 23, 2004 2:17
Antworten mit Zitat
Benutzer-Profile anzeigen
erm du hast zu jedem TextMessage nur genau 1 Msg, mehr hast du da garnicht

Sonst müsstest du die Msg als Array oder sonstwas definieren. Sprich bei deiner jetzigen Umsetzungen kannst du Msg auch grad so gut als String nehmen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Firstdeathmaker

BeitragFr, Jul 23, 2004 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach so, dann ist das also garnicht möglich. Vielen Dank, dann werde ich mir was anderes überlegen...
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Dreamora

BeitragFr, Jul 23, 2004 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Was du machen kannst ist mit den messages eine linked list erzeugen, die du dem TextMessage anhängst, das geht und dürfte das sein was du erreichen möchtest.

Google einfach ma nach Linked List sofern du nicht weisst, was das ist
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Markus2

BeitragFr, Jul 23, 2004 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich würde das so machen :

Type MessageType
Field Msg$
Field TColor
field SubText
End Type
Global Msg.MessageType

Wenn der Text zu dem Text drüber gehört das SubText auf 1 setzen .

In einer Funk. ungefähr so ausgeben

Code: [AUSKLAPPEN]


function MsgShowAll()

 local m.MessageType
 local ms.MessageType

 m=Msg
 for m.MessageType=each MessageType
  MsgOut m
  ms=m
  ms = after m ;<- den hatten wir ja schon 
  for ms.MessageType=each MessageType
   if ms\SubText=0 then exit
   MsgOut ms  ;<- das sind also Untertexte
  next
 next

end function
 

Dreamora

BeitragFr, Jul 23, 2004 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
ich versteh zwar net was das genau machen soll mangels gescheiter beschreibung. Es lässt sich nur sagen, das du nicht verständen hast, wie das ganze gehen soll.

Du darfst NICHT über die Each Type schleife gehen, da die automatisch alle von dem type ausgibt, nicht nur irgendwelche angehängte messages.

Darum sagte ich Google mal nach "Linked List"
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Firstdeathmaker

BeitragFr, Jul 23, 2004 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm ich hab bei Google nichts gescheites gefunden, nur irgend welche Regeln für eine Diplomarbeit zu diesem Thema, aber nicht die Diplomarbeit selber. Hier im Forum findet man auch keine genauen Beschreibungen dazu. Könnte mir da jmd weiterhelfen?
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Jake

BeitragFr, Jul 23, 2004 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Linked Lists mußt du dir wie eine Perlenkette vorstellen. Du betrachtest immer nur ein Element und kannst vor- und zurückwandern. Jedes Element hat also einen Vorgänger und einen Nachfolger. Der Vorgänger des ersten Elementes ist natürlich leer, genauso der Nachfolger des letzten.

In BB sähe das ungefähr so aus:
Code: [AUSKLAPPEN]

type Element
  field Inhalt$
  field Vorgaenger.Element
  field Nachfolger.Element
end type

function Anhaengen.Element (woran.Element,inhalt$)
; erstellt neues Element und hängt es an das übergebene Element an.
   this.element=new element
   this\Inhalt=inhalt
   this\Vorgaenger=woran
   this\Nachfolger=null
   woran\Nachfolger=this
  return this
end function

anfang.Element=Anhaengen (null,"A")
elem.Element=Anhaengen (anfang,"B")
elem=Anhaengen (elem,"C")
elem=Anhaengen (elem,"D")

; Alle Elemente ausgeben
elem=anfang
while elem<>null
 print elem\inhalt
 elem=elem\nachfolger
wend



Hoffe, ich hab keinen Flüchtigkeitsfehler drin, war aus der Hüfte getippt.
Du kannst natürlich noch Funktionen fürs Suchen, Einfügen, Rauslöschen etc... schreiben, aber ich hoffe, du hast das Prinzip jetzt mitgekriegt.
Denk immer an die Perlenkette Wink

Mit solchen Listen kannst du auch Stacks und Rings herstellen. Kann man schonmal brauchen.

Jake

Firstdeathmaker

BeitragSa, Jul 24, 2004 0:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, der Code funktioniert zwar nicht ganz, aber ich glaube ich hab es verstanden. Ich denke ich mach einfach folgendes:

Im Haupttext Type speichere ich wieviele Zeilen es haben soll.
Dann speichere ich im Haupttext die verknüpfung zum ersten zugehörigen Messageeintrag. (Soweit ich das verstanden habe übergibs du ja einen Handlewert, denn man ja nachher wieder benutzen kann um an diesen Eintrag ran zu kommen)

Dann speichere ich im Message Type den Text für eine Zeile und den Handlewert vom darauffolgenden.

Ok, ich versuch es mal so, vielen dank an alle die mir geholfen haben.

edit: So klappt es jetzt

Code: [AUSKLAPPEN]
; Netzwerkkommunikationsprogramm (Chat)
;Globale Variablen erstellen
Global Textposition
Global Font_Size=11
Global Font_Space#=1.1
Global SCREEN_X=300
Global SCREEN_Y=600

Global current_input$

;Felder/Types
Type Message
   Field Zeile$
   Field Nexthandle.Message
End Type

Type Textfeld
   Field Farbe
   Field Anfanghandle.Message
End Type

Global Eingetragen.Textfeld

Type selftext
   Field Zeile$
End Type

;system_options:
Global Sys_msg_color$=$66CC00
Global self_color$=$FF0000

Graphics SCREEN_X,SCREEN_Y,16,2
SetBuffer BackBuffer()
ClsColor 255,255,255


AddToselftext("Testzeile1")
AddToselftext("Testzeile2")
AddToselftext("Testzeile3")
SendToTextbox($0000FF)
AddToselftext("Testzeile1b")
AddToselftext("Testzeile2b")
AddToselftext("Testzeile3b")
SendToTextbox($FF0000)



Repeat
Cls
Textbox()
Inputtext()
Flip
Until KeyHit(1)



End





Function Textbox()
Textpos_tmp#=Font_Size-Textposition
Textcounter=0

For Eingetragen.Textfeld=Each Textfeld
   Color 0,0,Eingetragen\Farbe
   
      Message.Message=Eingetragen\Anfanghandle
      Text 10,Textpos_tmp,Message\Zeile
      Textpos_tmp=Textpos_tmp+(Font_Size*Font_Space)
      Textcounter=Textcounter+(Font_Size*Font_Space)

      While Message\Nexthandle.Message <> Null
         Message.Message=Message\Nexthandle
         Text 10,Textpos_tmp,Message\Zeile
         Textpos_tmp=Textpos_tmp+(Font_Size*Font_Space)
         Textcounter=Textcounter+(Font_Size*Font_Space)
      Wend
Next

If Textcounter>SCREEN_Y Textposition=(Textcounter+3*Font_Size)-SCREEN_Y
End Function

Function AddToselftext(Stringtext$)
selftext.selftext=New selftext
selftext\zeile=Stringtext
End Function

Function SendToTextbox(Color_ID$)
selftext.selftext=First selftext
If selftext.selftext <> Null

Textfeld.Textfeld=New Textfeld
   Textfeld\Farbe=Color_ID
   
   For selftext.selftext=Each selftext
      Message.Message=New Message
      If Textfeld\Anfanghandle=Null
         Textfeld\Anfanghandle=Message
      Else
         zs.message=Before Message
         zs\Nexthandle=Message
      EndIf
      
      Message\Zeile=Selftext\Zeile

      Delete selftext.selftext
   Next
EndIf
End Function

Function Inputtext()
Local zs
zs=GetKey()
If zs>31 And zs<128 current_input=current_input+Chr(zs)
If zs=13 And current_input<>""
   AddToSelftext(current_input)
   current_input=""
ElseIf zs=13 And current_input=""
   SendToTextbox(self_color)
EndIf

   
Color 0,0,self_color$
Text 10,SCREEN_Y-(FONT_SIZE*Font_Space+10),current_input


End Function
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Markus2

BeitragMo, Jul 26, 2004 12:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
ich versteh zwar net was das genau machen soll mangels gescheiter beschreibung. Es lässt sich nur sagen, das du nicht verständen hast, wie das ganze gehen soll.
Du darfst NICHT über die Each Type schleife gehen, da die automatisch alle von dem type ausgibt, nicht nur irgendwelche angehängte messages.
...



Meintest du jetzt mich ?
Wegen Each Schleife , darum ist das auch umgesetzt .
Also wenn die erste z.B. beim Eintrag 5 angelangt ist wird der
Pointer umgesetzt
und die zweite geht von 5-Ende bzw. bis keine Untertexte mehr kommen .
Damit wird die erste Schleife also nicht beeinflußt und kann
weiter fort fahren .
Nach der ersten müßte das noch so stehen
if ms\SubText=0 then MsgOut m

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group