Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy MemoryStream JPEG Fehler 42 (https://www.delphipraxis.net/171382-indy-memorystream-jpeg-fehler-42-a.html)

4lb3rtO 4. Nov 2012 16:34

Indy MemoryStream JPEG Fehler 42
 
Hallo Delphianer

Ich beschäftige mich gerade ein wenig mit MemoryStreams und hätte da ein kleines Problem beim versenden eines JPEG Image mit der Indy Komponente IdTCP. Ich erhalte einen JPEG Fehler 42 und komme an dieser Stelle leider nicht weiter.


Hiermit versuche ich zu senden:
Delphi-Quellcode:
procedure TForm1.Senden_BClick(Sender: TObject);
var
  ms: TMemoryStream;
  jpg: TJpegImage;

begin
  ms := TMemoryStream.Create;
  jpg := TJpegImage.Create;

  jpg.Assign(Image1.Picture);
  jpg.SaveToStream(ms);

  ms.Free;
  jpg.Free;
end;

Empfangen:
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  ms: TMemoryStream;
  jpg: TJpegImage;

begin
  ms := TMemoryStream.Create;
  jpg := TJpegImage.Create;

  jpg.LoadFromStream(ms);
  ms.Position := 0;
  Image1.Picture.Assign(jpg);

  ms.Free;
  jpg.Free;
end;

Das jpeg soll "einfach" nur vom Client (aus einem TImage) an den Server gesendet werden und dort in ein TImage geladen werden. Kann mir vlt. jemand einen Tip geben, woran es hier scheitert?


Schöne Grüße
4lb3rtO

stahli 4. Nov 2012 16:59

AW: Indy MemoryStream JPEG Fehler 42
 
Du kannst Dir mal das Testprojekt anschauen: http://www.delphipraxis.net/170904-i...bertragen.html

Union 4. Nov 2012 17:02

AW: Indy MemoryStream JPEG Fehler 42
 
Das liegt daran dass Du
* Den Stream ins Nichts schreibst - in einen lokalen Memorystream. Verwende die Methode IOHandler.Write des Clients.

* Den Stream aus dem Nichts liest - aus einem lokalen, leeren Memorystream. Verwende AContext.Connection.IOHandler.ReadStream

4lb3rtO 4. Nov 2012 17:58

AW: Indy MemoryStream JPEG Fehler 42
 
Ich danke euch vielmals. Hab Stunden damit verbracht eine Lösung dafür zu finden.

@stahli: Bei der umfangreichen Google-Suche bin ich auch auf dein Demo-Projekt gestoßen. Nur konnte ich leider aufgrund meiner bescheidenen Delphi Kenntnisse nicht allzu viel damit anfangen:)


So funktioniert es zumindest:
Client:
Delphi-Quellcode:
procedure TForm1.Senden_BClick(Sender: TObject);
var
  ms: TMemoryStream;
  jpg: TJpegImage;
  siz: Integer;

begin
  ms := TMemoryStream.Create;
  jpg := TJpegImage.Create;

  jpg.Assign(Image1.Picture);
  jpg.SaveToStream(ms);
  ms.Position := 0;
  IdTCPClient1.IOHandler.Write(ms, 0, True);

  ms.Free;
  jpg.Free;
end;


Server:
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  ms: TMemoryStream;
  jpg: TJpegImage;
  siz: Integer;

begin
  ms := TMemoryStream.Create;
  jpg := TJpegImage.Create;

  siz := AContext.Connection.IOHandler.ReadLongInt;
  AContext.Connection.IOHandler.ReadStream(ms, siz);

  ms.Position := 0;
  jpg.LoadFromStream(ms);
  Image1.Picture.Assign(jpg);

  ms.Free;
  jpg.Free;
end;

Schönen Abend noch
4lb3rtO


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