AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Kleine Datenbank speichern unter Verwendung von Zeigern
Thema durchsuchen
Ansicht
Themen-Optionen

Kleine Datenbank speichern unter Verwendung von Zeigern

Ein Thema von jawo3 · begonnen am 23. Aug 2010 · letzter Beitrag vom 3. Okt 2010
Antwort Antwort
Seite 1 von 2  1 2      
jawo3

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

Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 23. Aug 2010, 18: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 18:36 Uhr)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 23. Aug 2010, 20:40
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;
  Mit Zitat antworten Zitat
jawo3

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

AW: Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 23. Aug 2010, 20:47
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

Jan
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 23. Aug 2010, 21:33
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;
  Mit Zitat antworten Zitat
jawo3

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

AW: Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 23. Aug 2010, 21:43
Super, vielen Dank!
Es hat funktioniert...

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?
Jan
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 23. Aug 2010, 21:51
Versuch es mal so...
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if key = #13 then
    key:=#0;
end;
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 23. Aug 2010, 21:54
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)

Geändert von Satty67 (23. Aug 2010 um 21:56 Uhr)
  Mit Zitat antworten Zitat
jawo3

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

AW: Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 23. Aug 2010, 23:12
Ihr seid wirklich super!

Vielen Dank,
jawo3
Jan
  Mit Zitat antworten Zitat
jawo3

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

AW: Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 3. Okt 2010, 12:21
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
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Kleine Datenbank speichern unter Verwendung von Zeigern

  Alt 3. Okt 2010, 12:32
Prüfe mit FileExists, ob die Datei existiert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 00:31 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