Autor Beitrag
Donn!e DarKo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 20

Ubuntu 9.10, Ubuntu 8.04 LTS ( Server Edition )
Delphi
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57

Win Vista Ultimate

BeitragVerfasst: So 17.05.09 15:09 
genau das gleiche habe ich bei mir auch Verbaut

hier mal ein Code ausschnitt:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: So 17.05.09 15:36 
Wenn Du ein Array of String hast, dann kannst Du doch
entweder
ausblenden Delphi-Quelltext
1:
StrArr[indexnummer]:='';					

oder
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57

Win Vista Ultimate

BeitragVerfasst: So 17.05.09 15:40 
dann hast du aber eine Leerzeile drin wenn du das Array auslesen wilst ;)
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57

Win Vista Ultimate

BeitragVerfasst: So 17.05.09 15:46 
nicht wirklich ;) / deswegen würde ich mein Code Schnipsel verwenden
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

_________________
"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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57

Win Vista Ultimate

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 20

Ubuntu 9.10, Ubuntu 8.04 LTS ( Server Edition )
Delphi
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57

Win Vista Ultimate

BeitragVerfasst: So 17.05.09 17:12 
wäre super wenn du diesen dann mal online stellen würdest ;)
Donn!e DarKo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 20

Ubuntu 9.10, Ubuntu 8.04 LTS ( Server Edition )
Delphi
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 20

Ubuntu 9.10, Ubuntu 8.04 LTS ( Server Edition )
Delphi
BeitragVerfasst: 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
ausblenden volle Höhe 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.