![]() |
Der Index war außerhalb des Arraybereichs
Ich bin gerade dabei, ein bisschen mit ASP.NET zu programmieren und jetzt komme ich an einer Stelle nicht weiter.
Und zwar habe ich eine Funktion, die eine bestimmte Stelle in einem Quelltext auslesen kann. Nur das funktioniert jetzt nicht so ganz, wie ich das gerne haben würde! Wenn ich jetzt mit der Funktion FindinString einen Quelltext auslesen, kommt die meldung "Der Index war außerhalb des Arraybereichs". Habe es mal im folgenden Quelltext kommentiert. Hoffe, jemand kann mir damit helfen!
Delphi-Quellcode:
type
TArrayofstring = array of string; function FindInString(Text, SearchFrom, SearchTo: string; FirstOnly: Boolean; var Return: TArrayofstring): Boolean; var i: Cardinal; FoundString: string; begin Result := False; SetLength(Return, 0); i := Pos(SearchFrom, Text); while i > 0 do begin Result := True; i := i + Length(SearchFrom); FoundString := Copy(Text, i, PosEx(SearchTo,Text,i) - i); SetLength(Return, length(Return) + 1); Return[high(Return)] := FoundString; Delete(Text, 1, i); i := Pos(SearchFrom, Text); if FirstOnly then Break; end; end; procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs); var FileStream : TFileStream; HTMLCode: String; VideoID: TArrayOfString; TWert: TArrayOfString; VideoName: TArrayOfString; begin HTMLCode := TextBox1.Text; FindInString(HTMLCode, '<title>YouTube - ', '</title>', True, VideoName); FindInString(HTMLCode, '"t": "', '"', True, TWert); FindInString(HTMLCode, '"video_id": "', '"', True, VideoID); HTMLCode := 'http://youtube.com/get_video?video_id=' + VideoID[0] + '&t=' + TWert[0]; //[b]Der Index war außerhalb des Arraybereichs.[/b] TextBox1.Text := HTMLCode; end; |
Re: Der Index war außerhalb des Arraybereichs
High gibt den höchsten Index -1 zurück. Im ersten Durchlauf ergibt das dann -1 und da kommt die Out of Range Exception.
|
Re: Der Index war außerhalb des Arraybereichs
Danke erstmal für deine super schnelle Antwort!
Aber könntest du das mir nochmal genauer erklären? Woher weißt du, dass high -1 zurück gibt? |
Re: Der Index war außerhalb des Arraybereichs
Schau mal in der Delphihilfe unter System.Heigh.
Zitat:
|
Re: Der Index war außerhalb des Arraybereichs
Es liegt vermutlich daran, dass eins der Arrays leer ist, Du musst also zunächst mit Length() prüfen, bevor Du auf Element 0 zugreifst.
[edit] @Lars: er setzt vor dem High-Aufruf die Länge hoch, daran liegt es also nicht (dann käme der Fehler auch früher und nicht in der benannten Zeile). [/edit] |
Re: Der Index war außerhalb des Arraybereichs
Aber warum ist der Array leer? Also ich habe die Funktion auch nur aus dem Internet und kann jetzt nicht direkt jedes einzelne Wort nachvollziehen, aber es muss ja an der Funktion liegen.
Eigentlich hatte ich das selbe mal mit Win32 gemacht und da habe ich es folgendermaßen gemacht mit Indy (idHTTP). Aber das kann ich halt in ASP.NET nicht verwenden, deshalb muss es irgendwie auch ohne indy gehen.
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var FileStream : TFileStream; HTMLCode: String; VideoID: TArrayOfString; TWert: TArrayOfString; VideoName: TArrayOfString; Path: String; begin Path := ExtractFilePath(ParamStr(0)); IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)'; HTMLCode := idHTTP1.Get(Edit1.Text); FindInString(HTMLCode, '<title>YouTube - ', '</title>', True, VideoName); FileStream := TFileStream.Create(GetSpecialFolder(Handle, 37) + '\' + 'MediaPlayer' + '\' + 'Temp' + '\' + VideoName[0] + '.flv', fmCreate or fmShareExclusive); FindInString(HTMLCode, '"t": "', '"', True, TWert); FindInString(HTMLCode, '"video_id": "', '"', True, VideoID); ProgressDownloading := True; idHTTP1.Get('http://youtube.com/get_video?video_id=' + VideoID[0] + '&t=' + TWert[0], FileStream); idHTTP1.Free; FileStream.Free; ProgressDownloading := False; end; |
Re: Der Index war außerhalb des Arraybereichs
Schau Dir "FindInString" einmal in Ruhe an:
Zitat:
[edit] Wie ich gerade sehe, ist das ja sogar eine Boolean-Funktion, die Dir zurückgibt, ob die Länge > 0 ist. Das musst Du dann eben auch auswerten. [/edit] |
Re: Der Index war außerhalb des Arraybereichs
Zitat:
Mhh. Ich blick da noch nicht so ganz durch :oops: Also i > 0 wird nicht erfüllt, wenn i = 0 ergibt. |
Re: Der Index war außerhalb des Arraybereichs
Richtig, wenn der String also nicht gefunden wird, ist das Array leer. Jeder Zugriff auf Element 0 muss dann also scheitern, weil es das einfach nicht gibt.
|
Re: Der Index war außerhalb des Arraybereichs
ok, soweit habe ich es glaube ich verstanden.
Aber warum ist i = 0 ? Und warum war das nicht so, als ich es mit indy gemacht hatte? |
Re: Der Index war außerhalb des Arraybereichs
Schau Dir die Funktion Pos() einmal in der Hilfe an, dann weißt Du auch, wieso i hier
Zitat:
|
Re: Der Index war außerhalb des Arraybereichs
Weil der erste String nicht gefunden werden kann, also SearchFrom, denke ich.
|
Re: Der Index war außerhalb des Arraybereichs
Genau, in dem Falle ist das Array leer und die Funktion gibt somit false zurück.
|
Re: Der Index war außerhalb des Arraybereichs
Ok, schonmal einen Schritt weiter :thumb:
Und warum kann der String nicht gefunden werden? Und warum kann er gefunden werden, wenn ich einfach ein idHTTP dafür benutze? Das verstehe ich halt nicht. |
Re: Der Index war außerhalb des Arraybereichs
Das hat mit Indy und Konsorten überhaupt nichts zu tun, der Teilstring ist dann eben im Suchstring nicht vorhanden.
|
Re: Der Index war außerhalb des Arraybereichs
Aber es liegt ja an dem, was in HTMLCode drin steht!
Mit "HTMLCode := Edit1.Text" geht es nicht, aber mit "HTMLCode := idHTTP1.Get(Edit1.Text)" geht es! |
Re: Der Index war außerhalb des Arraybereichs
Das sind ja auch 2 Paar Schuhe. Im ersten Fall übergibst Du die URL selbst, im anderen den Quelltext, der sich dahinter verbirgt.
|
Re: Der Index war außerhalb des Arraybereichs
also hat es ja doch schon ein bissl was mit indy zu tun :wink:
Wie kann ich denn jetzt ohne Indy die Url übergeben, statt dem Text? |
Re: Der Index war außerhalb des Arraybereichs
Was willst Du denn jetzt auswerten? Eine URL an sich oder den Quelltext der entsprechenden Seite?
|
Re: Der Index war außerhalb des Arraybereichs
Den Quelltext der Url.
Und dazu muss in HTMLCode halt die Url stehen. Das ging mit indy, aber das habe ich ja jetzt nicht mehr. |
Re: Der Index war außerhalb des Arraybereichs
Irgendeine Netzwerk-Bibliothek wirst Du dafür schon brauchen. Ob das nun Indy, ICS, Synapse oder WinInet ist, dürfte dabei aber ziemlich egal sein.
|
Re: Der Index war außerhalb des Arraybereichs
Und was gibt es dafür so für .NET ?
Also für ASP.NET ? Und nochmal danke für die Hilfe! |
Re: Der Index war außerhalb des Arraybereichs
Bei ASP.NET muss ich leider passen, aber vielleicht hilft Dir das hier weiter:
![]() |
Re: Der Index war außerhalb des Arraybereichs
Auf der Seite habe ich nichts gefunden :(
Kann man dazu vielleicht einfach einen Hyperlink nehmen oder sowas? Muss ja irgendsowas in der Art wie indy auch für asp.net geben. |
Re: Der Index war außerhalb des Arraybereichs
Du musst doch trotzdem erst einmal den Source vom entsprechenden Server holen.
|
Re: Der Index war außerhalb des Arraybereichs
Stimmt, das macht Sinn :gruebel:
Also brauche ich eine Alternative zu Indy, die es bei ASP.NET gibt. Vielleicht findet Google was. EDIT: Könnte man vielleicht einfach die Funktion "Get" von idHTTP extrahieren und einzeln benutzen, oder geht das nicht? Und wäre das überhaupt erlaubt? |
Re: Der Index war außerhalb des Arraybereichs
Wäre echt super, wenn jemand hier noch eine Idee hätte :)
Bitte helft mich :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 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