Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Wert im Array Löschen / Einfügen
Donn!e DarKo - So 17.05.09 14:21
Titel: Wert im Array Löschen / Einfügen
Hey,
Also ich schreibe am Mi. eine Klausur und das Array ist leider doch Thema des ganzen. Mittlerweile habe ich dank diesem Forum hier, das array wirklich verstanden und kann auch sehr gut damit umgehen.
Nun fehlt mir noch das letzt stückchen was ich verstehen muss und das ist das einfügen und löschen eines Wertes im Array.
Ich hab Letzte Woche die Aufgabe bekommen, ein Songlisten Tool zu schreiben. Das heißt, der Benutzer gibt in editfeldern die sachen ein, und dies wird dann im Array gespeichert.
So was muss ich aber nun tun, wenn der Benutzer einen bestimmten Songtitel nicht mehr haben möchte und diesen Löschen will. Oder ihn sogar bearbeiten will ? Vielleicht auch einfach an dieser Stelle noch einen Songtitel einfügen möchte ?
Kann mir da jemand vielleicht helfen, mit nehm kleinen codeschnipsel oder so ? Bin für jede Hilfe dankbar !
Gruß DarKo
Martok - So 17.05.09 14:46
Bearbeiten ist relativ einfach: du schreibst an der gleichen Stelle (also dem gleichen Index) die geänderten Daten wieder rein.
Um aus einem Array was zu löschen, verschiebst du alle folgenden Einträge eins nach 'unten', überschreibst also den zu löschenden mit dem nächsten, den dann mit seinem nächsten usw. Zum Schluss brauchst du dann nur noch die Länge des Arrays um eins zu verkürzen.
Einfügen läuft genauso, nur andersrum ;)
Also erst verlängern, dann alle Einträge bis zu dem wo du einfügen willst eins nach Hinten verschieben und den neuen Eintrag rein schreiben.
Marc. - So 17.05.09 14:47
Donn!e DarKo hat folgendes geschrieben : |
So was muss ich aber nun tun, wenn der Benutzer einen bestimmten Songtitel nicht mehr haben möchte und diesen Löschen will. Oder ihn sogar bearbeiten will ? Vielleicht auch einfach an dieser Stelle noch einen Songtitel einfügen möchte ? |
Ich nehme an, dass es auf die Reihenfolge ankommt:
Löschen: Ab dem Index alle Array-Elemente eins nach Links verschieben und anschließend das Array um eins verkürzen.
Einfügen: Array-Länge um eins erhöhen. Ab dem Index alle Array-Elemente eins nach Rechts verschieben, anschließend Index überschreiben.
Grüße,
Marc
Fredy - So 17.05.09 15:09
genau das gleiche habe ich bei mir auch Verbaut
hier mal ein Code ausschnitt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i := lbxRA.Itemindex to high (Angebot_RechnungArray)-1 do Angebot_RechnungArray[i] :=Angebot_RechnungArray[i+1];
SetLength(Angebot_RechnungArray, Length(Angebot_RechnungArray) -1); |
Musst du nur noch auf dein Programm umschreiben dann müsste es gehen ;)
das ist für eine Löschung an dem Bearbeiten bin ich gerade auch dran. ( bzw. am Verzweifeln) komm gerade nicht weiter ;)
Mfg. Fredy
ffgorcky - So 17.05.09 15:36
Wenn Du ein Array of String hast, dann kannst Du doch
entweder
Delphi-Quelltext
1:
| StrArr[indexnummer]:=''; |
oder
Delphi-Quelltext
1:
| StrArr[indexnummer]:=null; |
zuweisen, um den Wert sozusagen "zu löschen" - also damit die Stelle offen bleibt für einen anderen Eintrag.
Damit markierst Du sozusagen "das Haus als unbewohnt", aber jederzeit wieder beziehbar.
Fredy - So 17.05.09 15:40
dann hast du aber eine Leerzeile drin wenn du das Array auslesen wilst ;)
Marc. - So 17.05.09 15:43
Fredy hat folgendes geschrieben : |
dann hast du aber eine Leerzeile drin wenn du das Array auslesen wilst ;) |
Um das zu vermeiden, könnte man nun die Länge des Strings oder den String selbst vor der Ausgabe prüfen. Aber ob das ein guter Stil ist?
Fredy - So 17.05.09 15:46
nicht wirklich ;) / deswegen würde ich mein Code Schnipsel verwenden
ffgorcky - So 17.05.09 15:56
Ja, der Code von Fredy ist da wirklich gut, wenn Du denn das "Haus" wirklich komplett löschen möchtest!
Wenn Du aber genau an der Stelle wieder einen neuen Eintag erwartest, dann solltest Du das ganze lieber mit einem Leerstring oder Null versuchen.
Martok - So 17.05.09 15:56
Marc. hat folgendes geschrieben : |
Aber ob das ein guter Stil ist? |
Kommt drauf an. DBase verwendet zum Beispiel Löschmarkierungen, statt direkt die Daten wegzuwerfen. Wenn man oft löscht/einfügt dann ist das halt schneller als jedes mal das komplette Array umzuräumen.
Man muss dann halt nur regelmäßig aufräumen.
Fredy - So 17.05.09 15:59
bei Größeren Datenbanken ist das auch eher sinnvoller, wenn man nicht jedes mal warten will bis er alles neu geschrieben hat :idea:
Donn!e DarKo - So 17.05.09 16:44
Hey,
Danke für all die Antworten. Werde gerade mal versuchen das irgendwie hin zu bekommen.
Aber der Code schnipsel sieht schonmal gut aus ... ich denke damit sollte es klappen, es macht ja auch sinn irgendwie :-D
Das mit dem Bearbeiten ist echt nicht einfach, da häng ich auch schon ne weile dran ... :-/
Mal schauen, vielleicht frag ich morgen einfach mal meinen Lehrer. Vielleicht kann er es mir erklären.
Gruß
Fredy - So 17.05.09 17:12
wäre super wenn du diesen dann mal online stellen würdest ;)
Donn!e DarKo - So 17.05.09 18:04
Kein Ding werd ich machen :)
Ich hoffe nur, das ich es bald schaffe mit dem einfügen und löschen ... das is ja schon echt ne geburt für mich -.-
Donn!e DarKo - Di 19.05.09 20:24
So, ich darf einmal auflösen :) Nun ist alles auch ein wenig verständlicher für mich geworden :)
Und des Löschen funktioniert auch :) Sowie das bearbeiten, war eigentlich einfacher als ich mir das am WE gemacht hab xD
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) ListBox1: TListBox; Edit1: TEdit; Edit2: TEdit; btnspeichern: TButton; btnrueck: TButton; btnvor: TButton; btnclear: TButton; btnbearbeiten: TButton; procedure FormCreate(Sender: TObject); procedure btnspeichernClick(Sender: TObject); procedure btnrueckClick(Sender: TObject); procedure btnvorClick(Sender: TObject); procedure btnclearClick(Sender: TObject); procedure btnbearbeitenClick(Sender: TObject); procedure ListBox1DblClick(Sender: TObject); private public procedure anzeige; end;
type tlist = record album : string[20]; interpret : string [20];
end;
var Form1: TForm1;
liste : array of tlist; aktuell : integer;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin aktuell := 0; end;
procedure TForm1.Anzeige; var i : integer; begin listbox1.clear;
if length(liste) > 0 then begin edit1.text := liste[aktuell].album; edit2.text := liste[aktuell].interpret;
for i := low(liste) to high(liste) do begin listbox1.items.add(liste[i].album +'->' +liste[i].interpret); end end; end;
procedure TForm1.btnspeichernClick(Sender: TObject); begin Setlength(liste, length(liste)+1);
liste[high(liste)].album := edit1.text; liste[high(liste)].interpret := edit2.text; aktuell := high(liste);
anzeige; end;
procedure TForm1.btnrueckClick(Sender: TObject); begin aktuell := aktuell - 1;
if aktuell < low(liste) then begin aktuell := low(liste); end;
anzeige; end;
procedure TForm1.btnvorClick(Sender: TObject); begin aktuell := aktuell + 1;
if aktuell > high(liste) then begin aktuell := high(liste); end;
anzeige; end;
procedure TForm1.btnclearClick(Sender: TObject); var i : integer; begin if application.MessageBox('Willste wirklich Löschen?' ,'Sicherheitsabfrage' ,MB_YesNo or MB_Iconquestion) =IDYES then begin for i := aktuell +1 to high(liste) do liste[i-1]:=liste[i]; if length(liste) > 0 then SetLength(liste, length(liste)-1) else application.Messagebox('Dem geht net!' ,'Döner Kaufen?' ,MB_OK or MB_Iconerror); btnvorClick(Sender);
end; end;
procedure TForm1.btnbearbeitenClick(Sender: TObject); begin liste[aktuell].album := edit1.text; liste[aktuell].interpret := edit2.text; anzeige; end;
procedure TForm1.ListBox1DblClick(Sender: TObject); begin aktuell := listbox1.ItemIndex; anzeige; end;
end. |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!