Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Probleme beim Stream Laden (https://www.delphipraxis.net/86475-probleme-beim-stream-laden.html)

SaFu 14. Feb 2007 18:32


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 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;
Stream Laden

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;

SaFu 14. Feb 2007 18:33

Re: Probleme beim Stream Laden
 
Liste der Anhänge anzeigen (Anzahl: 1)
upps vorher vergessen

shmia 14. Feb 2007 18:46

Re: Probleme beim Stream Laden
 
Also wenn ich deinen Code so anschaue, tun mir die Augen weh.
Delphi-Quellcode:
  FileStream.Write(b, SizeOf(Integer)); // Memo1 
  FileStream.Write(a[1], b);

  FileStream.Write(d, SizeOf(Integer)); // Memo2 
  FileStream.Write(c[1], d);
....
Wie wäre es denn, wenn du eine Unterfunktion schreiben würdest ??!!
Delphi-Quellcode:
procedure SaveAnsiStringToStream(stream:TStream; const s:AnsiString);
Und bitte danach die ganzen unnötigen Variablen a,b,c,d,... entsorgen.
Danach ist der Code so vereinfacht, dass Reihenfolgefehler sofort auffallen.

SaFu 14. Feb 2007 19:08

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.

SirThornberry 14. Feb 2007 19:18

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.

TonyR 14. Feb 2007 19:52

Re: Probleme beim Stream Laden
 
Zitat:

Zitat von fuknersascha
Die Variablen brauch man doch für den String oder??

Hast du überhaupt verstanden was shmia von dir wollte???
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!

SaFu 14. Feb 2007 19:58

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

TonyR 14. Feb 2007 20:08

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 hier bei dsdt.info reinschauen! :wink:

SaFu 14. Feb 2007 20:19

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

Jens Schumann 14. Feb 2007 20:28

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:
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.
In der richtigen Reihenfolge muss natürlich auch hier gelesen werden.

SaFu 14. Feb 2007 20:38

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

bitsetter 15. Feb 2007 00:24

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