Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Datensätze speichern (https://www.delphipraxis.net/112513-datensaetze-speichern.html)

xsommo 22. Apr 2008 18:37


Datensätze speichern
 
hi,
bitte entschuldigt, wenn das hier nicht passend ist. aber dies ist mein erster beitrag hier.
folgendes problem habe ich.
ich soll eine art datenbank erstellen, in dem eine vielzahl von schülern unterschiedlicher klassen gespeichert werden sollen.
direkt eine datenbank fällt raus, weil das noch nicht behandelt wurde.
will also getypte daten verwenden.
bisher habe ich mich aber damit nur erfolglos rumgeschlagen. daher wollt ich hier einfach mal nachfragen, ob mir da jemand weiter helfen kann?!
nutze delphi 2005

mfg

Die Muhkuh 22. Apr 2008 18:39

Re: Datensätze speichern
 
Hi xsommo,

herzlich Willkommen in der :dp:

Was hast Du denn schon versucht und wo hapert es?

DeddyH 22. Apr 2008 19:06

Re: Datensätze speichern
 
Für den Anfang könnte man das ja mal mit Records und typisierten Dateien lösen.

Die Muhkuh 22. Apr 2008 19:07

Re: Datensätze speichern
 
Möchte er doch machen. Zumindest verstehe ich das unter "getypten Daten" ;)

DeddyH 22. Apr 2008 19:22

Re: Datensätze speichern
 
Was weiß denn ich, wie der Typ getypte Typen typisiert :roteyes: :mrgreen: ?

bluesbear 22. Apr 2008 20:18

Re: Datensätze speichern
 
Zitat:

Zitat von DeddyH
Was weiß denn ich, wie der Typ getypte Typen typisiert :roteyes: :mrgreen: ?

Typisch! :mrgreen: SCNR

xsommo 23. Apr 2008 22:51

Re: Datensätze speichern
 
Zitat:

Zitat von DeddyH
Für den Anfang könnte man das ja mal mit Records und typisierten Dateien lösen.

jepp. genau das habe ich vor. nur das mir bisher ein ansatz fehlt.

ich habe da mal nen test programm versucht, aber das will irgendwie auch ne so recht.
vielleicht könnt ihr mir da ja weiterhelfen.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  Adresse = record
       name: string[50];
       strasse: string[100];
       plz: integer;
       ort: string[50];
       end;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Button8: TButton;
    procedure Button8Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure positionieren(datensatz: integer);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  datei: file of Adresse;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  AssignFile(datei,'adressen.dat');
  if FileExists('adressen.dat') then ReSet(datei)
  else ReWrite(datei);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  CloseFile(datei);
end;

procedure TForm1.positionieren(datensatz: integer);
var aktdatensatz: Adresse;
begin
  if (datensatz<0) or (datensatz>=FileSize(datei)) then exit
  else begin
    seek(datei, datensatz);
    read(datei, aktdatensatz);
    edit1.text:=aktdatensatz.name;
    edit2.text:=aktdatensatz.strasse;
    edit3.text:=IntToStr(aktdatensatz.plz);
    edit4.text:=aktdatensatz.ort;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  positionieren(0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  positionieren(FilePos(datei)-2);
  //Nach dem Lesen befindet sich der Datenzeiger HINTER dem aktuellen
  // Datensatz; deshalb muss um ZWEI nach vorne gegangen werden
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  positionieren(FilePos(datei));
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  positionieren(FileSize(datei)-1);
end;

const
  BufferSize = 32;


procedure TForm1.Button6Click(Sender: TObject);
var
  Buffer: array[0..BufferSize - 1] of Adresse; // erhöht Performance
  i, p: Integer;
  StartRecord, EndRecord: Integer;
  Max: Integer;
begin
  // Datenzeiger wird VOR den akt. Datensatz gesetzt
  Seek(Datei, FilePos(Datei)-1);
  // Starten mit dem ersten Datensatz hinter dem zu löschenden
  StartRecord := FilePos(Datei) + 1;
  EndRecord := FileSize(Datei);

  while StartRecord < EndRecord do begin

    // max. BufferSize Datensätze lesen
    Max := BufferSize;
    if Max > EndRecord - StartRecord then
      Max := EndRecord - StartRecord;
    Seek(Datei, StartRecord);
    for i := 0 to Max - 1 do
      Read(Datei, Buffer[i]);

    // Datensätze zurückschreiben
    Seek(Datei, StartRecord - 1);
    for i := 0 to Max - 1 do
      Write(Datei, Buffer[i]);
    inc(StartRecord);
  end;

  // Datei ab hier abschneiden
  Truncate(Datei);
  Positionieren(StartRecord-1);
end;

 
procedure TForm1.Button5Click(Sender: TObject);
var
  Buffer: array[0..BufferSize - 1] of Adresse;
  i, p: integer;
begin
  Seek(datei,0);
  p:=0;
  while not eof(datei) do begin //solange lesen, bis die Datei zu Ende ist
    Read(datei, Buffer[p]);
    inc(p); //entspr. p:=p+1
  end;
  CloseFile(datei); //Datei schließen...
  Buffer[p+1].name:=''; //Am Ende leeren Datensatz anhängen
  Buffer[p+1].strasse:='';
  Buffer[p+1].plz:=0;
  Buffer[p+1].ort:='';
  ReWrite(datei); //... und neu anlegen
  for i:=0 to p do write(datei, Buffer[i]);
  //Datensätze (bis auf letzten) in Datei schreiben
  positionieren(FileSize(datei)-1);
  //Dateizeiger auf letzten Datensatz positionieren
end;

procedure TForm1.Button7Click(Sender: TObject);
var datensatz: Adresse;
    nr: integer;
begin
  // Datenzeiger VOR den aktuellen Datensatz setzen
  Seek(Datei,FilePos(Datei)-1);
  nr:=FilePos(datei);
  datensatz.name:=Edit1.Text;
  datensatz.strasse:=Edit2.Text;

  //hier müsste eine Prüfung stattfinden, ob eine Zahl eingegeben wurde!
  //Falls keine gültige Zahl, wird -1 gespeichert
  datensatz.plz:=StrToIntDef(Edit3.Text, -1);

  datensatz.ort:=Edit4.Text;
  write(datei,datensatz);
  positionieren(nr);
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
 close
end;

end.
[edit=MrSpock]Code tag gegen Delphi Tag getauscht. Mfg, MrSpock[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 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