Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "Fehler bei der Bereichsprüfung" in "SetLength" (https://www.delphipraxis.net/83352-fehler-bei-der-bereichspruefung-setlength.html)

xZise 31. Dez 2006 16:05


"Fehler bei der Bereichsprüfung" in "SetLengt
 
Nun zu meiner Frage:
Ich habe folgenden Code
Delphi-Quellcode:
function TfrmManager.getNames: TStrArr; // TStrArr = array of string
var
  i : Integer;
begin
{x}  SetLength(Result, lwList.Items.Count - 1);
  for i := 0 to lwList.Items.Count - 1 do begin
    Result[i] := lwList.Items[i].Caption;
  end;
end;
und er wirft mir eine Exception an den Kopf, wenn er die Zeile 5 (mit dem x versehen) erreicht:
"Fehler bei der Berreichsprüfung".

lwList ist eine ListView und enthält keine Einträge.

[OOPs]Sry, aber dummer Bug ;) Einfach das "-1" weglassen... Warum fällt mir das erst jetzt auf? Wahrscheintlich deswegen:
Zitat:

lwList ist eine ListView und enthält keine Einträge.
[/OOPs]

Jürgen Thomas 31. Dez 2006 18:27

Re: "Fehler bei der Bereichsprüfung" in "SetL
 
Entschuldige, dass ich mich melde, auch wenn Du glaubst, dass Dir Dein Fehler selbst aufgefallen ist: Was soll Deine Funktion eigentlich machen?

Zitat:

Zitat von xZise
lwList ist eine ListView und enthält keine Einträge.

Also wird die Länge Deines array of string auf 0 gesetzt; die Schleife wird 0-mal durchlaufen; und es wird ein Array mit 0 Elementen zurückgegeben.

Irgendetwas dürfte daran doch wohl falsch sein...

Trotzdem guten Rutsch! Jürgen

Zacherl 31. Dez 2006 18:30

Re: "Fehler bei der Bereichsprüfung" in "SetL
 
SetLength muss man die richtige Größe des Arrays übergeben und nicht mit -1. Richtig ist also:

SetLength(Result, lwList.Items.Count);

Florian

xZise 31. Dez 2006 18:31

Re: "Fehler bei der Bereichsprüfung" in "SetL
 
Hi Jürgen.

Naja. Es ist eine Prozedur. Und Prozeduren werden ja bekanntlich mehrmals aufgerufen ;)

Nur ist es so, dass nach dem Programmstart keine Einträge vorhanden sind. Und wenn ich einen Eintrag erstellen will, dann wird die Methode aufgerufen ;)

Sie hat einen Sinn bei mehr als 0 Einträgen :D

@ Florian: Steht schon so im Edit drinne ;) War ein Denkfehler ^^

Zacherl 31. Dez 2006 18:34

Re: "Fehler bei der Bereichsprüfung" in "SetL
 
Habs grade gemerkt ... hatte das Edit überlesen :wall:

Jürgen Thomas 31. Dez 2006 19:13

Re: "Fehler bei der Bereichsprüfung" in "SetL
 
Zitat:

Zitat von xZise
Naja. Es ist eine Prozedur. Und Prozeduren werden ja bekanntlich mehrmals aufgerufen ;)

Nur ist es so, dass nach dem Programmstart keine Einträge vorhanden sind. Und wenn ich einen Eintrag erstellen will, dann wird die Methode aufgerufen ;)

Sie hat einen Sinn bei mehr als 0 Einträgen :D

Also, Dein Code sagt etwas anderes:
Zitat:

Zitat von xZise
Delphi-Quellcode:
function TfrmManager.getNames: TStrArr; // TStrArr = array of string
var
  i : Integer;
begin
  SetLength(Result, lwList.Items.Count);  //  Korrektur eingefügt; Jürgen
  for i := 0 to lwList.Items.Count - 1 do begin
    Result[i] := lwList.Items[i].Caption;
  end;
end;

1. Es wird ausdrücklich als Funktion bezeichnet und nicht als Prozedur.
2. Es ist gleichgültig, ob sie einmal oder mehrmals aufgerufen wird. (Es ist möglich, auch eine Prozedur nur einmal aufzurufen.)
3. Die Länge ordnest Du der "lokalen" Variablen Result zu, aber nicht einer Variablen des Formulars o.ä.
4. "Und wenn ich einen Eintrag erstellen will, dann wird die Methode aufgerufen" und erzeugt ein neues Array und überträgt erneut alle Listview-Captions?

Sicher, ich muss nicht verstehen, was Du machen willst; aber vielleicht denkst Du noch einmal darüber nach, ob da nicht irgendeine gravierende Seltsamkeit drin steckt. Jürgen

PS. Unter Delphi (Win32) erleichtert die TStringList die Arbeit mit String-Arrays ungemein, weil sie z.B. die Speicherzuordnung selbst vornimmt, mit Add() bzw. Insert() einfach Einträge ergänzen kann und mit IndexOf() suchen kann. Wäre das nicht etwas für Dich?

xZise 31. Dez 2006 19:29

Re: "Fehler bei der Bereichsprüfung" in "SetL
 
Hi Jürgen.

Entschuldige, aber ich habe dich falsch verstanden ;)
Ich habe gedacht du wolltest darauf hinaus, dass es doch unsinnig ist, wenn es keine Items gibt. (Teilweise stimmt das schon)

Du hast recht ;) Lieber eine Globale Variable einrichten. Und ich habe (bisher) nicht TStringList verwendet, weil das an sich ja =array of string ist. Aber ich habe nicht an "IndexOf" gedacht. Das ist natürlich sinnvoll!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 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