Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Eine Webseite laden mit Indy (https://www.delphipraxis.net/146295-eine-webseite-laden-mit-indy.html)

BenNation 17. Jan 2010 12:52


Eine Webseite laden mit Indy
 
Sorry, bin eher noch Delphi-Anfänger...

Ich möchte einfach nur eine Webseite laden und habe folgenden Code:

Delphi-Quellcode:
function TSDIAppForm.ReadSite(URI: string): string;
var
  idClient: TIdHTTP;
  msData: TMemoryStream;
  ResultString: String;
begin
  begin
    idClient := TIdHTTP.Create(Application);
    msData := TMemoryStream.Create;
    try
      idClient.Get(URI, msData);
      msData.Seek(0, soFromBeginning);
      ResultString := StreamToString(msData);
    except
      //nix
   end;
   idClient.Free;
   msData.Free;
  result := ResultString;
  end;
end;
Das Problem ist, dass es bei manchen Seiten funktioniert und mir den Quelltext schön zurückgibt.
Nur bei Seiten wie Google.de oder ähnlichen wirft mir Delphi eine Exception mit der Klasse ERangeError mit der Meldung "Range check error" aus und bleibt in der Zeile

Delphi-Quellcode:
msData.Seek(0, soFromBeginning);
hängen. Was kann ich tun, um das zu verhindern? Im Web habe ich nichts dazu gefunden...

himitsu 17. Jan 2010 12:58

Re: Eine Webseite laden mit Indy
 
Zitat:

wirft mir Delphi eine Exception ...
Bei welchem Befehl?

Meine :glaskugel: hätte da noch 'nen Verdacht:
Wie sieht denn dein StreamToString aus?

Delphi-Quellcode:
except
  //nix
end;
Wieso nix?

BenNation 17. Jan 2010 13:03

Re: Eine Webseite laden mit Indy
 
Ich wollte, dass er die Exception ignoriert. Funktioniert auch, wenn ich die .exe von Hand starte.

StreamToString ist folgende:

Delphi-Quellcode:
Function TSDIAppForm.StreamToString(AStream: TStream): String;
Begin
  SetLength(Result, AStream.Size);
  AStream.Position := 0;
  AStream.ReadBuffer(Result[1], AStream.Size);
End;
Scheint zu funktionieren...

FAlter 17. Jan 2010 13:15

Re: Eine Webseite laden mit Indy
 
Hi,

es gibt auch neine Überladung von TIdHTTP.Get, welche dir den String direkt zurückliefert.

Und verwende mal try-finally.

Gruß
FAlter

himitsu 17. Jan 2010 13:25

Re: Eine Webseite laden mit Indy
 
Zitat:

Zitat von BenNation
Delphi-Quellcode:
Function TSDIAppForm.StreamToString(AStream: TStream): String;
Begin
  SetLength(Result, AStream.Size);
  AStream.Position := 0;
  AStream.ReadBuffer(Result[1], AStream.Size);
End;

Und in welcher Delphi-Version?
Ab D2009 wird es Probleme geben (das nette Unicode halt).

Zitat:

Ich wollte, dass er die Exception ignoriert. Funktioniert auch, wenn ich die .exe von Hand starte.
Ja toll, dann tritt dort auch die Exception auf und weil man es nicht mitbekommt, weiß man nicht, warum irgendwas nicht geht.

BenNation 17. Jan 2010 13:43

Re: Eine Webseite laden mit Indy
 
Ich verwende Delphi 2007.

Die Überladung scheint's bei mir nicht zu geben. Ich kann nur die mit dem Stream finden...

Das mit dem finally hatte ich schon, so habe ich neulich die Funktion übernommen. Macht aber leider keinen Unterschied.

Kann ich denn nichts mehr tun?

Klaus01 17. Jan 2010 13:56

Re: Eine Webseite laden mit Indy
 
.. kann es sein, dass Du bei redirected Seiten
kein Ergebnis bekommst?

Wenn das der Fall sein sollte,
Delphi-Quellcode:
idHttp1.HandleRedirects := true;
Grüße
Klaus

himitsu 17. Jan 2010 13:58

Re: Eine Webseite laden mit Indy
 
Zitat:

Zitat von BenNation
Kann ich denn nichts mehr tun?

Ja kannst du, einfach nur den Grund für die Exception beheben.

BenNation 17. Jan 2010 16:49

Re: Eine Webseite laden mit Indy
 
Das klingt doch etwas ungenau für einen Anfänger. Kannst du das etwas ausführen?

Ganz nebenbei: Wie kann ich einen String auf eine bestimmte Länge "padden". Also wenn ich jetzt eine bestimmte Anzahl von Leerzeichen kreiiren wollte, wie heisst da die funktion?

himitsu 17. Jan 2010 17:17

Re: Eine Webseite laden mit Indy
 
Zitat:

Zitat von BenNation
Das klingt doch etwas ungenau für einen Anfänger. Kannst du das etwas ausführen?

Nein, da du die Fragen nicht beantwortet hast.

Ganz nebenbei: eine Frage pro Thread
("auf bestimmte Länge" = Delphi-Referenz durchsuchenSetLength, wobei Delphi-Referenz durchsuchenStringOfChar auch nett ist)


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