arrayelemete löschen....

mille

Erfahrenes Mitglied
ich habe ein array und will mitten drin ein Element löschen, per Listbox ... das angeklickte (markierte) soll dann aus dem array entfernt werden.

das hab ich bisher:

Code:
procedure TForm1.deletebuttonClick(Sender: TObject);
begin
x:= choose.items.Count;
feldloch := choose.itemindex;
choose.items.Delete(feldloch);
    for t:= feldloch to x DO
        BEGIN
        naechstes := t +1;
                  if naechstes > x THEN
                  BEGIN
                  info_db[t].kunde := '';
                  info_db[t].aufgaben := '';
                  info_db[t].preis := '';
                  info_db[t].bildpfad := '';
                  info_db[t].link := '';
                  info_db[t].ID := 0;
                  END
                  Else
                  Begin
                   info_db[t] := info_db[naechstes];
                  End;
        End;
end;

choose = listbox
feldloch = zu löschendes element
info_db[] = record variable (db wegn assoziation zur datenbank ;) )

bis her verschiebe ich die nachfolgenden elemte immer um eins nachvorne, nun ist das problem das das letzte und vorletzte element aber gleich ist, logisch. Wie umgehe ich das? bzw wie lösche ich das allerletzte Element vollständig?
weil mit =''; setzen setz ich ja nur den inhalt 0, das is ja doof, ich will das vollständig entfernen!
 

Patrick Kamin

Erfahrenes Mitglied
-

Das kannst du mit einem statischen Array nicht machen, da es auf dem Stack liegt. Der Speicherplatz wird erst bei Beendigung des Programmes freigegeben. Entweder du benutzt jetzt dynamische Arrays, wovon ich dir allerdings abraten würde, da du dich immer noch komplett selber drum kümmern musst, wenn ein Element in der Mitte gelöscht werden soll oder du nimmst TList, wodurch du eine verkettete Liste hast, welche nur so viele Elemente führt bzw Speicherplatz verbraucht, wie du zur Laufzeit in deinem Programm benötigst. Handling bitte in der Delphi Hilfe nachlesen.
 

mille

Erfahrenes Mitglied
Ich verstehe das nicht ganz.

Ich will doch eigentlcih nur an der Stelle t (Variable die ich hochzähle) das arrayelement löschen
ich habe gesagt mein array geht von 1-1000, aber wenn ich das array in meiner datei speichere, und ich nur 15 Datensätze eingetragen habe, speichert das prog auch nur die 15 und nicht alle 1000.

Wenn ich nun aber mitten drin eins lösche schiebe ich ja alle nachfolgenden elemente um eins nach vorne und das letzte will ich halt einfach entfernen, das muss odch gehen?!

info_db[t].delete, hab ich mir gedacht könnte gehn, geht aber nicht.... irgendwo logisch ;(

aber hat jemand ne idee wie ich das entferne?
 

JoelH

Erfahrenes Mitglied
hmm,

leg ein dynamisches Array an und setze jeweils die Länge mit setlength . Das macht mehr Sinn und ist flexibler ! Wichtig ist es aber trotzdem dass du immer im Rahmen bleibst Ansonsten kommt es zu 'Phantomdaten' wie du sie beschreibst. Das Programm belegt einen bestimmten Speicherbereich für dein Array aber es löscht nicht den Inhalt dieses Bereichs. Sprich wenn dein Array 2 Zeilen lang sit und du 'löschst' das letzte indem du den letzten Satz eins vorschreibst dann bleiben die Daten weiter erhalten, sprich wenn du das din wieder auf zwei erweiterst und nichts schreisbt dann hat der alte eintrag immer noch Gültigkeit Die Garbagecollection ist da bei Delphi noch nicht so weit, dafür ist aber der Speed recht gut.
Wie auch immer, mach es dynamisch und pass auf dass das Array nur erweitert wird wenn auch wirklich was in das neue Element geschrieben wird.
 

mille

Erfahrenes Mitglied
Ich wäre noch irgendwem verbunden wenn mir wer ne kurze anleitung zu dynamischen arrays geben kann.

Ich hab zwar das Programmierveständnis, aber mit delphi muss ich erstma noch richtig klarkommen. in der Schule arbeiten wir damit, aber von dynamischen arrays ham wa noch nichts gehört....!
und da mein Delphi auf english ist, ist das schlecht, denn mir etwas anzueignen auf english ist ziemlich schwierig ;).

also ich wäre dankbar :)
 

JoelH

Erfahrenes Mitglied
hmm,

anlegen geht ähnlich wie bei einem normalen Array, nur dasss du den Bereich weglässt. Also einfach
Code:
 var s : Array of String;

das war es schon, die Grösse ändern geht mit dem Setlength Befehl
Code:
setlength(s,10);
die Elemente beginnen mit dem Index 0.

Das ist dass ganze Geheimnis, der rest verhält sich wie bei 'normalen' Arrays.
 
Zuletzt bearbeitet:

Neue Beiträge