Autor Beitrag
Da Don
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 18.05.05 19:36 
Hallo zusammen,
ich bin gerade dabei ein Adressbuch zu programmieren mit Hardwareansteuerung.
Im allgemeinen klappt alles wie z.B. das speichern blättern oder ändern, aber eine Sache bekomme ich einfach nicht hin: ???Wie kann ich Datensätze löschen???

HIER EIN KLEINES BEISPIEL AUS MEINEN PROGRAMM:

Quellcode für einen neuen Datensatz anfügen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure NeuerDatensatz(var aktDS: integer; Adressbuch: TAdressbuch);
var
   f: File Of TAdressbuch;
   help: TAdressbuch;
begin
     if FileExists('Adressbuch.dat') then
     begin
          AssignFile(f, 'Adressbuch.dat');
          Reset(f);
          while not Eof(f) do read (f, help);
          write(f, Adressbuch);
          aktDS:= FileSize(f)-1;
          CloseFile(f);
     end else ShowMessage('Fehler! Die Datei existiert nicht!');
end;


!!Bitte brauche eure Hilfe!! :roll:

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.
Moderiert von user profile iconTino: Topic aus Sonstiges verschoben am Mo 23.05.2005 um 10:15
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 19.05.05 07:03 
Gar nicht.
Mach es den Datenbanken nach. Jeder Datensatz bekommt ein Kennzeichen (deleted : boolean). Die Datensätze mit dem gesetzten Kennzeichen ignorierst du.
Wenn du die Daten jedesmal physisch löscht (was auch nicht besonders schwierig ist), wird das mit wachsender Datensatz-Anzahl immer langsamer. Das wird normalerweise in einer Bereinigungs-Routine gemacht.
Da Don Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 20.05.05 14:34 
Ja da mag ja vielleicht gehen aber ich bekomme das nicht hin.
Ich hab mal mit meinen Lehrer darüber geredet und er hat mir vorgeschlagen ich könnte die Datensätze die nach diesem zu löschenden Datensatz kommen in eine extra Datei packen und dann wieder nach den Löschvorgang in die alte Datei schicken.
Nur das ist auch irgendwie kompliziert, ich bin glücklich das ich das andere zeug geschafft hab.

Kann mir da irgend jemand helfen ich hab nur noch zwei Wochen Zeit!!
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 20.05.05 18:12 
Source gebe ich dir jetzt nicht, aber einen Ansatz:
Du benötigst FilePos und Seek. Ein Link zu meiner HP mit dem Thema typisierte Dateien. Dort werden die Routinen auch beschrieben.

Angenommen du hast 10 Datensätze und willst den 7. löschen.
Dann gehst du zum 8. und liest den ein.
Dann gehst du zum 7. und überschreibst mit dem 8.
Das selbe mit dem 9. zum 8. und den 10. zum 9.
(Am besten das ganze in einer Schleife)
Zum Schluß benutzt du Truncate, um den 10. (der jetzt ja als Kopie an 9. Stelle steht) abzuschneiden.

Empfehlen kann ich diese Methode nicht. Warum, habe ich dir ja schon erklärt.
Da Don Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 28.05.05 18:01 
Ich habe noch eine Frage, wie kann kann ich datensätze löschen?
Wie lautet der Befehl ?DeleteFile()? oder was
cyanide
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 29.05.05 23:45 
Is eigentlich ganz einfach:

Fuer den fall, dass dein Adressbuch stets Adressen unter 5-10MB haben wird:

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:
Interface

Type TEntry = Record
       Vorname, 
       Nachname, 
       Strasse, 
       Nr, 
       Plz, 
       Ort, 
       Tel, 
       Fax, 
       eMail, 
       blah, 
       blub: Str[255];
     End;
     
     TAdresse = Class
       Entrys: TEntry;
     End;

Var
     AdressListe: TList; 

Implementation

Procedure AdressenLesen( Filename: String );
Var F: File;
    Adresse: TAdresse;
Begin
  AssignFile( F, Filename );
  Reset( F, 1 );

  While Not Eof( F ) Do
  Begin
    Adresse := TAdresse.Create;
    BlockRead( F, Adresse.Entrys, SizeOf( TAdresse ) );
    AdressListe.Add( Adresse );    
  End;

  CloseFile( F );
End;

Procedure AdressenSchreiben( Filename: String );
Var F: File; Var1: Integer;
    Adresse: TAdresse;
Begin
  AssignFile( F, Filename );
  Rewrite( F, 1 );

  For Var1 := 0 to AdressListe.Count - 1 Do
  Begin
    BlockWrite( F, AdressListe[Var1].Entrys, SizeOf( TAdresse ) );
  End;

  CloseFile( F );
End;

Procedure AdresseLoeschen( ID: Integer );
Begin
  TAdresse( AdressListe[ID] ).Destroy;
  AdressListe.Delete(ID);
End;

Procedure AdresseHinzufuegen( Entries: TEntries );
Var Adresse: TAdresse;
Begin
  Adresse := TAdresse.Create;
  Adresse.Entries := Entries;
  AdressListe.Add( Adresse );
End;

Initialization
  AdressListe := TList.Create;

Finalization
  While(AdressListe.Count > 0) Do 
  Begin
    TAdresse( AdressListe[0] ).Destroy;
    Delete(0);
  End;
  AdressListe.Destroy;


Habs jetzt nicht getestet, kommt einfach so ausm Bauch heraus.

Falls irgendwas nicht funktioniert, sollte trotzdem die Funktionsweise in etwa erklaert sein.

Viel Spass!
Da Don Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 31.05.05 14:21 
Danke man ich werde es gleich ausprobieren. :D
Da Don Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 31.05.05 14:53 
Ja das mag vielleicht funktionieren aber ich habe mein Programm nicht objektorientiert geschrieben sondern ganz normal hat da vielleicht jemand ne Idee??
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 31.05.05 15:00 
Wo ist dein Problem? Ich sehe da nichts objektorientiertes.