Autor Beitrag
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Do 10.04.03 14:42 
Titel: Ok, Strings gehen jetzt
Ok, beim Einlesen der Strings habe ich jetzt keine Probleme mehr. Das Hauptproblem war einfach das ich keine Pointer benutzt habe. (Mit Pointer habe ich einfach irgendwie keinen Durchblick :( )

Jetzt habe ich aber noch ein kleines Problem mit dem Stream den ich gespeichert habe. Hab ich den vllt auch falsch abgespeichert?

ausblenden Quelltext
1:
2:
3:
intGroesse := StreamText.Size;
StreamText.Position := 0;
Stream.WriteBuffer(StreamText, intGroesse);


Mein bisheriger Versuch des Einlesens:
ausblenden Quelltext
1:
2:
3:
4:
5:
Stream.ReadBuffer(intGroesse, SizeOf(intGroesse));
Dateien[intI].Dateiinhalt := TMemoryStream.Create;
Dateien[intI].Dateiinhalt.SetSize(intGroesse);   
Dateien[intI].Dateiinhalt.Position := 0;
Stream.ReadBuffer(Dateien[intI].Dateiinhalt, intGroesse);


Wenn ich da auch mit Pointer ran gehe wirft er mir eine Fehlermeldung.

Ansonten tritt kein Fehler auf beim Einlesen. Wenn ich aber dann

ausblenden Quelltext
1:
Dateien[intI].Dateiinhalt.Position := 0;					


ausführe, bekomme ich eine access violation.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 10.04.03 15:11 
@ Masterrandy:

Schaue mal in meinem vorherigen Post, da habe ich zwei Routinen gepostet, die dir eigentlich die ganze Arbeit mit den Strings abnehmen.
Wenn du sie dir anschaust, wirst du bemerken, das vor dem eigentlichen Inhalt die Größe des Strings als Word ("Stream.WriteBuffer(Len, SizeOf(Len));") abgelegt wird. Wo tust du das denn?

@Maximus:
Ja, der Harald hat schon super Zitate! :D Ich war am schwanken, ob ich nicht lieber "Die Welt ist nicht schlecht... Sie ist nur zu voll!" nehmen sollte oder dieses als Zitat.

Cu,
Udontknow
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Do 10.04.03 15:20 
Die größe speichere ich schon auch mit ab:

ausblenden Quelltext
1:
Stream.WriteBuffer(Stream.Size, SizeOf(Stream.Size));					


Aber wie gesagt: Damit hat das Programm anscheinend keine Probleme mehr. Und die Datei wird auch genau um soviel Bytes größer wie der Stream lang ist. Deshalb gehe ich jetzt mal davon aus, dass der Inhalt korrekt darin gespeichert ist.
Wenn ich nun den Pointer auf 0 setzen will, weil ich auf den neu eingelesenen Streaminhalt zugreifen möchte, wird eine Fehlermeldung geschmissen.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 10.04.03 15:22 
:?: :?: :?:

Du musst die Länge des Strings doch abspeichern, nicht die Größe des Streams :!:
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Do 10.04.03 15:36 
Titel: Wenn du den Code nun zusammen schreibst:
Dann erhält man dies:

ausblenden Quelltext
1:
2:
3:
4:
intGroesse := StreamText.Size; 
Stream.WriteBuffer(intGroesse, SizeOf(intGroesse));  //Feld gibt an wieviel Zeichen der folgende Stream hat
StreamText.Position := 0; 
Stream.WriteBuffer(StreamText, intGroesse); // Speichert den Stream ab
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 10.04.03 15:41 
Tut mir leid, aber du verwirrst mich!

Was ist streamText? Ist das ein MemoryStream? Dann musst du
ausblenden Quelltext
1:
Stream.WriteBuffer(Stream.Memory, intGroesse)					

schreiben.

Aber warum so kompliziert? Warum nicht einfach "SaveStrToStream(Stream,MeinString);" ?

Cu,
Udontknow
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Do 10.04.03 16:08 
Titel: Ich bin nicht mehr bei den Strings
Ich möchte jetzt einen MemoryStream speichern und wieder einlesen. Das Speichern und Einlesen der Strings funktioniert doch schon lange, was ich auch oben schon erwähnt habe.
StreamText ist ein MemoryStream in den ich Text geschoben habe.

Was genau bewirkt das:

ausblenden Quelltext
1:
Stream.WriteBuffer(Stream.Memory, intGroesse)					


Abspeichern kann ich den MemoryStream auch soviel ich sehen kann, nur beim Laden aus der Datei habe ich noch Probleme.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 10.04.03 16:17 
Pffff... :?

Ich verstehe zwar noch immer noch nicht, warum du die geposteten Routinen nicht verwenden willst, da du in diesem MemoryStream ja doch nur Text hast, aber wenn es denn unbedingt mit zusätzlichem Code sein muss, bitte schön.

Also, Die Eigenschaft Memory ist ein Pointer auf den Speicherbereich den das TMemorystream für seine Daten benutzt. Wenn du wie in deinem vorigen Post einfach nur Stream.ReadBuffer(MemStream,intGroesse);
schreibst, überschreibst du damit die Objektinstanz des Streams, und nicht den Dateninhalt. Dann kracht es natürlich.

Cu,
Udontknow
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 10.04.03 17:14 
Ihr seid so wirre :roll:

warum denn mit readBuffer? ->

ausblenden Quelltext
1:
Stream.LoadFromStream(MemStream);					


Spricht was dagegen...ich mein streams sind ja dafür da mit streams umzugehen.

_________________
mfg.
mâximôv
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Fr 11.04.03 09:06 
Titel: Kleines Problem!!!
Mit LoadFromStream wird der Ganze Stream eingelesen. Ich brauche aber nur einen bestimmten Teil davon.
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Fr 11.04.03 09:32 
Titel: Was mache ich hier falsch?
Warum kann ich so keinen Test aus einem RichEdit holen, in einen MemoryStream schreiben und von dort in eine Datei speichern, anschließend von der Datei über den MemoryStream wider ins RichEdit laden?
ACHTUNG: Das ist nur eine Testprocedure um zu sehen wo es hakt, also bitte nicht kommen und fragen warum ich das nicht gleich in eine Datei speichere!!!

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure TFDoku.test21Click(Sender: TObject);
var       fStream: TFileStream;
          mStream: TMemoryStream;
          intGroesse: Integer;
begin
    fStream := TFileStream.Create('c:\test.doku', fmCreate);
    mStream := TMemoryStream.Create;

    try
      RichEdit.Lines.SaveToStream(mStream);
      intGroesse := mStream.Size;;

      mStream.Position := 0;
      fStream.WriteBuffer(mStream, intGroesse);

    finally
      mStream.Free;
      fStream.Free;
      RichEdit.Lines.Clear;
    end;

    fStream := TFileStream.Create('c:\test.doku', fmOpenRead);
    mStream := TMemoryStream.Create;

    try

      mStream.Position := 0;
      fStream.Position := 0;

      fStream.ReadBuffer(mStream, intGroesse);
      RichEdit.Lines.LoadFromStream(mStream);

    finally
      mStream.Free;
      fStream.Free;
    end;
end;


Wenn ich das ausführe, dann bleibt das Rcihedit leer.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 11.04.03 09:34 
Klappt es denn jetzt? Alternativ kannst du noch die Methode CopyFrom anwenden.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 11.04.03 09:37 
Liest du eigentlich meine Posts?

ausblenden Quelltext
1:
2:
3:
fStream.WriteBuffer(mStream, intGroesse); 
...
fStream.ReadBuffer(mStream, intGroesse);


Du musst mStream.Memory verwenden (könnte auch mStream.Memory^ sein), so wie du es machst geht es nicht! Oder verwende besser CopyFrom.

Cu,
Udontknow
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 11.04.03 09:44 
Es muss Memory^ sein.

So, hier mal die korrigierte Version:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
procedure TForm1.Button1Click(Sender: TObject);
var       fStream: TFileStream;
          mStream: TMemoryStream;
          intGroesse: Integer;
begin
    fStream := TFileStream.Create('c:\test.doku', fmCreate);
    mStream := TMemoryStream.Create;

    try
      RichEdit.Lines.SaveToStream(mStream);
      intGroesse := mStream.Size;

      mStream.Position := 0;
      fStream.WriteBuffer(mStream.Memory^, intGroesse);

    finally
      mStream.Free;
      fStream.Free;
      RichEdit.Lines.Clear;
    end;

    fStream := TFileStream.Create('c:\test.doku', fmOpenRead);
    mStream := TMemoryStream.Create;

    try

      mStream.Position := 0;
      fStream.Position := 0;
      mstream.Size:=fStream.Size; //memoryStream-Grösse muss vorher festgelegt werden, ansonsten ist Memory NIL

      fStream.ReadBuffer(mStream.Memory^, intGroesse);
      RichEdit.Lines.LoadFromStream(mStream);

    finally
      mStream.Free;
      fStream.Free;
    end;
end;


Cu,
Udontknow
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Fr 11.04.03 09:55 
Titel: Ok, es funktioniert
Hatte es zwar mit mStream.Memory mal probiert, aber nicht mit mStream.Memory^ und daran lag es ja anscheinend gelegen.

Jedenfalls danke danke danke für deine Hilfe und Geduld :P
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Fr 11.04.03 10:09 
Titel: Re: Kleines Problem!!!
Schön das es funktioniert!

Aber eins wollte ich noch anmerken:

Masterrandy hat folgendes geschrieben:
Mit LoadFromStream wird der Ganze Stream eingelesen. Ich brauche aber nur einen bestimmten Teil davon.


Soweit ich weiss wolltest du den gesamten TextMemoryStream in die datei laden!? oder nicht?

_________________
mfg.
mâximôv
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Fr 11.04.03 10:16 
Titel: Nicht ganz
Da war das schon wieder umgekehrt. Ich wollte aus der Datei in den MomoryStream lesen.
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Fr 11.04.03 13:53 
Titel: Re: Stringlänge steht davor
Sorry, habe die 2te Seite überlesen (bitte löschen)!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.


Zuletzt bearbeitet von wulfskin am Fr 11.04.03 14:11, insgesamt 1-mal bearbeitet
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 11.04.03 14:06 
Ich denke, Masterrandy wollte es allgemein einmal mit Streams machen, damit er dann später auch andere Sachen wie ein Bitmap einfach in einen Stream einspielen und wieder korrekt herauslesen kann.

Cu,
Udontknow