Zitat von
CloudyofSky:
Die Änderung ist nur das ändern von < auf <= ? 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