Autor |
Beitrag |
Donn!e DarKo
      
Beiträge: 20
Ubuntu 9.10, Ubuntu 8.04 LTS ( Server Edition )
Delphi
|
Verfasst: So 17.05.09 14:21
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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: 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
      
Beiträge: 57
Win Vista Ultimate
|
Verfasst: 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
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: 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.
Zuletzt bearbeitet von ffgorcky am So 17.05.09 15:40, insgesamt 1-mal bearbeitet
|
|
Fredy
      
Beiträge: 57
Win Vista Ultimate
|
Verfasst: So 17.05.09 15:40
dann hast du aber eine Leerzeile drin wenn du das Array auslesen wilst 
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 17.05.09 15:43
|
|
Fredy
      
Beiträge: 57
Win Vista Ultimate
|
Verfasst: So 17.05.09 15:46
nicht wirklich  / deswegen würde ich mein Code Schnipsel verwenden
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: 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.
Zuletzt bearbeitet von ffgorcky am So 17.05.09 15:59, insgesamt 2-mal bearbeitet
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Fredy
      
Beiträge: 57
Win Vista Ultimate
|
Verfasst: 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 
|
|
Donn!e DarKo 
      
Beiträge: 20
Ubuntu 9.10, Ubuntu 8.04 LTS ( Server Edition )
Delphi
|
Verfasst: 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
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
      
Beiträge: 57
Win Vista Ultimate
|
Verfasst: So 17.05.09 17:12
wäre super wenn du diesen dann mal online stellen würdest 
|
|
Donn!e DarKo 
      
Beiträge: 20
Ubuntu 9.10, Ubuntu 8.04 LTS ( Server Edition )
Delphi
|
Verfasst: 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 
      
Beiträge: 20
Ubuntu 9.10, Ubuntu 8.04 LTS ( Server Edition )
Delphi
|
Verfasst: 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
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. |
|
|