Delphi-PRAXiS

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?

DeddyH 10. Mai 2009 18:09

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:

Delphi-Quellcode:
i := Pos(SearchFrom, Text);

0 werden kann.

Paul0703 10. Mai 2009 18:18

Re: Der Index war außerhalb des Arraybereichs
 
Weil der erste String nicht gefunden werden kann, also SearchFrom, denke ich.

DeddyH 10. Mai 2009 18:20

Re: Der Index war außerhalb des Arraybereichs
 
Genau, in dem Falle ist das Array leer und die Funktion gibt somit false zurück.

Paul0703 10. Mai 2009 18:23

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.

DeddyH 10. Mai 2009 18:24

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.

Paul0703 10. Mai 2009 18:33

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!

DeddyH 10. Mai 2009 18:36

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.

Paul0703 10. Mai 2009 18:47

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?

DeddyH 10. Mai 2009 18:53

Re: Der Index war außerhalb des Arraybereichs
 
Was willst Du denn jetzt auswerten? Eine URL an sich oder den Quelltext der entsprechenden Seite?

Paul0703 10. Mai 2009 19:13

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.

DeddyH 11. Mai 2009 07:28

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.

Paul0703 11. Mai 2009 16:38

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!

DeddyH 11. Mai 2009 16:55

Re: Der Index war außerhalb des Arraybereichs
 
Bei ASP.NET muss ich leider passen, aber vielleicht hilft Dir das hier weiter: http://www.tutorialin.de/Tutorials/l...ng=german.html

Paul0703 11. Mai 2009 17:06

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.

DeddyH 11. Mai 2009 17:13

Re: Der Index war außerhalb des Arraybereichs
 
Du musst doch trotzdem erst einmal den Source vom entsprechenden Server holen.

Paul0703 11. Mai 2009 17:19

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?

Paul0703 11. Mai 2009 19:09

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 16:52 Uhr.

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