Avatar billede klasker Nybegynder
29. september 2003 - 21:10 Der er 11 kommentarer og
1 løsning

Hjælp med streams!!

Jeg har store kvaler med at på TStream til at virke.
Det eneste jeg vil er at kunne gemme og redigere en tekst i den.
Jeg har prøvet med disse men alle sammen rejste exceptions, dog ikke compilerfejl:

Stream.Write(Pointer(S)^, Length(S));
Stream.Write(S, Length(S));
Stream.Write(S, SizeOf(S));
Stream.Write(Pointer(S)^, SizeOf(S));

Hvor S altså er en string.

Jeg har prøvet at søge på google efter hjælp til at arbejde med Streams, men uden held :(

Jeg håber at der er nogen her som kan hjælpe lille mig.
Avatar billede Slettet bruger
29. september 2003 - 21:25 #1
Prøv at fjerne ^.
Avatar billede martinlind Nybegynder
29. september 2003 - 21:36 #2
Eller brug TStringStream !!
Avatar billede klasker Nybegynder
29. september 2003 - 21:42 #3
Jeg fik løst problemet med exceptionen, men nu gemmer den bare ikke noget i min Stream.
Det jeg sådan set er ude efter er hvordan streams i det hele taget fungerer.
Avatar billede athlon-pascal Juniormester
29. september 2003 - 21:43 #4
Går ud fra at S er en String, og en String er en pointer.
Prøv det her:
Stream.Write(S[1], Length(S) + 1);
Avatar billede athlon-pascal Juniormester
29. september 2003 - 21:48 #5
Hvis du evt. senere vil kunne læse fra din stream igen , så kig på dette:

  procedure WriteString(S: String);
  var
    Size: Word;
  begin
    if Length(S) > MaxWord then
      S := Copy(S, 1, MaxWord);
    Size := Length(S);
    Stream.Write(Size, 2); //Skriver strengens længde
    Stream.Write(S[1], Size + 1); //Skriver stengen
  end;

  procedure ReadString(var S: String);
  var
    Count: Word;
    ICount: Integer;
    P: PChar;
  begin
    TempStream.Read(Count, 2); //Læser strengens længde

    ICount := Count + 1;
    getmem(P, ICount);
    if TempStream.Read(P^, ICount) = ICount then //Læser strengen
      S := P
    else
      S := '';
    FreeMem(P);
  end;
Avatar billede klasker Nybegynder
01. oktober 2003 - 21:00 #6
Jeg er kommet lige langt.
Jeg aner stadig ikke hvad f*nden en TStream vil have af parametrer i sin Write funktion uden at lave fejl.
Jeg er glad for at i vil hjælpe men alle jeres eksempler har genereret den samme fejl.
Avatar billede athlon-pascal Juniormester
01. oktober 2003 - 21:21 #7
Dette bør ikke komme med fejl, viker hos mig...
Stream.Write(S[1], Length(S) + 1);

Stream.Write(S, SizeOf(String));
At overstående ikke virker, kan jeg godt forstå, da S er en String, og en String er en pointer. Altså vil adressen til hvor i hukommelsen S gemmer sig blive skrevet til filen, i stedet for strengen S.
Svarer til at du tager et billede af et hus, og når du så får det fremkaldt, får du et hvidt billede med adressen til huset skrevet på...
Avatar billede klasker Nybegynder
01. oktober 2003 - 21:26 #8
Jeg prøvede med et nyt program bare for at få streams til at virke.
Jeg har prøvet dette:

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TStringStream;
begin
  Stream := TStringStream.Create('hej');
  Stream.WriteString(Memo1.Text);
  Richedit1.Lines.LoadFromStream(Stream);
  Stream.Free;
end;

Det virker ikke!

Heller ikke dette her virker:

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TStringStream;
begin
  Stream := TStringStream.Create('hej');
  Memo1.Lines.SaveToStream(Stream);
  Richedit1.Lines.LoadFromStream(Stream);
  Stream.Free;
end;

Der kommer ingen fejl, men Richedit'en bliver tom. Jeg har også prøvet at bytte om på richedit og memo.
Det er dog ikke læsefunktionen den er gal med, for når jeg gør sådan her står der 'hej' i min Richedit:

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TStringStream;
begin
  Stream := TStringStream.Create('hej');
  // Stream.WriteString(Memo1.Text);
  Richedit1.Lines.LoadFromStream(Stream);
  Stream.Free;
end;
Avatar billede klasker Nybegynder
01. oktober 2003 - 21:29 #9
Aha! Nu virker det!

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TStringStream;
begin
  Stream := TStringStream.Create('hej');
  Stream.WriteString(Memo1.Text);
  Stream.Position := 0;
  Richedit1.Lines.LoadFromStream(Stream);
  Stream.Free;
end;
Avatar billede athlon-pascal Juniormester
01. oktober 2003 - 21:36 #10
Den her er mere fleksibel:

procedure WriteString(aString: String; var aStream: TStream);
var
  Size: Word;
begin
  if Length(aString) > MaxWord then
    aString := Copy(aString, 1, MaxWord);
  Size := Length(aString);
  aStream.Write(Size, 2); //Skriver strengens længde
  aStream.Write(aString[1], Size + 1); //Skriver strengen
end;
Avatar billede athlon-pascal Juniormester
01. oktober 2003 - 21:37 #11
Men prøv det her:
procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TStringStream;
begin
  Stream := TStringStream.Create('hej');
  Stream.Write(Memo1.Text[1], Length(Memo1.Text));
  Stream.Position := 0;
  Richedit1.Lines.LoadFromStream(Stream);
  Stream.Free;
end;
Avatar billede klasker Nybegynder
07. oktober 2003 - 12:27 #12
Tak for hjælpen folkens, men jeg fandt sådan set selv ud af hvad problemet var (altså at Stream.Position skulle være = 0), så jeg lukker bare spørgsmålet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester