Eintrag aus dynamischem Array herauslöschen

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.

Eintrag aus dynamischem Array herauslöschen

Beitragvon Ally » 16. Feb 2018, 15:28 Eintrag aus dynamischem Array herauslöschen

Hallo,

ich habe ein Problem mit der aktuellen Version 1.8 von Lazarus, das unter Version 1.4.2 noch nicht bestand.
Um aus einem dynamischen Array einen Eintrag herauszulöschen verwende ich folgenden Code:

Code: Alles auswählen
// TxtFenster ist wie folgt deklariert:
TxtFenster: Array of TSynEdit;
 
 
// die Einträge werden dynamisch erzeugt.
function TfrmMain.CreateNeuenText(): Integer;
var Idx: Integer;
begin
  Idx := Length(TxtFenster);
 
  DateinamenListe.Add('Unbenannt' + IntToStr(Idx + 1));
  KodierungsListe.Add(Standardkodierung);
 
  SetLength(TxtFenster, Idx + 1);
  TxtFenster[Idx] := TSynEdit.Create(Self);
 
  with TxtFenster[Idx] do
  begin
    OnKeyDown := @SEditKeyDown;
    OnKeyPress := @SEditKeyPress;
    OnChange := @SEditCh.....
 
 
// Eintrag herauslöschen:
ShowMessage('High(TxtFenster): ' + IntToStr(High(TxtFenster))); // liefert bei 5 Elementen 4
for i := Idx to High(TxtFenster) - 1 do
  TxtFenster[i] := TxtFenster[i + 1];
ShowMessage('High(TxtFenster): ' + IntToStr(High(TxtFenster))); // liefert 4
SetLength(TxtFenster, High(TxtFenster));
ShowMessage('High(TxtFenster): ' + IntToStr(High(TxtFenster))); // liefert 3


Das Problem ist nun, dass zwar das TxtFenster[Idx] gelöscht wird, alle TxtFenster unterhalb von Idx aber den Inhalt des gelöschten Elementes beinhalten.
Die nachvolgenden aber ihren korrekten Inhalt behalten?

Was ich auch nicht verstehe, warum SetLength(TxtFenster, High(TxtFenster)); die Elementzahl verringert. Richtigerweise müsste hier doch stehen: SetLength(TxtFenster, High(TxtFenster)-1);


HILFE
Ally
 
Beiträge: 76
Registriert: 11. Jun 2009, 08:25

Beitragvon wp_xyz » 16. Feb 2018, 16:20 Re: Eintrag aus dynamischem Array herauslöschen

Ally hat geschrieben:Was ich auch nicht verstehe, warum SetLength(TxtFenster, High(TxtFenster)); die Elementzahl verringert.

Hier verwechselst du High mit Length. Length ist die Elementanzahl, High der höchste Index. Da die Indizierung bei Null beginnt, ist High = Length - 1. Beispiel: Wenn Length = 3 ist, hast du die Elementindices 0 1, und 2, High ist also 2, um 1 weniger als Length.

Nachdem SetLength aber die *Länge* verlangt, wird bei Setlength(.., High(..)) die Länge um 1 verringert - es ist letztlich dasselbe wie SetLength(..., Length(...) - 1).
wp_xyz
 
Beiträge: 2611
Registriert: 8. Apr 2011, 08:01

Beitragvon Ally » 16. Feb 2018, 18:14 Re: Eintrag aus dynamischem Array herauslöschen

Hallo wp_xyz,

stimmt, darum funktioniert's ja auch. Das wäre geklärt. :oops: Danke.
Aber warum funktioniert das herauslöschen eines Elemente nicht mehr. Beziehungsweise, warum werden jetzt alle Elemente vor dem Herausgelöschten durch das Herausgelöschte ersetzt.

Gruß
Ally
 
Beiträge: 76
Registriert: 11. Jun 2009, 08:25

Beitragvon wp_xyz » 16. Feb 2018, 18:28 Re: Eintrag aus dynamischem Array herauslöschen

Ally hat geschrieben:Aber warum funktioniert das herauslöschen eines Elemente nicht mehr. Beziehungsweise, warum werden jetzt alle Elemente vor dem Herausgelöschten durch das Herausgelöschte ersetzt.

Dazu ist dein Quelltest zu unspezifisch. Ich nehme an, dass das "Idx" in dem mit "Eintrag herauslöschen" gekennzeichneten Teil nichts mit dem darüberstehenden zu tun hat. Am besten wäre, wenn du ein kleines Demo-Projekt zusammenklicken würdest. Leider kann man hier nichts mehr hochladen, aber vielleicht findest du irgendwo eine Cloud dafür.

Und außerdem: Objekte würde ich soweit wie möglich überhaupt nicht in einem dynamischen Array speichern, das ist bezüglichen Einfügen, Löschen, Sortieren viel zu unflexibel. Nimm eine TList, TFPList, oder TFPGList o.ä., oder evtl auch TObjList (falls das gelösche SynEdit auch gleich zerstört werden soll).
wp_xyz
 
Beiträge: 2611
Registriert: 8. Apr 2011, 08:01

Beitragvon Ally » 19. Feb 2018, 15:49 Re: Eintrag aus dynamischem Array herauslöschen

Hallo wp_xyz,

der Tipp mit den Listen war goldrichtig. Vielen Dank dafür.
Genommen habe ich dann übrigens eine TComponentList.

Gruß Roland
Ally
 
Beiträge: 76
Registriert: 11. Jun 2009, 08:25

• Themenende •

Zurück zu Programmierung



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried