Synapse HTTPsend s.Seek not implemented???

Alle Fragen zur Netzwerkkommunikation
Antworten
Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Synapse HTTPsend s.Seek not implemented???

Beitrag von Komoluna »

Liebes Forum,

ich wollte spaßeshalber mal ein Programm schreiben, was in regelmäßigen Abständen ein Bild aus dem Internet Herunterläd.
wenn ich jedoch die Funktion "HttpGetBinary" aufrufe wird jedoch immer eine exception mit dem Text "TStream.Seek not implemented" ausgelöst.

Code: Alles auswählen

function HttpGetBinary(const URL: string; const Response: TStream): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    Result := HTTP.HTTPMethod('GET', URL);
    if Result then
    begin
      Response.Seek(0, soFromBeginning);   //<<--- Hier wird die Exception ausgelöst
      Response.CopyFrom(HTTP.Document, 0);
    end;
  finally
    HTTP.Free;
  end;
end;

benutze ich die funktion falsch oder ist das ein Bug, mein Quellmantel ist folgender

Code: Alles auswählen

Procedure TForm1.Button1Click(Sender: TObject);
Const
  link: String = 'http://kprogramme.kp.funpic.de/files/kpdm.txt'; // oder irgendein link
Var
  s: TStream;
Begin
  s := TStream.Create;
  HttpGetBinary(link, s);
End


MFG
Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse HTTPsend s.Seek not implemented???

Beitrag von theo »

Es gibt keinen TStream. Das ist nur die Idee eines Streams (Abstrakte Basisklasse).
s := TStream.Create; ist immer falsch.
Du benötigst einen TMemoryStream oder TFileStream.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Synapse HTTPsend s.Seek not implemented???

Beitrag von Komoluna »

danke theo, wieder was gelernt...

wenn ich jetzt die Daten in eine TImage/TImage.Picture laden möchte, was muss ich dann machen?
geht das irgendwie über Image1.Picture.LoadFromStream(); (Exception "StreamReadError" wird erzeugt)oder muss ich den Umweg über eine Datei nehmen:

Code: Alles auswählen

 
Procedure TForm1.Button1Click(Sender: TObject);
Const
  link: String = 'http://sdo.gsfc.nasa.gov/assets/img/latest/f_211_193_171_512.jpg';
Var
  s: TMemoryStream;
Begin
  s := TMemoryStream.Create;
  HttpGetBinary(link, s);
  s.SaveToFile('tmp.jpg');
  Image1.Picture.LoadFromFile('tmp.jpg'); //<-- oder kann ich hier *.LoadFromStream(s); verwenden?
  s.Free;                           
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse HTTPsend s.Seek not implemented???

Beitrag von theo »

Probier's doch aus. LoadFromStream sollte klappen. U.U. vorher S.Position:=0; setzen.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Synapse HTTPsend s.Seek not implemented???

Beitrag von Komoluna »

danke theo, jetzt funktioniert alles wie gewünscht, schönen Restabend noch...

MFG
Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Antworten