Einzelnen Beitrag anzeigen

jawo3

Registriert seit: 15. Sep 2009
Ort: Niedersachsen
41 Beiträge
 
#1

Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 23. Aug 2010, 19:10
Hi,
ich versuche gerade eine Vokabeldatenbank zu erstellen, bei der Vokabeln nacheinander eingegeben werden sollen. Entweder mit Enter Taste oder einem Klick auf "Liste Anzeigen" soll die Vokabelliste in einer ListBox angezeigt werden. Mit "Liste leeren" wird die Listbox geleert. Die Radiobuttons LIFO und FIFO sind zunächst erstmal ohne Bedeutung, ebenso die "Vokabel-entfernen Funktion.

Im Moment arbeite ich gerade daran, die Vokabeldatenbank in einer externen Datei zu speichern und diese dann nach einem Neustart des Programms wieder laden zu können. Das Grundgerüst habe ich schon aufgebaut, und das Programm läuft auch ohne Fehlermeldung, aber die Datenbank wird einfach nicht gespeichert bzw. die Datei, in die gespeichert werden soll bleibt leer. Demnach kann ich natürlich auch nichts laden.

Vielleicht könnt ihr mir helfen, sodass ich endlich meine Speicher/Lade-Funktion verwenden kann.

Eine weitere Frage, die sich mir stellt, ist folgende. Wenn ich eine Vokabel eingebe und Enter drücke, so wird das Textfeld gelöscht, die Datei in die Liste übernommen, und die neue Liste angezeigt. Allerdings geschieht dies immer mit einem "Warnton" des Systems. Vielleicht wisst ihr ja, was es damit auf sich hat.

Hier der Quelltext:
Delphi-Quellcode:
unit Vokabeln;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
    TForm1 = class(TForm)
      Label1: TLabel;
      EditEintragen: TEdit;
      EditEntfernen: TEdit;
      ListBoxAnzeige: TListBox;
      ButtonSpeichern: TButton;
      ButtonLaden: TButton;
      ButtonBeenden: TButton;
      ButtonEintragen: TButton;
      ButtonEntfernen: TButton;
      ButtonAnzeigen: TButton;
      RadioButton1: TRadioButton;
      RadioButton2: TRadioButton;
      ButtonLeeren: TButton;
      procedure ButtonBeendenClick(Sender: TObject);
      procedure ButtonEintragenClick(Sender: TObject);
      procedure ButtonEntfernenClick(Sender: TObject);
      procedure ButtonSpeichernClick(Sender: TObject);
      procedure ButtonLadenClick(Sender: TObject);
      procedure ButtonAnzeigenClick(Sender: TObject);
      procedure FormActivate(Sender: TObject);
      procedure EditEintragenKeyPress(Sender: TObject; var Key: Char);
      procedure ButtonLeerenClick(Sender: TObject);
    end;
    Zeiger = ^Element; //Definition eines Zeigertyps
    tInhalt = string[15];
    Element = record
                naechster: Zeiger;
                Inhalt: tInhalt;
              end;


const Datenpfad='Vokabeln.dta'; //Hier wird die Datenbank gespeichert

var
  Form1: TForm1;
  Wurzel, z : Zeiger; //nötig um Liste aufzubauen
  f: file of tInhalt; //nötig für Speicher-/Ladevorgang

function Kontrolle:Boolean;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject); //Bei Programm-Start
begin
EditEintragen.SetFocus; //Fokus auf Eintragen-Textfeld setzen
Wurzel:=nil; //Wurzel markiert erstes greifbares Element und wird zunächst "geerdet"
end;

function Kontrolle; //Test auf gängigste IO-Fehler
begin
  result := false;
  case IOResult of
     0: result := true;
     2: begin showmessage ('Datei nicht vorhanden.' +#13+ 'Datei wird angelegt');
          rewrite(f);
          result := true;
        end;
     3: showmessage ('Ungueltiger Dateiname/Pfad');
     5: showmessage ('Dateizugriff verweigert.');
    21: showmessage ('Laufwerk nicht bereit!');
  end;
end;

procedure TForm1.EditEintragenKeyPress(Sender: TObject; var Key: Char); //Eintragen über Enter Taste
begin
if (Key=#13) and (length(EditEintragen.Text)<>0) then
  begin
    ButtonEintragenClick(Sender); //Wenn "Enter" gedrückt wird dann eintragen...
    ButtonAnzeigenClick(Sender); //... und anzeigen
    EditEintragen.SetFocus; //Fokus auf Textfeld setzen
  end;
end;

procedure TForm1.ButtonEintragenClick(Sender: TObject); //Vokabeln eintragen
begin
if length(EditEintragen.Text)<>0 then //Wenn Textfeld nicht leer ist
begin
  New(z); //Erzeugen eines neuen Listenelements
  z^.Inhalt:= EditEintragen.Text; //Record wird befüllt
  z^.naechster:=Wurzel; //Zeiger "naechster" wird bisheriger Wurzelwert zugewiesen
  Wurzel:=z; //Zeiger Wurzel wird auf z "verbogen"
  EditEintragen.Text:=''; //Textfeld wieder leeren
  ButtonAnzeigenClick(Sender); //neue Liste anzeigen
  EditEintragen.SetFocus; //Fokus auf Textfeld setzen
end;
end;

procedure TForm1.ButtonAnzeigenClick(Sender: TObject);
begin
ListBoxAnzeige.Items.Clear; //Listbox wird zunächst geleert...
z:=Wurzel;
while z<>nil do //...und mit neuer Liste befüllt
  begin
  ListBoxAnzeige.Items.Add(z^.Inhalt);
  z:=z^.naechster;
  end;
end;

procedure TForm1.ButtonLeerenClick(Sender: TObject); //Listbox wird geleert
begin
ListBoxAnzeige.Items.Clear;
end;

procedure TForm1.ButtonEntfernenClick(Sender: TObject);
begin
//Vokabeln entfernen
end;

procedure TForm1.ButtonSpeichernClick(Sender: TObject); //Vokabeldatenbank speichern
var i:integer;
begin
Assignfile (f,Datenpfad);
{$I-} reset (f); {$I+}
if Kontrolle then
  begin
    while z<>nil do
      begin
        write (f, z^.Inhalt);
        z:=z^.naechster;
      end;
    closefile (f);
    showmessage('Vokabel-Verzeichnis erfolgreich gespeichert'); //Erfolgsmeldung ausgeben
  end;
end;

procedure TForm1.ButtonLadenClick(Sender: TObject); //Vokabeldatenbank laden
var i:integer;
begin
  i:=1;
  Assignfile (f,Datenpfad);
  {$I-} reset(f); {$I+}
  if Kontrolle then
    begin
       while not eof(f) do //Auslesen bis Ende der Datei erreicht wird
         begin
           read(f, z^.Inhalt);
           z:=z^.naechster;
         end;
     end;
   closefile (f);
   showmessage('Datenbank erfolgreich geladen'); //Erfolgsmeldung ausgeben
end;

procedure TForm1.ButtonBeendenClick(Sender: TObject); //Programm beenden
begin
  close;
end;



end.
Vielen Dank im Voraus
Jan

Geändert von jawo3 (23. Aug 2010 um 19:36 Uhr)
  Mit Zitat antworten Zitat