Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#13

Re: Kombi von 2D mit 3D Elementen, auch ohne OpenGL ?

  Alt 23. Nov 2006, 15:49
Zitat von CloudyofSky:
Die Änderung ist nur das ändern von < auf &lt;= ? Weil einen anderen Unterschied hab ich nicht gefunden
Eigentlich sollte da eine ganze Zeile mehr drin sein, die hab ich wohl vergessen, peinlich

Zitat von CloudyofSky:
Oder liegt das vielleicht an dem Inhalt? Ich mußte leider ein .size weglassen, ich dachte es ist zu viel? Weil mir auch dir Fehlermedlung sagte, das er da was anderes erwartet:
Delphi-Quellcode:
procedure addToContainer(const Stream : TStream; const Container : TStream);
begin
  if assigned(Stream) and assigned(Container) then
  begin
    Container.Write(Stream, sizeof(Integer));

    Container.CopyFrom(Stream, 0);
  end;
end;
Ja, dass weglassen war ganz schlecht. Ist mein Fehler, war halt ungetesteter Code, hätte ich deutlich sagen sollen. Jedenfalls kurz zur Theorie was du da machst, du schreibst etwas in einen Stream. Ein Stream kannst du dir dabei als einen Strom von Bytes vorstellen, der hat sonst keinerlei Logik. Alles was du den gibst ist einfach eine Adresse von der aus er liest und sagst ihm wieviele Bytes da stehen. So hat der Datentyp Byte z.B. genau ein Byte, eine Word hat zwei Byte, ein String hat pro Zeichen ein Byte + 4 Byte für die Längenangabe, ein ShortString hat hingegen pro Zeichen ein Byte + ein Byte für die Längenangabe, usw.
Da du jeden Datentypen in so einen Stream schreiben kannst, nimmst du etwas sehr allgemeines (wie gesagt es ist eigentlich nur eine Adresse), wieviele Bytes von hier zu dem eigentlichen Datum das geschrieben werden soll gehören, musst du als zweiten Parameter angeben. sizeOf(X) gibt dir halt die Größe des Datentyps X an. Bei den primitiven Datentypen und Records (ohne String) liefert es die erwarteten Ergebnisse. Bei dyn. Arrays oder z.B. auch Klassen sieht es anders aus. Hier speicherst du implizit immer nur einen Zeiger auf die Datenstruktur, sizeOf würde dir nur die Größe des Zeigers (ein Prozesswort) liefern.
Delphi-Quellcode:
procedure addToContainer(const Stream : TStream; const Container : TStream);
var buffer : Integer;
begin
  if assigned(Stream) and assigned(Container) then
  begin
    // Stream ist nur eine Referenz auf eine Instanz vom Typ TStream
    // Du schreibst hier also die Adresse der Instanz, nicht die Größe des Stream
    Container.Write(Stream, sizeof(Integer));

    buffer := Stream.Size;
    // hier schreibst du jetzt den Wert von buffer in den Stream
    // da du hier die Stream.Size zugewiesen hast, also die Anzahl der Bytes in dem Stream
    Container.Write(buffer, sizeOf(Integer));

    Container.CopyFrom(Stream, 0);
  end;
end;
Das was der hier anderes erwartet hatte war eine Variable. Buffer ist hier auch wirklich variabel, Container.Size hingegen eine Eigenschaft.


Ich hab mal ein kleines (einfaches) Beispiel angehängt. Einfach einen Container erstellen, ein (oder beliebig viele Bitmaps hinzufügen) den Container laden (muss auch gemacht werden, wenn du ihn im selben Lauf angelegt hast) und dann halt mit getNext das nächste Bild anzeigen lassen. Ist kein schöner Code, es wird hier nicht geprüft ob du alles in der richtigen Reihenfolge machst, also schön drauf achten (sonst gibt es halt Fehler).

Gruß Der Unwissende
Angehängte Dateien
Dateityp: zip bitmapcontainer_136.zip (6,3 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat