AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi CD-Datenbank - Array, aus dem man löschen kann..
Thema durchsuchen
Ansicht
Themen-Optionen

CD-Datenbank - Array, aus dem man löschen kann..

Ein Thema von absentsilence · begonnen am 1. Feb 2004 · letzter Beitrag vom 2. Feb 2004
Antwort Antwort
Seite 1 von 2  1 2      
absentsilence

Registriert seit: 1. Feb 2004
10 Beiträge
 
#1

CD-Datenbank - Array, aus dem man löschen kann..

  Alt 1. Feb 2004, 22:26
Hallo!
Dies ist mein erster Beitrag hier, ich hoffe, man kann mir helfen.
Also folgendes:
Ich will ein Programm zum Verwalten von CDs (Interpret, Album, Genre, Jahr, Preis) erstellen. Ich habe also ein Record "tEintrag" und ein Unterrecord "tCDname" (t nehme ich für "typisiert" wegen dem Überblick...) habe also dafür diese Vereinbarung:

Delphi-Quellcode:
type tCDname=Record
interpret, album:string[20];
end; //unterrecord

type tEintrag=Record
CDname:tCDname;
genre:string[15];
jahr:integer;
preis:real;
end; //record
Ich hatte das Programm soweit, daß man eintragen, speichern, drucken und öffnen konnte. Aber ich will auch einzelne Einträge aus dem Feld löschen können. Da ich mein Array so vereinbart hatte

tAlleCDs=Array[1..max] of tEintrag; //max ist eine Konstante konnte ich nichts einzeln löschen, hab es jedenfalls nicht hinbekommen. Da habe ich einfach mit

cd_Listbox.Items.Delete(cd_Listbox.ItemIndex); aus der Listbox die einzelnen Einträge gelöscht und dann gespeichert. Doch so will er auf einmal nicht mehr sortieren (nach Interpret beispielsweise...). Also brauche ich wohl ein "dynamisches Array" und dazu eine Löschroutine. Beides habe ich versucht aber nicht hinbekommen, da die Sources aus dem Netz immer zu viel voraussetzen bei mir... Vielleicht habt Ihr eine gute Idee? Bin auch übers ICQ zu erreichen, dort meist invisible.

Viele Grüße,

AS

[edit=Luckie]Delphi-Tags ergänzt. Beim nächsten mal bitte selber machen. Mfg, Luckie[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#2

Re: CD-Datenbank - Array, aus dem man löschen kann..

  Alt 1. Feb 2004, 22:45
Hallo und herzlich willkommen in der DP!

Zu deinem Problem: Bei einem dynamisches Array muss vor Verwendung die Länge (Anzahl der Eintrgäge) festgelegt werden. Das geht mit

SetLength(Array,50); //50 Einträge möglich Wenn du nun einen Eintrag löschen willst, musst du die Anderen Einträge im Array ja um eins nach oben verschieben. Ich würde deshalb das ganze Array, außer des zu löschenden Eintrags, in ein anderes Array kopieren:

Delphi-Quellcode:
var
Arr1, Arr2: Array of TEintrag;
.
.
.
procedure EintragLoeschen(Eintrag, LaengeArr: Integer);
var i : Integer;
begin
SetLength(Arr2, LaengeArr -1);
  For i := 0 to LaengeArr - 1 do
    begin
      IF i < Eintrag THEN Arr2[i] := Arr1[i]
        ELSE
      IF i > Eintrag THEN Arr2[i] := Arr1[i+1]
    end;

  For i := 0 to Length(Arr2) -1 do
    begin
      SetLength(Arr1,Length(Arr2));
      Arr1[i] := Arr2[i]
    end;
end;
Ich hoffe mal, das das stimmt, was ich geschrieben hab. Bin schon etwas müde, also bitte korrigiert mich, wenn ich Schmarrn geschrieben hab.

Man liest sich, Stanlay
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#3

Re: CD-Datenbank - Array, aus dem man löschen kann..

  Alt 1. Feb 2004, 23:48
Ich denke, das 2. Array ist entbehrlich:
Delphi-Quellcode:
type
  DeinTyp = Array of tEintrag;

var
  DeinArray : DeinTyp;

procedure InsertEintrag(DerEintrag : tEintrag; Index : Integer = -1);
var i : Integer;
begin
  if (Index >= 0) and (Index < Length(DeinArray)) // Index ist irgendwo VOR dem neuen
                                                   // Ende des Arrays...
  then begin
    SetLength(DeinArray,Length(DeinArray)+1); // Array vergrößern
    for i := Index+1 to High(DeinArray)
      do DeinArray[i] := DeinArray[i-1]; // Alle Items von Index bis Ende verschieben...
    DeinArray[Index] := DerEintrag; // und den Eintrag an gewünschte Stelle schreiben.

  end else begin // kein Index angegeben - also Add am Ende
    AddEintrag(DerEintrag) // siehe Procedure AddEintrag...
  end;
end;

procedure AddEintrag(DerEintrag : tEintrag);
begin
  SetLength(DeinArray,Length(DeinArray)+1); // Array vergrößern
  DeinArray[High(DeinArray)] := DerEintrag; // Eintrag ans Ende schreiben - fertig!
end;

procedure DeleteEintrag(Index : Integer);
var i : Integer;
begin
  if (Index >= 0) and (Index < Length(DeinArray))
  then begin
    for i := Index+1 to High(DeinArray)
      do DeinArray[i-1] := DeinArray[i]; // umkopieren

    SetLength(DeinArray,Length(DeinArray)-1); // anschließend Array
                                              // verkleinern - fertig.

  end else raise Exception.Create('Ungültiger Index!'#13#10+
                                  'Minimum = 0'#13#10+
                                  'Maximum = '+InToStr(High(DeinArray))+#13#10+
                                  'Fehlerhafter Wert = '+IntToStr(Index)+' !');
end;

procedure ClearDeinArray;
var i : Integer;
begin
  SetLength(DeinArray,0); // Länge auf Null setzen - fertig!
end;
hoffe, das hülfet Dir, dynamische Arrays zu verstehen...
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
absentsilence

Registriert seit: 1. Feb 2004
10 Beiträge
 
#4

Re: CD-Datenbank - Array, aus dem man löschen kann..

  Alt 2. Feb 2004, 01:45
Erstmal vielen Dank für die schnellen Antworten! Aber da gibt's schon wieder ein unvorhergesehenes Problem:

Delphi-Quellcode:
procedure DeleteEintrag(Index : Integer);
var i : Integer;
begin
  if Index >= 0 and Index < Length(DeinArray) then begin <<---an dieser Stelle bringt er den Fehler '(' erwartet, aber ')' gefunden
Außerdem weiß ich noch nicht so richtig, wo ich die Länge vereinbaren muß. Ich hab global (also gleich nach der Record-Vereinbarung)

type tAlleCDs=Array of tEintrag; vereinbart. Schonmal vielen Dank für Eure Geduld und gute Nacht!

[edit=Luckie]Delphi-Tags ergänzt. Das nächste mal bitte selber machen. Danke. Mfg, Luckie[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#5

Re: CD-Datenbank - Array, aus dem man löschen kann..

  Alt 2. Feb 2004, 02:37
Zu 1. Sowas kommt von sowas - kaum bin ich nicht in der IDE, fange ich an zu schlampen.
es fehlten die Klammern. Habe das Beispiel oben korrigiert Denke ich. Sollte jetzt funktionieren.

Zu 2. Soweit ganz richtig. Die Länge wird nun dynamisch gesetzt - nicht mehr von Dir zur Entwurfszeit. Immer wenn Du Deinem Array einen Eintrag mit der Add- oder Insertprozedur hinzufügst, wird es um 1 vergrößert, bei der Deleteprozedur wird es um 1 verkleinert. Wie groß es konkret ist, weist Du zur Entwurfszeit nun nicht mehr - aber das ist nicht weiter schlimm - Du kannst für for-Schleifen ja die Funktion High() benutzen, so daß Du nicht über das Array-Ende "hinausschlitterst".

Erwähnenswert ist vielleicht noch, das dynamische Arrays immer einen nullbasierten Index haben. Daraus ergibt sich für DeinArray mit 10 Elementen z.B.:

DeinArray[0] = 1. Element,
High(DeinArray) = 9 und
Length(DeinArray) = 10

Das wär alles, was mir zum Thema im Moment einfällt...

Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
absentsilence

Registriert seit: 1. Feb 2004
10 Beiträge
 
#6

Re: CD-Datenbank - Array, aus dem man löschen kann..

  Alt 2. Feb 2004, 10:39
Hallo,
mit den neuen Klammern bringt Delphi den selben Fehler:

if (Index >= 0) and (Index < Length(tAlleCDs)) [Fehler] Unit1.pas(136): '(' erwartet, aber ')' gefunden

Woran liegt das? Ich verzweifle hier noch... Immer, wenn man denkt, man hat was verstanden, kommt was neues Unerklärliches.
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#7

Re: CD-Datenbank - Array, aus dem man löschen kann..

  Alt 2. Feb 2004, 13:31
Der Fehler ist wiedermal meiner. Wir definieren den Typ DeinArray, schaffen aber keine Arrayvariable dieses Types. Wenn wir nun DeinArray benutzen, erwartet der Compiler einen Type-Cast und der Verlangst nach Klammern.
Ändere die Zeile
Delphi-Quellcode:
type
 DeinArray = Array of tEintrag;
in
Delphi-Quellcode:
type
  DeinTyp = Array of tEintrag;
var
  DeinArray : DeinTyp;
Dann hast Du in DeinArray eine Arrayvariable vom DeinTyp, und es sollte funktionieren.

Sorry & Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
absentsilence

Registriert seit: 1. Feb 2004
10 Beiträge
 
#8

Re: CD-Datenbank - Array, aus dem man löschen kann..

  Alt 2. Feb 2004, 13:44
Delphi-Quellcode:
implementation {$R *.dfm}

type tCDname=Record
interpret, album:string[20];
end; //unterrecord

type tEintrag=Record
CDname:tCDname;
genre:string[15];
jahr:integer;
preis:real;
end; //record

type
tAlleCDs = Array of tEintrag;
var
CDArray:tAlleCDs;
i:integer;


procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
end;

procedure eintrag_loeschen(Index : Integer);
var i:Integer;
begin
if (Index >= 0) and Index < (Length(ArrayCDs))
then begin
for i:=Index+1 to High(tAlleCDs) do
ArrayCDs[i-1]:=ArrayCDs[i]; // umkopieren
SetLength(ArrayCDs,Length(ArrayCDs)-1); // anschließend Array verkleinern - fertig.
end
else
raise Exception.Create('Ungültiger Index!'#13#10+
                                  'Minimum = 0'#13#10+
                                  'Maximum = '+InToStr(High(ArrayCDs))+#13#10+
                                  'Fehlerhafter Wert = '+IntToStr(Index)+' !');
end;
So geht es auch nicht, ist das, was du meintest?
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#9

Re: CD-Datenbank - Array, aus dem man löschen kann..

  Alt 2. Feb 2004, 13:46
Nein:
Delphi-Quellcode:
implementation {$R *.dfm} 

type tCDname=Record
interpret, album:string[20];
end; //unterrecord

type tEintrag=Record
CDname:tCDname;
genre:string[15];
jahr:integer;
preis:real;
end; //record

type
  tAlleCDs = Array of tEintrag;
var
  CDArray:tAlleCDs;
  i:integer;


procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
end;

procedure eintrag_loeschen(Index : Integer);
var i:Integer;
begin
if (Index >= 0) and Index < (Length(CDArray))
then begin
for i:=Index+1 to High(CDArray) do
CDArray[i-1]:=CDArray[i]; // umkopieren
SetLength(CDArray,Length(CDArray)-1); // anschließend Array verkleinern - fertig.
end
else
raise Exception.Create('Ungültiger Index!'#13#10+
                                  'Minimum = 0'#13#10+
                                  'Maximum = '+InToStr(High(CDArray))+#13#10+
                                  'Fehlerhafter Wert = '+IntToStr(Index)+' !');
end;
so!
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
absentsilence

Registriert seit: 1. Feb 2004
10 Beiträge
 
#10

Re: CD-Datenbank - Array, aus dem man löschen kann..

  Alt 2. Feb 2004, 13:51
Ich glaub, mein Delphi will mich fertig machen:

if (Index >= 0) and Index < (Length(CDArray)) Meldung: Operator auf diesen Operandentyp nicht anwendbar!

Sowas...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz