Avatar billede circadian Nybegynder
10. januar 2010 - 21:52 Der er 17 kommentarer og
1 løsning

List index out of bounds

Hej,

Jeg har en listbox hvortil brugeren kan tilføje elementer.
Elementerne gemmes, når der trykkes på en knap, i variabler:

  gr01 := Listbox1.Items[0];
  gr02 := Listbox1.Items[1];
  gr03 := Listbox1.Items[2];
  gr04 := Listbox1.Items[3];
  gr05 := Listbox1.Items[4];
  gr06 := Listbox1.Items[5];
  gr07 := Listbox1.Items[6];
  gr08 := Listbox1.Items[7];
  gr09 := Listbox1.Items[8];
  gr10 := Listbox1.Items[9];
  gr11 := Listbox1.Items[10];

(der kan max. være 11 elementer i listboxen).

Når jeg ikke har indsat nogle elementer i listboxen og trykker på knappen, så siger den "List index out of bounds".

Det skal den jo ikke gøre. Jeg ønsker at kunne aflæse, om der er skrevet noget i et enkelt item, og det gør jeg således:

  if gr01 = '' then
    Unit1.Form1.Edit1.Text := 'You did not choose anything.';

Kan man ikke gøre sådan?

Jeg aner bare ikke hvorfor den kommer op med den fejl der.


Og i det Edit1 felt der, der skal stå forskellige ting, alt efter om hvor mange items der er sat ind i Listboxen.
Avatar billede a_nor Nybegynder
10. januar 2010 - 22:01 #1
Du kan bruge  Listbox1.count , som skal være større end 0
Avatar billede circadian Nybegynder
10. januar 2010 - 22:09 #2
#1
Jeg får stadig den fejlmeddelelse.
Avatar billede a_nor Nybegynder
10. januar 2010 - 22:10 #3
Indexet skal være mellem 0 og listbox1.count-1, ellers får du den angivne fejl.
Avatar billede circadian Nybegynder
10. januar 2010 - 22:20 #4
#3
Jeg tror også det er det -- men er ikke sikker.




procedure TForm11.TransferBackBtnClick(Sender: TObject);
var
  i: integer;
begin
  for i := Listbox1.Items.Count - 1 downto 0 do
    if Listbox1.Selected[i] then
    begin
      Listbox2.Items.Add(Listbox1.Items[i]);
      Listbox1.Items.Delete(i);
    end;
end;

procedure TForm11.TransferBtnClick(Sender: TObject);
var
  i: integer;
begin
  for i := Listbox2.Items.Count - 1 downto 0 do
    if Listbox2.Selected[i] then
    begin
      Listbox1.Items.Add(Listbox2.Items[i]);
      Listbox2.Items.Delete(i);
    end;
end;


Listbox2 er en listbox med de elementer, man kan flytte over i Listbox1 vha. Transfer knappen. TransferBack knappen flytter elementer fra Listbox1 til Listbox2.
Avatar billede a_nor Nybegynder
10. januar 2010 - 22:41 #5
Jamen det virker da fint, hvad er problemet nu?
Du må selvfølgelig ikke overføre flere elementer fra listbox1, end der faktisk er, så du må også der anvende listbox1.count
Avatar billede a_nor Nybegynder
10. januar 2010 - 22:44 #6
Altså skal
  if gr01 = '' then
    Unit1.Form1.Edit1.Text := 'You did not choose anything.';
erstattes med
  if listbox1.count=0 then
    Edit1.Text := 'You did not choose anything.';
Avatar billede circadian Nybegynder
10. januar 2010 - 22:49 #7
#5
Kan du venligst komme med et kodeeksempel? Er ikke ret skarp i Delphi.
Avatar billede circadian Nybegynder
10. januar 2010 - 22:49 #8
Se bort fra #7
Avatar billede circadian Nybegynder
10. januar 2010 - 22:53 #9
#6
Jeg får desværre stadig samme fejl. Det har ikke noget med mine variabler i #0 at gøre?

fx

  gr01 := ChosenGenres.Items[0];
Avatar billede circadian Nybegynder
10. januar 2010 - 22:53 #10
#9
Undskyld, "ChosenGenres" = "Listbox1".
Avatar billede circadian Nybegynder
10. januar 2010 - 23:02 #11
Jeg har fundet ud af en ting.

Hvis jeg sætter min udregning af gr01 i en kommentar, så virker det. Det går bare galt når jeg sætter ..Items[1] lig gr01.
Avatar billede a_nor Nybegynder
10. januar 2010 - 23:05 #12
Hvornår får du fejlen ?  Det er jo ikke når du flytter frem og tilbage mellem listbox1 og listbox2

Så er det når du kører gemmelisten igennem. Hvis du har indsat nogle tomme items i listbox, kan disse også overføres
sæt edit1.text := IntToStr(listbox1.count) inden overførslen startes.
Avatar billede a_nor Nybegynder
10. januar 2010 - 23:07 #13
Ad #11, men det har du jo heller ikke skrevet ovenfor nogen steder ? ? ?
Avatar billede circadian Nybegynder
10. januar 2010 - 23:11 #14
#13
Jo i #0.

Jeg pastede bare koden for de 2 bokse der, da du nævnte det med index i #3.

---
Jeg kan sagtens indsætte en streng, ligesom vi gør i #6. Altså fx 'You did not choose anything.'

I stedet for denne streng skal der være den variabel, fx gr01, der svarer til det første item i Listboxen :) Og det er det, den ikke har lyst til.
Avatar billede circadian Nybegynder
10. januar 2010 - 23:26 #15
Meget mærkeligt -- jeg har fundet fejlen.

Det virker ved at skrive
Edit1.Text := Listbox1.Items[0];

Og ikke ved først at smide Listbox1.Items[0] ind i en string variabel (gr01) og så gøre:
Edit1.Text := gr01;

Yderst mærkværdigt...
Avatar billede a_nor Nybegynder
10. januar 2010 - 23:43 #16
Det lyder ikke sandsynligt det er derfor. Enten eksisterer item[0] eller også gør det ikke....

Skriver den ikke x (et tal) efter "List index out of bounds (x)" ?
Avatar billede circadian Nybegynder
10. januar 2010 - 23:51 #17
Jo den skrev 0.
Avatar billede circadian Nybegynder
11. januar 2010 - 17:33 #18
Tak for hjælpen a_nor - det skal siges at jeg bruger din hjælp fra #1.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester