![]() |
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:
Das Problem ist, dass es bei manchen Seiten funktioniert und mir den Quelltext schön zurückgibt.
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; 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:
hängen. Was kann ich tun, um das zu verhindern? Im Web habe ich nichts dazu gefunden...
msData.Seek(0, soFromBeginning);
|
Re: Eine Webseite laden mit Indy
Zitat:
Meine :glaskugel: hätte da noch 'nen Verdacht: Wie sieht denn dein StreamToString aus?
Delphi-Quellcode:
Wieso nix?
except
//nix end; |
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:
Scheint zu funktionieren...
Function TSDIAppForm.StreamToString(AStream: TStream): String;
Begin SetLength(Result, AStream.Size); AStream.Position := 0; AStream.ReadBuffer(Result[1], AStream.Size); End; |
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 |
Re: Eine Webseite laden mit Indy
Zitat:
Ab D2009 wird es Probleme geben (das nette Unicode halt). Zitat:
|
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? |
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:
Grüße
idHttp1.HandleRedirects := true;
Klaus |
Re: Eine Webseite laden mit Indy
Zitat:
|
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? |
Re: Eine Webseite laden mit Indy
Zitat:
Ganz nebenbei: eine Frage pro Thread ("auf bestimmte Länge" = ![]() ![]() |
Re: Eine Webseite laden mit Indy
Ich sehe da nur die Frage von Klaus01 und antworte: Gut möglich, hab ich noch nicht getestet. Aber Google.de wirft eine Exception, ausserdem kriege ich auch bei 301-Seiten einen Hinweis. Nur keine Ahnung, wie ich die einfach ignorieren kann...
Danke, StringOfChar war genau, was ich suchte. Irgendwie fehlt mir eine Seite wie SelfPHP mit einer guten Referenz, nur eben für Delphi... |
Re: Eine Webseite laden mit Indy
Zitat:
Zitat:
Zitat:
![]() ![]() ![]() ![]() dieses gibt es auch lokal als Online Hilfe (OH) über F1 PS: die Autovervollständigung ist auch ganz praktisch ... man gebe einen Namespace an, dahinter ein Punkt und schon sieht man, was es dort gibt. ![]() |
Re: Eine Webseite laden mit Indy
Zitat:
Zitat:
Wie könnte ich zum Beispiel eine HTTP 301 (ich glaube, Moved Permanently) abfangen? |
Re: Eine Webseite laden mit Indy
Meine Function sieht jetzt so aus:
Delphi-Quellcode:
Die Exception wird gemeldet, was okay ist, aber diese Funktion soll mehrmals aufgerufen werden. Leider stoppt das Programm nach einer Exception (zB 301-Moved Permanently).
function TSDIAppForm.ReadSite(URI: string): String;
var idClient: TIdHTTP; msData: TMemoryStream; ResultString: String; begin idClient := TIdHTTP.Create(Application); msData := TMemoryStream.Create; try idClient.Get(URI, msData); msData.Seek(0, soFromBeginning); ResultString := StreamToString(msData); except on E:Exception do begin E.Message := 'Meldung: '+E.Message; Raise; // Erneut auslösen ! end; end; idClient.Free; msData.Free; result := ResultString; end; Wenn ich die Zeile mit dem "Raise" weglasse, macht das Programm eine Weile lang weiter, stürzt aber dann ab. Bin ich der einzige, der mit nicht erreichbaren Seiten Probleme hat? Das kann doch fast nicht sein. Kann man den TIdHTTP nicht so konfigurieren, dass er Seiten, die es nicht mehr gibt o.ä. einfach ignoriert? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 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