Avatar billede whynot Nybegynder
14. december 2003 - 12:28 Der er 2 kommentarer og
2 løsninger

array problem

Nedenståender er min kode.. .der er tale om et 2d array med et array på 1 til 53 rows indeholdt i et array med en dynamisk størrelse... men jeg får konstant en fejl når koden bliver kaldt. Dvs. koden bliver compilet men giver en CRASH CRASH ting.. når man trykker på knappen... øv.. jeg håber nogle af Jer eksperter lige kunne sætte fingeren på hvad jeg gør galt :)

hensigten med koden er at jeg først fylder mit array med data fra nogle editboxe... og derefter kaste dataen over i et stringgrid.

så derfor poster jeg min kode:


Type
TMatrix_deltur = array of array[0..53] of string;

var
  FormOrdre: TFormOrdre;
  Array_deltur: TMatrix_deltur;

implementation

procedure TFormOrdre.Button4Click(Sender: TObject);
var
i, x, y: integer;
Bil_indeks, tempstring:string;

begin
showmessage(inttostr(length(Array_deltur)));
SetLength(Array_deltur, length(Array_deltur)+1);
showmessage(inttostr(length(Array_deltur)));
  i:=length(array_deltur);
  Array_deltur[i,1]:=''; //deltursindeks
  Array_deltur[i,2]:=Edit_pickupNavn.Text;
  Array_deltur[length(Array_deltur),3]:=Edit_pickupAdr.Text;
  Array_deltur[length(Array_deltur)+1,4]:=Edit_pickupAdrnr.Text;
  Array_deltur[length(Array_deltur)+1,5]:=Edit_pickupPostnr.Text;
  Array_deltur[length(Array_deltur)+1,6]:=Edit_pickupPostby.Text;
  Array_deltur[length(Array_deltur)+1,7]:=Edit_pickupTlf.Text;
  Array_deltur[length(Array_deltur)+1,8]:=Edit_pickupTlf2.Text;
  Array_deltur[length(Array_deltur)+1,9]:=Edit_pickupFax.Text;
  Array_deltur[length(Array_deltur)+1,10]:=Edit_pickupCvrnr.Text;
  Array_deltur[length(Array_deltur)+1,11]:=Edit_pickup_kontakt_navn.Text;
  Array_deltur[length(Array_deltur)+1,12]:=Edit_pickup_kontakt_email.Text;
  Array_deltur[length(Array_deltur)+1,13]:=Edit_pickup_kontakt_tlf.Text;
  Array_deltur[length(Array_deltur)+1,14]:=Edit_pickup_kontakt_mobil.Text;
  Array_deltur[length(Array_deltur)+1,15]:=ComboBox_pickupTid.Text;
  Array_deltur[length(Array_deltur)+1,16]:=datetostr(DateTimePicker_pickup.Date);

  Array_deltur[length(Array_deltur)+1,17]:=Edit_dropoffNavn.Text;
  Array_deltur[length(Array_deltur)+1,18]:=Edit_dropoffAdr.Text;
  Array_deltur[length(Array_deltur)+1,19]:=Edit_dropoffAdrnr.Text;
  Array_deltur[length(Array_deltur)+1,20]:=Edit_dropoffPostnr.Text;
  Array_deltur[length(Array_deltur)+1,21]:=Edit_dropoffPostby.Text;
  Array_deltur[length(Array_deltur)+1,22]:=Edit_dropoffTlf.Text;
  Array_deltur[length(Array_deltur)+1,23]:=Edit_dropoffTlf2.Text;
  Array_deltur[length(Array_deltur)+1,24]:=Edit_dropoffFax.Text;
  Array_deltur[length(Array_deltur)+1,25]:=Edit_dropoffCvrnr.Text;
  Array_deltur[length(Array_deltur)+1,26]:=Edit_dropoff_kontakt_navn.Text;
  Array_deltur[length(Array_deltur)+1,27]:=Edit_dropoff_kontakt_email.Text;
  Array_deltur[length(Array_deltur)+1,28]:=Edit_dropoff_kontakt_tlf.Text;
  Array_deltur[length(Array_deltur)+1,29]:=Edit_dropoff_kontakt_mobil.Text;
  Array_deltur[length(Array_deltur)+1,30]:=ComboBox_dropoffTid.Text;
  Array_deltur[length(Array_deltur)+1,31]:=datetostr(DateTimePicker_dropoff.Date);

  Array_deltur[length(Array_deltur)+1,32]:=Edit_vognmandnr.Text; //v_indeks
  Array_deltur[length(Array_deltur)+1,33]:=Edit_pris_vognmandKm.Text;
  Array_deltur[length(Array_deltur)+1,34]:=Edit_pris_vognmandNkm.Text;
  Array_deltur[length(Array_deltur)+1,35]:=Edit_pris_vognmandTillaeg.Text;
  Array_deltur[length(Array_deltur)+1,36]:=Edit_pris_vognmandVentetidmin.Text;
  Array_deltur[length(Array_deltur)+1,37]:=Edit_pris_vognmandVentetidkrmin.Text;
  Array_deltur[length(Array_deltur)+1,38]:=Edit_pris_vognmandFastpris.Text;
  Array_deltur[length(Array_deltur)+1,39]:=Memo_pris_noter.Text;
  Array_deltur[length(Array_deltur)+1,40]:=''; //POD
  Array_deltur[length(Array_deltur)+1,41]:=Memo_fragtbeskrivelse.Text;
  Array_deltur[length(Array_deltur)+1,42]:=Edit_vognmandnr.Text;
  Array_deltur[length(Array_deltur)+1,43]:=Edit_vognmandNavn.Text;
  Array_deltur[length(Array_deltur)+1,44]:=Edit_vognmandAdr.Text;
  Array_deltur[length(Array_deltur)+1,45]:=Edit_vognmandAdrnr.Text;
  Array_deltur[length(Array_deltur)+1,46]:=Edit_vognmandPostnr.Text;
  Array_deltur[length(Array_deltur)+1,47]:=Edit_vognmandPostby.Text;
  Array_deltur[length(Array_deltur)+1,48]:=Edit_vognmandKontakt.Text;
  Array_deltur[length(Array_deltur)+1,49]:=Edit_vognmandTlf.Text;
  Array_deltur[length(Array_deltur)+1,50]:=Edit_vognmandTlf2.Text;
  Array_deltur[length(Array_deltur)+1,51]:=Edit_vognmandFax.Text;
  Array_deltur[length(Array_deltur)+1,52]:=Edit_vognmandCvrnr.Text;


  //finder bil_indeks ud fra den sammensatte string i bilcombobox
  tempstring:=ComboBox_vognmandEgnebiler.Items.Strings[ComboBox_vognmandEgnebiler.itemIndex];
  Bil_indeks:='';
  if ComboBox_vognmandEgnebiler.itemIndex <> -1 then
    begin
      i:=1;
      while tempstring[i] <> '_' do
        begin
          Bil_indeks:=Bil_indeks+tempstring[i];
          inc(i);
        end;
    end;

  Array_deltur[length(Array_deltur)+1,53]:=Bil_indeks;

