Typisches Familien Problem mit Eltern und Kindern
Übersicht

![]() |
Markus RosséBetreff: Typisches Familien Problem mit Eltern und Kindern |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, hier geht es um Types, Parents und Chilts, nichts dass verwechslungen auftreten ;)
Ich habe ein Parent Code: [AUSKLAPPEN] Type V2D_Object Field x#,y# Field visible Field r Field g Field b Field lines.V2D_Lines End Type und ein Child Code: [AUSKLAPPEN] Type V2D_Lines Field x1#,x2# Field y1#,y2# End Type Erstellen von Objekten geht alles ohne weiteres und auch das aufrufen.. leider nur mit einem Problem. Wenn ich zB. das Objekt skalieren will, werden nicht nur die V2D_Lines des gewünschten V2D_Objects gewählt, sondern ALLE die es überhaupt gibt. Code: [AUSKLAPPEN] Function V2D_ScaleObject(id,s#) obj.V2D_Object=Object.V2D_Object(id) For obj\lines=Each V2D_Lines obj\lines\x1#=obj\lines\x1#*s# obj\lines\y1#=obj\lines\y1#*s# obj\lines\x2#=obj\lines\x2#*s# obj\lines\y2#=obj\lines\y2#*s# Next End Function Das Problem liegt an For obj\lines=Each V2D_Lines, wie ich durch die Forensuche herausfinden konnte. Doch leider gab es keine befriedigende Lösung. Weiss jemand, wie ich dieses Problem verhindern kann? Ich will immer nur die V2D_Lines vom angegebenen Parent. [edit] Sorry, falsches Forum, kann einer nach Allgemein verschieben? cu, Markus Rossé |
||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Markus!
Ich hab im moment auch das Problem...ich hab leider auch noch keine lösung gefunden...ich glaube der Each Pointer is dazu nicht flexibel genug...aber vielleicht kann uns beiden ja noch wer helfen ![]() |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn du explizite Zuordnung von Parent und Child willst, musst du beim Parent einen Array des Childs einfügen
Also field lines.V2D_Lines[10] wenn es maximal 10 childs haben soll. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das problem ist: wenn ich ein parent hab und dann ein child nun eine instanz des parents mache und 5 des childs... nun mache ich noch eine parent instanz und wieder 5 des childs...nun will ich per pointer each nur auf die instanzen, welche die childs von dem ersten parent sind zugreifen, was aber nicht (meines wissens) funktioniert, weil each immer alle nimmt und ihm parent child kram egal ist selbst wenn man es so schreib wie markus und ich! | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Um nur die Childs eines Parents durchzugehen, kann man diese doch untereinander verlinken. Der Parent benötigt einen Eintrag "First_Child" und jedes Child benötigt den Eintrag "Next_Child". In der Schleife springt man nun zu Anfang zum First_Child des Parent und dann sollange zum Next_Child weiter, bis dieses Null ist. Das erfordert allerdings etwas Aufwand in der Verwaltung, denn wenn zb. ein Child gelöscht werden soll, dass sich mittendrin in dieser Kette befindet, dann muss das in der Kette vor diesem Child liegende Child (eventuell kann das auch der Parent sein) auf das Folge-Child des zu löschenden umlinken. Um letzteres zu vereinfachen, könnte man auch zusätzlich noch einen Eintrag für das vorherige Child anlegen. | ||
- Zuletzt bearbeitet von Ava am So, Jan 29, 2006 20:53, insgesamt einmal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Darum einen Array mit den Childs im Parenttype anstatt nur 1 Child. Dann kannst du beim Parent die Childs durchgehen anstatt alle Childs durchgehen zu müssen.
Die einzige einschränkung ist, dass du nur eine feste Anzahl Childs pro Parent haben kannst, da BlitzArrays (Erkennbar an den []) leider nicht vergrössert und verkleinert werden können. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Meine Methode funktioniert genauso gut und ist dazu nicht an eine vorfestgelegte maximale Child-Anzahl gebunden. *zwinker* | ||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
uff und dann wären wir mal wieder beim leidigen thema verkettete listen...*kotz* ich hasse die dinger! naja danke auf jedenfall^^ werd mir das mal durch den kopf gehen lassen! | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oder einfach beim child ein Field parent.V2D_Object einfügen
und dann Code: [AUSKLAPPEN] obj.V2D_Object=Object.V2D_Object(id)
For obj\lines=Each V2D_Lines If obj\lines\parent = obj ... ... End If Next @Ava: Ja ich weiss, deins ist schneller weil man dann in der Schleife nicht alle durchgeht, dafür dürfte es bei deinem Probleme geben wenn man einzelne Childs löschen will. |
||
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle! Fraget euren Arzt oder Apotheker! |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Das ist natürlich die einfachste Variante. Einen direkten Link sollte ein Child zum Parent eh immer haben. Ich habe den Beitrag ehrlich gesagt nicht komplett gelesen und war davon ausgegangen, dass dies selbstverständlich sei. ![]() Das "Problem" mit dem Löschen eines Childs habe ich ja auch bereits erwähnt und einen entsprechenden Lösugsvorschlag erwähnt. Und eigentlich ist das auch alles ganz einfach und gar nicht so kompliziert und aufwendig, wie man vielleicht denkt. |
||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mit BEFORE / AFTER hat man ja schon die notwendigen Befehle um sich manuell durch eine solche Kette von Childs zu hangeln.
Man braucht bei der Childliste also nur noch einen "Einsprungpunkt". Das Problem hier ist, dass vor dieses erste Child ja ein weiteres der gleichen Gruppe eingefügt werden könnte oder überhaupt kein Child vorhanden ist. Man müsste also den Einsprung-"Pointer" umständlich verwalten. Daher mache ich das so, dass in der Childliste für jedes Parentobjekt ein eigener Dummy-Eintrag angelegt wird, auf welchen das Parentobjekt linkt. Hinter diesem Dummy-Eintrag werden dann die eigentlichen Datensätze zu diesem Parentobjekt angelegt. Mit AFTER kann man dann ganz leicht durch die Liste gehen, solange bis der nächste Dummyeintrag gefunden wurde und damit die Liste des nächsten Elternobjekt beginnt. So können die Childs leicht eingefügt/verschoben/gelöscht werden, ohne dass hier groß verwaltet werden muss. Dadurch ist diese Lösung auch sehr schnell. Hier mal mein übliches Fruchtbeispiel(sieht komplizierter aus als es ist): Code: [AUSKLAPPEN] Const TYPE_ENTRY = 0 Const TYPE_INSTANCE = 1 SeedRnd MilliSecs() Global Cnt_Instance Type Frucht Field Typ; 0=Entry 1=Instance ; Könnte man auch in Name oder Gewicht verstecken Field Name$ Field Gewicht End Type Type Baum Field Name$ Field Frucht.Frucht End Type ;Bäume erzeugen abaum.baum = CreateBaum("Apfelbaum", "Apfel") bbaum.baum = CreateBaum("Birnbaum", "Birne") kbaum.baum = CreateBaum("Kirschbaum", "Kirsche") pbaum.baum = CreateBaum("Pflaumenbaum", "Pflaume") ;Früchte erzeugen For b.baum = Each baum Anzahl = Rand(2,7) For i = 1 To Anzahl CreateFrucht(b,Rand(50,250)) Next Next ;Früchte je Baum ausgeben For b.baum = Each baum Print b\name$ f.frucht = After b\frucht While f <> Null If f\Typ = TYPE_INSTANCE Then Exit Print " " + f\Name$ + " " + f\Gewicht + "g" f.frucht = After f.frucht Wend Next WaitKey() ;Ende Hauptprogramm Function CreateBaum.Baum(Baumname$, Fruchtname$) Local b.Baum b = New Baum b\Name$ = Baumname$ b\Frucht = CreateFruchtInstance(Fruchtname$) Return b End Function Function CreateFruchtInstance.Frucht(Fruchtname$) Local f.Frucht f = New Frucht f\typ = TYPE_INSTANCE f\Name$ = Fruchtname$ Return f End Function Function CreateFrucht.Frucht(Baum.Baum, Gewicht) Local f.Frucht Local h.Frucht If baum.baum = Null Return Null h = baum\frucht f = New Frucht f\typ = TYPE_ENTRY f\Name$ = h\name$ f\Gewicht = Gewicht Insert f After baum\frucht Return f End Function |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Alternative mit Links
Code: [AUSKLAPPEN] Type t_eltern
Field name$ Field erstes_kind.t_kind Field letztes_kind.t_kind End Type Type t_kind Field name$ Field eltern.t_eltern Field naechstes_kind.t_kind Field vorheriges_kind.t_kind End Type ; ------------------------------------------------------------------------- Local eltern_1.t_eltern Local eltern_2.t_eltern Local eltern_3.t_eltern eltern_1 = neue_eltern("Müller") neues_kind("Hans", eltern_1) neues_kind("Klaus", eltern_1) neues_kind("Jürgen", eltern_1) eltern_2 = neue_eltern("Maier") neues_kind("Maria", eltern_2) neues_kind("Hannes", eltern_2) eltern_3 = neue_eltern("Schulz") neues_kind("Eberhard", eltern_3) neues_kind("Hannelore", eltern_3) neues_kind("Ingrid", eltern_3) neues_kind("Manfred", eltern_3) ; ------------------------------------------------------------------------- SeedRnd MilliSecs() Graphics 640, 480, 16, 2 SetBuffer BackBuffer() ; ------------------------------------------------------------------------- Repeat Cls Text 20, 20, "<F1 bis F3> Kinder weg ... <1 bis 3> Neues Kind" eltern_auflisten(80, 80) If KeyHit(59) Then kind_weg(eltern_1\erstes_kind) If KeyHit(60) Then kind_weg(eltern_2\erstes_kind) If KeyHit(61) Then kind_weg(eltern_3\erstes_kind) If KeyHit(2) Then neues_kind(Zufallsname(), eltern_1) If KeyHit(3) Then neues_kind(Zufallsname(), eltern_2) If KeyHit(4) Then neues_kind(Zufallsname(), eltern_3) Flip Until KeyHit(1) : End ; ------------------------------------------------------------------------- Function neue_eltern.t_eltern(name$) Local eltern.t_eltern = New t_eltern eltern\name = name Return eltern End Function ; ------------------------------------------------------------------------- Function neues_kind.t_kind(name$, eltern.t_eltern) Local kind.t_kind = New t_kind kind\name = name kind\eltern = eltern If Not eltern\letztes_kind = Null kind\vorheriges_kind = eltern\letztes_kind eltern\letztes_kind\naechstes_kind = kind eltern\letztes_kind = kind Else eltern\erstes_kind = kind eltern\letztes_kind = kind EndIf Return kind End Function ; ------------------------------------------------------------------------- Function kind_weg(kind.t_kind) If kind = Null Then Return If Not kind\vorheriges_kind = Null kind\vorheriges_kind = kind\naechstes_kind EndIf If kind\eltern\erstes_kind = kind kind\eltern\erstes_kind = kind\naechstes_kind EndIf If kind\eltern\letztes_kind = kind kind\eltern\letztes_kind = kind\vorheriges_kind EndIf Delete kind End Function ; ------------------------------------------------------------------------- Function eltern_auflisten(x = 0, y = 0, mit_kinder = True) Local eltern.t_eltern For eltern = Each t_eltern Text x, y, "Familie " + eltern\name If mit_kinder Then y = kinder_auflisten(eltern, x + 20, y) y = y + 40 Next End Function ; ------------------------------------------------------------------------- Function kinder_auflisten(eltern.t_eltern, x = 0, y = 0) Local kind.t_kind = eltern\erstes_kind While Not kind = Null y = y + 20 Text x, y, "- " + kind\name + " " + eltern\name kind = kind\naechstes_kind Wend Return y End Function ; ------------------------------------------------------------------------- Function Zufallsname$() Local name$ = Chr(Rand(65,90)) Local laenge = Rand(3, 6) Local i For i = 2 To laenge name = name + Chr(Rand(97,122)) Next Return name End Function ; ------------------------------------------------------------------------- |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group