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

user profile iconDonn!e DarKo hat folgendes geschrieben Zum zitierten Posting springen:
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:
  // Alle Datensätze ab der löschstelle um eine Stelle nach vorne kopieren,
  // damit wird der zu löschende Satz überschrieben.

  for i := lbxRA.Itemindex to high (Angebot_RechnungArray)-1 do
           Angebot_RechnungArray[i] :=Angebot_RechnungArray[i+1];

  // Array um eine Stelle kürzen, d. h. den letzten Satz abschneiden.
        
  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

user profile iconFredy hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconMarc. hat folgendes geschrieben Zum zitierten Posting springen:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    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); // Beim Start Ausführen
begin
     aktuell := 0;
end;

procedure TForm1.Anzeige; // Eigene Procedure
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;    // Auf High Speichern
     liste[high(liste)].interpret := edit2.text;
     aktuell := high(liste);

     anzeige; // Anzeige Procedure aufrufen
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.