StringGrid_deltur.ColCount:=52;
StringGrid_deltur.RowCount:=length(Array_deltur)+1;

for y:= 0 to length(Array_deltur) do
  begin
  for x:= 1 to 53 do
    begin
    StringGrid_deltur.Cells[x,y]:= Array_deltur[y,x];
    end;
  end;
end;
Avatar billede bleze Nybegynder
14. december 2003 - 14:33 #1
Du tilgår array_deltur med antalet af poster. Du skal gøre det med antalet af poster MINUS 1, ellers får du access violation

setlength(array, 1);
array[0] := blah;
array[1] := blah2; <- access vio
Avatar billede whynot Nybegynder
14. december 2003 - 19:48 #2
Det er jeg ikke sikker på at jeg forstår.. koden gør det at den allerede har fået defineret længden af det "første" array.. nemlig 1..53

Skal setlength ikke først bruges ved dynamiske arrays?

..fordi som jeg gør, så sætter jeg
SetLength(Array_deltur, length(Array_deltur)+1);

..hvilket gerne skulle sætte længden til array'ets længde plus én.. altså forstørrer længden med én row.. er det forkert?

Dit eksempel giver en access vio fordi du sætter længden til 1 men tvinger to elementer.. men jeg har da allere defineret længden som 1..53 og sætter faktisk kun det andet arrays længde.

plz help me
Avatar billede zerohero Nybegynder
15. december 2003 - 06:06 #3
Så vidt jeg kan se, sætter du længden af din dynamiske array til 1, men prøver at stoppe information ind i den, som om den var 53 lang!!!

du skriver følgende linje:

SetLength(Array_deltur, length(Array_deltur)+1);

for at få det til at virke burde du skrive

SetLength(Array_deltur, 54);
Avatar billede whynot Nybegynder
15. december 2003 - 09:44 #4
hmmm jamen dog.. I har ret.. nu virker det :)

Det var da helt fantastisk dejligt - mange tak skal i have.
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