Eintrag aus dynamischem Array herauslöschen

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Eintrag aus dynamischem Array herauslöschen

Beitrag von Ally »

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

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Eintrag aus dynamischem Array herauslöschen

Beitrag von wp_xyz »

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).

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Eintrag aus dynamischem Array herauslöschen

Beitrag von Ally »

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ß

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Eintrag aus dynamischem Array herauslöschen

Beitrag von wp_xyz »

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).

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Eintrag aus dynamischem Array herauslöschen

Beitrag von Ally »

Hallo wp_xyz,

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

Gruß Roland

Antworten