AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi "Fehler bei der Bereichsprüfung" in "SetLength"
Thema durchsuchen
Ansicht
Themen-Optionen

"Fehler bei der Bereichsprüfung" in "SetLength"

Ein Thema von xZise · begonnen am 31. Dez 2006 · letzter Beitrag vom 31. Dez 2006
Antwort Antwort
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

"Fehler bei der Bereichsprüfung" in "SetLengt

  Alt 31. Dez 2006, 16:05
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]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

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

  Alt 31. Dez 2006, 18:27
Entschuldige, dass ich mich melde, auch wenn Du glaubst, dass Dir Dein Fehler selbst aufgefallen ist: Was soll Deine Funktion eigentlich machen?

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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

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

  Alt 31. Dez 2006, 18:30
SetLength muss man die richtige Größe des Arrays übergeben und nicht mit -1. Richtig ist also:

SetLength(Result, lwList.Items.Count);

Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

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

  Alt 31. Dez 2006, 18:31
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

@ Florian: Steht schon so im Edit drinne War ein Denkfehler ^^
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

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

  Alt 31. Dez 2006, 18:34
Habs grade gemerkt ... hatte das Edit überlesen
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#6

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

  Alt 31. Dez 2006, 19:13
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 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?
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

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

  Alt 31. Dez 2006, 19:29
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!
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 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