Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Streams (https://www.delphipraxis.net/19810-streams.html)

Quick_silver 9. Apr 2004 10:29


Streams
 
Ich habe bisschen probs das mit den Streams ganz zu verstehen. Hat vielleicht jemand ne Read und Write Procedure, umd ein Array in ne Streamdatei zu schreiben? Eigentlich ganz simpel^^
Naja wenn sich keienr findet werde ich mich wohl oder überl noch nen paar stunden damit beschäftigen. Aber wäre wirklich klasse hier was zu bekommen. Thx.

Christian Seehase 9. Apr 2004 11:45

Re: Streams
 
Moin Quick Silver,

ein Beispiel:

Delphi-Quellcode:
var
  fsWork : TFileStream;
  aiDemo : array [1..10] of integer;
  iIndex : integer;

begin
  fsWork := TFileStream.Create('c:\temp\SaveArrayDemo.file',fmCreate or fmOpenWrite);
  try
    for iIndex := low(aiDemo) to high(aiDemo) do begin
      aiDemo[iIndex] := iIndex; // Nur damit auch was in der Datei steht
      fsWork.Write(aiDemo[iIndex],4);
    end;
  finally
    FreeAndNil(fsWork);
  end;
end;

Quick_silver 10. Apr 2004 07:04

Re: Streams
 
Kann mir jetzt noch einer etwas genauer die 4 Erläutern? Die steht doch für irgend ne läger oder ?!?
Und wie kommst du hier gerade auf 4?

Edit: und ne passene Readfunktion dafür wäre hilfreich.

Sharky 10. Apr 2004 07:16

Re: Streams
 
Zitat:

Zitat von Quick_silver
...Und wie kommst du hier gerade auf 4?...

Ich denke mal weil ein Integer 4 Byte lang ist.

Quick_silver 10. Apr 2004 08:52

Re: Streams
 
Gut das schreiben habe ich jetzt glaube ich begriffen :) Und wie lese ich das ganze in eine variable aus der datei?

Sharky 10. Apr 2004 09:01

Re: Streams
 
Zitat:

Zitat von Quick_silver
Gut das schreiben habe ich jetzt glaube ich begriffen :) Und wie lese ich das ganze in eine variable aus der datei?

Hai Quick_silver,

hier mal eine Erweiterung des Beispieles von oben. Du brauchst auf der Form einen Button und eine Memo
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fsWork : TFileStream;
  aiDemo : array [1..10] of integer;
  iIndex : integer;
  i_deineVariable : Integer;
begin
  fsWork := TFileStream.Create('c:\temp\SaveArrayDemo.file',fmCreate or fmOpenWrite);
  try
    for iIndex := low(aiDemo) to high(aiDemo) do
    begin
      aiDemo[iIndex] := iIndex; // Nur damit auch was in der Datei steht
      fsWork.Write(aiDemo[iIndex],4);
    end;
   //Ab hier wird gelesen
   fsWork.Position := 0; //Den Stream auf die Anfangsposition setzen
   for iIndex := low(aiDemo) to high(aiDemo) do
   begin
     fsWork.Read(i_deineVariable,4); //Die nächsten 4 Byte aus dem Stream lesen
     Memo1.Lines.Add (IntToStr (i_deineVariable)); // Variable im Memo anzeigen
   end;
  finally
    FreeAndNil(fsWork);
  end;
end;

Sharky 10. Apr 2004 09:03

Re: Streams
 
Hier ist ein Tutorial zu dem Thema Streams.

Quick_silver 14. Apr 2004 08:11

Re: Streams
 
Also weiter. Ich habe das Prinzip jetzt gerallt :) Aber beim asulesen kommt noch was falsches zurück.

Delphi-Quellcode:

type
   TConnection=record
     user,pass,host:string;
     port:integer;
     auth:boolean;
     end;


//speichern:
procedure TFormMain.Button1Click(Sender: TObject);
var
  Stream: TStream;
begin

Connect_info.user:=edit7.text;
Connect_info.pass:=edit8.text;
Connect_info.host:=edit9.text;
Connect_info.port:=strtoint(edit10.text);
Connect_info.auth:=CheckBox1.enabled;

Stream := TFileStream.Create('h:\Connection.info', fmCreate or fmOpenWrite);
  try
    Stream.Write(Connect_info.user, SizeOf(Connect_info.user)+10);
    Stream.Write(Connect_info.pass, SizeOf(Connect_info.pass)+10);
    Stream.Write(Connect_info.host, SizeOf(Connect_info.host)+10);
    Stream.Write(Connect_info.port, SizeOf(Connect_info.port)+10);
    Stream.Write(Connect_info.auth, SizeOf(Connect_info.auth)+10);
  finally
    Stream.Free;
  end;

//edits leeren und variablen verfälschen. Mache ich nur formal, damit man sieht wenn es NICHT klappt :)

edit7.text:='';
edit8.text:='';
edit9.text:='';
edit10.text:='';

Connect_info.user:='XX';
Connect_info.pass:='XX';
Connect_info.host:='XX';
Connect_info.port:=666;
Connect_info.auth:=false;

end;


//laden:
procedure TFormMain.Button2Click(Sender: TObject);
var Stream: TStream;
begin


Stream := TFileStream.Create('h:\Connection.info', fmOpenRead);
  try
    Stream.Position:=0; //<-- überflüssig hier
    Stream.Read(Connect_info.user, SizeOf(Connect_info.user)+10);
    Stream.Read(Connect_info.pass, SizeOf(Connect_info.pass)+10);
    Stream.Read(Connect_info.host, SizeOf(Connect_info.host)+10);
    Stream.Read(Connect_info.port, SizeOf(Connect_info.port)+10);
    Stream.Read(Connect_info.auth, SizeOf(Connect_info.auth)+10);
  finally
    Stream.Free;
  end;

//Variablen in edits ausgeben
edit7.text:=Connect_info.user;
edit8.text:=Connect_info.pass;
edit9.text:=Connect_info.host;
edit10.text:=inttostr(Connect_info.port);
edit2.text:=inttostr(SizeOf(Connect_info.user));

end;
Aber in den Edits steht hinter den eigentlich inhalten iemr noch ein zeichen doer sie sind unvollständig... Testet es selber. Nachher schicke ich noch ein screen vielleich. Geht jetzt nicht bin in der Schule.

Christian Seehase 14. Apr 2004 20:31

Re: Streams
 
Moin Quick Silver,

Dein Problem steckt in dieser Zeile:

Delphi-Quellcode:
user,pass,host:string;
String ist nur ein Pointer auf den Inhalt des Wertes, es wird also, unabhängig davon, was in den Feldern steht, immer nur der Pointer auf den String in den Stream geschrieben.

Probier mal string durch array of char zu ersetzen, oder ggf. auch ShortStrings.

Delphi-Quellcode:
user, pass, host: array [1..20] of char;

// oder
user, pass,host: String[20];
20 ist natürlich nur ein Beispiel.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz