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

![]() |
FirstdeathmakerBetreff: Kleiner Fehler den ich nicht finde... (Fields&Types) |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Mit solchen Listen kannst du auch Stacks und Rings herstellen. Kann man schonmal brauchen. Jake |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group