Avatar billede jaweni Nybegynder
21. juni 2003 - 15:19 Der er 10 kommentarer og
1 løsning

Gemmer ikke indhold af listboxe

Jeg har følgende i et program (Delphi 2.0):

procedure TForm1.gemClick(Sender: TObject);
var
  Ud : String;
begin
  AssignFile(RFil,Sti); Rewrite(RFil);
  Ud := '';

  for i := 0 to LB1.Items.Count - 1 do begin
    if LB1.Selected[i] then begin
      FOR j := 0 to Memo1.Lines.Count - 1 DO         
        Ud := Ud + Memo1.Lines[j];            { MEMO1 indeholder Beskrivelse af Varenummer }

      BRec.Beskrivelse := Ud;
      Label1.Caption := LB1.Items[i]+' skrives';  { Kontrol af aktivitet }
    end; { IF LB1 ..  }

    BRec.Varenummer := LB1.Items[i];
    BRec.Pris := LB2.Items[i];

    Write(RFil,BRec);
  end;  {  IF i := 0 ... }                   
  CloseFile(RFil);
end;


Jeg ved, at der er ens antal elementer i både LB1 (Varenummer) og LB2 (Pris). Begge er listboxe.

MEEEEN, når jeg så tester programmet, får jeg beskeden:
  EStringError "List index out of bounds"

Hvad er der galt? Hvad løser problemet?
Avatar billede nca Juniormester
21. juni 2003 - 15:32 #1
Prøv at erklære i og j som lokale variable. Du kommer måske til at ændre deres værdier i en anden procedure.
Avatar billede jaweni Nybegynder
21. juni 2003 - 20:03 #2
Hej nca,

jeg prøver lige dit forslag og vender tilbage.
Avatar billede jaweni Nybegynder
21. juni 2003 - 20:48 #3
Hej nca,
prøvede med flg:

procedure TForm1.gemClick(Sender: TObject);
var
  Ud  : String;
  f, n : Byte;
begin
  AssignFile(RFil,Sti); Rewrite(RFil);
  Ud := '';
                     
  for f := 0 to Max - 1 do begin
    BRec.Varenummer := LB1.Items[f];
    BRec.Pris := LB2.Items[f];

    if LB1.Selected[f] then begin
      FOR n := 0 to Memo1.Lines.Count - 1 DO begin
        Ud := Ud + Memo1.Lines[n];
      END;
      BRec.Beskrivelse := Ud;
      Label1.Caption := LB1.Items[f] + ' skrives.';
    end; { IF LB1 ...  }

    Write(RFil,BRec);
  end;  { IF f := 0 .. }
  CloseFile(RFil);
end;

Fik kun det 1. element blev gemt; men fik så samme fejlmeddelelse.
Avatar billede nca Juniormester
23. juni 2003 - 08:12 #4
Gad vide om din fejlmeddelelse kommer fra Memo1.
Prøv at ændre:
      FOR n := 0 to Memo1.Lines.Count - 1 DO begin
        Ud := Ud + Memo1.Lines[n];
      END;

til
      Ud := Ud + Memo1.Lines[0];
Avatar billede nop Nybegynder
24. juni 2003 - 11:50 #5
i,j:  integer; // ikke bytes (kan jo være flere end 255 elementer/linjer)
brec: beskrivRec; //prøv så vidt muligt at definere variable
                  // i samme scope som koden de bruges i

...samme
rewrite(rfil,sizeof(brec)); //sizen skal med ellers bruges 128 (!)
...det samme her
ud:=''; //bemærk at beskrivelsen altid skal sættes (tom streng hvis ingen)
if lb1.selected[f] then
  for n:=0 to memo1.lines.count-1 do
    ud:=ud+memo1.lines[n];
brec.beskrivelse:=ud;
...det samme her

Ellers ser det rigtigt ud men prøv at singel steppe og se hvilke værdier der puttes i brec.
Avatar billede nop Nybegynder
24. juni 2003 - 11:53 #6
Ellers kunne man tro, ud fra fejl msg'en, at de to lister alligevel ikke er lige lange. Hvor nøjagtig gives fejlen (igen prøv med singel step osse).
Avatar billede jaweni Nybegynder
24. juni 2003 - 12:10 #7
Jeg har fundet en tidl. løsning, der virker:

procedure TForm1.gemClick(Sender: TObject);
var i, j : Byte; Ud : String[255];
begin
  Ud := '';
  for i := 0 to LB1.Items.Count - 1 do begin
    if LB1.Selected[i] then begin
      AssignFile(RFil,Sti);
      Reset(RFil);
      Seek(RFil,i);

      FOR j := 0 to Memo1.Lines.Count - 1 DO
        Ud := Ud + Memo1.Lines[j];
      BRec.Beskrivelse := Ud;

      Write(RFil,BRec);
      CloseFile(RFil);
      Label1.Caption := LB1.Items[i]+' skrives';
    end;  { IF LB1 ... }
  end;    { for i := ... }
end;

Så jeg giver points til mig selv.
Avatar billede nop Nybegynder
24. juni 2003 - 12:21 #8
Fint med mig, men du bør ændre byte til integer og osse bruge string istedet for string[255]. Desuden vil reset(rfil,sizeof(brec)) være rigtigt ellers er der altså max 128 bytes tilrådighed i en record.
Avatar billede nop Nybegynder
24. juni 2003 - 12:25 #9
...du kunne sætte en break ind som det sidste i if-begin-blokken så undgår du at skulle loope alle igennem, faktisk kunne du bruge lb1.itemIndex som indeholder det selectede element, eller -1 hvis ingen valgt, istedet for dit loop !
Avatar billede nop Nybegynder
24. juni 2003 - 12:26 #10
ups...ja ok hvis man kun kan vælge et element ad gangen !!
Avatar billede jaweni Nybegynder
25. juni 2003 - 11:15 #11
nop (din sidste kommentar):

Meningen er nemlig, at man kun kan vælge 1 element ad gangen, da proceduren er rent imidlertidig. Altså indtil alle Beskrivelser er gemt. Jeg regner ikke med, at beskrivelserne skal ændres, når de først er gemt.
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