![]() |
Probleme beim Stream Laden
Liste der Anhänge anzeigen (Anzahl: 1)
Hi
Irgendwas stimmt beim laden meines Streams nicht, beim Speichern wird alles sauber gespeichert beim laden werden alle Daten des StringGrids auch sauber geladen nur die Memos und Labels erhalten nur nicht mach ich was falsch in der Reihenfolge??. Hab mal bilder angehängt mit der eingabe und was beim laden raus kommt. Stream Speichern
Delphi-Quellcode:
Stream Laden
{Stream Speichern}
procedure TForm7.memospeichern; var FileStream: TMemoryStream; memos :TFileName; x, y, row, col,len :Word; a,c,e,g,i,k,m,o,q,s :String; b,d,f,h,j,l,n,p,r,t :integer; begin a:= Memo1.Text; b:=Length(a); c:= Memo2.Text; d:=Length(c); e:= Memo3.Text; f:=Length(e); g:= Memo4.Text; h:=Length(g); i:= Memo5.Text; j:=Length(i); k:= Memo6.Text; l:=Length(k); m:= Label8.Caption; n:=Length(m); o:= Label10.Caption; p:=Length(o); q:= Label3.Caption; r:=Length(q); s:= Label1.Caption; t:=Length(s); FileStream:= TMemoryStream.Create; col:= StringGrid1.ColCount -1; row:= StringGrid1.RowCount -1; FileStream.Write(row, SizeOf(Word)); FileStream.Write(col, SizeOf(Word)); for x:= 0 to row do for y:= 0 to col do begin buff:= StringGrid1.Cells[y,x]; len:= length(buff); FileStream.Write(len, SizeOf(Word)); FileStream.Write(buff[1], len); end; FileStream.Write(b, SizeOf(Integer)); // Memo1 FileStream.Write(a[1], b); FileStream.Write(d, SizeOf(Integer)); // Memo2 FileStream.Write(c[1], d); FileStream.Write(f, SizeOf(Integer)); // Memo3 FileStream.Write(e[1], f); FileStream.Write(h, SizeOf(Integer)); // Memo4 FileStream.Write(g[1], h); FileStream.Write(j, SizeOf(Integer)); // Memo5 FileStream.Write(i[1], j); FileStream.Write(l, SizeOf(Integer)); // Memo6 FileStream.Write(k[1], l); FileStream.Write(n, SizeOf(Integer)); // Label8 FileStream.Write(m[1], n); FileStream.Write(p, SizeOf(Integer)); // Label10 FileStream.Write(o[1], p); FileStream.Write(r, SizeOf(Integer)); // Label3 FileStream.Write(q[1], r); FileStream.Write(t, SizeOf(Integer)); // Label1 FileStream.Write(s[1], t); memos:= ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ ComboBox4.Text+'.txt'; FileStream.SaveToFile(memos); FileStream.Free; end;
Delphi-Quellcode:
{Stream Laden}
procedure TForm7.memoladen; var x, y, row, col,len :Word; memos :TFileName; FileStream :TMemoryStream; i,l :Integer; s :String; begin FileStream := TMemoryStream.Create; memos:=ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ ComboBox3.Text+'.txt'; FileStream.LoadFromFile(memos); FileStream.Read(row, SizeOf(Word)); FileStream.Read(col, SizeOf(Word)); for x:= 0 to row do for y:= 0 to col do begin FileStream.Read(len, SizeOf(Word)); SetLength(buff, len); FileStream.Read(buff[1], len); StringGrid1.Cells[y,x]:= buff; end; l := 0; FileStream.Position:=0; for i := 1 to 10 do begin FileStream.Read(l, SizeOf(Integer)); setlength(s, l); // legt die Länge einer String- Variable fest FileStream.Read(s[1], l); case i of 1: Memo1.Text:= s; 2: Memo2.Text:= s; 3: Memo3.Text:= s; 4: Memo4.Text:= s; 5: Memo5.Text:= s; 6: Memo6.Text:= s; 7: Label8.Caption:= s; 8: Label10.Caption:= s; 9: Label3.Caption:= s; 10: Label1.Caption:= s; end; end; FileStream.Free; end; |
Re: Probleme beim Stream Laden
Liste der Anhänge anzeigen (Anzahl: 1)
upps vorher vergessen
|
Re: Probleme beim Stream Laden
Also wenn ich deinen Code so anschaue, tun mir die Augen weh.
Delphi-Quellcode:
Wie wäre es denn, wenn du eine Unterfunktion schreiben würdest ??!!
FileStream.Write(b, SizeOf(Integer)); // Memo1
FileStream.Write(a[1], b); FileStream.Write(d, SizeOf(Integer)); // Memo2 FileStream.Write(c[1], d); ....
Delphi-Quellcode:
Und bitte danach die ganzen unnötigen Variablen a,b,c,d,... entsorgen.
procedure SaveAnsiStringToStream(stream:TStream; const s:AnsiString);
Danach ist der Code so vereinfacht, dass Reihenfolgefehler sofort auffallen. |
Re: Probleme beim Stream Laden
Die Variablen brauch man doch für den String oder??
hab mal ne eigene Procedure geschrieben geht Trotzdem nicht vielleicht liegt es doch am speichern bekomm auch keine Fehler meldung. |
Re: Probleme beim Stream Laden
@fuknersascha: Nutze zukünftig bitte http://www.delphipraxis.net/template.../icon_edit.gif um deinen Beitrag zu ändern bzw. einen vergessenen Anhang hinzu zufügen.
|
Re: Probleme beim Stream Laden
Zitat:
Du sollst eine Routine schreiben, die du für jedes Memo und Label einmal aufrufst um zu speichern!!! Wenn du das gemacht hast, dann kannst du eine kongruente Routine zum Laden der Labels und Memos schreiben... und wenn dann immer noch was nicht geht, kannst du deinen (dann hoffentlich sauberen und ordentlichen) code nochmal posten! Da wird bestimmt auch einer gewillt sein sich das durchzulesen und ggf. dich auf Fehler aufmerksam zu machen :wink: Edit: Was mir grad auffällt! Du speicherst doch nur Strings, oder? Dann wäre es doch viel, viel einfacher, wenn du sie einfach nur alle in ein Memo kopierst und dann als txt-datei speicherst! |
Re: Probleme beim Stream Laden
Sorry aber leider habe ich nicht soviel erfahrung mit dem Programmieren und muss mir eigentlich alles mühsam zusammen lesen und verstehen leider finde ich nicht alles was ich zum finden und lösen meiner fehler brauche.
Bin eigentlich noch Blutiger anfänger Das was seiner meinung nach hilfsVarialblen sein sollen, habe ich so nach gelesen das man die brauch wenn man einen String in einem Stream speichern möchte. Bin gerne für verbesserungen offen |
Re: Probleme beim Stream Laden
Ich find das mit den Streams hier zu arg, wenn du dich da nicht wirklich auskennst...
Ich würde wie gesagt die Inhalte (Strings) deiner Labels, Memos und weis der Geier... in einer bestimmten Reihenfolge hintereinander (Zeile für Zeile) in ein Memo kopieren und dieses per SaveToFile abspeichern! Da entfällt zugleich dieses blöde Angeben der Stringlänge immer, welches beim als Stream abspeichern nötig ist, weg, da ja jeder String in einer neuen Zeile stehen würde! Und wenn du extrem Faul bist und es dir total egal ist, wie es programmiert ist dann kannst du die Komponenten auch im ganzen abspeichern. Wenn du nicht verstehst, was ich meine oder du einfach darin interessiert bist, wie das geht, dann kannst du ja mal ![]() |
Re: Probleme beim Stream Laden
Das sind super vorschläge werde mich wahrscheinlich noch um das letzte mal kümmern.
Denn es ist wirklich egal wie es Programmirt ist. Aber nochmal zu verständnis wenn ich jetzt meine Komponenten inhalte speicher stehen sie im Klartext in der endsprechenden Datei. Das heist das das speicher des Streams funktioniert hat oder bin ich da auf dem Holzweg |
Re: Probleme beim Stream Laden
Hallo,
in grauer Vorzeit habe ich mir für das Lesen und Schreiben von Strings in einen Stream zwei Nachfahren gebastelt.
Delphi-Quellcode:
In der richtigen Reihenfolge muss natürlich auch hier gelesen werden.
uses Sysutils, Classes;
Type TMemoryStreamExt = class(TMemoryStream) public procedure WriteStringToStream(aStr : String); function ReadStringFromStream : String; end; TFileStreamExt = class(TFilestream) public procedure WriteStringToStream(aStr : String); function ReadStringFromStream : String; end; implementation { TFileStreamExt } procedure TFileStreamExt.WriteStringToStream(aStr : String); var aStrLen : Integer; begin aStrLen:=Length(aStr); WriteBuffer(aStrLen,SizeOf(Integer)); WriteBuffer(Pointer(aStr)^,aStrLen); end; function TFileStreamExt.ReadStringFromStream: String; var aStrLen : Integer; begin ReadBuffer(aStrLen,SizeOf(Integer)); SetLength(Result,aStrLen); ReadBuffer(Pointer(Result)^,aStrLen); end; { TMemoryStreamExt } function TMemoryStreamExt.ReadStringFromStream: String; var aStrLen : Integer; begin ReadBuffer(aStrLen,SizeOf(Integer)); SetLength(Result,aStrLen); ReadBuffer(Pointer(Result)^,aStrLen); end; procedure TMemoryStreamExt.WriteStringToStream(aStr: String); var aStrLen : Integer; begin aStrLen:=Length(aStr); WriteBuffer(aStrLen,SizeOf(Integer)); WriteBuffer(Pointer(aStr)^,aStrLen); end; end. |
Re: Probleme beim Stream Laden
Wie gesagt ich bin eigenlich ein anfänger und habe nicht soviel ahnung das sieht für mich sehr Komplieziert aus auch wen einige jetzt schmunzeln werden.
Mein Problem ist halt das ich sämtliche informationen von den Komponeten in einen Datei Speichern muss. Habe es bisher über zwei Dateien gemacht die eine wird mit TFileName erzeugt und die andere mit einem MemoryStrem auf dem Bild kann man erkennen welche, das StringGrid wurde für sich alleine gespeichert und die anderern Komponenten in den Stream. Jetzt ist mir aber aufgefallen wenn ich die Vertretungspläne verschieben will müsste mann zwei dateien verschieben was sehr umständlich wäre also habe ich mir gedacht das ich alles in ein MemoryStream speicher. Alles alleine für sich funktioniert auch (StrinGrid) (Memos und Labels) aber die Kombination von beiden leider nicht so richtig. Wäre es überhaupt möglich wie gesagt würde es ja auch gerne verstehen wollen. Habe zwei Bücher in den viel drin steht aber leider auch nicht alles |
Re: Probleme beim Stream Laden
Wenn da einer helfen soll, dann müsstest du dein ganzes Programm mit Code zum Testen mal hochladen, so sieht man nur schwer durch.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz