Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit dynamischen array (https://www.delphipraxis.net/15266-problem-mit-dynamischen-array.html)

Schwabe 25. Jan 2004 13:25


Problem mit dynamischen array
 
Hi,

Ich hab einen dynamischen array:
Delphi-Quellcode:
var   eingabe: array of array of extended;
Den ich mit dieser procedure fülle:
Delphi-Quellcode:
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-Quellcode:
procedure TFunktionsgraph.BBEintragLoeschenClick(Sender: TObject);
var g,c: integer;
begin
  for c:= LBGezeichneteFunktionen.Items.Count-1 downto 0 do
  begin
    if LBGezeichneteFunktionen.Selected[c] then
    begin
      LBGezeichneteFunktionen.Items.Delete[c];
      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?

scp 25. Jan 2004 13:38

Re: Problem mit dynamischen array
 
Spontan kann ich z.B. nicht feststellen, wie du die Beziehung zwischen k und laenge herstellst, wenn aus irgendeinem Grund (k >= laenge) werden würde, dann könnte das eine Ursache für den Fehler sein.

Schwabe 25. Jan 2004 13:53

Re: Problem mit dynamischen array
 
Und wie sollte ich es dann machen? Könntest du mir einen Ansatzt geben?

scp 25. Jan 2004 14:07

Re: Problem mit dynamischen array
 
Ich weis ja nicht, warum du da zwei Variablen hast. Wenn ich mir nur diesen Code betrachte, könnte ich sagen, das du statt die Länge aus dem LB zu holen, entweder
Delphi-Quellcode:
laenge := k+1;
oder
Delphi-Quellcode:
laenge := length(eingabe[0]) + 1;
verwendest.

Wird eigentlich immer, wenn ZeichnenClick ausgelöst wurde auch an anderer Stelle ein Eintrag zu LBGezeichneteFunktionen hinzugefügt?
Am besten gibst du mir noch ein paar relevante Code-Schnipsel, wenn die obigen Vorschläge nicht passen sollten.

Schwabe 25. Jan 2004 14:22

Re: Problem mit dynamischen array
 
Delphi-Quellcode:
procedure TFunktionsgraph.Schaubild_Zeichnen;
var c: integer;
begin
  for c:= 0 to k do
  begin
    a0:= eingabe[0,c];
    a1:= eingabe[1,c];
    a2:= eingabe[2,c];
    a3:= eingabe[3,c];

    Kurve_Zeichnen;
  end;
end;
Delphi-Quellcode:
function f(x:extended) :extended;
begin
  f:= a3*Power(x,3)+a2*Power(x,2)+a1*x+a0;
end;
In Kurve_Zeichnen wird dann das Schaubild über die Funktion f(x) gezeichnet und der Listbox der jeweilige Eintrag hinzugefügt.

Delphi-Quellcode:
LBGezeichneteFunktionen.Items.AddObject('f´(x)='+ausgabe);

Hoffe das hilft dir weiter:).

scp 25. Jan 2004 16:04

Re: Problem mit dynamischen array
 
OK, dann ist das in Ordnung:
Delphi-Quellcode:
procedure TFunktionsgraph.ZeichnenClick(Sender: TObject);
begin
  try
    k:= k+1;

    laenge := k+1;

    SetLength(eingabe,4,laenge);
//...
Dann musst du aber bei
Delphi-Quellcode:
procedure TFunktionsgraph.BBEintragLoeschenClick(Sender: TObject);
auch das hier machen:
Delphi-Quellcode:
SetLength(eingabe,4,laenge-1);
k := k - 1;
laenge := laenge - 1;

Schwabe 25. Jan 2004 16:16

Re: Problem mit dynamischen array
 
Also jetzt klappts scho ziemlich gut. Es kommt jetzt nur noch manchmal beim Löschen zu einem "Fehler der Bereichsprüfung".Manchmal wird der Eintrag auch nicht aus der Listbox gelöscht. Manchmal gehts manchmal aber auch nicht. Was stimmt denn da noch net?

Edit:

Es klappt jetzt alles außer das es manchmal vorkommt, dass eine IEntrag nicht aus der Listbox gelöscht wird. Dadurch kommt es vor, dass er nen Fehler bringt weil er noch nen Eintrag in der Listox hat aber keinen im array. Da gibts noch irgendein Problem.

Delphi-Quellcode:
procedure TFunktionsgraph.BBEintragLoeschenClick(Sender: TObject);
var g,c: integer;
begin
  for c:= LBGezeichneteFunktionen.Items.Count-1 downto 0 do
  begin
    if LBGezeichneteFunktionen.Selected[c] then
    begin
     
      for g:= 0 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;

      LBGezeichneteFunktionen.Items.Delete(c);

      SetLength(eingabe,4,laenge-1);
      k:= k - 1;
      laenge:= laenge - 1;

      Schaubild_Zeichnen;
    end;
  end;
end;
Wäre super wenn du mir noch wieterhelfen könntest:).

Schwabe 25. Jan 2004 18:43

Re: Problem mit dynamischen array
 
So jetzt klappt alles. Vielen Dank für deine Hilfe :).


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 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