Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Prism Der Index war außerhalb des Arraybereichs (https://www.delphipraxis.net/133845-der-index-war-ausserhalb-des-arraybereichs.html)

Paul0703 10. Mai 2009 16:57


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;

quendolineDD 10. Mai 2009 17:06

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.

Paul0703 10. Mai 2009 17:12

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?

quendolineDD 10. Mai 2009 17:14

Re: Der Index war außerhalb des Arraybereichs
 
Schau mal in der Delphihilfe unter System.Heigh.
Zitat:

In Delphi können Sie mit High die Obergrenze eines Ordinal-, Array- oder ShortString-Wertes abrufen. Der Typ des Rückgabewertes ist X oder der Indextyp von X.
X ist entweder ein Typbezeichner oder eine Variablenreferenz. X muss einer der folgenden Typen sein:
Array-Typ Der größte Wert im Bereich des Indextyps des Arrays. Bei leeren Arrays gibt High –1 zurück. <---
Offenes Array Ein Integer-Wert, der die Anzahl der Elemente im aktuellen Parameter minus 1 angibt

DeddyH 10. Mai 2009 17:15

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]

Paul0703 10. Mai 2009 17:32

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;

DeddyH 10. Mai 2009 17:37

Re: Der Index war außerhalb des Arraybereichs
 
Schau Dir "FindInString" einmal in Ruhe an:
Zitat:

Delphi-Quellcode:
  SetLength(Return, 0);
  i := Pos(SearchFrom, Text);
  while i > 0 do

Was gibt diese Funktion denn wohl in Return zurück, wenn i 0 ergibt?

[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]

Paul0703 10. Mai 2009 17:51

Re: Der Index war außerhalb des Arraybereichs
 
Zitat:

Zitat von DeddyH
Schau Dir "FindInString" einmal in Ruhe an:
Zitat:

Delphi-Quellcode:
  SetLength(Return, 0);
  i := Pos(SearchFrom, Text);
  while i > 0 do

Was gibt diese Funktion denn wohl in Return zurück, wenn i 0 ergibt?

[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]


Mhh. Ich blick da noch nicht so ganz durch :oops:
Also i > 0 wird nicht erfüllt, wenn i = 0 ergibt.

DeddyH 10. Mai 2009 17:53

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.

Paul0703 10. Mai 2009 18:03

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 03:12 Uhr.
Seite 1 von 3  1 23      

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