Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit dynamischen array


Schwabe - Sa 24.01.04 13:17
Titel: Problem mit dynamischen array
Hi,

Ich hab einen dynamischen array:

Delphi-Quelltext
1:
var    eingabe: array of array of extended;                    


Den ich mit dieser procedure fülle:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TFunktionsgraph.ZeichnenClick(Sender: TObject);
begin
  try    k:= k+1;

    if LBGezeichneteFunktionen.Items.Count = 0 then
      laenge:= 1
      else
      laenge:= LBGezeichneteFunktionen.Items.Count;

    SetLength(eingabe,4,laenge);

    eingabe[0,k]:= StrToFloat(Ea0.Text);
    eingabe[1,k]:= StrToFloat(Ea1.Text);
    eingabe[2,k]:= StrToFloat(Ea2.Text);
    eingabe[3,k]:= StrToFloat(Ea3.Text);

  Schaubild_Zeichnen;
  except
  end;
end;


(k wird bei OnFormCreate der Wert -1 zugewießen)

Ich habe eine Listbox angelegt wo er mir alle Gezeichneten Schaubilder auflistet. Jetzt möchte ich einzelen Funktionen aus der Listbox und somit aus dem array löschen.

Das mach ich mit dieser procedure:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TFunktionsgraph.BBEintragLoeschenClick(Sender: TObject);
var g,c: integer;
begin
  for c:= 0 to LBGezeichneteFunktionen.Items.Count-1 do
  begin
    if LBGezeichneteFunktionen.Selected[c] then
    begin
      LBGezeichneteFunktionen.DeleteSelected;
      for g:= c to k do
      begin
        eingabe[0,g]:= eingabe[0,g+1];
        eingabe[1,g]:= eingabe[1,g+1];
        eingabe[2,g]:= eingabe[2,g+1];
        eingabe[3,g]:= eingabe[3,g+1];
      end;
    SetLength(eingabe,4,laenge-1);

    Schaubild_Zeichnen;
    end;
  end;
end;


Ich bekomm aber jedesmal wenn ich einen Eintrag löschen will einen Application.Run error oder es kommt eine Fehlermeldung die mir sagt das der Listindex das Maximum überschreitet.

Weiß jemand wo da der Fehler liegt?


Delete - Sa 24.01.04 13:18

Geh mal mit F7 durch und kuck dir den Inhalt der Variablen an.


toms - Sa 24.01.04 13:23


Delphi-Quelltext
1:
LBGezeichneteFunktionen.DeleteSelected;                    


Löscht ALLE selektierten Items in der Listbox.

Müsste so heissen:


Delphi-Quelltext
1:
 LBGezeichneteFunktionen.Items.Delete(c);                    




Delphi-Quelltext
1:
  for c:= 0 to LBGezeichneteFunktionen.Items.Count-1 do                    


verwende eine downto - Schleife.


Schwabe - Sa 24.01.04 13:48

Also ich hab des jetzt mit dem Delet eingebaut. Bekomme jetzt aber ne Zugriffsverletzung sobalsd ich mehr als 2 Schaubilder zeichne :(.


toms - Sa 24.01.04 14:40

Zitat:
verwende eine downto - Schleife.


Das auch?


Schwabe - Sa 24.01.04 14:44

Ja hab des eingebaut:

Delphi-Quelltext
1:
  for c:= LBGezeichneteFunktionen.Items.Count-1 downto 0 do                    


Der fehler kommt aber trotzdem.


toms - Sa 24.01.04 15:06

Zitat:
Bekomme jetzt aber ne Zugriffsverletzung


Wo genau kommt sie denn?


Schwabe - Sa 24.01.04 15:39

Die kommt wenn ich auf Zeichnen oder auf Löschen mehrmals klick. Delphi zeigt aber nicht an in welcher Zeile der Fehler aufgetreten ist


rokdd - Mi 04.02.04 16:47
Titel: setlength
hallo,

setlength(eingabe,5, laenge-1) kann doch nciht funktionieren oder???

rokdd


Raphael O. - Mi 04.02.04 16:52

denke auch, dass es eher so heißen sollte :?

Delphi-Quelltext
1:
setlength(eingabe[5] ,laenge-1);                    


Christian S. - Mi 04.02.04 17:04

Hallo!

Ich weiß jetzt nicht, ob er im Rahmen des Programmes Sinn macht. Aber generell erzeugt der Befehl

Delphi-Quelltext
1:
SetLength(myArray, a, b);                    

Ein "rechteckiges" 2-dimensionales Array mit "Kantenlängen" a und b.

Mfg
Peter


rokdd - Do 05.02.04 18:40

Bitte poste nochmal den ganzen Quelltext(mit änderungen)! danke!


rokdd