Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Kleine Datenbank speichern unter Verwendung von Zeigern (https://www.delphipraxis.net/153979-kleine-datenbank-speichern-unter-verwendung-von-zeigern.html)

jawo3 23. Aug 2010 18:10

Kleine Datenbank speichern unter Verwendung von Zeigern
 
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

omata 23. Aug 2010 20:40

AW: Kleine Datenbank speichern unter Verwendung von Zeigern
 
Versuch es mal so...
Delphi-Quellcode:
procedure TForm1.ButtonSpeichernClick(Sender: TObject); //Vokabeldatenbank speichern
begin
  Assignfile(f, Datenpfad);
  try
    rewrite(f);
    if Kontrolle then
    begin
      while z <> nil do
      begin
        write(f, z^.Inhalt);
        z:=z^.naechster;
      end;
    end;
    showmessage('Vokabel-Verzeichnis erfolgreich gespeichert'); //Erfolgsmeldung ausgeben
  finally
    closefile(f);
  end;
end;

jawo3 23. Aug 2010 20:47

AW: Kleine Datenbank speichern unter Verwendung von Zeigern
 
Danke für die Antwort. Leider wird immer noch nichts in die Datei geschrieben und es kann nichts geladen werden.

Vielleicht hast du ja noch eine Idee...

Danke
jawo3

:?:

omata 23. Aug 2010 21:33

AW: Kleine Datenbank speichern unter Verwendung von Zeigern
 
Versuch es mal so...
Delphi-Quellcode:
procedure TForm1.SpeicherFreigeben;
var DelPointer : Zeiger;
begin
  while Wurzel <> nil do begin
    DelPointer:=Wurzel;
    Wurzel:=Wurzel^.naechster;
    dispose(DelPointer);
  end;
  Wurzel:=nil;
end;

procedure TForm1.ButtonSpeichernClick(Sender: TObject); //Vokabeldatenbank speichern
var RunPointer : Zeiger;
begin
  Assignfile(f, Datenpfad);
  try
    rewrite(f);
    RunPointer:=Wurzel;
    while RunPointer <> nil do
    begin
      write(f, RunPointer^.Inhalt);
      RunPointer:=RunPointer^.naechster;
    end;
    showmessage('Vokabel-Verzeichnis erfolgreich gespeichert'); //Erfolgsmeldung ausgeben
  finally
    closefile(f);
  end;
end;

procedure TForm1.ButtonLadenClick(Sender: TObject); //Vokabeldatenbank laden
var NewPointer, OldPointer : Zeiger
begin
  SpeicherFreigeben;
  Assignfile (f, Datenpfad);
  try
    reset(f);
    OldPointer:=nil;
    while not eof(f) do //Auslesen bis Ende der Datei erreicht wird
    begin
      new(NewPointer);
      read(f, NewPointer^.Inhalt);
      NewPointer^.naechster:=nil;
      if OldPointer <> nil then
        OldPointer^.naechster:=NewPointer;
      if Wurzel = nil then
        Wurzel:=NewPointer;
      OldPointer:=NewPointer;
    end;
    showmessage('Datenbank erfolgreich geladen'); //Erfolgsmeldung ausgeben
  finally
    closefile(f);
  end;
end;

jawo3 23. Aug 2010 21:43

AW: Kleine Datenbank speichern unter Verwendung von Zeigern
 
Super, vielen Dank!
Es hat funktioniert...:thumb:

Ich kann mir allerdings immer noch nicht erklären, warum immer dieser "Blechtrommel-Ton" kommt, wenn ich aus den Editfeldern Enter drücke.

Hast du eine Idee woran das liegen kann? :?:

omata 23. Aug 2010 21:51

AW: Kleine Datenbank speichern unter Verwendung von Zeigern
 
Versuch es mal so...
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if key = #13 then
    key:=#0;
end;

Satty67 23. Aug 2010 21:54

AW: Kleine Datenbank speichern unter Verwendung von Zeigern
 
Ohne es selber getestet zu haben, könnte Ton für falsche Eingabe sein.

Setze bei return den Key auf #0
Delphi-Quellcode:
if (Key=#13) and (length(EditEintragen.Text)<>0) then
  begin
     Key := #0
(Ups, war zu langsam)

jawo3 23. Aug 2010 23:12

AW: Kleine Datenbank speichern unter Verwendung von Zeigern
 
Ihr seid wirklich super!

Vielen Dank,
jawo3

jawo3 3. Okt 2010 12:21

AW: Kleine Datenbank speichern unter Verwendung von Zeigern
 
Mir ist heute aufgefallen, dass wenn ich die abgespeicherte Datei aus dem Verzeichnis lösche und dann das Programm starte und versuche die Datenbank zu laden, ich eine Fehlermeldung bekomme (was ja soweit auch logisch ist:|).

Es wäre schön, wenn ich statt der Fehlermeldung eine Message mit zum Beispiel "Es wurde keine Datenbank gefunden" oder etwas dergleichen angezeigt bekommen würde, also als showmessage.

Nur habe ich keine Ahnung, wie ich das in Code umsetzen kann. Muss man da irgendwie mit solchen Compilerdirektiven arbeiten {$I-} ?

Vielen Dank im Voraus
jawo3

Luckie 3. Okt 2010 12:32

AW: Kleine Datenbank speichern unter Verwendung von Zeigern
 
Prüfe mit FileExists, ob die Datei existiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 Uhr.
Seite 1 von 2  1 2      

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