![]() |
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:
Wenn ich den Stream in eine TXT speichere, kommt folgendes dabei heraus:
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. `ä pä €ä Hoffe mir kann jemand helfen. Gruß Spurius |
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; |
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 :( |
Re: Warum seh ich den Record Inhalt nicht?
Zitat:
|
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.
|
Re: Warum seh ich den Record Inhalt nicht?
Hast Du mein Posting zu Deinem Record gelesen ??
|
Re: Warum seh ich den Record Inhalt nicht?
Ja, ich habs auch ausprobiert, nur geht leider nicht.
|
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. |
Re: Warum seh ich den Record Inhalt nicht?
Hallo,
ich hab das mit dem Synchronize eingebaut, aber es geht immer noch nicht:
Delphi-Quellcode:
Das Showmessage wir nur ausgeführt, wenn ich das Fenster schließe, da sieht man es kurz.
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. D.h. dass das UpdateForm gar nicht ausgeführt wird oder? |
Re: Warum seh ich den Record Inhalt nicht?
Hallo, es geht jetzt, ich hba das hier weggelassen:
Delphi-Quellcode:
Weiss zwar net warum es so ist, aber naja.
Label1.Caption := '--';
Vielen Dank für die Hilfe Gruß Spurius |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 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-2025 by Thomas Breitkreuz