![]() |
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? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 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