![]() |
stream wird nicht versendet
Hallo,
ich hab mal wieder ein Problem mit Streams: Warum wird im folgenden Code das Bild nicht versendet?
Delphi-Quellcode:
Hoffe ihr könnt mir helfen,
var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin server.Active := true; memo1.Lines[0] := ''; end; procedure TForm1.Button1Click(Sender: TObject); begin client.Connect(); end; procedure TForm1.serverExecute(AThread: TIdPeerThread); Var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; Athread.Connection.ReadStream(Stream, SizeOf(Stream)); Image2.Picture.Bitmap.LoadFromStream(Stream); Image2.Picture.SaveToFile('c:\testbild.bmp'); Stream.Free; end; procedure TForm1.Button2Click(Sender: TObject); Var Stream2: TMemoryStream; begin Stream2 := TMemoryStream.Create; Image1.Picture.Bitmap.SaveToStream(Stream2); Client.WriteStream(Stream2); Stream2.Free; end; end. Gruß Spurius |
Re: stream wird nicht versendet
Hallo,
versuch mal folgendes: Stream2.Seek(0,soFromBeginning);
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
Var Stream2: TMemoryStream; begin Stream2 := TMemoryStream.Create; Image1.Picture.Bitmap.SaveToStream(Stream2); Stream2.Seek(0,soFromBeginning); Client.WriteStream(Stream2); Stream2.Free; end; |
Re: stream wird nicht versendet
Hallo,
geht leider auch nicht. Ist es wirklich so schwer, einen Stream mit Indy zu versenden? Weil ich seh meistens Lösungen, die mit Tclientsocket - server oder wie das heisst realisiert wurden. Ich hoffe, jemand findet eine Lösung für mein Problem. |
Re: stream wird nicht versendet
Hallo Spurius,
ich habe mal ein Beispiel gebastelt und getestet. Ich habe bislang nur mit TClient- und TServerSocket gearbeitet. Über die Indy-Komponenten habe ich in der Vergangenheit nur ab und zu etwas gelesen. Das Beispiel konnte ich durch aufmerksames lesen der Indy Hilfe erstellen. Damit möchte ich nicht etwa angeben, sondern aufzeigen, dass man ruhig mal die Hilfe lesen sollte.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdTCPServer, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, ComCtrls, ExtCtrls; type TForm1 = class(TForm) Client: TIdTCPClient; Server: TIdTCPServer; btnConnect: TButton; SB: TStatusBar; btnDisConnect: TButton; btnSendStream: TButton; imgSource: TImage; imgDest: TImage; procedure btnConnectClick(Sender: TObject); procedure ClientConnected(Sender: TObject); procedure btnDisConnectClick(Sender: TObject); procedure ClientDisconnected(Sender: TObject); procedure btnSendStreamClick(Sender: TObject); procedure ServerExecute(AThread: TIdPeerThread); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } FReceiveStream : TMemoryStream; procedure UpdateDestImage; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnConnectClick(Sender: TObject); begin Client.Connect; end; procedure TForm1.ClientConnected(Sender: TObject); begin SB.SimpleText:='Connected'; btnSendStream.Enabled:=True; end; procedure TForm1.btnDisConnectClick(Sender: TObject); begin Client.Disconnect; end; procedure TForm1.ClientDisconnected(Sender: TObject); begin SB.SimpleText:='Disconnected'; btnSendStream.Enabled:=False; end; procedure TForm1.btnSendStreamClick(Sender: TObject); var AStream : TMemoryStream; begin AStream:=TMemoryStream.Create; Try imgSource.Picture.Bitmap.SaveToStream(AStream); Client.WriteStream(AStream,True,True); Finally AStream.Free; end; end; procedure TForm1.ServerExecute(AThread: TIdPeerThread); begin FReceiveStream.Clear; AThread.Connection.ReadStream(FReceiveStream); {Wenn ich mich recht erinnere wird OnExecute im Kontekt des Indy-ServerThreads aufgerufen. Deshalb nutze ich hier Synchronize um die empfangenen Daten an imgDest zu schicken} ATHread.Synchronize(UpdateDestImage); end; procedure TForm1.UpdateDestImage; begin FReceiveStream.Seek(0,soFromBeginning); imgDest.Picture.Bitmap.LoadFromStream(FReceiveStream); end; procedure TForm1.FormCreate(Sender: TObject); begin FReceiveStream:=TMemoryStream.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin FReceiveStream.Free; end; end. |
Re: stream wird nicht versendet
Hallo,
erstmal Danke für die Antwort. ICh bekomme allerdings eine Zugriffsverletztung bei Adresse 000... Lesen von 000.... Hier der Code:
Delphi-Quellcode:
Gruß
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; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure serverExecute(AThread: TIdPeerThread); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } procedure updateimg2; public { Public-Deklarationen } end; var Form1: TForm1; Stream2: TMemoryStream; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin server.Active := true; memo1.Lines[0] := ''; Stream2 := TMemorystream.Create; end; procedure TForm1.Button1Click(Sender: TObject); begin client.Connect(); end; procedure TForm1.serverExecute(AThread: TIdPeerThread); begin Stream2.Clear; Athread.Connection.ReadStream(Stream2); AThread.Synchronize(UpdateImg2); end; procedure TForm1.updateimg2; begin Stream2.Seek(0, soFromBeginning); Image2.Picture.Bitmap.LoadFromStream(Stream2); Stream2.Free; end; procedure TForm1.Button2Click(Sender: TObject); Var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; Image1.Picture.Bitmap.SaveToStream(Stream); Client.WriteStream(Stream, true, true); Stream2.Free; end; end. Spurius |
Re: stream wird nicht versendet
Funktioniert immer noch nicht...
|
Re: stream wird nicht versendet
Klappt jetzt :)
Für alle, die die Lösung interessiert:
Delphi-Quellcode:
Ich denke es hängt mit den gekennzeichneten Parametern zusammen.
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; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure serverExecute(AThread: TIdPeerThread); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin server.Active := true; memo1.Lines[0] := ''; end; procedure TForm1.Button1Click(Sender: TObject); begin client.Connect(); end; procedure TForm1.serverExecute(AThread: TIdPeerThread); Var stream2: TMemorystream; begin Stream2 := TMemoryStream.Create; Stream2.Clear; Athread.Connection.ReadStream(Stream2, -1, true); //<------- Stream2.SaveToFile('c:\testbild01.bmp'); Stream2.Free; end; procedure TForm1.Button2Click(Sender: TObject); Var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; Stream.LoadFromFile('c:\bild.bmp'); Stream.Position := 0; Client.OpenWriteBuffer; Client.WriteStream(Stream); // <---- Client.CloseWriteBuffer; Stream.Free; end; end. Gruß Spurius |
Re: stream wird nicht versendet
Hi Leute,
wie jemand schon vor mir erwähnt hat, wer Lesen kann ist klar im Vorteil ! Vor allen Dingen die Hilfe !!! Also bei all euren Source-Codes oben ist das Problem das Zusammenspiel von WriteStream und ReadStream. ReadStream ohne Parameter erwartet, das in den ersten 4 Bytes des Streams die Größe des Streams steht. WriteStream schickt die Größenangabe aber nur mit wenn man WriteStream(myStream,true,true) verwendet. Das erste True steht dafür das vom Anfang des Streams gesendet wird ! Das zweite True sorgt dafür, das die Größe des Streams in die ersten 4-Bytes des Streams geschrieben wird. Gruß Data |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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