Types: Objekte per Array erstellen + einzeln auslesen
Übersicht

![]() |
KnorxThieusBetreff: Types: Objekte per Array erstellen + einzeln auslesen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
da ich mich für eine Funktion noch näher mit Types beschäftigt habe, ist mir klar geworden, dass ich die Zusammenhänge und Kombinationsmöglichkeiten zwischen Types und Array nicht begreife. Meines Verständnisses gibt es da 1. Field als Array: BlitzBasic: [AUSKLAPPEN] Type T 2. Objekte mit Array erstellen: BlitzBasic: [AUSKLAPPEN] Type T 3. Gibt es noch etwas? Aber mein Kernproblem liegt bei 2.: Kann ich [Blitzarrays] erstellen? Mein Problem liegt dabei, dass ich gerne 3 Objektreihen getrennt voneinander erstellen möchte, also etwa so: BlitzBasic: [AUSKLAPPEN] Type T Das möchte ich per Array (ob Blitz- oder multidimensionales ist mir egal) zusammenfassen: BlitzBasic: [AUSKLAPPEN] Type T Aber wenn ich nun meine erste Typereihe durchgehen will, liefert mir BlitzBasic auch die benachbarten Einträge: BlitzBasic: [AUSKLAPPEN] Type T Konsolenausgabe: Code: [AUSKLAPPEN] 42
1764 3111696 Kann ich das irgendwie verhindern? Geht das per Blitzarray, das habe ich nicht hinbekommen? Geht es per quadratisches Array, wobei mir da ebenfalls unklar ist, wie sich dies bewerkstelligen ließe? Gesucht hab ich schon im gefühlten halben Forum, das hier und das hier konnten mir aber nicht weiterhelfen. Mit freundlichen Grüßen, KnorxThieus |
||
Version: BlitzPlus / Blitz+ |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hay.
Jedes Type hat nur eine Liste und deshalb werden immer alle Einträge mit Each durch gegangen. Vlt hilft dir diese Möglichkeit. Code: [AUSKLAPPEN] Dim Garage.TGarage(10) Garage(0)=New TGarage G.TGarage=Garage(0) G\Autos[3]=New TAuto G\Autos[3]\Name="VW" G\Autos[4]=New TAuto G\Autos[4]\Name="Viat" Type TGarage Field Autos.TAuto[10] End Type Type TAuto Field Name$ End Type For I=0 To 9 If Garage(0)\Autos[I]<>Null Then DebugLog Garage(0)\Autos[I]\Name End If Next Mfg Matz ![]() |
||
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
vielen Dank für deine Antwort. Allerdings ist mir nicht ganz die Vorgehensweise deines Codes klar. Du erstellst einen Type TAuto mit dem Feld Name und einen Type TGarage mit dem Feld Autos.TAuto. Aber den Rest verstehe ich nicht: BlitzBasic: [AUSKLAPPEN] Dim Garage.TGarage(10) BlitzBasic: [AUSKLAPPEN] For I=0 To 9 |
||
Version: BlitzPlus / Blitz+ |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Weil es jetzt sehr allgemein war.
Es kommt darauf an was du erreichen willst. Bitte erkläre es mir genauer. Mit der For schleife werden alle Autos aus der Garage 0 durch gegangen und die die vorhanden sind werden mit dem Namen angezeigt. Code: [AUSKLAPPEN] DebugLog Garage(0)\Autos[3]\Name |
||
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich lade Daten für Styles in mein Programm (Schrift, Farbe etc.), dabei habe ich mehrere Styles und jeweils mehrere Zustände (es handelt sich um Links, MouseHover, MouseDown, nichts von alledem, Link aktiv...). Später habe ich dann Variablen style und zustand, daher ist es mir sehr wichtig, den einzelnen Typeeintrag direkt ansprechen zu können. Geht das jetzt nur mit verschachtelten Types oder auch anders?
MFG |
||
Version: BlitzPlus / Blitz+ |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Achso ok.
Vlt sowas. Code: [AUSKLAPPEN] Dim Styles.TStyles(10) Type TStyles Field Schrift$,Farbe$ End Type Styles(0)=New TStyles Styles(0)\Schrift="Arial" Styles(0)\Farbe="Blau" Styles(1)=New TStyles Styles(1)\Schrift="OS" Styles(1)\Farbe="Grün" DebugLog Styles(1)\Schrift |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dein Fehler war das hier:
BlitzBasic: [AUSKLAPPEN] For o.T(1) = Each T Dabei werden in einer Schleife alle existenten T durchlaufen (Each T) und eins nach dem anderen in o.T(1) reingestopft. Verwende die For ... = Each ... -Schleifen, wenn du jedes Element eines Types ein mal verwenden möchtest. Verwende o.T(x), wenn du das T haben willst, was sich an x-ter Stelle im Array o.T befindet. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Matthias.
Danke, aber wenn ich jetzt zum nächsten Objekt der Reihe springe (also vom 1. Objekt der Reihe Style (0) zum 2. Objekt), komme ich beim 1. Objekt der Reihe Style (1) raus: BlitzBasic: [AUSKLAPPEN]
Eigentlich sollte ja beim zweiten DebugLog Styles(0) = null gelten und eine fehlermeldung entstehen! Also anstatt Code: [AUSKLAPPEN] Objekt(0) Objekt(1) Objekt(2)
Objekt(0) Objekt(1) Objekt(2) Objekt(0) Objekt(1) Objekt(2) ... ... ... (nach oben / unten mit After / Before, nach links und rechts gar nicht) gilt: Code: [AUSKLAPPEN] Objekt(0)
Objekt(0) Objekt(0) ... Objekt(1) Objekt(1) Objekt(1) ... Objekt(2) Objekt(2) Objekt(2) (am ende der reihe objekt(0) geht es gleich mit objekt(1) weiter!) Und ich versuche, Modell 1 hinzukriegen. Ist das so verständlich? ![]() Deine verschachtelten Types schienen mir schon ein Ansatz, bloß sehe ich nicht ganz, wie ich das umsetzen soll... ich versuche es gleich noch mal... @DAK: (ich hab dich erst jetzt gesehen, tut mir leid) Ich verstehe schon, aber wie lässt sich jetzt das o1.T, o2.T, o3.T als Array o.T(1) einzeln abfragen (siehe Modell 1)? EDIT: Ich habe mir Matthias' Garagencode nochmal intensiv angeschaut und was probiert: BlitzBasic: [AUSKLAPPEN] Type Style ;hier trage ich meine einzelnen Einstellungswerte ein Ist das nur zufällig richtig, oder hab ich das Prinzip verstanden? Die Typelisten sähen dann so aus: Code: [AUSKLAPPEN] st(0)\s.Style[0] st(1)\s.Style[0]
(st(0)\s.Style[0] (st(1)\s.Style[0] ;(*) ...) ...) st(0)\s.Style[1] st(1)\s.Style[1] (st(0)\s.Style[1] (st(1)\s.Style[1] ...) ...) st(0)\s.Style[2] st(1)\s.Style[2] ... ... (*) ich könnte rein theoretisch weitere hiervon erstellen, aber beim Auslesen wäre das dann s[1] etc...., oder? Stimmt das? |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich verstehe nicht ganz das Durcheinander, dass hier herscht.
Wenn man ein Array aud Objekten machen will, sollte man sie anschließend auch als Array ansprechen: Code: [AUSKLAPPEN] Dim Styles.TStyles(10) Type TStyles Field Schrift$,Farbe$ End Type Styles(0)=New TStyles Styles(0)\Schrift="Arial" Styles(0)\Farbe="Blau" Styles(1)=New TStyles Styles(1)\Schrift="OS" Styles(1)\Farbe="Grün" Max%=1 For i%=0 To Max DebugLog i + " " + Styles(i)\Farbe + " " + Styles(i)\Schrift Next Die Variante "Each" könnnte höchstens zufällig die richtige Reihenfolge enthalten. Garantiert ist das nicht! |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stimmt, ich könnte das Ganze auch so anstellen:
BlitzBasic: [AUSKLAPPEN] Type T Hauptsache ist ja, dass es sich eindeutig ansprechen lässt... und das klappt ja jetzt hier, bei Midimaster und meinem Editcode? Ich hatte bloß nicht zu Beginn begriffen, was Midimaster soeben sagte... Ich denke, dann nehme ich die Variante mit st(ss)\s[s]\value. MFG |
||
Version: BlitzPlus / Blitz+ |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK, noch mal von Anfang. Es gib zwei verschiedene Arten Objekte eines Types anzusprechen. Per Variable oder per Liste.
Gegeben folgender Type: BlitzBasic: [AUSKLAPPEN] Type TTest Per Variable: BlitzBasic: [AUSKLAPPEN] o1.TTest = New TTest Eine Variable behält also ihren Wert solange bis sie überschrieben wird. Anders als z.B. bei normalen Zahlenwerten wird der Wert nicht in der Variable selbst gespeichert sondern die Variable beinhaltet eine Referenz auf ein Objekt. Haben zwei Variablen den gleichen Zahlenwert, dann sind sie von einander unabhängig. Verändert man den Wert der einen Variable ändert das an der Anderen nichts. Bei Type-Variablen ist das anders. Zeigen zwei Variablen auf das gleiche Objekt und man ändert den Wer eines Feldes des Objekts, dann wird das Feld bei beiden Variablen geändert sein, da beide Variablen auf das gleiche Feld zeigen. Per Liste: BlitzBasic: [AUSKLAPPEN] For x.TTest = Each TTest Das Array ist ein Sonderfall vom Zugriff per Variable. Ein Array ist ein Satz von einer fixen Anzahl Variablen, die sich per Index-Zahl ansprechen lassen. Du musst also nicht die Befehle First, After, Last oder Each verwenden um an die Objekte zu kommen. Im Gegenteil, dadurch, dass du sie kombinierst machst du eigentlich alles kaputt. Um noch mal dein Beispiel von vorhin aufzugreifen: BlitzBasic: [AUSKLAPPEN] Dim Styles.TStyles(10) Wie du siehst ist es nur Zufall, dass du das richtige Ergebnis bekommst. Wenn du beim Erstellen der Objekte z.B. zuerst Styles(1) und dann erst Styles(0) einen Wert zuweist, dann wird die Ausgabe genau falsch herum sein. Richtig wäre folgendes: BlitzBasic: [AUSKLAPPEN]
|
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK, vielen Dank nochmals, dann habe ich es jetzt wohl verstanden.
Liste und Einzelobjekt waren mir ja schon klar, bloß das Array nicht. Ist mein EDIT-Code nun also richtig? MFG |
||
Version: BlitzPlus / Blitz+ |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Öh, ja, sollte passen. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube, die Verwirrung hier rührt weniger von Types selbst her, vielmehr ist nicht ganz klar, was für eine Datenstruktur du versuchst auf zu bauen.
Du hast n Styles mit m Untertypen - also beliebig viele zu beliebig vielen? Dann verstehe ich nicht, wozu die ganzen Arrays gut sein sollen. Hier wäre erst mal ein Diagramm angebracht, dass das Problem beschreibt: Welche Objekte wie zu anderen stehen. Vorschnelle Versuche etwas optimieren zu wollen, bringen meistens nichts. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
@DAK: Ok, danke!
@Xeres: Ich habe in jenem Edit-Post auch schon versucht, die Lage darzustellen: Code: [AUSKLAPPEN] st(0)\s.Style[0] st(1)\s.Style[0]
(st(0)\s.Style[0] (st(1)\s.Style[0] ;(*) ...) ...) st(0)\s.Style[1] st(1)\s.Style[1] (st(0)\s.Style[1] (st(1)\s.Style[1] ...) ...) st(0)\s.Style[2] st(1)\s.Style[2] ... ... (*) ich könnte rein theoretisch weitere hiervon erstellen, aber beim Auslesen wäre das dann s[1] etc...., oder? Stimmt das? Mir ist bloß nicht ganz klar (nein, ich habe es ausprobiert:) mir war nicht ganz klar, was passiert, wenn ich zweimal Styles(1)=New TStyles aufrufe: Letzter Aufruf überschreibt vorherigen. Dann ist mir jetzt eigentlich alles klar, bloß aus meinem "Diagramm" muss ich die Fußnote und die Punkte streichen. MFG |
||
Version: BlitzPlus / Blitz+ |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich kann dir nicht sagen ob das "stimmt" denn ich kann beim besten Willen nicht erkennen, was du darstellen willst.
Ein UML Diagramm könnte helfen. Wenn du zwei mal "Styles(1)=New TStyles" ausführst, enthält Styles(1) das zu letzt erzeugte Objekt - das ist richtig. Allerdings existiert das zu erst erstelle Objekt weiter in der Globalen Typeliste bist du es mit Delete ![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie ich oben schrieb:
nach oben / unten mit After / Before, nach links und rechts gar nicht Xeres hat Folgendes geschrieben: Wenn du zwei mal "Styles(1)=New TStyles" ausführst, enthält Styles(1) das zu letzt erzeugte Objekt - das ist richtig. Allerdings existiert das zu erst erstelle Objekt weiter in der Globalen Typeliste bist du es mit Delete löschst.
Und wie spreche ich das erste Styles(1) an? per For-each? |
||
Version: BlitzPlus / Blitz+ |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
For...Each ist die einzige Möglichkeit dieses Style Objekt wieder zu erreichen, wenn die Referenz aus dem Array entfernt bzw. überschrieben wurde. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK, also gewissermaßen wurde die Adresse gelöscht.
? |
||
Version: BlitzPlus / Blitz+ |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja.
Alle Type-Variablen enthalten immer nur eine Referenz auf ein Objekt. Mit For..Each werden einer Variable der Reihe nach die Referenzen aus der Internen, Globalen Liste des Types zugewiesen. Auf diese Liste kann man auch mit First ![]() ![]() ![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group