Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Warum seh ich den Record Inhalt nicht? (https://www.delphipraxis.net/24760-warum-seh-ich-den-record-inhalt-nicht.html)

Spurius 25. Jun 2004 18:18


Warum seh ich den Record Inhalt nicht?
 
Hallo,
ich versuch hier grad ein Record mit den Indy-kompos zu verschicken, aber in dem Label wo test.b angezeigt werden soll, steht das nicht drin :(
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    server: TIdTCPServer;
    client: TIdTCPClient;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure serverExecute(AThread: TIdPeerThread);
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
  end;
  TTest=record
  a,b,c: String;
  end;
var
  Form1: TForm1;
  Test: TTest;
implementation

{$R *.dfm} 


procedure TForm1.FormCreate(Sender: TObject);
begin
server.Active := true;
memo1.Lines[0] := '';

end;

procedure TForm1.Button1Click(Sender: TObject);
Var Stream: TMemoryStream;
begin
 client.Connect();
 Test.a := 'a';
 Test.b := 'b';
 Test.c := 'c';
 Stream := TMemoryStream.Create;
 Stream.Position := 0;
 Stream.Write(Test,sizeof(Test));

 Client.OpenWriteBuffer;
 Client.WriteStream(Stream);
 Client.CloseWriteBuffer;
 Stream.Free;
end;

procedure TForm1.serverExecute(AThread: TIdPeerThread);
Var stream2: TMemorystream;
    Test2: TTest;
begin
 label1.Caption := '--';
 Stream2 := TMemoryStream.Create;
 Stream2.Clear;
 Athread.Connection.ReadStream(Stream2, -1, true);
 Stream2.Position := 0;
 Stream2.Read(test2, sizeOf(TTest));
 label1.Caption := test2.b;
 showmessage(test.a);
end;

end.
Wenn ich den Stream in eine TXT speichere, kommt folgendes dabei heraus:

`ä pä €ä

Hoffe mir kann jemand helfen.
Gruß
Spurius

Jens Schumann 25. Jun 2004 19:02

Re: Warum seh ich den Record Inhalt nicht?
 
Hallo,
Dein Problem ist der String im Record. Lange Strings lassen sich nicht so einfach in einen
Stream schreiben. Deklariere Deine Record zum Test mal wie folgt:
Delphi-Quellcode:
  TTest=record
  a,b,c: String[50];
  end;

Spurius 25. Jun 2004 19:10

Re: Warum seh ich den Record Inhalt nicht?
 
Also wenn ich da in eine TXT speicher, kommt jetzt das:
a b c
Aber mit mehr abstand dazwischen. In dem Label erscheint allerdings immer noch nichts
:(

Jens Schumann 25. Jun 2004 19:12

Re: Warum seh ich den Record Inhalt nicht?
 
Zitat:

Zitat von Spurius
Also wenn ich da in eine TXT speicher, kommt jetzt das:
a b c
Aber mit mehr abstand dazwischen. In dem Label erscheint allerdings immer noch nichts
:(

Tut mir Leid, ich weiss nicht was Du mir oder einem Andren sagen möchtest.

Spurius 25. Jun 2004 19:18

Re: Warum seh ich den Record Inhalt nicht?
 
Ich möchte damit lediglich kundtun, dass der Record Inhalt anscheinend nicht richtig übermittel wird. Zum Test habe ich ihn in eine Textdatei gespeichert, wobei das oben geschriebene herausgekommen ist. Deshalb würde ich gerne wissen, ob du oder ein anderer mir weiterhelfen kannst/kann.

Jens Schumann 25. Jun 2004 19:20

Re: Warum seh ich den Record Inhalt nicht?
 
Hast Du mein Posting zu Deinem Record gelesen ??

Spurius 25. Jun 2004 19:23

Re: Warum seh ich den Record Inhalt nicht?
 
Ja, ich habs auch ausprobiert, nur geht leider nicht.

Jens Schumann 25. Jun 2004 19:25

Re: Warum seh ich den Record Inhalt nicht?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dann versuch mal diesen Source:
Delphi-Quellcode:
unit Unit1;

interface

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

type

  TTest=record
  a,b,c: String[50];
  end;
 
  TForm1 = class(TForm)
    Server: TIdTCPServer;
    Client: TIdTCPClient;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ServerExecute(AThread: TIdPeerThread);
  private
    { Private-Deklarationen }
    FTest : TTest;
    procedure UpdateForm;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Server.Active:=Not Server.Active;
  If Server.Active then
    Button1.Caption:='Shutdown Server'
    else
      Button1.Caption:='Run Server';
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Test    : TTest;
  MStream : TMemoryStream;
begin
  Test.a:='Jens Schumann';
  Test.b:='at';
  Test.c:='www.DelphiPraxis.net';

  MStream:=TMemoryStream.Create;
  Client.Connect;
  Try
    MStream.Write(Test,SizeOf(TTest));
    Client.OpenWriteBuffer;
    Client.WriteStream(MStream,True,True);
    Client.CloseWriteBuffer;
  Finally
    Client.Disconnect;
    MStream.Free;
    end;
end;

procedure TForm1.ServerExecute(AThread: TIdPeerThread);
{Achtung: Diese Event wird im Kontext das Indy-Thread ausgeführt.
 D.h. nicht im Kontext des MainThread's deshalb werden Aktualisierungen
 des Formulars über Synchronize gemacht}
var
  Test    : TTest;
  MStream : TMemoryStream;
  F : TThread;
begin
  MStream:=TMemoryStream.Create;
  Try
    Athread.Connection.ReadStream(MStream);
    MStream.Position:=0;
    MStream.ReadBuffer(FTest,SizeOf(TTest));
    AThread.Synchronize(UpdateForm);
  Finally
    MStream.Free;
    end;
end;

procedure TForm1.UpdateForm;
begin
  Memo1.Clear;
  Memo1.Lines.Add(FTest.a);
  Memo1.Lines.Add(FTest.b);
  Memo1.Lines.Add(FTest.c);
end;

end.

Spurius 26. Jun 2004 13:45

Re: Warum seh ich den Record Inhalt nicht?
 
Hallo,
ich hab das mit dem Synchronize eingebaut, aber es geht immer noch nicht:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    server: TIdTCPServer;
    client: TIdTCPClient;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure serverExecute(AThread: TIdPeerThread);
  private
    { Private-Deklarationen }
    procedure UpdateForm;
  public
    { Public-Deklarationen }
  end;
  TTest=record
  a,b,c: String[50];
  end;
var
  Form1: TForm1;
  Test, Test2: TTest;
implementation

{$R *.dfm} 


procedure TForm1.FormCreate(Sender: TObject);
begin
server.Active := true;
memo1.Lines[0] := '';

end;

procedure TForm1.Button1Click(Sender: TObject);
Var Stream: TMemoryStream;
begin
 client.Connect();
 Test.a := 'a';
 Test.b := 'b';
 Test.c := 'c';
 Stream := TMemoryStream.Create;
 Stream.Position := 0;
 Stream.Write(Test,sizeof(Test));

 Client.OpenWriteBuffer;
 Client.WriteStream(Stream, True, True);
 Client.CloseWriteBuffer;
 Stream.Free;
end;

procedure TForm1.serverExecute(AThread: TIdPeerThread);
Var stream2: TMemorystream;

begin
 label1.Caption := '--';
 Stream2 := TMemoryStream.Create;
 Stream2.Clear;
 Athread.Connection.ReadStream(Stream2, -1, true);
 Stream2.Position := 0;
 Stream2.ReadBuffer(test2, sizeOf(TTest));
 AThread.Synchronize(UpdateForm);
 Stream2.SaveToFile('c:/streamtest.txt');
end;
procedure TForm1.UpdateForm;
begin
 showmessage('Ausgeführt!');   // wird nicht angezeigt
 Label1.Caption := test2.b;
end;
end.
Das Showmessage wir nur ausgeführt, wenn ich das Fenster schließe, da sieht man es kurz.
D.h. dass das UpdateForm gar nicht ausgeführt wird oder?

Spurius 26. Jun 2004 14:13

Re: Warum seh ich den Record Inhalt nicht?
 
Hallo, es geht jetzt, ich hba das hier weggelassen:
Delphi-Quellcode:
Label1.Caption := '--';
Weiss zwar net warum es so ist, aber naja.
Vielen Dank für die Hilfe
Gruß
Spurius


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 Uhr.
Seite 1 von 2  1 2      

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