Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Streamproblem (https://www.delphipraxis.net/18097-streamproblem.html)

Spurius 14. Mär 2004 16:48


Streamproblem
 
Hallo,
wie kann ich bei folgendem Code das Record mit den Daten aus dem Stream füllen?
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 type
  TTest = record
   a, b, c: integer;
  end;
var
  Form1: TForm1;
  Stream: TMemoryStream;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var Test: TTest;

begin
 Test.a := 1;
 Test.b := 2;
 Test.c := 3;
 Stream := TMemoryStream.Create;
 Stream.WriteBuffer(Test, Sizeof(Test));
end;

procedure TForm1.Button2Click(Sender: TObject);
var test2: TTest;
begin
 Stream.Position := 0;
 Stream.SaveToFile('c:/hm.txt');

end;
end.
Gruß
Spurius

Jens Schumann 14. Mär 2004 17:49

Re: Streamproblem
 
Hallo,
ganz eínfach:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

  TTest = record
   a, b, c: integer;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen } 
   FStream: TMemoryStream;

  public
    { Public-Deklarationen } 
  end;

var
  Form1: TForm1;
//  Stream: TMemoryStream; // globale Instanzen / Variablen sind immer schlecht
implementation

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); // OnCreate Event-Handler
begin
  FStream:=TMemoryStream.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject); // OnDestroy Event-Handler
begin
  FStream.Free
end;

procedure TForm1.Button1Click(Sender: TObject);
var Test: TTest;

begin
Test.a := 1;
Test.b := 2;
Test.c := 3;
{Stream := TMemoryStream.Create;
Stream.WriteBuffer(Test, Sizeof(Test)); }
  FStream.Write(Test,SizeOf(TTest);
end;

procedure TForm1.Button2Click(Sender: TObject);
var test2: TTest;
begin
  FStream.Position := 0;
  FStream.SaveToFile('c:/hm.txt');
end;

procedure TForm1.Button3Click(Sender: TObject);
// Öffnet eine Datei und schiebt den Inhalt in FStream
var
  Test3       : TTest;
begin
  FStream.LoadfromFile('c:/hm.txt');
  FStream.Position := 0; // sicherheitshalber
  FStream.Read(Test3,SizeOf(TTest));
end;
end.
Ich habe Deinen Code noch ein bißchen geändert.

Luckie 14. Mär 2004 18:01

Re: Streamproblem
 
Gibt es einen Grund, warum du einen MemoryStream genommen hast und keinen FileStream?

BTW solltest du das Objekt auch irgendwo wieder freigeben. ;)

Spurius 14. Mär 2004 18:03

Re: Streamproblem
 
Hallo,
Danke.
Gruß
Spurius

Spurius 14. Mär 2004 18:18

Re: Streamproblem
 
So,
ich wollte das ganze jetzt mit Indy/ TCP versenden, aber es geht irgendwie nicht:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdTCPConnection, IdTCPClient, IdBaseComponent,
  IdComponent, IdTCPServer;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Server: TIdTCPServer;
    Client: TIdTCPClient;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure ServerExecute(AThread: TIdPeerThread);
    procedure ServerConnect(AThread: TIdPeerThread);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 type
  TTest = record
   a, b, c: integer;
  end;
var
  Form1: TForm1;
  Stream, stream2: TMemoryStream;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var Test: TTest;
begin
 client.Connect;
 Test.a := 1;
 Test.b := 2;
 Test.c := 3;
 Stream := TMemoryStream.Create;
 Stream.Write(Test, Sizeof(Test));
 Client.WriteStream(stream, true, true, 0);
end;

procedure TForm1.ServerExecute(AThread: TIdPeerThread);
begin
 Label1.Caption := 'Connected';
end;

procedure TForm1.ServerConnect(AThread: TIdPeerThread);
var test2: TTest;
begin
 Stream2 := TMemoryStream.Create;
 athread.Connection.ReadStream(stream2);
 Stream2.Position := 0;
 Stream.Read(Test2, Sizeof(TTest));
 memo1.Lines.Add(inttostr(test2.a));   // wenn a oder b dann kommt eine große zahl, wenn c kommt 0 
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Stream.Free;
 stream2.Free;
end;

end.
Was mach ich da falsch?
Gruß
Spurius

Spurius 18. Mär 2004 13:59

Re: Streamproblem
 
Geht leider immer noch nicht...

Luckie 19. Mär 2004 13:39

Re: Streamproblem
 
Tja. Bei solchen detailierten Beschreibungen der Fehlermeldung, bzw. was nicht geht, ist man so von Informationen erschlagen, dass man gar nicht weiß, wo man als erstes ansetzten soll. :?

Spurius 19. Mär 2004 13:46

Re: Streamproblem
 
Also. der Stream den ich versenden will wird nicht richtig im Memo angezeigt.
Wenn ich aus dem Record, welches ich mit dem Stream fülle,
test.a auslese kommt 9261416,
bei test.b kommt 9258196,
bei test.c kommt 0.
Wenn die Infos nicht ausreichen, kann ich dir das Projekt auch mal schicken.
Gruß
Spurius

Spurius 22. Mär 2004 13:52

Re: Streamproblem
 
Gibts wirlich niemand hier, der mir helfen kann?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 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