Typisches Familien Problem mit Eltern und Kindern

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Markus Rossé

Betreff: Typisches Familien Problem mit Eltern und Kindern

BeitragSo, Jan 29, 2006 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 29, 2006 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

Dreamora

BeitragSo, Jan 29, 2006 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 29, 2006 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

Ava

Gast

BeitragSo, Jan 29, 2006 20:50
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

BeitragSo, Jan 29, 2006 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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.
 

Ava

Gast

BeitragSo, Jan 29, 2006 20:55
Antworten mit Zitat
Meine Methode funktioniert genauso gut und ist dazu nicht an eine vorfestgelegte maximale Child-Anzahl gebunden. *zwinker*

5k41

BeitragSo, Jan 29, 2006 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 29, 2006 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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!
 

Ava

Gast

BeitragSo, Jan 29, 2006 21:36
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. Rolling Eyes

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

BeitragSo, Jan 29, 2006 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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)
 

Ava

Gast

BeitragMo, Jan 30, 2006 2:06
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


; -------------------------------------------------------------------------

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group